瀏覽代碼

feature 代码提交

xiahan 7 月之前
父節點
當前提交
f155b17050

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

@@ -1,6 +1,9 @@
 package com.rongwei.bscommon.sys.dao;
 
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * PorjectCommonMapper class
@@ -10,4 +13,7 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface PorjectCommonMapper {
+    // 获取时效内的项目数量信息
+    List<String> withinTimeEPCProjectNames(@Param("mainIds") List<String> mainIds,
+                                           @Param("projectName") List<String> projectName);
 }

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

@@ -30,7 +30,8 @@ public interface ScoreCalculationService {
      * @param currentUser
      * @return
      */
-    default JtYcpfhzDetail assemblyYcpfhzDetail(JtYcpfhz jtYcpfhz, JkAssessmentRules jkAssessmentRules, BigDecimal source, String errorMsg, SysUserVo currentUser) {
+    default JtYcpfhzDetail assemblyYcpfhzDetail(JtYcpfhz jtYcpfhz, JkAssessmentRules jkAssessmentRules,
+                                                BigDecimal source, String errorMsg, SysUserVo currentUser) {
         JtYcpfhzDetail jtYcpfhzDetail = new JtYcpfhzDetail();
         jtYcpfhzDetail.setId(SecurityUtil.getUUID());
         jtYcpfhzDetail.setKhxmflyj(jkAssessmentRules.getCategorylevel1());

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

@@ -73,7 +73,7 @@ public class ScoreCalculationServiceNum13 implements ScoreCalculationService {
         // 获取分母 计划内项目的总数量
         List<String> denominator = gcsjqd.stream().map(JtKcsjxm::getXmmc).distinct().collect(Collectors.toList());
         if (denominator.isEmpty()) {
-            errorMsg = "项目级:计划内项目的总数量为0";
+            errorMsg = "项目级:计划内项目的总数量为0";
             finalScore = BigDecimal.ZERO;
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
@@ -82,7 +82,7 @@ public class ScoreCalculationServiceNum13 implements ScoreCalculationService {
         // 分子 已审定的项目数量: 最终节点审定责任人(审查审定-审查审定率)、批准时间(审查审定-审查审定率)不为空的且批准时间在考核区间内的项目数量
         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";
+            errorMsg = "项目级:已审定的项目数量为0";
             finalScore = BigDecimal.ZERO;
             return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
         }
@@ -106,12 +106,13 @@ public class ScoreCalculationServiceNum13 implements ScoreCalculationService {
         if (rate.compareTo(BigDecimal.valueOf(100)) >= 0) {
             // 不扣分
         } else if (rate.compareTo(BigDecimal.valueOf(60)) <= 0) {
-            finalScore = BigDecimal.ZERO.subtract(FOUR_SOURCE);
+            finalScore = BigDecimal.ZERO.subtract(THREE_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

+ 77 - 0
jsglkh-common/src/main/java/com/rongwei/bscommon/sys/strategy/scoreCalculation/ScoreCalculationServiceNum14.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.JtFjglxmServiceImpl;
+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
+ * EPC方案审查合规性
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum14 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtScsdlServiceImpl jtScsdlService;
+
+    /**
+     * 分级管理制度/法人主体责任字段为空扣2分。
+     * 是否涉及施工管理为是(分级管理-项目清单),总工程师或授权人签字/盖章时间(审查审定-审查审定率)为空,扣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 = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        if (StringUtils.isBlank(jtGsjtbsj.getEpcfaschgxfjglzdfrztzr())) {
+            errorMsg = "公司级:分级管理制度/法人主体责任字段为空";
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<JtFjglxm> khxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>().eq(BaseDo::getDeleted, "0")
+                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .eq(JtFjglxm::getSfsjsggl, "0")
+        );
+        if (khxmList.isEmpty()) {
+            errorMsg = "项目级:不存在涉及到施工管理的项目";
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<JtScsdl> jtScsdls = jtScsdlService.list(new LambdaQueryWrapper<JtScsdl>().eq(BaseDo::getDeleted, "0")
+                .eq(JtScsdl::getDeleted, "0")
+                .in(JtScsdl::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtScsdl::getXmmc, khxmList.stream().map(JtFjglxm::getXmmc))
+        );
+        List<String> projectNameList = jtScsdls.stream().filter(data -> data.getQzsj() == null).map(JtScsdl::getXmmc).distinct().collect(Collectors.toList());
+        if (projectNameList.isEmpty()) {
+            errorMsg = "项目级:不存在总工程师或授权人签字/盖章时间为空的项目";
+        } else {
+            finalScore = finalScore.subtract(TWO_SOURCE);
+            errorMsg = "项目级:下列项目 " + String.join(",", projectNameList) + "总工程师或授权人签字/盖章时间为空";
+        }
+        return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+
+    }
+}

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

@@ -0,0 +1,122 @@
+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.sql.Date;
+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.JXKHUtils.CALCULATE_Y3;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * EPC-审查审定率
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum15 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtScsdlServiceImpl jtScsdlService;
+    @Autowired
+    private JtKcsjxmServiceImpl jtKcsjxmService;
+
+    /**
+     * 考核范围:“计划开始时间”在考核区间内且中标主体为二级单位以上的项目。
+     * 审查审定率=已批准的EPC项目数量/EPC项目数量
+     * 已批准的EPC项目数量:最终节点审定责任人(审查审定-审查审定率)、批准时间(审查审定-审查审定率)不为空且是否涉及施工管理为是(分级管理-项目清单)的项目数量。
+     * EPC项目数量:项目清单中,是否涉及施工管理为是且在勘察设计项目工作清单的项目数量。
+     * 结果取小数点后一位。
+     * (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> jtFjglxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>().eq(BaseDo::getDeleted, "0")
+                .eq(JtFjglxm::getZbztdj, "0")
+                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .eq(JtFjglxm::getSfsjsggl, "0")
+                .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(),
+                        jtGsjtbsj.getAssessmentendtime()));
+        // EPC项目数量:项目清单中,是否涉及施工管理为是且在勘察设计项目工作清单的项目数量。
+        if(jtFjglxmList.isEmpty()){
+            errorMsg="项目级:无法获取到分级管理项目清单";
+            finalScore= BigDecimal.ZERO;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<JtKcsjxm> list = jtKcsjxmService.list(new LambdaQueryWrapper<JtKcsjxm>().eq(BaseDo::getDeleted, "0")
+                .in(JtKcsjxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtKcsjxm::getXmmc, jtFjglxmList.stream().map(JtFjglxm::getXmmc)));
+        List<String> denominator = list.stream().map(JtKcsjxm::getXmmc).distinct().collect(Collectors.toList());
+
+        //已批准的EPC项目数量:最终节点审定责任人(审查审定-审查审定率)、批准时间(审查审定-审查审定率)不为空且是否涉及施工管理为是(分级管理-项目清单)的项目数量。
+        List<JtScsdl> jtScsdls = jtScsdlService.list(new LambdaQueryWrapper<JtScsdl>()
+                .eq(BaseDo::getDeleted, "0")
+                .in(JtScsdl::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtScsdl::getXmmc, jtFjglxmList.stream().map(JtFjglxm::getXmmc)));
+        List<String> numerator = jtScsdls.stream().filter(data -> StringUtils.isNotBlank(data.getZzjdsdzrr()) && data.getPzsj() != null)
+                .map(JtScsdl::getXmmc)
+                .distinct()
+                .collect(Collectors.toList());
+        // 审查审定率=已批准的EPC项目数量/EPC项目数量
+        BigDecimal rate = calculateApprovalRate(denominator.size(), numerator.size());
+        return calculateFinalSource(finalScore, rate, jtYcpfhz, jkAssessmentRules, currentUser);
+
+    }
+    /**
+     * 计算最终得分
+     * 审查审定率≥100%,不扣分。
+     * 审查审定率≤60%,扣3分。
+     * 其他数值线性计算得分,得分取小数点后三位。
+     * @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(THREE_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);
+    }
+}

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

@@ -0,0 +1,117 @@
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.dao.PorjectCommonMapper;
+import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
+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 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;
+import static com.rongwei.bscommon.sys.utils.JXKHUtils.CALCULATE_Y3;
+
+/**
+ * ScoreCalculationServiceNum1 class
+ * EPC-审定时效性
+ * @author XH
+ * @date 2024/12/09
+ */
+@Service
+public class ScoreCalculationServiceNum16 implements ScoreCalculationService {
+
+    @Autowired
+    private JtFjglxmServiceImpl jtFjglxmService;
+    @Autowired
+    private JtKcsjxmServiceImpl jtKcsjxmService;
+    @Autowired
+    private PorjectCommonMapper porjectCommonMapper;
+
+    /**
+     * 考核范围:“计划开始时间”在考核区间内且中标主体为二级单位以上的项目
+     * 审定时效性=时效内的EPC项目数量/EPC项目数量。
+     * 时效内的EPC项目数量:批准时间(审查审定-审查审定率)不为空且批准时间小于等于“环节计划完成时间”(勘察设计项目工作清单)且是否涉及施工管理为是(分级管理-项目清单)的项目数量。
+     * EPC项目数量:项目清单中,是否涉及施工管理为是(分级管理-项目清单)且在勘察设计项目工作清单的项目数量。
+     * 结果取小数点后一位。
+     * (3)评分规则
+     * 审定时效性≥90%,不扣分。
+     * 审定时效性≤60%,扣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 = jkAssessmentRules.getWeight();
+        // 扣分细则
+        String errorMsg = null;
+        // 考核范围:“计划开始时间”在考核区间内且中标主体为二级单位以上的项目
+        List<JtFjglxm> jtFjglxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>().eq(BaseDo::getDeleted, "0")
+                .eq(JtFjglxm::getZbztdj, "0")
+                .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .eq(JtFjglxm::getSfsjsggl, "0")
+                .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(),
+                        jtGsjtbsj.getAssessmentendtime()));
+        // EPC项目数量:项目清单中,是否涉及施工管理为是(分级管理-项目清单)且在勘察设计项目工作清单的项目数量。
+        if (jtFjglxmList.isEmpty()) {
+            errorMsg = "项目级:无法获取到分级管理项目清单";
+            finalScore = BigDecimal.ZERO;
+            return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
+        }
+        List<JtKcsjxm> list = jtKcsjxmService.list(new LambdaQueryWrapper<JtKcsjxm>().eq(BaseDo::getDeleted, "0")
+                .in(JtKcsjxm::getMainid, khbmList.stream().map(JtXmkh::getId))
+                .in(JtKcsjxm::getXmmc, jtFjglxmList.stream().map(JtFjglxm::getXmmc)));
+        //EPC项目数量
+        List<String> denominator = list.stream().map(JtKcsjxm::getXmmc).distinct().collect(Collectors.toList());
+
+        //时效内的EPC项目数量:批准时间(审查审定-审查审定率)不为空且批准时间小于等于“环节计划完成时间”(勘察设计项目工作清单)且是否涉及施工管理为是(分级管理-项目清单)的项目数量。
+        List<String> numerator = porjectCommonMapper.withinTimeEPCProjectNames(
+                khbmList.stream().map(JtXmkh::getId).collect(Collectors.toList()),
+                jtFjglxmList.stream().map(JtFjglxm::getXmmc).collect(Collectors.toList()));
+        // 审查审定率=时效内的EPC项目数量/EPC项目数量。
+        BigDecimal rate = calculateApprovalRate(denominator.size(), numerator.size());
+        return calculateFinalSource(finalScore, rate, jtYcpfhz, jkAssessmentRules, currentUser);
+
+    }
+
+    /**
+     * 计算最终得分
+     * 审查审定率≥90%,不扣分。
+     * 审查审定率≤60%,扣2分。
+     * 其他数值线性计算得分,得分取小数点后三位。
+     * @param rete
+     */
+    public JtYcpfhzDetail calculateFinalSource(BigDecimal finalScore, BigDecimal rate, JtYcpfhz jtYcpfhz, JkAssessmentRules jkAssessmentRules,
+                                               SysUserVo currentUser) {
+        String errorMsg = "审查审定率为:" + rate.toString() + "%";
+        if (rate.compareTo(BigDecimal.valueOf(90)) >= 0) {
+            // 不扣分
+        } else if (rate.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            finalScore = BigDecimal.ZERO.subtract(TWO_SOURCE);
+        } else {
+            finalScore = finalScore.subtract(CALCULATE_Y3(BigDecimal.valueOf(90), BigDecimal.valueOf(2), 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);
+    }
+}

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

@@ -3,6 +3,25 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.rongwei.bscommon.sys.dao.PorjectCommonMapper">
+    <select id="withinTimeEPCProjectNames" resultType="java.lang.String">
+        select distinct js.XMMC
+        from jt_scsdl js
+        left join jt_kcsjxm jk on js.MAINID = jk.MAINID AND js.XMMC=jk.XMMC
+        <where>
+            js.DELETED='0'
+            AND jk.DELETED="0"
+            AND js.MAINID in
+            <foreach collection="mainIds" item="mainId" open="(" separator="," close=")">
+                #{mainId}
+            </foreach>
+            AND js.XMMC in
+            <foreach collection="projectName" item="projectName" open="(" separator="," close=")">
+                #{projectName}
+            </foreach>
+            AND js.PZSJ is not null
+            and js.PZSJ &lt;= jk.HJJHWCSJ
+        </where>
 
+    </select>
 
 </mapper>