xiangpei
2024-08-23 96e520a9c5407310d03792b6012195f516f0233b
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -28,7 +28,10 @@
import com.ycl.platform.wvp.WVPResult;
import com.ycl.system.Result;
import com.ycl.system.domain.SysConfig;
import com.ycl.system.entity.SysDictData;
import com.ycl.system.mapper.SysConfigMapper;
import com.ycl.system.mapper.SysDictDataMapper;
import com.ycl.system.mapper.SysDictTypeMapper;
import com.ycl.system.model.LoginUser;
import com.ycl.system.page.PageUtil;
import com.ycl.utils.DateUtils;
@@ -59,6 +62,7 @@
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -79,10 +83,11 @@
    private final WorkOrderYwConditionRecordMapper workOrderYwConditionRecordMapper;
    private final NotifyService notifyService;
    private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper;
    private final TMonitorMapper monitorMapper;
    private final WorkOrderErrorTypeServiceImpl workOrderErrorTypeService;
    private final SysConfigMapper configMapper;
    private final ServerConfig serverConfig;
    private final ReportMapper reportMapper;
    private final SysDictDataMapper dictDataMapper;
    @Value("${rtsp.server:http://127.0.0.1:7788}")
    private String rtspServer;
@@ -106,27 +111,36 @@
        List<String> serialNumberList = workOrderList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList());
        // 查出数据库中国标码对应的未完成的工单
        List<WorkOrder> inDatabaseWorkOrderList = new LambdaQueryChainWrapper<>(baseMapper)
                .select(WorkOrder::getId, WorkOrder::getSerialNumber, WorkOrder::getStatus, WorkOrder::getErrorType)
                .select(WorkOrder::getId, WorkOrder::getSerialNumber, WorkOrder::getStatus, WorkOrder::getWorkOrderNo)
                .in(WorkOrder::getSerialNumber, serialNumberList)
                .ne(WorkOrder::getStatus, WorkOrderStatusEnum.AUDITING_SUCCESS)
                .list();
        Map<String, WorkOrder> mapping = inDatabaseWorkOrderList.stream().collect((Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder)));
        List<WorkOrder> waitAddList = new ArrayList<>(48);
        List<WorkOrderErrorType> waitAddErrorTypeList = new ArrayList<>(48);
        Integer updateNum = 0;
        Date now = new Date();
        for (WorkOrder workOrder : workOrderList) {
            WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber());
            if (Objects.nonNull(databaseWorkOrder)) {
                String errorType = databaseWorkOrder.getErrorType();
                if (workOrder.getErrorType().equals(errorType)) {
                List<String> errorNameList = workOrderErrorTypeService.getBaseMapper().getNotFinishWorkOrderErrors(workOrder.getWorkOrderNo());
                List<String> errorTypes = workOrder.getErrorTypeList();
                if (errorNameList.containsAll(errorTypes)) {
                    // 如果,国标码、故障类型都一样,则跳过不处理
                    continue;
                } else {
                    // 错误类型不一样,就更新错误类型,并且重置工单状态为待处理
                    errorType = errorType + "," + workOrder.getErrorType();
                    databaseWorkOrder.setErrorType(errorType);
                    for (String errorType : errorTypes) {
                        if (! errorNameList.contains(errorType)) {
                            // 错误类型不一样,就新增一个错误类型,并且重置工单状态为待处理
                            WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType();
                            workOrderErrorType.setWorkOrderNo(databaseWorkOrder.getWorkOrderNo());
                            workOrderErrorType.setCreateTime(now);
                            workOrderErrorType.setUpdateTime(now);
                            workOrderErrorType.setErrorName(errorType);
                            workOrderErrorTypeService.save(workOrderErrorType);
                        }
                    }
                    databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                    Date now = new Date();
                    databaseWorkOrder.setUpdateTime(now);
                    baseMapper.updateById(databaseWorkOrder);
                    updateNum++;
@@ -141,11 +155,11 @@
            } else {
                workOrder.setCreateTime(new Date());
                workOrder.setUpdateTime(new Date());
                // 如果报备过,使用最新报备的错误类型
                Report report = reportMapper.checkPointReported(workOrder.getSerialNumber());
                if (Objects.nonNull(report)) {
                    workOrder.setErrorType(report.getErrorType());
                }
//                // 如果报备过,使用最新报备的错误类型
//                Report report = reportMapper.checkPointReported(workOrder.getSerialNumber());
//                if (Objects.nonNull(report)) {
//                    workOrder.setErrorType(report.getErrorType());
//                }
                waitAddList.add(workOrder);
            }
        }
@@ -170,26 +184,40 @@
                continue;
            }
            workOrder.setWorkOrderNo(IdUtils.timeAddRandomNO(5));
            workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            if (Objects.nonNull(point.getUnitId())) {
                workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            }
            if (point.getImportantTag() || point.getImportantCommandImageTag()) {
                workOrder.setProcessingPeriod(Integer.valueOf(important.getConfigValue()));
            } else {
                workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue()));
            }
            // 保存错误类型
            for (String errorType : workOrder.getErrorTypeList()) {
                WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType();
                workOrderErrorType.setWorkOrderNo(workOrder.getWorkOrderNo());
                workOrderErrorType.setCreateTime(now);
                workOrderErrorType.setUpdateTime(now);
                workOrderErrorType.setErrorName(errorType);
                waitAddErrorTypeList.add(workOrderErrorType);
            }
        }
        waitAddList.removeAll(notAddList);
        if (CollectionUtils.isEmpty(waitAddList)) {
            return Boolean.TRUE;
        }
        this.saveBatch(waitAddList);
        // 保存工单和故障类型
        baseMapper.addMany(waitAddList);
        if (! CollectionUtils.isEmpty(waitAddErrorTypeList)) {
            workOrderErrorTypeService.getBaseMapper().addMany(waitAddErrorTypeList);
        }
        // 如果是直接下发,添加下发记录
        if (WorkOrderStatusEnum.DISTRIBUTED.equals(waitAddList.get(0).getStatus())) {
            List<WorkOrderDistributeRecord> distributedRecordList = waitAddList.stream().map(item -> {
                WorkOrderDistributeRecord workOrderDistributeRecord = new WorkOrderDistributeRecord();
                workOrderDistributeRecord.setWorkOrderId(item.getId());
                workOrderDistributeRecord.setWorkOrderNo(item.getWorkOrderNo());
                workOrderDistributeRecord.setDistributeWay(WorkOrderDistributeWayEnum.DIRECT_DISTRIBUTE);
                workOrderDistributeRecord.setUserId(1L);
                Date now = new Date();
                workOrderDistributeRecord.setCreateTime(now);
                workOrderDistributeRecord.setUpdateTime(now);
                return workOrderDistributeRecord;
@@ -214,6 +242,9 @@
        Date now = new Date();
        entity.setCreateTime(now);
        entity.setUpdateTime(now);
        entity.setErrorType(String.join(",", form.getErrorType()));
        List<WorkOrderErrorType> workOrderErrorTypes = form.getErrorType().stream().map(errorType -> new WorkOrderErrorType(entity.getWorkOrderNo(), errorType)).toList();
        workOrderErrorTypeService.getBaseMapper().insertWorkOrderErrorTypeList(workOrderErrorTypes);
        if(baseMapper.insert(entity) > 0) {
            return Result.ok("添加成功");
        }
@@ -439,20 +470,20 @@
                .orderByDesc(WorkOrder::getCreateTime)
                .last("limit " + data.getFastNumLimit())
                .list();
        List<Integer> ids = list.stream().map(WorkOrder::getId).toList();
        List<String> workOrderNoList = list.stream().map(WorkOrder::getWorkOrderNo).toList();
        List<String> serialNumberList = list.stream().map(WorkOrder::getSerialNumber).toList();
        if (ids.isEmpty()) { return Result.error("没有符合条件的工单"); }
        if (workOrderNoList.isEmpty()) { return Result.error("没有符合条件的工单"); }
        if (!getDistributeLock()) { return Result.error("此刻有人下发中,为避免冲突,请稍后重试"); }
        try {
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                    .in(WorkOrder::getId, ids)
                    .in(WorkOrder::getWorkOrderNo, workOrderNoList)
                    .update();
            addDistributeRecord(ids, WorkOrderDistributeWayEnum.FAST_DISTRIBUTE);
            addDistributeRecord(workOrderNoList, WorkOrderDistributeWayEnum.FAST_DISTRIBUTE);
            // 同步点位状态
            ywPointService.updateRecovery(serialNumberList, 1);
            return Result.ok("成功下发" + ids.size() + "条工单");
            return Result.ok("成功下发" + workOrderNoList.size() + "条工单");
        } catch (Exception e) {
            return Result.error("操作失败");
        } finally {
@@ -466,27 +497,27 @@
        WorkOrderDistributeWayEnum distributeWayEnum = WorkOrderDistributeWayEnum.SELECTED_DISTRIBUTE;
        if (!getDistributeLock()) { return Result.error("此刻有人下发中,为避免冲突,请稍后重试"); }
        try {
            if (query.getIds().isEmpty()) {
                query.setIds(new LambdaQueryChainWrapper<>(baseMapper)
            if (query.getWorkOrderNOList().isEmpty()) {
                query.setWorkOrderNOList(new LambdaQueryChainWrapper<>(baseMapper)
                        .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                        .eq(Objects.nonNull(query.getUnitId()), WorkOrder::getUnitId, query.getUnitId())
                        .select(WorkOrder::getId)
                        .list()
                        .stream()
                        .map(WorkOrder::getId)
                        .map(WorkOrder::getWorkOrderNo)
                        .collect(Collectors.toList()));
                distributeWayEnum = WorkOrderDistributeWayEnum.ALL_DISTRIBUTE;
            }
            if (query.getIds().isEmpty()) { return Result.error("没有工单待下发"); }
            if (query.getWorkOrderNOList().isEmpty()) { return Result.error("没有工单待下发"); }
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                    .in(WorkOrder::getId, query.getIds())
                    .in(WorkOrder::getWorkOrderNo, query.getWorkOrderNOList())
                    .update();
            addDistributeRecord(query.getIds(), distributeWayEnum);
            addDistributeRecord(query.getWorkOrderNOList(), distributeWayEnum);
            // 同步点位状态
            List<String> serialNumberList = new LambdaQueryChainWrapper<>(baseMapper).select(WorkOrder::getSerialNumber).in(WorkOrder::getId, query.getIds()).list().stream().map(WorkOrder::getSerialNumber).toList();
            List<String> serialNumberList = new LambdaQueryChainWrapper<>(baseMapper).select(WorkOrder::getSerialNumber).in(WorkOrder::getId, query.getWorkOrderNOList()).list().stream().map(WorkOrder::getSerialNumber).toList();
            ywPointService.updateRecovery(serialNumberList, 1);
            return Result.ok("成功下发" + query.getIds().size() + "条工单");
            return Result.ok("成功下发" + query.getWorkOrderNOList().size() + "条工单");
        } catch (Exception e) {
            return Result.error("操作失败");
        } finally {
@@ -500,7 +531,7 @@
     */
    public synchronized Boolean getDistributeLock() {
        if (Objects.isNull(redisCache.getCacheObject(DISTRIBUTE_LOCK_KEY))) {
            redisCache.setCacheObject(DISTRIBUTE_LOCK_KEY, "1");
            redisCache.setCacheObject(DISTRIBUTE_LOCK_KEY, "1", 30, TimeUnit.SECONDS);
            return true;
        } else {
            return false;
@@ -516,13 +547,13 @@
    /**
     * 添加工单下发记录
     * @param ids 工单id
     * @param workOrderNoList 工单id
     */
    private void addDistributeRecord(List<Integer> ids, WorkOrderDistributeWayEnum distributeWay) {
    private void addDistributeRecord(List<String> workOrderNoList, WorkOrderDistributeWayEnum distributeWay) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        workOrderDistributeRecordMapper.insertBatch(
                ids.stream()
                        .map(id -> new WorkOrderDistributeRecord(id, loginUser.getUserId(), distributeWay))
                workOrderNoList.stream()
                        .map(no -> new WorkOrderDistributeRecord(no, loginUser.getUserId(), distributeWay))
                        .toList()
        );
    }