|
@@ -0,0 +1,197 @@
|
|
|
+package com.rongwei.bscommon.sys.strategy.scoreCalculation;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.rongwei.bscommon.sys.dao.BusinessCommonMapper;
|
|
|
+import com.rongwei.bscommon.sys.service.impl.JtFjglxmServiceImpl;
|
|
|
+import com.rongwei.bscommon.sys.service.impl.JtKcsjxmServiceImpl;
|
|
|
+import com.rongwei.bscommon.sys.service.impl.JtSjjdqdServiceImpl;
|
|
|
+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.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import static com.rongwei.bscommon.sys.utils.JXKHConstant.DefaultSource.TWO_SOURCE;
|
|
|
+import static com.rongwei.bscommon.sys.utils.JXKHUtils.CALCULATE_Y3;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ScoreCalculationServiceNum1 class
|
|
|
+ * 设计交底
|
|
|
+ * @author XH
|
|
|
+ * @date 2024/12/09
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class ScoreCalculationServiceNum17 implements ScoreCalculationService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private JtFjglxmServiceImpl jtFjglxmService;
|
|
|
+ @Autowired
|
|
|
+ private JtKcsjxmServiceImpl jtKcsjxmService;
|
|
|
+ @Autowired
|
|
|
+ private BusinessCommonMapper businessCommonMapper;
|
|
|
+ @Autowired
|
|
|
+ private JtSjjdqdServiceImpl jtSjjdqdService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 考核范围:“计划完成时间”(分级管理-项目清单)在考核区间内且中标主体为二级单位以上的项目
|
|
|
+ * 覆盖率=交底项目数量/项目总数量
|
|
|
+ * 交底项目数量:该模块的数据量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ * 项目总数量:计划完成时间(分级管理-项目清单)在考核区间内的项目数量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ * 结果取小数点后一位。
|
|
|
+ * (3)评分规则
|
|
|
+ * 设计交底开展证明文件为空,扣2分。
|
|
|
+ * 覆盖率≥100%,不扣分。
|
|
|
+ * 覆盖率≤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;
|
|
|
+ if (StringUtils.isBlank(jtGsjtbsj.getSjjdkzzm())) {
|
|
|
+ errorMsg = "公司级:设计交底开展证明文件为空";
|
|
|
+ finalScore = finalScore.subtract(TWO_SOURCE);
|
|
|
+ return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 考核范围:“计划完成时间”(分级管理-项目清单)在考核区间内且中标主体为二级单位以上的项目
|
|
|
+ List<JtFjglxm> jtFjglxmList = jtFjglxmService.list(new LambdaQueryWrapper<JtFjglxm>().eq(BaseDo::getDeleted, "0")
|
|
|
+ .eq(JtFjglxm::getZbztdj, "0")
|
|
|
+ .between(JtFjglxm::getJhkssj, jtGsjtbsj.getAssessmentstarttime(),
|
|
|
+ jtGsjtbsj.getAssessmentendtime())
|
|
|
+ .in(JtFjglxm::getMainid, khbmList.stream().map(JtXmkh::getId)));
|
|
|
+ if (jtFjglxmList.isEmpty()) {
|
|
|
+ errorMsg = "项目级:无法获取到分级管理项目清单";
|
|
|
+ finalScore = finalScore.subtract(TWO_SOURCE);
|
|
|
+ return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
|
|
|
+ }
|
|
|
+ // 设计交底清单数据
|
|
|
+ List<JtSjjdqd> jtSjjdqdList = jtSjjdqdService.list(new LambdaQueryWrapper<JtSjjdqd>()
|
|
|
+ .eq(BaseDo::getDeleted, "0")
|
|
|
+ .in(JtSjjdqd::getMainid, khbmList.stream().map(JtXmkh::getId)));
|
|
|
+ if (jtSjjdqdList.isEmpty()) {
|
|
|
+ errorMsg = "项目级:无法获取到设计交底清单";
|
|
|
+ finalScore = finalScore.subtract(TWO_SOURCE);
|
|
|
+ return assemblyYcpfhzDetail(jtYcpfhz, jkAssessmentRules, finalScore, errorMsg, currentUser);
|
|
|
+ }
|
|
|
+ // 分子 EPC项目数量:交底项目数量:该模块的数据量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ int numerator = calculateNumerator(jtSjjdqdList, jtGsjtbsj);
|
|
|
+ // 分母 项目总数量:计划完成时间(分级管理-项目清单)在考核区间内的项目数量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ int denominator = calculateDenominator(jtFjglxmList, jtSjjdqdList, jtGsjtbsj);
|
|
|
+ // 覆盖率=交底项目数量/项目总数量
|
|
|
+ BigDecimal rate = calculateApprovalRate(denominator, numerator);
|
|
|
+ return calculateFinalSource(finalScore, rate, jtYcpfhz, jkAssessmentRules, currentUser);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算最终得分
|
|
|
+ * 覆盖率≥100%,不扣分。
|
|
|
+ * 覆盖率≤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(100)) >= 0) {
|
|
|
+ // 不扣分
|
|
|
+ } else if (rate.compareTo(BigDecimal.valueOf(60)) <= 0) {
|
|
|
+ finalScore = BigDecimal.ZERO.subtract(TWO_SOURCE);
|
|
|
+ } else {
|
|
|
+ finalScore = finalScore.subtract(CALCULATE_Y3(BigDecimal.valueOf(100), 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) {
|
|
|
+ if (denominator == 0) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ if (numerator == 0) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ return BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 6, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).setScale(3, BigDecimal.ROUND_HALF_UP);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算分子
|
|
|
+ * 交底项目数量:该模块的数据量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ */
|
|
|
+ public int calculateNumerator(List<JtSjjdqd> jtSjjdqdList, JtGsjtbsj jtGsjtbsj) {
|
|
|
+ //该模块的数据量
|
|
|
+ long allNameCount = jtSjjdqdList.stream().map(JtSjjdqd::getXmmc).distinct().count();
|
|
|
+ long count = jtSjjdqdList.stream().filter(data -> data.getJhjdsj() != null &&
|
|
|
+ compareDatesIgnoringTime(jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime(), data.getJhjdsj())).map(JtSjjdqd::getXmmc)
|
|
|
+ .distinct()
|
|
|
+ .count();
|
|
|
+ return (int) (allNameCount - count);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算分母
|
|
|
+ * 计划完成时间(分级管理-项目清单)在考核区间内的项目数量 - 计划交底时间不在考核区间内的项目数量
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public int calculateDenominator(List<JtFjglxm> jtFjglxmList, List<JtSjjdqd> jtSjjdqdList, JtGsjtbsj jtGsjtbsj) {
|
|
|
+ long count = jtFjglxmList.stream().map(JtFjglxm::getXmmc).distinct().count();
|
|
|
+ long count1 = jtSjjdqdList.stream().filter(data -> data.getJhjdsj() != null &&
|
|
|
+ !compareDatesIgnoringTime(jtGsjtbsj.getAssessmentstarttime(), jtGsjtbsj.getAssessmentendtime(), data.getJhjdsj())).map(JtSjjdqd::getXmmc)
|
|
|
+ .distinct()
|
|
|
+ .count();
|
|
|
+ return (int) (count - count1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较日期
|
|
|
+ * @param date1
|
|
|
+ * @param date2
|
|
|
+ * @param dat3
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean compareDatesIgnoringTime(Date date1, Date date2, Date dat3) {
|
|
|
+ Calendar cal1 = Calendar.getInstance();
|
|
|
+ Calendar cal2 = Calendar.getInstance();
|
|
|
+ Calendar cal3 = Calendar.getInstance();
|
|
|
+ cal1.setTime(date1);
|
|
|
+ cal2.setTime(date2);
|
|
|
+ cal3.setTime(dat3);
|
|
|
+
|
|
|
+ cal1.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ cal1.set(Calendar.MINUTE, 0);
|
|
|
+ cal1.set(Calendar.SECOND, 0);
|
|
|
+ cal1.set(Calendar.MILLISECOND, 0);
|
|
|
+
|
|
|
+ cal2.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ cal2.set(Calendar.MINUTE, 0);
|
|
|
+ cal2.set(Calendar.SECOND, 0);
|
|
|
+ cal2.set(Calendar.MILLISECOND, 0);
|
|
|
+
|
|
|
+ cal3.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ cal3.set(Calendar.MINUTE, 0);
|
|
|
+ cal3.set(Calendar.SECOND, 0);
|
|
|
+ cal3.set(Calendar.MILLISECOND, 0);
|
|
|
+
|
|
|
+ return cal3.compareTo(cal2) <= 0 && cal3.compareTo(cal1) >= 0;
|
|
|
+ }
|
|
|
+}
|