|
@@ -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"));
|
|
|
+ }
|
|
|
+}
|