fuliqi
2024-09-30 3351ade035a3a027d38e0372e496a5669cd7bde2
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1,5 +1,6 @@
package com.ycl.platform.service.impl;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -55,6 +56,12 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -93,7 +100,6 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    //TODO:Redis加锁,从Redis读取当日工单数据量
    public synchronized Boolean innerAddWorkOrder(List<WorkOrder> workOrderList) {
        int total = workOrderList.size();
        workOrderList.stream().filter(item -> {
@@ -199,7 +205,7 @@
        // 如果即将生成工单,但是设备国标码查不到点位,则不添加?
        List<WorkOrder> notAddList = new ArrayList<>();
        //查redis今日工单数量
        int workOrderNum = 1;
        int workOrderNum = 0;
        //UUID作为value,保证上锁的线程自己解锁
        String requestId = IdUtils.fastSimpleUUID();
        try {
@@ -208,7 +214,7 @@
                if (result) {
                    //查今日工单量
                    Object redisNum = redisCache.getCacheObject(RedisConstant.WORKORDER_NUM);
                    workOrderNum = redisNum == null ? 1 : (Integer) redisNum;
                    workOrderNum = redisNum == null ? 0 : (Integer) redisNum;
                    break;
                } else {
                    if (i == 2) {
@@ -216,16 +222,13 @@
                        return Boolean.FALSE;
                    }
                    //等待一段时间后继续
                    Thread.sleep(3000);
                    Thread.sleep(5000);
                }
            }
        } catch (InterruptedException e) {
            log.error("获取锁异常");
            return Boolean.FALSE;
        } finally {
            redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        }
        for (WorkOrder workOrder : waitAddList) {
            YwPoint point = pointMapping.get(workOrder.getSerialNumber());
            if (Objects.isNull(point)) {
@@ -233,8 +236,8 @@
                continue;
            }
            //数字前面补0
            workOrder.setWorkOrderNo(IdUtils.randomNO(now, String.format("%05d", workOrderNum)));
            workOrderNum++;
            workOrder.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum)));
            if (Objects.nonNull(point.getUnitId())) {
                workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            }
@@ -259,6 +262,7 @@
        }
        //记录工单数
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        // 保存工单和故障类型
        baseMapper.addMany(waitAddList);
        if (!CollectionUtils.isEmpty(waitAddErrorTypeList)) {
@@ -302,6 +306,8 @@
            //查今日工单量
            Object redisNum = redisCache.getCacheObject(RedisConstant.WORKORDER_NUM);
            workOrderNum = redisNum == null ? 1 : (Integer) redisNum;
            workOrderNum++;
            redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
            redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        } else {
            return Result.error("工单正在添加,请稍后再试");
@@ -312,9 +318,7 @@
        Date now = new Date();
        entity.setCreateTime(now);
        entity.setUpdateTime(now);
        entity.setWorkOrderNo(IdUtils.randomNO(now, String.format("%05d", workOrderNum)));
        workOrderNum++;
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        entity.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum)));
        entity.setErrorType(String.join(",", form.getErrorType()));
        List<WorkOrderErrorType> workOrderErrorTypes = form.getErrorType().stream().map(errorType -> new WorkOrderErrorType(entity.getWorkOrderNo(), errorType)).toList();
        workOrderErrorTypeService.getBaseMapper().insertWorkOrderErrorTypeList(workOrderErrorTypes);
@@ -560,7 +564,7 @@
                .select(WorkOrder::getSerialNumber, WorkOrder::getWorkOrderNo)
                .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                .eq(Objects.nonNull(data.getUnitId()), WorkOrder::getUnitId, data.getUnitId())
                .eq(WorkOrder::getErrorType, data.getErrorType())
                .in(WorkOrder::getErrorType, data.getErrorType())
                .between(WorkOrder::getCreateTime, data.getStart(), data.getEnd())
                .orderByDesc(WorkOrder::getCreateTime)
                .last("limit " + data.getFastNumLimit())
@@ -622,6 +626,7 @@
            ywPointService.updateRecovery(serialNumberList, 1);
            return Result.ok("成功下发" + query.getWorkOrderNOList().size() + "条工单");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return Result.error("操作失败");
        } finally {
            distributeUnLock();
@@ -766,8 +771,6 @@
                FFmpegFrameGrabber grabber = null;
                try {
                    grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
                    //设置10s超时
                    grabber.setTimeout(10000);
                    grabber.start();
                    Frame frame = grabber.grabImage(); // 直接捕获一帧
                    if (frame != null) {
@@ -786,17 +789,16 @@
                    } else {
                        System.out.println("未捕获到帧");
                    }
                } catch (FrameGrabber.Exception e) {
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (grabber != null) {
                        try {
                            grabber.stop(); // 停止捕获
                            grabber.release();
                        } catch (FrameGrabber.Exception e) {
                            e.printStackTrace();
                        }
                        // 通常不需要调用release(),因为stop()会处理资源释放
                        // grabber.release(); // 释放资源
                    }
                }
            }
@@ -944,4 +946,25 @@
        workOrder.setImgList(imgList);
        return Result.ok().data(workOrder);
    }
    @Override
    public List<WorkOrderVO> export(WorkOrderExportQuery query) {
        query.setUnitId(SecurityUtils.getUnitId());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (query.getStart() == null) {
            query.setStart(format.format(DateUtils.getDayStart(new Date())));
        } else {
            query.setStart(query.getStart() + " 00:00:00");
        }
        if (query.getEnd() == null) {
            query.setStart(format.format(DateUtils.getDayEnd(new Date())));
        } else {
            query.setEnd(query.getEnd() + " 23:59:59");
        }
        List<WorkOrderVO> export = baseMapper.export(query);
        System.out.println(export);
        return export;
    }
}