fuliqi
2025-01-16 23302186a81c1b6f3e5f398f21b057350bfd34e8
工单扣分处理时间调整逻辑
5个文件已修改
112 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ContractTask.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -119,7 +119,6 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date distributeTime;
    private Date auditTime;
    /** 下发人 */
    private String realName;
@@ -127,6 +126,12 @@
     * 是否扣过积分
     */
    private Boolean deduct;
    //处理时间点集合
    private List<Date> handleTimeList;
    private Date handleTime;
    //审核时间点集合
    private List<Date> auditTimeList;
    private Date auditTime;
    public static WorkOrderVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderVO vo) {
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -77,7 +77,7 @@
     */
    List<DeviceInfoVO> hasErrorWorkOrderList(@Param("start") Date start, @Param("end") Date end);
    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("auditStatus") String auditStatus);
    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("errorList") List<String> errorList);
    int addMany(@Param("workOrderList") List<WorkOrder> workOrderList);
@@ -117,4 +117,8 @@
    List<String> getOfflineWorkOrder();
    List<WorkOrderVO> getAuditTimeList(@Param("workOrderNos")List<String> workOrderNos);
    List<WorkOrderVO> getHandleTimeList(@Param("workOrderNos")List<String> workOrderNos);
}
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -194,7 +194,32 @@
        LocalDateTime endTime = LocalDateTime.now();
        // 计算30天前的日期
        LocalDateTime startTime = endTime.minusDays(30);
        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "审核通过");
        //自动扣分的工单故障类型
        List<String> deductErrorType = new ArrayList<>();
        deductErrorType.add(ErrorType.OSD_ERROR.getValue());
        deductErrorType.add(ErrorType.ABNORMAL_PIC.getValue());
        deductErrorType.add(ErrorType.POINT_INFO_ERROR.getValue());
        deductErrorType.add(ErrorType.CLOCK_SKEW.getValue());
        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType);
        //存在有两种扣分的故障 只扣减第一个故障
        Map<String, WorkOrderVO> map = workOrders.stream()
                .collect(Collectors.toMap(
                        WorkOrderVO::getWorkOrderNo,
                        Function.identity(),
                        (older, newer) -> older.getDistributeTime().compareTo(newer.getDistributeTime()) <= 0 ? older : newer
                ));
        workOrders = new ArrayList<>(map.values());
        List<String> workOrderNos = workOrders.stream().map(WorkOrderVO::getWorkOrderNo).collect(Collectors.toList());
        List<WorkOrderVO> auditTimeList = workOrderMapper.getAuditTimeList(workOrderNos);
        Map<String, List<Date>> auditTimeMap = auditTimeList.stream()
                .collect(Collectors.groupingBy(
                        WorkOrderVO::getWorkOrderNo, // 分组的键
                        Collectors.mapping(WorkOrderVO::getAuditTime, Collectors.toList())));
        List<WorkOrderVO> handleTimeList = workOrderMapper.getHandleTimeList(workOrderNos);
        Map<String, List<Date>> handleTimeMap = handleTimeList.stream()
                .collect(Collectors.groupingBy(
                        WorkOrderVO::getWorkOrderNo, // 分组的键
                        Collectors.mapping(WorkOrderVO::getHandleTime, Collectors.toList())));
        for (WorkOrderVO workOrder : workOrders) {
            //检测是否报备过
            if (!CollectionUtils.isEmpty(reportNumbers)) {
@@ -227,7 +252,7 @@
//                }
//            }
            //前端感知源治理工作(时钟同步规则、OSD规则、一机一档规则)
            if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
            if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
                if (!CollectionUtils.isEmpty(monitorRuleMap)) {
                    monitorRuleMap.forEach((contractId, rules) -> {
                        Integer unitId = rules.get(0).getUnitId();
@@ -235,8 +260,14 @@
                        if (workOrder.getUnitId().equals(unitId)) {
                            //工单下发时间
                            Date createTime = workOrder.getDistributeTime();
                            Date auditTime = workOrder.getAuditTime();
                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
                            List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
                            List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
                            //拿到审核时间
                            long auditDuration = getAuditDuration(auditTimes, handleTimes);
                            //审核通过时间
                            Date passTime = Collections.max(auditTimes);
                            //处理花费总时长
                            double diffTime = (double) (passTime.getTime() - createTime.getTime() - auditDuration) / (1000 * 60 * 60);
                            //找到对应规则、选择时间范围内的规则
                            for (CalculateRuleVO rule : rules) {
                                if(ErrorType.OSD_ERROR.getValue().equals(errorType)){
@@ -267,8 +298,13 @@
                        if (workOrder.getUnitId().equals(unitId)) {
                            //工单下发时间
                            Date createTime = workOrder.getDistributeTime();
                            Date auditTime = workOrder.getAuditTime();
                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
                            List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
                            List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
                            //拿到审核时间
                            long auditDuration = getAuditDuration(auditTimes, handleTimes);
                            //审核通过时间
                            Date passTime = Collections.max(auditTimes);
                            double diffTime = (double) (passTime.getTime() - createTime.getTime() -auditDuration) / (1000 * 60 * 60);
                            //选择时间范围内的规则
                            for (CalculateRuleVO rule : rules) {
                                if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) {
@@ -302,6 +338,27 @@
        log.info("结束执行工单扣分");
    }
    private long getAuditDuration(List<Date> auditTimes, List<Date> handleTimes) {
        //计算出审核的总时间(由于故障类型会更新导致可能提交的时间点数量和审核的时间点数量不一致)
        long auditDuration = 0;
        for (Date auditTime : auditTimes) {
            //离这次审核最近的一次提交处理时间点
            Date nearestHandleTime = null;
            long minDifference = Long.MAX_VALUE;
            for (Date handleTime : handleTimes) {
                if(handleTime.before(auditTime)) {
                    long difference = Math.abs(auditTime.getTime() - handleTime.getTime());
                    if (difference < minDifference) {
                        minDifference = difference;
                        nearestHandleTime = handleTime;
                    }
                }
            }
            auditDuration += auditTime.getTime()-nearestHandleTime.getTime();
        }
        return auditDuration;
    }
    /**
     * 不定期检查数据 扣除积分
ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml
@@ -98,7 +98,11 @@
    </insert>
    <select id="getErrorList" resultType="com.ycl.system.entity.SysDictData">
        SELECT da.dict_value, da.dict_label FROM t_work_order_error_type oer INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value WHERE oer.work_order_no = #{workOrderNo}
        SELECT da.dict_value, da.dict_label
        FROM t_work_order_error_type oer
            INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value
        WHERE oer.work_order_no = #{workOrderNo}
        ORDER BY oer.create_time
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -359,12 +359,16 @@
    </insert>
    <select id="selectPassOrder" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
        SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime,woar.create_time as auditTime
        SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime
        FROM t_work_order wo
        LEFT JOIN t_work_order_error_type woet ON woet.work_order_no = wo.work_order_no
        LEFT JOIN t_work_order_auditing_record woar ON woar.work_order_no = wo.work_order_no
        WHERE wo.deleted = 0 AND wo.status = #{status}  AND woar.result = #{auditStatus}
        AND wo.deduct = 0 AND woar.create_time between #{startTime} and #{endTime}
        WHERE wo.deleted = 0 AND wo.deduct = 0 AND wo.status = #{status}
        AND woet.error_name in
        <foreach collection="errorList" item="error" separator="," open="(" close=")">
            #{error}
        </foreach>
        AND woar.create_time between #{startTime} and #{endTime} and woar.result = #{auditStatus}
    </select>
    <update id="updateMany">
@@ -467,4 +471,18 @@
            </foreach>
        </where>
    </select>
    <select id="getAuditTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
        select work_order_no ,create_time as auditTime from t_work_order_auditing_record where work_order_no in
        <foreach collection="workOrderNos" item="no" open="(" close=")" separator=",">
            #{no}
        </foreach>
    </select>
    <select id="getHandleTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
        select work_order_no ,create_time as handleTime from t_work_order_yw_condition_record
        where sys_msg = 0 and  work_order_no in
        <foreach collection="workOrderNos" item="no" open="(" close=")" separator=",">
            #{no}
        </foreach>
    </select>
</mapper>