fuliqi
2024-08-22 f37bacfd573715e20dcd003e2b4000f9713aceff
工单增加扣除积分状态
8个文件已修改
171 ■■■■■ 已修改文件
ycl-common/src/main/java/enumeration/ContractRule.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/TContractMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/TContractServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ContractTask.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TContractMapper.xml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/enumeration/ContractRule.java
@@ -14,22 +14,23 @@
    CONTRACT_RULE_Online(1,"设备平均在线率", 0),
    CONTRACT_RULE_2(2,"前端感知源治理工作", 0),
    CONTRACT_RULE_Time(3,"时钟同步(超过±3秒为不合格)", 2),
    CONTRACT_RULE_OSD(4,"OSD标识", 2),
    CONTRACT_RULE_OneFile(5,"一机一档", 2),
    CONTRACT_RULE_Monitor(2,"前端感知源治理工作", 0),
    CONTRACT_RULE_Monitor_Time(null,"时钟同步", 2),
    CONTRACT_RULE_Monitor_OSD(null,"OSD标识", 2),
    CONTRACT_RULE_Monitor_OneFile(null,"一机一档", 2),
    CONTRACT_RULE_6(6,"存储故障", 0),
    CONTRACT_RULE_7(7,"因存储设备、云存储软件等引起平台不能正常查看历史图像,须在24小时排除故障", 6),
    CONTRACT_RULE_8(8,"因视频或者图片丢失导致重要案事件不能回放或查看", 6),
    CONTRACT_RULE_Store(3,"存储故障", 0),
    CONTRACT_RULE_Store_24H(null,"因存储设备、云存储软件等引起平台不能正常查看历史图像,须在24小时排除故障,单次故障在24小时以内", 3),
    CONTRACT_RULE_Store_48H(null,"因存储设备、云存储软件等引起平台不能正常查看历史图像,须在24小时排除故障,单次故障在48小时以内", 3),
    CONTRACT_RULE_Store_Important(null,"因视频或者图片丢失导致重要案事件不能回放或查看", 3),
    CONTRACT_RULE_9(9,"对于前端点位异常情况的处理", 0),
    CONTRACT_RULE_10(10,"镜头故障或污染或树枝遮挡或枪机视角偏移正常角度或补光灯应亮未亮", 9),
    CONTRACT_RULE_Site(4,"对于前端点位异常情况的处理", 0),
    CONTRACT_RULE_Site_Error(null,"镜头故障或污染或树枝遮挡或枪机视角偏移正常角度或补光灯应亮未亮", 4),
    CONTRACT_RULE_13(13,"确保录像完整不定期对所有点位录像完整性抽查", 0),
    CONTRACT_RULE_VideoRecord(5,"确保录像完整不定期对所有点位录像完整性抽查", 0),
    CONTRACT_RULE_19(19,"确保图片完整不定期对所有人脸车辆以及智能前端抓拍的图片完整性抽查", 0),
    CONTRACT_RULE_20(20,"发现后台存储不能调取前端设备图片", 19),
    CONTRACT_RULE_PicComplete(6,"确保图片完整不定期对所有人脸车辆以及智能前端抓拍的图片完整性抽查", 0),
    CONTRACT_RULE_PicComplete_PicUnuseful(null,"发现后台存储不能调取前端设备图片", 6),
    ;
    private final Integer id;
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java
@@ -77,4 +77,8 @@
    @ApiModelProperty("是否超时,0没有 1警告 2超时")
    @TableField("overtime")
    private Integer overtime;
    @ApiModelProperty("是否扣过积分")
    @TableField("deduct")
    private Boolean deduct;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -83,6 +83,10 @@
    /** 下发人 */
    private String realName;
    /**
     * 是否扣过积分
     */
    private Boolean deduct;
    public static WorkOrderVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderVO vo) {
        if(vo == null) {
            vo = new WorkOrderVO();
ycl-server/src/main/java/com/ycl/platform/mapper/TContractMapper.java
@@ -23,5 +23,5 @@
    IPage<ContractVO> getPage(IPage page, @Param("query") ContractQuery query);
    List<CalculateRuleVO> selectByRuleName(String ruleName, String ruleCondition, Date date);
    List<CalculateRuleVO> getCalculateRule(Date date);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/TContractServiceImpl.java
@@ -84,7 +84,7 @@
        setTemplateRule(list,null,"设备平均在线率","90%≤设备平均在线率<95%",94D,90D,RuleDeductCategoryEnum.DEDUCT_POINTS,10.00);
        setTemplateRule(list,null,"设备平均在线率","<90%",89D,null,RuleDeductCategoryEnum.DEDUCT_POINTS,20.00);
        setTemplateRule(list,2,"前端感知源治理工作","时钟同步(超过±3秒为不合格)",null,null,RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY,0.1);
        setTemplateRule(list,2,"前端感知源治理工作","时钟同步",null,null,RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY,0.1);
        setTemplateRule(list,null,"前端感知源治理工作","OSD标识",null,null,RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY,0.1);
        setTemplateRule(list,null,"前端感知源治理工作","一机一档",null,null,RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY,0.1);
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -32,6 +32,7 @@
import java.util.*;
import java.util.stream.Collectors;
/**
 * 合同考核定时任务
 */
@@ -70,7 +71,9 @@
     */
    public void onlineCheck() {
        log.info("开始计算合同点位在线率");
        List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
        List<CalculateRuleVO> ruleVos = contractMapper.getCalculateRule(new Date()).stream()
                .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName()))
                .collect(Collectors.toList());
        List<Integer> unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList());
        List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds));
        //key是unitId value是设备编码集合
@@ -140,51 +143,52 @@
        String mouthStart = DateUtils.getMouthStart(new Date());
        String mouthEnd = DateUtils.getMouthEnd(new Date());
//        if (now.equals(mouthEnd)) {
            //查一个月的记录
            List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd);
            //通过unitId分单位
            Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId));
            //查在线率规则
            List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
            //获取key为合同id,value为在线率规则的map
            Map<Integer, List<CalculateRuleVO>> contractMap = ruleVos.stream().collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
            //准备批量打分的集合
            List<ContractScore> contractScoreList = new ArrayList<>();
            contractMap.forEach((contractId, ruleList) -> {
                //一个合同对应一个单位,因此unitId都相同
                CalculateRuleVO calculateRuleVO = ruleList.get(0);
                Integer unitId = calculateRuleVO.getUnitId();
                List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + ""));
                if (!CollectionUtils.isEmpty(ruleMonthRecords)) {
                    BigDecimal siteOnlineTotal = ruleRecordList.stream().map(ContractRuleRecord::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
                    BigDecimal siteOnline = siteOnlineTotal.divide(new BigDecimal(ruleRecordList.size()), 2, RoundingMode.DOWN);
                    for (CalculateRuleVO ruleVO : ruleList) {
                        Double max = ruleVO.getMax();
                        Double min = ruleVO.getMin();
                        //判断范围在哪个区间
                        if (checkRange(min, max, siteOnline.multiply(new BigDecimal(100)))) {
                            //需要扣除的分数
                            Double deductScore = ruleVO.getCalcFraction();
                            ContractScore contractScore = new ContractScore();
                            contractScore.setContractId(Long.parseLong(contractId + ""));
                            contractScore.setAuditingStatus(AuditingStatus.PASS);
                            contractScore.setAuditingTime(new Date());
                            contractScore.setAuditingUser(Remark);
                            contractScore.setUnitId(Long.parseLong(unitId + ""));
                            contractScore.setRuleId(Long.parseLong(ruleVO.getId() + ""));
                            contractScore.setRuleIds("0," + ruleVO.getId());
                            contractScore.setNum(siteOnline + "");
                            contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc());
                            contractScore.setScore(new BigDecimal(deductScore));
                            contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition());
                            contractScore.setCreateTime(new Date());
                            contractScore.setUpdateTime(new Date());
                            contractScore.setRemark(Remark);
                            contractScoreList.add(contractScore);
                        }
        //查一个月的记录
        List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd);
        //通过unitId分单位
        Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId));
        //查在线率规则 获取key为合同id,value为在线率规则的map
        Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
                .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName()))
                .collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
        //准备批量打分的集合
        List<ContractScore> contractScoreList = new ArrayList<>();
        contractMap.forEach((contractId, ruleList) -> {
            //一个合同对应一个单位,因此unitId都相同
            CalculateRuleVO calculateRuleVO = ruleList.get(0);
            Integer unitId = calculateRuleVO.getUnitId();
            List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + ""));
            if (!CollectionUtils.isEmpty(ruleMonthRecords)) {
                BigDecimal siteOnlineTotal = ruleRecordList.stream().map(ContractRuleRecord::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
                BigDecimal siteOnline = siteOnlineTotal.divide(new BigDecimal(ruleRecordList.size()), 2, RoundingMode.DOWN);
                for (CalculateRuleVO ruleVO : ruleList) {
                    Double max = ruleVO.getMax();
                    Double min = ruleVO.getMin();
                    //判断范围在哪个区间
                    if (checkRange(min, max, siteOnline.multiply(new BigDecimal(100)))) {
                        //需要扣除的分数
                        Double deductScore = ruleVO.getCalcFraction();
                        ContractScore contractScore = new ContractScore();
                        contractScore.setContractId(Long.parseLong(contractId + ""));
                        contractScore.setAuditingStatus(AuditingStatus.PASS);
                        contractScore.setAuditingTime(new Date());
                        contractScore.setAuditingUser(Remark);
                        contractScore.setUnitId(Long.parseLong(unitId + ""));
                        contractScore.setRuleId(Long.parseLong(ruleVO.getId() + ""));
                        contractScore.setRuleIds("0," + ruleVO.getId());
                        contractScore.setNum(siteOnline + "");
                        contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc());
                        contractScore.setScore(new BigDecimal(deductScore));
                        contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition());
                        contractScore.setCreateTime(new Date());
                        contractScore.setUpdateTime(new Date());
                        contractScore.setRemark(Remark);
                        contractScoreList.add(contractScore);
                    }
                }
            });
            }
        });
//        }
        contractScoreService.saveBatch(contractScoreList);
        log.info("结束计算合同点位在线率分数");
@@ -203,4 +207,36 @@
        return true;
    }
    /**
     *   检测工单表 进行合同积分扣除
     *   查出工单需要扣分的所有规则
     *   查出未扣分且已经审核完成了的工单组成map<unitId,List<WorkOrder>> 工单需要连工单故障表查出多个故障类型
     *   循环工单map,每个工单故障类型查对应的规则,根据规则和工单创建时间和审核通过时间进行扣分
     *   插入合同积分表,修改工单状态为已扣分
     */
    public void workOrderDeduct() {
        //查询生效合同对应所有的规则
        List<CalculateRuleVO> calculateRules = contractMapper.getCalculateRule(new Date());
        Map<String, Map<Integer, List<CalculateRuleVO>>> ruleMap = calculateRules.stream()
                .collect(Collectors.groupingBy(
                        CalculateRuleVO::getRuleName,  // 按规则名称分组
                        Collectors.groupingBy(
                                CalculateRuleVO::getContractId // 每个规则名称内部再按合同ID分组,value为规则集合
                        )
                ));
        //前端感知源治理工作(时钟同步规则、OSD规则、一机一档规则) 获取key为合同id,value为规则的map
        Map<Integer, List<CalculateRuleVO>> monitorRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Monitor.getName());
        //存储故障(24小时以内,48小时以内) 获取key为合同id,value为规则的map
        Map<Integer, List<CalculateRuleVO>> storeRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Store.getName());
        //点位异常情况处理 获取key为合同id,value为规则的map
        Map<Integer, List<CalculateRuleVO>> siteRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Site.getName());
    }
    /**
     *  不定期检查数据 扣除积分
     */
    public void randomDeduct() {
    }
}
ycl-server/src/main/resources/mapper/zgyw/TContractMapper.xml
@@ -36,19 +36,12 @@
        order by create_time desc
    </select>
    <select id="selectByRuleName" resultType="com.ycl.platform.domain.vo.CalculateRuleVO">
    <select id="getCalculateRule" resultType="com.ycl.platform.domain.vo.CalculateRuleVO">
        select tc.unit_id ,tcr.*
        from t_contract tc
        left join t_calculate_rule tcr on tc.id = tcr.contract_id
        <where>
            tc.deleted =0 and #{date} between tc.start_time and tc.end_time
            <if test="ruleName !=null and ruleName!=''">
                and tcr.rule_name = #{ruleName}
            </if>
            <if test="ruleCondition !=null and ruleCondition!=''">
                and tcr.rule_condition = #{ruleCondition}
            </if>
        </where>
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -14,6 +14,7 @@
        <result column="yw_condition" property="ywCondition"/>
        <result column="yw_check_result" property="ywCheckResult"/>
        <result column="overtime" property="overtime"/>
        <result column="deduct" property="deduct"/>
    </resultMap>
    <select id="page" resultType="com.ycl.platform.domain.vo.WorkOrderVO">