Bladeren bron

feature 代码提交

xiahan 7 maanden geleden
bovenliggende
commit
d082c3637f
16 gewijzigde bestanden met toevoegingen van 882 en 270 verwijderingen
  1. 15 12
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum1.java
  2. 77 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum10.java
  3. 83 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum11.java
  4. 83 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum12.java
  5. 125 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum13.java
  6. 23 26
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum2.java
  7. 136 12
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum3.java
  8. 2 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum37.java
  9. 55 0
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum3Deprecated.java
  10. 52 15
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum4.java
  11. 48 13
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum5.java
  12. 28 97
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum6.java
  13. 41 27
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum7.java
  14. 29 35
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum8.java
  15. 83 31
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum9.java
  16. 2 2
      jsglkh-common/src/main/java/com/rongwei/bscommon/sys/utils/JXKHUtils.java

+ 15 - 12
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum1.java

@@ -12,23 +12,22 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
 import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.ZERO_POINT_FIVE_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 分级管理
  * @author XH
  * @date 2024/12/09
  */
 @Service
 public class ScoreCalculationServiceNum1 implements ScoreCalculationService {
 
+    public static final String ERRORMSG = "项目级: 以下项目名称%s的中标主体或项目定位为空";
     @Autowired
     private JtFjglxmServiceImpl jtFjglxmService;
-    public static final String ERRORMSG = "项目级: 以下项目名称%s的中标主体或项目定位为空";
 
     /**
      * 技术策划分级分类管理制度为空,扣3分。
@@ -44,8 +43,8 @@ public class ScoreCalculationServiceNum1 implements ScoreCalculationService {
     public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
                                           JkAssessmentRules jkAssessmentRules,
                                           SysUserVo currentUser) {
-        // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        // 默认得分
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
         if (StringUtils.isBlank(jtGsjtbsj.getJschfjglzd())) {
@@ -54,7 +53,7 @@ public class ScoreCalculationServiceNum1 implements ScoreCalculationService {
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
         if (khbmList.isEmpty()) {
-            finalScore = THREE_SOURCE;
+            finalScore = finalScore.subtract(THREE_SOURCE);
             errorMsg = "项目级:暂无项目信息不扣分";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
@@ -64,21 +63,25 @@ public class ScoreCalculationServiceNum1 implements ScoreCalculationService {
                 .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId)));
         if (fjglxmList.isEmpty()) {
             errorMsg = "项目级:暂无项目信息不扣分";
-            finalScore = THREE_SOURCE;
+            finalScore = finalScore.subtract(THREE_SOURCE);
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
         // 从项目维度出发 若中标主体、项目定位任一字段为空 获取前6个
-        List<JtFjglxm> limit = fjglxmList.stream()
+        List<String> projectNameList = fjglxmList.stream()
                 .filter(info -> StringUtils.isBlank(info.getZbztdw()) || StringUtils.isBlank(info.getXmdw()))
-                .limit(6)
+                .map(JtFjglxm::getXmmc)
+                .distinct()
                 .collect(Collectors.toList());
-        if (limit.isEmpty()) {
+        if (projectNameList.isEmpty()) {
             finalScore = THREE_SOURCE;
             errorMsg = "项目级:分级分类制定明确";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        finalScore = ZERO_POINT_FIVE_SOURCE.multiply(BigDecimal.valueOf(limit.size()));
-        String projectName = limit.stream().map(JtFjglxm::getXmmc).collect(Collectors.joining());
+        finalScore = finalScore.subtract(ZERO_POINT_FIVE_SOURCE.multiply(BigDecimal.valueOf(projectNameList.size())));
+        if (finalScore.compareTo(BigDecimal.ZERO) < 0) {
+            finalScore = BigDecimal.ZERO;
+        }
+        String projectName = String.join(",", projectNameList);
         errorMsg = String.format(ERRORMSG, projectName);
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }

+ 77 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum10.java

@@ -0,0 +1,77 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.impl.JtScsdlServiceImpl;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 管理合规性
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum10 implements ScoreCalculationService {
+
+
+    @Autowired
+    private JtScsdlServiceImpl jtScsdlService;
+
+
+    /**
+     * 流程分级分类制度为空,扣2分。
+     * 电子签名/用印节点名称(审查审定-审定审查率)字段为空,扣0.5分/项。
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
+                                          JkAssessmentRules jkAssessmentRules,
+                                          SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        // 获取考核项目信息 计划开始时间”在考核区间内且中标主体为二级单位以上的项目
+        if (StringUtils.isBlank(jtGsjtbsj.getGlhgxlcfjflzd())) {
+            errorMsg = "公司级:流程分级分类制度为空";
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取审查审定率 数据
+        List<JtScsdl> jtScsdls = jtScsdlService.list(new LambdaQueryWrapper<JtScsdl>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtScsdl::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (jtScsdls.isEmpty()) {
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            errorMsg = "项目级:无法获取审查审定率";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<String> projectNames = jtScsdls.stream().filter(data -> StringUtils.isBlank(data.getQmmc())).map(JtScsdl::getXmmc).distinct().collect(Collectors.toList());
+        if (projectNames.isEmpty()) {
+            errorMsg = "项目级:不存在不合规项目";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        errorMsg = "项目级: 以下项目:" + String.join(",", projectNames) + "未维护电子签名/用印节点名称";
+        finalScore = finalScore.subtract(BigDecimal.valueOf(0.5).multiply(BigDecimal.valueOf(projectNames.size())));
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+}

+ 83 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum11.java

@@ -0,0 +1,83 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.impl.JtWtbhglServiceImpl;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 问题闭环管理
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum11 implements ScoreCalculationService {
+
+
+    @Autowired
+    private JtWtbhglServiceImpl jtWtbhglService;
+
+
+    /**
+     问题清单为空,扣2分。
+     问题提出人、问题提出时间不为空,问题反馈日期、问题反馈负责人任一字段为空扣0.5分/项。
+     项目级该模块没有数据不扣分。
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
+                                          JkAssessmentRules jkAssessmentRules,
+                                          SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        // 问题清单为空,扣2分。
+        if (StringUtils.isBlank(jtGsjtbsj.getWtbhglwtqd())) {
+            errorMsg = "公司级:问题清单为空";
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取审查审定率 数据
+        List<JtWtbhgl> jtWtbhglList = jtWtbhglService.list(new LambdaQueryWrapper<JtWtbhgl>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtWtbhgl::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (jtWtbhglList.isEmpty()) {
+            errorMsg = "项目级:未获取到问题闭环管理数据";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<String> projectNames = jtWtbhglList.stream()
+                .filter(data -> (StringUtils.isNotBlank(data.getWttcr()) && data.getWttcrq() != null) && (
+                        StringUtils.isBlank(data.getWtfkfzr()) || data.getWtfkrq() == null
+                )).map(JtWtbhgl::getXmmc)
+                .distinct()
+                .collect(Collectors.toList());
+        if (projectNames.isEmpty()) {
+            errorMsg = "项目级:不存在不合规项目";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+
+        finalScore = finalScore.subtract(BigDecimal.valueOf(0.5).multiply(BigDecimal.valueOf(projectNames.size())));
+        errorMsg = "项目级: 以下项目:" + String.join(",", projectNames) + "问题提出人、问题提出时间不为空,但问题反馈日期、问题反馈负责人为空";
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+}

+ 83 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum12.java

@@ -0,0 +1,83 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.impl.JtScbhglServiceImpl;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 审查闭环管理
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum12 implements ScoreCalculationService {
+
+
+    @Autowired
+    private JtScbhglServiceImpl jtScbhglService;
+
+
+    /**
+     * 外部审查意见清单为空,扣2分。
+     * 意见提出人、意见提出时间不为空,外部回复意见负责人、回复时间任一字段为空扣0.5分/项。
+     * 项目级模块无数据不扣分
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
+                                          JkAssessmentRules jkAssessmentRules,
+                                          SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        // 问题清单为空,扣2分。
+        if (StringUtils.isBlank(jtGsjtbsj.getScbhglwbscyjqd())) {
+            errorMsg = "公司级:外部审查意见清单为空";
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取审查审定率 数据
+        List<JtScbhgl> jtScbhglList = jtScbhglService.list(new LambdaQueryWrapper<JtScbhgl>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtScbhgl::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (jtScbhglList.isEmpty()) {
+            errorMsg = "项目级:未获取到审查闭环管理数据";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<String> projectNames = jtScbhglList.stream()
+                .filter(data -> (StringUtils.isNotBlank(data.getYjtcr()) && data.getYjtcsj() != null) && (
+                        StringUtils.isBlank(data.getWbhfyjfzr()) || data.getHfsj() == null
+                )).map(JtScbhgl::getXmmc)
+                .distinct()
+                .collect(Collectors.toList());
+        if (projectNames.isEmpty()) {
+            errorMsg = "项目级:不存在不合规项目";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+
+        finalScore = finalScore.subtract(BigDecimal.valueOf(0.5).multiply(BigDecimal.valueOf(projectNames.size())));
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
+        }
+        errorMsg = "项目级: 以下项目:" + String.join(",", projectNames) + "意见提出人、意见提出时间不为空,但外部回复意见负责人、回复时间为空";
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+}

+ 125 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum13.java

@@ -0,0 +1,125 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtKcsjxmServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtScsdlServiceImpl;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHUtils.CALCULATE_Y3;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 成果输出-审查审定率
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum13 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtKcsjxmServiceImpl jtKcsjxmService;
+    @Autowired
+    private JtScsdlServiceImpl jtScsdlService;
+
+    /**
+     * (1)系统字段
+     * 使用审查审定-审查审定率字段
+     * (2)计算规则
+     * 考核范围:“计划完成时间”在考核区间内且中标主体为二级单位以上的项目
+     * 审查审定率=已审定的项目数量/计划内项目的总数量
+     * 已审定的项目数量:最终节点审定责任人(审查审定-审查审定率)、批准时间(审查审定-审查审定率)不为空的且批准时间在考核区间内的项目数量
+     * 计划内项目的总数量:“计划完成时间”(分级管理-项目清单)在考核区间内且中标主体为二级单位及以上且在勘察设计项目工作清单内的项目数量。
+     * 结果取小数点后一位。
+     * (3)评分规则
+     * 审查审定率≥100%,不扣分。
+     * 审查审定率≤60%,扣3分。
+     * 其他数值线性计算得分,得分取小数点后三位。
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        // 获取考核项目信息 计划完成时间”在考核区间内且中标主体为二级单位以上的项目
+        List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>().eq(BaseDo::getDeleted, "0").eq(JtFjglxm::getZbztdj, "0").in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId)).between(JtFjglxm::getJhwcsj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
+        if (khxmList.isEmpty()) {
+            errorMsg = "公司级:分级管理-项目清单为空";
+            finalScore = finalScore.subtract(THREE_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取勘察设计项目清单 计划内项目的总数量 “计划完成时间”(分级管理-项目清单)在考核区间内且中标主体为二级单位及以上且在勘察设计项目工作清单内的项目数量。
+        List<JtKcsjxm> gcsjqd = jtKcsjxmService.list(new LambdaQueryWrapper<JtKcsjxm>().eq(BaseDo::getDeleted, "0").in(JtKcsjxm::getMainid, khbmList.stream().map(JtXmkh::getId)).in(JtKcsjxm::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc)));
+        // 获取分母 计划内项目的总数量
+        List<String> denominator = gcsjqd.stream().map(JtKcsjxm::getXmmc).distinct().collect(Collectors.toList());
+        if (denominator.isEmpty()) {
+            errorMsg = "项目级级:计划内项目的总数量为0";
+            finalScore = BigDecimal.ZERO;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取已完成审查的项目数量 分子
+        List<JtScsdl> ywcscList = jtScsdlService.list(new LambdaQueryWrapper<JtScsdl>().eq(BaseDo::getDeleted, "0").in(JtScsdl::getMainid, khbmList.stream().map(JtXmkh::getId)).in(JtScsdl::getXmmc, gcsjqd.stream().map(JtKcsjxm::getXmmc)).between(JtScsdl::getPzsj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
+        // 分子 已审定的项目数量: 最终节点审定责任人(审查审定-审查审定率)、批准时间(审查审定-审查审定率)不为空的且批准时间在考核区间内的项目数量
+        List<String> numerator = ywcscList.stream().filter(data -> StringUtils.isNotBlank(data.getZzjdsdzrr()) && data.getPzsj() != null).map(JtScsdl::getXmmc).distinct().collect(Collectors.toList());
+        if (numerator.isEmpty()) {
+            errorMsg = "项目级级:已审定的项目数量为0";
+            finalScore = BigDecimal.ZERO;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        //审查审定率
+        BigDecimal rate = calculateApprovalRate(denominator.size(), numerator.size());
+        return calculateFinalSource(finalScore, rate, jtYcpfhz, jkAssessmentRules, currentUser);
+
+    }
+
+
+    /**
+     * 计算最终得分
+     * 大于等于100 4分
+     * 小于60 -4 分
+     * 其他情况 线性计算
+     * @param rete
+     */
+    public JtYcpfhzDetail calculateFinalSource(BigDecimal finalScore, BigDecimal rate, JtYcpfhz jtYcpfhz, JkAssessmentRules jkAssessmentRules,
+                                               SysUserVo currentUser) {
+        String errorMsg = "审查审定率为:" + rate.toString() + "%";
+        if (rate.compareTo(BigDecimal.valueOf(100)) >= 0) {
+            // 不扣分
+        } else if (rate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            finalScore = BigDecimal.ZERO.subtract(FOUR_SOURCE);
+        } else {
+            finalScore=finalScore.subtract(CALCULATE_Y3(BigDecimal.valueOf(100),BigDecimal.valueOf(3),BigDecimal.valueOf(60),BigDecimal.ZERO,rate));
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+
+    /**
+     * 计算审查审定率
+     * @param denominator
+     * @param numerator
+     * @return
+     */
+    public BigDecimal calculateApprovalRate(int denominator, int numerator) {
+        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).setScale(3, BigDecimal.ROUND_HALF_UP);
+    }
+}

+ 23 - 26
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum2.java

@@ -3,7 +3,6 @@ package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.rongwei.bscommon.sys.service.impl.JtKcsjxmServiceImpl;
 import com.rongwei.bsentity.domain.*;
-
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.utils.StringUtils;
@@ -14,12 +13,13 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.*;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
 
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 勘察设计项目工作清单
  * @author XH
  * @date 2024/12/09
  */
@@ -48,7 +48,7 @@ public class ScoreCalculationServiceNum2 implements ScoreCalculationService {
                                           JkAssessmentRules jkAssessmentRules,
                                           SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
         if (StringUtils.isBlank(jtGsjtbsj.getKcsjmbbxzn())) {
@@ -59,14 +59,12 @@ public class ScoreCalculationServiceNum2 implements ScoreCalculationService {
         // 发布证明
         if (StringUtils.isBlank(jtGsjtbsj.getKcsjmbbxznfbzm())) {
             finalScore = finalScore.subtract(TWO_SOURCE);
-            errorMsg = "公司级:发布证明为空";
+            errorMsg = "公司级:发布证明为空 ";
         }
         // 无法获取考核部门直接 记录 信息
         if (khbmList.isEmpty()) {
-            if (finalScore.equals(BigDecimal.ZERO)) {
-                finalScore = FOUR_SOURCE;
-                errorMsg = "";
-            }
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "公司级:无法获取考核部门信息 ";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
 
@@ -75,42 +73,41 @@ public class ScoreCalculationServiceNum2 implements ScoreCalculationService {
                 .eq(BaseDo::getDeleted, "0")
                 .in(JtKcsjxm::getMainid, khbmList.stream().map(JtXmkh::getId)));
         if (kcsjxmList.isEmpty()) {
-            if (finalScore.equals(BigDecimal.ZERO)) {
-                finalScore = FOUR_SOURCE;
-                errorMsg = "";
-            }
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "公司级:无法获取勘察设计项目清单";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-
         // 从项目维度出发 若任务环节编号、任务环节名称、任务环节责任人、环节计划完成时间任一字段为空,扣1分/项。
-        int limitNum = BigDecimal.ZERO.subtract(finalScore).intValue() == 0 ? 4 : BigDecimal.ZERO.subtract(finalScore).intValue();
         List<String> list1 = kcsjxmList.stream()
                 .filter(info -> StringUtils.isBlank(info.getRwhjbh()) || StringUtils.isBlank(info.getRwhjmc()) ||
                         StringUtils.isBlank(info.getRwhjzrr()) || info.getHjjhwcsj() == null)
                 .map(JtKcsjxm::getXmmc)
                 .distinct()
-                .limit(limitNum)
                 .collect(Collectors.toList());
+        if (!list1.isEmpty()) {
+            finalScore = finalScore.subtract(BigDecimal.valueOf(list1.size()));
+            errorMsg = errorMsg + "项目级:" + String.format(ERRORMSG, String.join(",", list1));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
         // 项目未编制工作清单,扣1分/项。
-        int limitNum2 = limitNum + list1.size() == 0 ? 4 : limitNum + list1.size();
         List<String> list2 = kcsjxmList.stream()
                 .filter(info -> StringUtils.isBlank(info.getQdbh()))
                 .map(JtKcsjxm::getXmmc)
                 .distinct()
-                .limit(limitNum2)
+                .limit(finalScore.intValue())
                 .collect(Collectors.toList());
-        if (!list1.isEmpty()) {
-            finalScore = finalScore.subtract(BigDecimal.valueOf(list1.size()));
-            errorMsg = errorMsg + "项目级:" + String.format(ERRORMSG,String.join(",", list1));
-            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
-        }
+
         if (!list2.isEmpty()) {
             finalScore = finalScore.subtract(BigDecimal.valueOf(list2.size()));
             errorMsg = errorMsg + "项目级:" + String.format(ERRORMSG_SECOND, String.join(",", list2));
-            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
         }
-        finalScore = FOUR_SOURCE;
-        errorMsg = "";
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
 

+ 136 - 12
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum3.java

@@ -1,26 +1,41 @@
 package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtGzdgServiceImpl;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.utils.StringUtils;
+import lombok.Synchronized;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.stream.Collectors;
 
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.*;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 勘察工作大纲
  * @author XH
  * @date 2024/12/09
  */
 @Service
 public class ScoreCalculationServiceNum3 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtGzdgServiceImpl jtGzdgService;
+
+
     /**
-     * 工作大纲/指导书模板(编写指南)为空,扣3分
-     * 发布证明为空,扣2分
+     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察工作大纲
+     *  发布证明为空,扣2分
      *
      * @param khbmList
      * @param jtKhxmList
@@ -29,13 +44,13 @@ public class ScoreCalculationServiceNum3 implements ScoreCalculationService {
      * @return
      */
     @Override
-    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
-                                          JkAssessmentRules jkAssessmentRules,
-                                          SysUserVo currentUser) {
+    @Synchronized
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
+                                          JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
-        String errorMsg = null;
+        String errorMsg = "";
         if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxzn())) {
             finalScore = finalScore.subtract(THREE_SOURCE);
             errorMsg = "公司级:工作大纲/指导书模板(编写指南)为空";
@@ -43,12 +58,121 @@ public class ScoreCalculationServiceNum3 implements ScoreCalculationService {
         }
         if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxznfbzm())) {
             finalScore = finalScore.subtract(TWO_SOURCE);
-            errorMsg = "公司级:工作大纲/指导书模板(编写指南)发布证明为空";
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)发布证明为空 ";
+        }
+
+        // 获取考核项目信息
+        List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>()
+                .eq(BaseDo::getDeleted, "0")
+                .eq(JtFjglxm::getZbztdj, "0")
+                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
+
+        if (khxmList.isEmpty()) {
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到项目信息";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        finalScore =THREE_SOURCE;
-        errorMsg = "";
+        // 获取勘察工作大纲
+        List<JtGzdg> gzdgList = jtGzdgService.list(new LambdaQueryWrapper<JtGzdg>().eq(BaseDo::getDeleted, "0")
+                .eq(JtGzdg::getType, "0") //勘察工作大纲
+                .in(JtGzdg::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc))
+                .in(JtGzdg::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (gzdgList.isEmpty()) {
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到勘察工作大纲";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取已审定的项目数量
+        List<JtGzdg> authorizeDatas = gzdgList.stream()
+                .filter(data -> StringUtils.isNotBlank(data.getSdzrr()) && data.getSdsj() != null)
+                .collect(Collectors.toList());
+        BigDecimal approvalRate = calculateApprovalRate(khxmList, authorizeDatas);
+        errorMsg = errorMsg + "公司级:审查审定率为:" + approvalRate + "% ";
+        if (approvalRate.compareTo(BigDecimal.valueOf(90)) >= 0) {
+            // 不扣分
+//            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        } else if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            // 得零分
+            finalScore = BigDecimal.ZERO;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        } else {
+            // 90- 60之前计算线性得分
+            finalScore = finalScore.subtract(approvalRate.subtract(BigDecimal.valueOf(60))).divide(BigDecimal.valueOf(90).subtract(BigDecimal.valueOf(60))).multiply(BigDecimal.valueOf(2)).add(BigDecimal.valueOf(1));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        // 获取大纲中的项目名称
+        List<String> xmmcList = gzdgList.stream().map(JtGzdg::getXmmc).collect(Collectors.toList());
+        // 若每个项目没有“类型”为勘察工作大纲对应的数据(即三项都没有),扣0.5分/项。
+        List<String> emptyBlankData = khxmList.stream()
+                .filter(info -> !xmmcList.contains(info.getXmmc()))
+                .map(JtFjglxm::getXmmc)
+                .distinct()
+                .collect(Collectors.toList());
+        if (!emptyBlankData.isEmpty()) {
+            String peojectNames = String.join(",", emptyBlankData);
+            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 没有勘察工作大纲";
+            finalScore = finalScore.subtract(BigDecimal.valueOf((double) emptyBlankData.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        List<String> emergingProjects = getEmergingProjects(khxmList, xmmcList, emptyBlankData.size());
+        if (!emergingProjects.isEmpty()) {
+            String peojectNames = String.join(",", emergingProjects);
+            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展勘察工作大纲审查";
+            finalScore = finalScore.subtract(BigDecimal.valueOf((double) emergingProjects.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
+        }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
 
+    /**
+     * 获取是新兴项目但是在大纲中不存在的项目信息
+     * @param khxmList
+     * @param gzdgList
+     * @return
+     */
+    public List<String> getEmergingProjects(List<JtFjglxm> khxmList, List<String> xmmcList, int limitSize) {
+
+        return khxmList
+                .stream()
+                .filter(info -> "0".equals(info.getSfxxyw()) && !xmmcList.contains(info.getXmmc()))
+                .map(JtFjglxm::getXmmc)
+                .distinct()
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 计算审查审定率
+     *
+     * @param khxmList       考核区间内的项目
+     * @param authorizeDatas 已完成审定的项目数量
+     * @return
+     */
+    public BigDecimal calculateApprovalRate(List<JtFjglxm> khxmList, List<JtGzdg> authorizeDatas) {
+        // 分母
+        int denominator = khxmList.size();
+        // 分子
+        int numerator = (int) authorizeDatas.stream().map(JtGzdg::getXmmc).distinct().count();
+        if (denominator == 0) {
+            return BigDecimal.ZERO;
+        }
+        if (numerator == 0) {
+            return BigDecimal.valueOf(100);
+        }
+        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP)
+                .multiply(new BigDecimal("100"))
+                .setScale(3, BigDecimal.ROUND_HALF_UP);
+    }
 }

+ 2 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum37.java

@@ -7,6 +7,8 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.util.List;
 
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
+
 
 /**
  * ScoreCalculationServiceNum1 class

+ 55 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum3Deprecated.java

@@ -0,0 +1,55 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.utils.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.*;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 工作大纲/指导书模板
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+@Deprecated
+public class ScoreCalculationServiceNum3Deprecated implements ScoreCalculationService {
+    /**
+     * 工作大纲/指导书模板(编写指南)为空,扣3分
+     * 发布证明为空,扣2分
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
+                                          JkAssessmentRules jkAssessmentRules,
+                                          SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = BigDecimal.ZERO;
+        // 扣分细则
+        String errorMsg = null;
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxzn())) {
+            finalScore = finalScore.subtract(THREE_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)为空";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxznfbzm())) {
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)发布证明为空";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        finalScore =THREE_SOURCE;
+        errorMsg = "";
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+
+}

+ 52 - 15
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum4.java

@@ -16,10 +16,11 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 勘察设计指导书
  * @author XH
  * @date 2024/12/09
  */
@@ -33,7 +34,7 @@ public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
 
 
     /**
-     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察工作大纲
+     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察设计指导书
      *  发布证明为空,扣2分
      *
      * @param khbmList
@@ -47,9 +48,19 @@ public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
     public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
                                           JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxzn())) {
+            finalScore = finalScore.subtract(THREE_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)为空";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxznfbzm())) {
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)发布证明为空 ";
+        }
+
         // 获取考核项目信息
         List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>()
                 .eq(BaseDo::getDeleted, "0")
@@ -57,27 +68,39 @@ public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
                 .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
                 .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
         if (khxmList.isEmpty()) {
-            finalScore = finalScore.subtract(THREE_SOURCE);
-            errorMsg = "无法获取到项目信息";
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到项目信息";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
         // 获取勘察工作大纲
         List<JtGzdg> gzdgList = jtGzdgService.list(new LambdaQueryWrapper<JtGzdg>().eq(BaseDo::getDeleted, "0")
-                .eq(JtGzdg::getType, "0") //勘察工作大纲
+                .eq(JtGzdg::getType, "2") //勘察设计指导书
                 .in(JtGzdg::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc))
                 .in(JtGzdg::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (gzdgList.isEmpty()) {
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到勘察工作大纲";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
         // 获取已审定的项目数量
         List<JtGzdg> authorizeDatas = gzdgList.stream()
                 .filter(data -> StringUtils.isNotBlank(data.getSdzrr()) && data.getSdsj() != null)
                 .collect(Collectors.toList());
         BigDecimal approvalRate = calculateApprovalRate(khxmList, authorizeDatas);
+        errorMsg = errorMsg + "公司级:审查审定率为:" + approvalRate + "% ";
         if (approvalRate.compareTo(BigDecimal.valueOf(90)) >= 0) {
-            finalScore = THREE_SOURCE;
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
+//            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        } else if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            // 得零分
+            finalScore = BigDecimal.ZERO;
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
-        }
-        if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
+        } else {
+            // 90- 60之前计算线性得分
+            finalScore = finalScore.subtract(approvalRate.subtract(BigDecimal.valueOf(60))).divide(BigDecimal.valueOf(90).subtract(BigDecimal.valueOf(60))).multiply(BigDecimal.valueOf(2)).add(BigDecimal.valueOf(1));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
         }
         // 获取大纲中的项目名称
         List<String> xmmcList = gzdgList.stream().map(JtGzdg::getXmmc).collect(Collectors.toList());
@@ -86,17 +109,29 @@ public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
                 .filter(info -> !xmmcList.contains(info.getXmmc()))
                 .map(JtFjglxm::getXmmc)
                 .distinct()
-                .limit(6).collect(Collectors.toList());
+                .limit(6)
+                .collect(Collectors.toList());
         if (!emptyBlankData.isEmpty()) {
             String peojectNames = String.join(",", emptyBlankData);
-            errorMsg = "项目级:以下项目名称:" + peojectNames + " 没有勘察工作大纲";
+            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 没有勘察设计指导书 ";
             finalScore = finalScore.subtract(BigDecimal.valueOf((double) emptyBlankData.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
         }
         List<String> emergingProjects = getEmergingProjects(khxmList, xmmcList, emptyBlankData.size());
         if (!emergingProjects.isEmpty()) {
             String peojectNames = String.join(",", emergingProjects);
-            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展勘察工作大纲审查";
+            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展设勘察设计指导书审查";
             finalScore = finalScore.subtract(BigDecimal.valueOf((double) emergingProjects.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
         }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
@@ -136,6 +171,8 @@ public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
         if (numerator == 0) {
             return BigDecimal.valueOf(100);
         }
-        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
+        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP)
+                .multiply(new BigDecimal("100"))
+                .setScale(3, BigDecimal.ROUND_HALF_UP);
     }
 }

+ 48 - 13
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum5.java

@@ -16,10 +16,11 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 勘察设计指导书
  * @author XH
  * @date 2024/12/09
  */
@@ -47,9 +48,18 @@ public class ScoreCalculationServiceNum5 implements ScoreCalculationService {
     public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
                                           JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxzn())) {
+            finalScore = finalScore.subtract(THREE_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)为空";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        if (StringUtils.isBlank(jtGsjtbsj.getGzdgzdsmbbxznfbzm())) {
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            errorMsg = "公司级:工作大纲/指导书模板(编写指南)发布证明为空 ";
+        }
         // 获取考核项目信息
         List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>()
                 .eq(BaseDo::getDeleted, "0")
@@ -57,27 +67,39 @@ public class ScoreCalculationServiceNum5 implements ScoreCalculationService {
                 .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
                 .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
         if (khxmList.isEmpty()) {
-            finalScore = finalScore.subtract(THREE_SOURCE);
-            errorMsg = "无法获取到项目信息";
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到项目信息";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
         // 获取勘察工作大纲
         List<JtGzdg> gzdgList = jtGzdgService.list(new LambdaQueryWrapper<JtGzdg>().eq(BaseDo::getDeleted, "0")
-                .eq(JtGzdg::getType, "2") //勘察设计指导书
+                .eq(JtGzdg::getType, "1") //勘察设计指导书
                 .in(JtGzdg::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc))
                 .in(JtGzdg::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (gzdgList.isEmpty()) {
+            finalScore = BigDecimal.ZERO;
+            errorMsg = errorMsg + "无法获取到勘察工作大纲";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
         // 获取已审定的项目数量
         List<JtGzdg> authorizeDatas = gzdgList.stream()
                 .filter(data -> StringUtils.isNotBlank(data.getSdzrr()) && data.getSdsj() != null)
                 .collect(Collectors.toList());
         BigDecimal approvalRate = calculateApprovalRate(khxmList, authorizeDatas);
+        errorMsg = errorMsg +"公司级:审查审定率为:" + approvalRate + "%";
         if (approvalRate.compareTo(BigDecimal.valueOf(90)) >= 0) {
-            finalScore = THREE_SOURCE;
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
+//            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        } else if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            // 得零分
+            finalScore = BigDecimal.ZERO;
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
-        }
-        if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
+        } else {
+            // 90- 60之前计算线性得分
+            finalScore = finalScore.subtract(approvalRate.subtract(BigDecimal.valueOf(60))).divide(BigDecimal.valueOf(90).subtract(BigDecimal.valueOf(60))).multiply(BigDecimal.valueOf(2)).add(BigDecimal.valueOf(1));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
         }
         // 获取大纲中的项目名称
         List<String> xmmcList = gzdgList.stream().map(JtGzdg::getXmmc).collect(Collectors.toList());
@@ -90,14 +112,25 @@ public class ScoreCalculationServiceNum5 implements ScoreCalculationService {
                 .collect(Collectors.toList());
         if (!emptyBlankData.isEmpty()) {
             String peojectNames = String.join(",", emptyBlankData);
-            errorMsg = "项目级:以下项目名称:" + peojectNames + " 没有勘察设计指导书";
+            errorMsg = errorMsg+ "项目级:以下项目名称:" + peojectNames + " 没有勘察设计指导书 ";
             finalScore = finalScore.subtract(BigDecimal.valueOf((double) emptyBlankData.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
         }
         List<String> emergingProjects = getEmergingProjects(khxmList, xmmcList, emptyBlankData.size());
         if (!emergingProjects.isEmpty()) {
             String peojectNames = String.join(",", emergingProjects);
-            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展勘察设计指导书审查";
+            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展勘察设计指导书审查 ";
             finalScore = finalScore.subtract(BigDecimal.valueOf((double) emergingProjects.size() * 0.5));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
         }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
@@ -137,6 +170,8 @@ public class ScoreCalculationServiceNum5 implements ScoreCalculationService {
         if (numerator == 0) {
             return BigDecimal.valueOf(100);
         }
-        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
+        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP)
+                .multiply(new BigDecimal("100"))
+                .setScale(3, BigDecimal.ROUND_HALF_UP);
     }
 }

+ 28 - 97
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum6.java

@@ -1,13 +1,11 @@
 package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
-import com.rongwei.bscommon.sys.service.impl.JtGzdgServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtZtfapsServiceImpl;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.utils.StringUtils;
-import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -15,11 +13,11 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- *
+ * 总体方案评审
  * @author XH
  * @date 2024/12/09
  */
@@ -27,14 +25,10 @@ import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SO
 public class ScoreCalculationServiceNum6 implements ScoreCalculationService {
 
     @Autowired
-    private JtFjglxmServiceImpl jtFjglxmService;
-    @Autowired
-    private JtGzdgServiceImpl jtGzdgService;
-
-
+    private JtZtfapsServiceImpl ztfapsService;
     /**
-     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察设计指导书
-     *  发布证明为空,扣2分
+     * 流程分级分类制度为空,扣4分。
+     * 论证评审文件责任人、论证评审文件批准时间任一字段为空,扣1分/项。
      *
      * @param khbmList
      * @param jtKhxmList
@@ -43,100 +37,37 @@ public class ScoreCalculationServiceNum6 implements ScoreCalculationService {
      * @return
      */
     @Override
-    @Synchronized
-    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
-                                          JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList, JtGsjtbsj jtGsjtbsj,
+                                          JkAssessmentRules jkAssessmentRules,
+                                          SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore =  jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
-        // 获取考核项目信息
-        List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>()
-                .eq(BaseDo::getDeleted, "0")
-                .eq(JtFjglxm::getZbztdj, "0")
-                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
-                .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
-        if (khxmList.isEmpty()) {
-            finalScore = finalScore.subtract(THREE_SOURCE);
-            errorMsg = "无法获取到项目信息";
+        if (StringUtils.isBlank(jtGsjtbsj.getZtfapslcfjflzd())) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+            errorMsg = "公司级:流程分级分类制度为空";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        // 获取勘察工作大纲
-        List<JtGzdg> gzdgList = jtGzdgService.list(new LambdaQueryWrapper<JtGzdg>().eq(BaseDo::getDeleted, "0")
-                .eq(JtGzdg::getType, "1") //勘察设计指导书
-                .in(JtGzdg::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc))
-                .in(JtGzdg::getMainid, khbmList.stream().map(JtXmkh::getId)));
-        // 获取已审定的项目数量
-        List<JtGzdg> authorizeDatas = gzdgList.stream()
-                .filter(data -> StringUtils.isNotBlank(data.getSdzrr()) && data.getSdsj() != null)
-                .collect(Collectors.toList());
-        BigDecimal approvalRate = calculateApprovalRate(khxmList, authorizeDatas);
-        if (approvalRate.compareTo(BigDecimal.valueOf(90)) >= 0) {
-            finalScore = THREE_SOURCE;
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
+        // 总体方案评审清单
+        List<JtZtfaps> ztfapsList = ztfapsService.list(new LambdaQueryWrapper<JtZtfaps>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtZtfaps::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (ztfapsList.isEmpty()) {
+            errorMsg = "项目级:总体方案评审清单为空";
+            finalScore = finalScore.subtract(FOUR_SOURCE);
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        if (approvalRate.compareTo(BigDecimal.valueOf(60)) <= 0) {
-            errorMsg = "公司级:审查审定率为:" + approvalRate + "%";
-        }
-        // 获取大纲中的项目名称
-        List<String> xmmcList = gzdgList.stream().map(JtGzdg::getXmmc).collect(Collectors.toList());
-        // 若每个项目没有“类型”为勘察工作大纲对应的数据(即三项都没有),扣0.5分/项。
-        List<String> emptyBlankData = khxmList.stream()
-                .filter(info -> !xmmcList.contains(info.getXmmc()))
-                .map(JtFjglxm::getXmmc)
-                .distinct()
-                .limit(6)
+        // 获取项目名称信息
+        List<String> projectNameList = ztfapsList.stream()
+                .filter(data -> StringUtils.isBlank(data.getLzpswjzrr()) || data.getLzpswjpzsj() == null)
+                .map(JtZtfaps::getXmmc)
+                .limit(4)
                 .collect(Collectors.toList());
-        if (!emptyBlankData.isEmpty()) {
-            String peojectNames = String.join(",", emptyBlankData);
-            errorMsg = "项目级:以下项目名称:" + peojectNames + " 没有勘察设计指导书 ";
-            finalScore = finalScore.subtract(BigDecimal.valueOf((double) emptyBlankData.size() * 0.5));
-        }
-        List<String> emergingProjects = getEmergingProjects(khxmList, xmmcList, emptyBlankData.size());
-        if (!emergingProjects.isEmpty()) {
-            String peojectNames = String.join(",", emergingProjects);
-            errorMsg = errorMsg + "项目级:以下项目名称:" + peojectNames + " 属于新兴业务项目但未开展勘察设计指导书审查 ";
-            finalScore = finalScore.subtract(BigDecimal.valueOf((double) emergingProjects.size() * 0.5));
+        if (!projectNameList.isEmpty()) {
+            finalScore = finalScore.subtract(BigDecimal.valueOf(projectNameList.size()));
+            errorMsg = "项目级:以下项目名称:" + String.join(",", projectNameList) + " 论证评审文件责任人、论证评审文件批准时间任一字段为空";
         }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
-
-    /**
-     * 获取是新兴项目但是在大纲中不存在的项目信息
-     * @param khxmList
-     * @param gzdgList
-     * @return
-     */
-    public List<String> getEmergingProjects(List<JtFjglxm> khxmList, List<String> xmmcList, int limitSize) {
-
-        return khxmList
-                .stream()
-                .filter(info -> "0".equals(info.getSfxxyw()) && !xmmcList.contains(info.getXmmc()))
-                .map(JtFjglxm::getXmmc)
-                .distinct()
-                .limit(6 - limitSize)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * 计算审查审定率
-     *
-     * @param khxmList       考核区间内的项目
-     * @param authorizeDatas 已完成审定的项目数量
-     * @return
-     */
-    public BigDecimal calculateApprovalRate(List<JtFjglxm> khxmList, List<JtGzdg> authorizeDatas) {
-        // 分母
-        int denominator = khxmList.size();
-        // 分子
-        int numerator = (int) authorizeDatas.stream().map(JtGzdg::getXmmc).distinct().count();
-        if (denominator == 0) {
-            return BigDecimal.ZERO;
-        }
-        if (numerator == 0) {
-            return BigDecimal.valueOf(100);
-        }
-        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
-    }
 }

+ 41 - 27
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum7.java

@@ -1,13 +1,10 @@
 package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.rongwei.bscommon.sys.service.impl.JtKcsjxmServiceImpl;
-import com.rongwei.bscommon.sys.service.impl.JtXmkhServiceImpl;
-import com.rongwei.bscommon.sys.service.impl.JtZtfapsServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtWyysServiceImpl;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
-import com.rongwei.rwcommon.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -16,10 +13,12 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.JCZL;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.WYYS;
 
 /**
  * ScoreCalculationServiceNum1 class
- * 总体方案评审
+ * 外业验收
  * @author XH
  * @date 2024/12/09
  */
@@ -27,10 +26,12 @@ import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOU
 public class ScoreCalculationServiceNum7 implements ScoreCalculationService {
 
     @Autowired
-    private JtZtfapsServiceImpl ztfapsService;
+    private JtWyysServiceImpl jtWyysService;
+
     /**
-     * 流程分级分类制度为空,扣4分。
-     * 论证评审文件责任人、论证评审文件批准时间任一字段为空,扣1分/项。
+     * 验证类型勾选了“基础资料验证”,勘察、测量、水文气象资料验证时间为空扣1分/项。
+     * 验证类型勾选了“外业验收验证”,现场勘察、测量验证时间为空扣1分/项。
+     * 该模块无数据不扣分。
      *
      * @param khbmList
      * @param jtKhxmList
@@ -43,34 +44,47 @@ public class ScoreCalculationServiceNum7 implements ScoreCalculationService {
                                           JkAssessmentRules jkAssessmentRules,
                                           SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
-        if (StringUtils.isBlank(jtGsjtbsj.getZtfapslcfjflzd())) {
-            finalScore = finalScore.subtract(FOUR_SOURCE);
-            errorMsg = "公司级:流程分级分类制度为空";
-            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
-        }
+
         // 总体方案评审清单
-        List<JtZtfaps> ztfapsList = ztfapsService.list(new LambdaQueryWrapper<JtZtfaps>()
+        List<JtWyys> ztfapsList = jtWyysService.list(new LambdaQueryWrapper<JtWyys>()
                 .eq(BaseDo::getDeleted, "0")
-                .in(JtZtfaps::getMainid, khbmList.stream().map(JtXmkh::getId)));
+                .in(JtWyys::getMainid, khbmList.stream().map(JtXmkh::getId)));
         if (ztfapsList.isEmpty()) {
-            errorMsg = "项目级:总体方案评审清单为空";
+            errorMsg = "项目级:外业验收清单为空";
+            finalScore = finalScore.subtract(FOUR_SOURCE);
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        // 获取项目名称信息
-        List<String> projectNameList = ztfapsList.stream()
-                .filter(data -> StringUtils.isBlank(data.getLzpswjzrr()) || data.getLzpswjpzsj() == null)
-                .map(JtZtfaps::getXmmc)
-                .limit(4)
+        // 基础资料验证
+        List<JtWyys> jczlList = ztfapsList.stream().filter(info -> JCZL.equals(info.getYzlx())).collect(Collectors.toList());
+        List<String> jczlProjectName = jczlList.stream()
+                .filter(info -> info.getZlyzsj() == null)
+                .map(JtWyys::getXmmc).distinct()
+                .collect(Collectors.toList());
+        if (jczlProjectName.isEmpty()) {
+            errorMsg = "项目级:以下项目名称:" + String.join(",", jczlProjectName) + " 勘察、测量、水文气象资料验证时间为空 ";
+            finalScore = finalScore.subtract(BigDecimal.valueOf(jczlProjectName.size()));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+                return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+            }
+        }
+        // 外业验收资料
+        List<JtWyys> wyysList = ztfapsList.stream().filter(info -> WYYS.equals(info.getYzlx())).collect(Collectors.toList());
+        List<String> xcyzProjectName = wyysList.stream()
+                .filter(info -> info.getXcyzsj() == null)
+                .map(JtWyys::getXmmc).distinct()
                 .collect(Collectors.toList());
-        if (!projectNameList.isEmpty()) {
-            finalScore = finalScore.subtract(BigDecimal.valueOf(projectNameList.size()));
-            errorMsg = "项目级:以下项目名称:" + String.join(",", projectNameList) + " 论证评审文件责任人、论证评审文件批准时间任一字段为空";
-        } else {
-            finalScore = FOUR_SOURCE;
+        if (xcyzProjectName.isEmpty()) {
+            errorMsg = errorMsg + "项目级:以下项目名称:" + String.join(",", xcyzProjectName) + " 现场勘察、测量验证时间为空扣1分/项。";
+            finalScore = finalScore.subtract(BigDecimal.valueOf(xcyzProjectName.size()));
+            if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+                finalScore = BigDecimal.ZERO;
+            }
         }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
+
 }

+ 29 - 35
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum8.java

@@ -1,10 +1,11 @@
 package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.rongwei.bscommon.sys.service.impl.JtWyysServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtYjbhglServiceImpl;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -12,13 +13,11 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.JCZL;
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.WYYS;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- * 外业验收
+ * 意见闭环管理
  * @author XH
  * @date 2024/12/09
  */
@@ -26,12 +25,12 @@ import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.WYYS;
 public class ScoreCalculationServiceNum8 implements ScoreCalculationService {
 
     @Autowired
-    private JtWyysServiceImpl jtWyysService;
+    private JtYjbhglServiceImpl jtYjbhglService;
 
     /**
-     * 验证类型勾选了“基础资料验证”,勘察、测量、水文气象资料验证时间为空扣1分/项
-     * 验证类型勾选了“外业验收验证”,现场勘察、测量验证时间为空扣1分/项。
-     * 该模块无数据不扣分。
+     * 意见清单为空,扣3分
+     * 外业验收意见提出人、意见提出时间不为空,整改反馈时间、整改反馈责任人任一字段为空,扣0.5分/项。
+     * 项目级该模块无数据不扣分。
      *
      * @param khbmList
      * @param jtKhxmList
@@ -44,41 +43,36 @@ public class ScoreCalculationServiceNum8 implements ScoreCalculationService {
                                           JkAssessmentRules jkAssessmentRules,
                                           SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
+        if (StringUtils.isBlank(jtGsjtbsj.getYjbhglyjqd())) {
+            errorMsg = "公司级:意见清单为空";
+            finalScore = finalScore.subtract(THREE_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
 
-
-        // 总体方案评审清单
-        List<JtWyys> ztfapsList = jtWyysService.list(new LambdaQueryWrapper<JtWyys>()
+        // 意见清单为空
+        List<JtYjbhgl> jtYjbhglList = jtYjbhglService.list(new LambdaQueryWrapper<JtYjbhgl>()
                 .eq(BaseDo::getDeleted, "0")
-                .in(JtWyys::getMainid, khbmList.stream().map(JtXmkh::getId)));
-        if (ztfapsList.isEmpty()) {
+                .in(JtYjbhgl::getMainid, khbmList.stream().map(JtXmkh::getId)));
+
+        if (jtYjbhglList.isEmpty()) {
             errorMsg = "项目级:外业验收清单为空";
-            finalScore = finalScore.subtract(FOUR_SOURCE);
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        // 基础资料验证
-        List<JtWyys> jczlList = ztfapsList.stream().filter(info -> JCZL.equals(info.getYzlx())).collect(Collectors.toList());
-        List<String> jczlProjectName = jczlList.stream()
-                .filter(info -> info.getZlyzsj() == null)
-                .map(JtWyys::getXmmc).distinct()
-                .limit(4)
+        List<String> projectName = jtYjbhglList.stream().filter(data -> (StringUtils.isNotBlank(data.getYjtcr()) && data.getYjtcsj() != null) &&
+                        (StringUtils.isBlank(data.getZgfkzrr()) || data.getZgfksj() == null))
+                .map(JtYjbhgl::getXmmc)
+                .distinct()
                 .collect(Collectors.toList());
-        if (jczlProjectName.isEmpty()) {
-            errorMsg = "项目级:以下项目名称:" + String.join(",", jczlProjectName) + " 勘察、测量、水文气象资料验证时间为空 ";
-            finalScore = finalScore.subtract(BigDecimal.valueOf(jczlProjectName.size()));
+        if (projectName.isEmpty()) {
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, THREE_SOURCE, errorMsg, currentUser);
         }
-        // 外业验收资料
-        List<JtWyys> wyysList = ztfapsList.stream().filter(info -> WYYS.equals(info.getYzlx())).collect(Collectors.toList());
-        List<String> xcyzProjectName = wyysList.stream()
-                .filter(info -> info.getXcyzsj() == null)
-                .map(JtWyys::getXmmc).distinct()
-                .limit(4 - jczlProjectName.size())
-                .collect(Collectors.toList());
-        if (xcyzProjectName.isEmpty()) {
-            errorMsg = errorMsg + "项目级:以下项目名称:" + String.join(",", xcyzProjectName) + " 现场勘察、测量验证时间为空扣1分/项。";
-            finalScore = finalScore.subtract(BigDecimal.valueOf(xcyzProjectName.size()));
+        errorMsg = "项目级:以下项目名称:" + String.join(",", projectName) + " 外业验收意见提出人和意见提出时间不为空,但整改反馈时间或整改反馈责任人任为空";
+        finalScore = finalScore.subtract(BigDecimal.valueOf(projectName.size()));
+        if (finalScore.compareTo(BigDecimal.ZERO) <= 0) {
+            finalScore = BigDecimal.ZERO;
         }
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }

+ 83 - 31
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum9.java

@@ -1,7 +1,9 @@
 package com.rongwei.bscommon.sys.strategy.scoreCalculation;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.rongwei.bscommon.sys.service.impl.JtYjbhglServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtKcsjxmServiceImpl;
+import com.rongwei.bscommon.sys.service.impl.JtScsdlServiceImpl;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
@@ -11,26 +13,36 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.List;
-import java.util.stream.Collectors;
 
-import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.THREE_SOURCE;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
 
 /**
  * ScoreCalculationServiceNum1 class
- * 意见闭环管理
+ * 审查审定-审查审定率
  * @author XH
  * @date 2024/12/09
  */
 @Service
 public class ScoreCalculationServiceNum9 implements ScoreCalculationService {
 
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
     @Autowired
-    private JtYjbhglServiceImpl jtYjbhglService;
+    private JtKcsjxmServiceImpl jtKcsjxmService;
+    @Autowired
+    private JtScsdlServiceImpl jtScsdlService;
 
     /**
-     * 意见清单为空,扣3分。
-     * 外业验收意见提出人、意见提出时间不为空,整改反馈时间、整改反馈责任人任一字段为空,扣0.5分/项。
-     * 项目级该模块无数据不扣分。
+     * 考核范围:“计划开始时间”在考核区间内且中标主体为二级单位以上的项目
+     * 审查审定率=已完成审查的项目数量/计划内项目的总数量
+     * 已完成审查的项目数量:最终节点审定责任人、批准时间不为空且在勘察设计项目工作清单内的项目数量。
+     * 计划内项目的总数量:“计划开始时间”(分级管理-项目清单)在考核区间内且中标主体为二级单位及以上且在勘察设计项目工作清单内的项目数量。
+     * 结果取小数点后一位。
+     * (3)评分规则
+     * 审查审定率≥100%,不扣分。
+     * 审查审定率≤60%,扣4分。
+     * 其他数值线性计算得分,得分取小数点后三位。
      *
      * @param khbmList
      * @param jtKhxmList
@@ -43,37 +55,77 @@ public class ScoreCalculationServiceNum9 implements ScoreCalculationService {
                                           JkAssessmentRules jkAssessmentRules,
                                           SysUserVo currentUser) {
         // 考核得分
-        BigDecimal finalScore = BigDecimal.ZERO;
+        BigDecimal finalScore = jkAssessmentRules.getWeight();
         // 扣分细则
         String errorMsg = null;
-        if (StringUtils.isBlank(jtGsjtbsj.getYjbhglyjqd())) {
-            errorMsg = "公司级:意见清单为空";
-            finalScore = finalScore.subtract(THREE_SOURCE);
+        // 获取考核项目信息 计划开始时间”在考核区间内且中标主体为二级单位以上的项目
+        List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>()
+                .eq(BaseDo::getDeleted, "0")
+                .eq(JtFjglxm::getZbztdj, "0")
+                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime()));
+        if (khxmList.isEmpty()) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+            errorMsg = "项目级: 无法获取到项目信息";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-
-        // 意见清单为空
-        List<JtYjbhgl> jtYjbhglList = jtYjbhglService.list(new LambdaQueryWrapper<JtYjbhgl>()
-                .eq(BaseDo::getDeleted, "0")
-                .in(JtYjbhgl::getMainid, khbmList.stream().map(JtXmkh::getId)));
-
-        if (jtYjbhglList.isEmpty()) {
-            errorMsg = "项目级:外业验收清单为空";
-            finalScore = THREE_SOURCE;
+        // 获取勘察设计项目清单 项目总数量 分母
+        List<JtKcsjxm> gcsjqd = jtKcsjxmService.list(new LambdaQueryWrapper<JtKcsjxm>().eq(BaseDo::getDeleted, "0")
+                .in(JtKcsjxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtKcsjxm::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc)));
+        if (gcsjqd.isEmpty()) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+            errorMsg = "项目级: 无法获取到计划内的项目";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取已完成审查的项目数量 分子
+        List<JtScsdl> ywcscList = jtScsdlService.list(new LambdaQueryWrapper<JtScsdl>().eq(BaseDo::getDeleted, "0")
+                .in(JtScsdl::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtScsdl::getXmmc, gcsjqd.stream().map(JtKcsjxm::getXmmc)));
+        if (ywcscList.isEmpty()) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+            errorMsg = "项目级: 未找到已完成审查的项目信息";
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
-        List<String> projectName = jtYjbhglList.stream().filter(data -> (StringUtils.isNotBlank(data.getYjtcr()) && data.getYjtcsj() != null) &&
-                        (StringUtils.isBlank(data.getZgfkzrr()) || data.getZgfksj() == null))
-                .map(JtYjbhgl::getXmmc)
-                .distinct()
-                .limit(6)
-                .collect(Collectors.toList());
-        if (projectName.isEmpty()) {
-            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, THREE_SOURCE, "", currentUser);
+        BigDecimal rate = calculateApprovalRate(gcsjqd.stream().map(JtKcsjxm::getXmmc).distinct().count(),
+                ywcscList.stream()
+                        .filter(info -> StringUtils.isNotBlank(info.getZzjdsdzrr()) && info.getPzsj() != null)
+                        .map(JtScsdl::getXmmc)
+                        .distinct()
+                        .count()
+        );
+        // 小于100 大于60 之间的数据 按照线性计算
+        return calculateFinalSource(rate, jtYcpfhz, jkAssessmentRules, currentUser, finalScore);
+    }
+
+    /**
+     * 计算最终得分
+     * 大于等于100 4分
+     * 小于60 -4 分
+     * 其他情况 线性计算
+     * @param rete
+     */
+    public JtYcpfhzDetail calculateFinalSource(BigDecimal rate, JtYcpfhz jtYcpfhz, JkAssessmentRules jkAssessmentRules,
+                                               SysUserVo currentUser, BigDecimal finalScore) {
+        String errorMsg = "审查审定率为:" + rate.toString() + "%";
+        if (rate.compareTo(BigDecimal.valueOf(100)) >= 0) {
+        } else if (rate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+        } else {
+            finalScore = finalScore.subtract(BigDecimal.valueOf(0.1).multiply(rate.subtract(BigDecimal.valueOf(60))).setScale(3, BigDecimal.ROUND_HALF_UP));
         }
-        errorMsg = "项目级:以下项目名称:" + String.join(",", projectName) + " 外业验收意见提出人和意见提出时间不为空,但整改反馈时间或整改反馈责任人任为空";
-        finalScore = finalScore.subtract(BigDecimal.valueOf(projectName.size()));
         return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
     }
 
+    public BigDecimal calculateApprovalRate(long denominator, long numerator) {
+        if (denominator == 0) {
+            return BigDecimal.ZERO;
+        }
+        if (numerator == 0) {
+            return BigDecimal.valueOf(100);
+        }
+        return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP)
+                .multiply(new BigDecimal("100"))
+                .setScale(3, BigDecimal.ROUND_HALF_UP);
+    }
 }

+ 2 - 2
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/utils/JXKHUtils.java

@@ -60,13 +60,13 @@ public class JXKHUtils {
         t.setDeleted("0");
     }
 
-    public static BigDecimal calculateY3(BigDecimal x1, BigDecimal y1, BigDecimal x2, BigDecimal y2, BigDecimal x3) {
+    public static BigDecimal CALCULATE_Y3(BigDecimal x1, BigDecimal y1, BigDecimal x2, BigDecimal y2, BigDecimal x3) {
         // 检查x1是否等于x2,以避免除以零的错误
         if (x1.compareTo(x2) == 0) {
             throw new IllegalArgumentException("x1 和 x2 不能相等,因为这将导致除以零的错误。");
         }
         // 使用两点式方程计算y3值
-        return y1.add(y2.subtract(y1)).divide(x3.subtract(x1)).multiply(x2.subtract(x1));
+        return y1.add(y2.subtract(y1)).multiply(x3.subtract(x1)).divide(x2.subtract(x1)).setScale(3, BigDecimal.ROUND_HALF_UP);
 
     }