Ver Fonte

feature 代码提交

xiahan há 8 meses atrás
pai
commit
9fb0d94a81

+ 13 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/dao/PorjectCommonMapper.java

@@ -0,0 +1,13 @@
+package com.rongwei.bscommon.sys.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * PorjectCommonMapper class
+ *
+ * @author XH
+ * @date 2024/12/10
+ */
+@Mapper
+public interface PorjectCommonMapper {
+}

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

@@ -58,7 +58,7 @@ public class ScoreCalculationServiceNum2 implements ScoreCalculationService {
         }
         // 发布证明
         if (StringUtils.isBlank(jtGsjtbsj.getKcsjmbbxznfbzm())) {
-            finalScore = finalScore.subtract(SECOND_SOURCE);
+            finalScore = finalScore.subtract(TWO_SOURCE);
             errorMsg = "公司级:发布证明为空";
         }
         // 无法获取考核部门直接 记录 信息
@@ -84,25 +84,29 @@ public class ScoreCalculationServiceNum2 implements ScoreCalculationService {
 
         // 从项目维度出发 若任务环节编号、任务环节名称、任务环节责任人、环节计划完成时间任一字段为空,扣1分/项。
         int limitNum = BigDecimal.ZERO.subtract(finalScore).intValue() == 0 ? 4 : BigDecimal.ZERO.subtract(finalScore).intValue();
-        List<JtKcsjxm> list1 = kcsjxmList.stream()
+        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());
         // 项目未编制工作清单,扣1分/项。
         int limitNum2 = limitNum + list1.size() == 0 ? 4 : limitNum + list1.size();
-        List<JtKcsjxm> list2 = kcsjxmList.stream()
+        List<String> list2 = kcsjxmList.stream()
                 .filter(info -> StringUtils.isBlank(info.getQdbh()))
+                .map(JtKcsjxm::getXmmc)
+                .distinct()
                 .limit(limitNum2)
                 .collect(Collectors.toList());
         if (!list1.isEmpty()) {
             finalScore = finalScore.subtract(BigDecimal.valueOf(list1.size()));
-            errorMsg = errorMsg + "项目级:" + String.format(ERRORMSG, list1.stream().map(JtKcsjxm::getXmmc).collect(Collectors.joining()));
+            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, list2.stream().map(JtKcsjxm::getXmmc).collect(Collectors.joining()));
+            errorMsg = errorMsg + "项目级:" + String.format(ERRORMSG_SECOND, String.join(",", list2));
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
         finalScore = FOUR_SOURCE;

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

@@ -0,0 +1,54 @@
+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
+public class ScoreCalculationServiceNum3 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);
+    }
+
+}

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

@@ -0,0 +1,140 @@
+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.THREE_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ *
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum4 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtGzdgServiceImpl jtGzdgService;
+
+
+    /**
+     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察工作大纲
+     *  发布证明为空,扣2分
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    @Synchronized
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
+                                          JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = BigDecimal.ZERO;
+        // 扣分细则
+        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 = THREE_SOURCE;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取勘察工作大纲
+        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)));
+        // 获取已审定的项目数量
+        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 + "%";
+            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).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));
+        }
+        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"));
+    }
+}

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

@@ -0,0 +1,141 @@
+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.THREE_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ *
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum5 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtGzdgServiceImpl jtGzdgService;
+
+
+    /**
+     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察设计指导书
+     *  发布证明为空,扣2分
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    @Synchronized
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
+                                          JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = BigDecimal.ZERO;
+        // 扣分细则
+        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 = THREE_SOURCE;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 获取勘察工作大纲
+        List<JtGzdg> gzdgList = jtGzdgService.list(new LambdaQueryWrapper<JtGzdg>().eq(BaseDo::getDeleted, "0")
+                .eq(JtGzdg::getType, "2") //勘察设计指导书
+                .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 + "%";
+            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)
+                .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));
+        }
+        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"));
+    }
+}

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

@@ -0,0 +1,141 @@
+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.THREE_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ *
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum6 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtGzdgServiceImpl jtGzdgService;
+
+
+    /**
+     *  工作大纲/指导书模板(编写指南)为空,扣3分 勘察设计指导书
+     *  发布证明为空,扣2分
+     *
+     * @param khbmList
+     * @param jtKhxmList
+     * @param jtGsjtbsj
+     * @param jkAssessmentRules
+     * @return
+     */
+    @Override
+    @Synchronized
+    public JtYcpfhzDetail soreCalculation(JtYcpfhz jtYcpfhz, List<JtXmkh> khbmList, List<JtKhxm> jtKhxmList,
+                                          JtGsjtbsj jtGsjtbsj, JkAssessmentRules jkAssessmentRules, SysUserVo currentUser) {
+        // 考核得分
+        BigDecimal finalScore = BigDecimal.ZERO;
+        // 扣分细则
+        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 = THREE_SOURCE;
+            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 + "%";
+            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)
+                .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));
+        }
+        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"));
+    }
+}

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

@@ -0,0 +1,76 @@
+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.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;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.FOUR_SOURCE;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 总体方案评审
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum7 implements ScoreCalculationService {
+
+    @Autowired
+    private JtZtfapsServiceImpl ztfapsService;
+    /**
+     * 流程分级分类制度为空,扣4分。
+     * 论证评审文件责任人、论证评审文件批准时间任一字段为空,扣1分/项。
+     *
+     * @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.getZtfapslcfjflzd())) {
+            finalScore = finalScore.subtract(FOUR_SOURCE);
+            errorMsg = "公司级:流程分级分类制度为空";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        // 总体方案评审清单
+        List<JtZtfaps> ztfapsList = ztfapsService.list(new LambdaQueryWrapper<JtZtfaps>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtZtfaps::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (ztfapsList.isEmpty()) {
+            errorMsg = "项目级:总体方案评审清单为空";
+            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)
+                .collect(Collectors.toList());
+        if (!projectNameList.isEmpty()) {
+            finalScore = finalScore.subtract(BigDecimal.valueOf(projectNameList.size()));
+            errorMsg = "项目级:以下项目名称:" + String.join(",", projectNameList) + " 论证评审文件责任人、论证评审文件批准时间任一字段为空";
+        } else {
+            finalScore = FOUR_SOURCE;
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+}

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

@@ -0,0 +1,86 @@
+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.bsentity.domain.*;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
+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.YZLX.JCZL;
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.YZLX.WYYS;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * 外业验收
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum8 implements ScoreCalculationService {
+
+    @Autowired
+    private JtWyysServiceImpl jtWyysService;
+
+    /**
+     * 验证类型勾选了“基础资料验证”,勘察、测量、水文气象资料验证时间为空扣1分/项。
+     * 验证类型勾选了“外业验收验证”,现场勘察、测量验证时间为空扣1分/项。
+     * 该模块无数据不扣分。
+     *
+     * @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;
+
+
+        // 总体方案评审清单
+        List<JtWyys> ztfapsList = jtWyysService.list(new LambdaQueryWrapper<JtWyys>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtWyys::getMainid, khbmList.stream().map(JtXmkh::getId)));
+        if (ztfapsList.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)
+                .collect(Collectors.toList());
+        if (jczlProjectName.isEmpty()) {
+            errorMsg = "项目级:以下项目名称:" + String.join(",", jczlProjectName) + " 勘察、测量、水文气象资料验证时间为空 ";
+            finalScore = finalScore.subtract(BigDecimal.valueOf(jczlProjectName.size()));
+        }
+        // 外业验收资料
+        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()));
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+    }
+
+}

+ 12 - 1
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/utils/JXKHConstant.java

@@ -64,7 +64,7 @@ public class JXKHConstant {
 
     public static class DefaultSource {
         public static final BigDecimal THREE_SOURCE = BigDecimal.valueOf(3);
-        public static final BigDecimal SECOND_SOURCE = BigDecimal.valueOf(2);
+        public static final BigDecimal TWO_SOURCE = BigDecimal.valueOf(2);
         public static final BigDecimal FOUR_SOURCE = BigDecimal.valueOf(4);
         public static final BigDecimal FIVE_SOURCE = BigDecimal.valueOf(5);
         public static final BigDecimal ZERO_POINT_FIVE_SOURCE = BigDecimal.valueOf(0.5);
@@ -172,5 +172,16 @@ public class JXKHConstant {
          */
         public static final String JXJB_1 = "1";
     }
+
+    public static class YZLX{
+        /**
+         * 基础资料验证
+         */
+        public static final String JCZL="0";
+        /**
+         * 外业验收验证
+         */
+        public static final String WYYS="1";
+    }
 }
 

+ 8 - 0
jsglkh-common/src/main/resources/mybatis/PorjectCommonMapper.xml

@@ -0,0 +1,8 @@
+<?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.rongwei.bscommon.sys.dao.PorjectCommonMapper">
+
+
+</mapper>

+ 11 - 0
jsglkh-entity/src/main/java/com/rongwei/bsentity/domain/JtGsjtbsj.java

@@ -395,6 +395,17 @@ public class JtGsjtbsj extends BaseDo implements Serializable {
     @TableField(value = "YXZGCSPXBYXGCBZPXBDPXHZHYXGRSL")
     private String yxzgcspxbyxgcbzpxbdpxhzhyxgrsl;
 
+    /**
+     * 考核区间开始
+     */
+    @TableField(value = "assessmentstarttime")
+    private Date assessmentstarttime;
+
+    /**
+     * 考核区间截止
+     */
+    @TableField(value = "assessmentendtime")
+    private Date  assessmentendtime;
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }