zxl
2025-05-12 49067588d021a8dce13d9857c4a032daaa68f646
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -35,6 +35,7 @@
import com.ycl.utils.http.HttpUtils;
import com.ycl.utils.redis.RedisCache;
import com.ycl.utils.uuid.IdUtils;
import constant.ApiConstants;
import constant.Constants;
import constant.RedisConstant;
import enumeration.ErrorType;
@@ -59,7 +60,9 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import pojo.CascadeOption;
import utils.file.FileUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -214,6 +217,7 @@
        }
        List<String> willAddSerialNumber = waitAddList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList());
        //只生成考核设备、且有运维单位的工单
        List<YwPoint> pointList = new LambdaQueryChainWrapper<>(ywPointService.getBaseMapper())
                .select(YwPoint::getUnitId, YwPoint::getSerialNumber, YwPoint::getImportantTag, YwPoint::getImportantTag, YwPoint::getImportantCommandImageTag)
                .in(YwPoint::getSerialNumber, willAddSerialNumber)
@@ -286,6 +290,7 @@
            }
            log.info("即将生成的工单:{}", workOrder);
        }
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        // 保存工单和故障类型
@@ -471,18 +476,22 @@
                UrgentLevelEnum.WARNING,
                workOrder.getWorkOrderNo());
        notifyService.save(notify);
        List<String> errorList = workOrderErrorTypeMapper.getErrorList(workOrder.getWorkOrderNo())
                .stream().map(SysDictData::getDictValue).collect(Collectors.toList());
        List<WorkOrderVO> workOrderVOS = workOrderErrorTypeMapper.getErrorListByNumbers(Arrays.asList(workOrder.getWorkOrderNo()));
        // 同步点位状态
        if (form.getAuditingResult() == WorkOrderStatusEnum.AUDITING_SUCCESS) {
            ywPointService.updateRecovery(Collections.singletonList(workOrder.getSerialNumber()), 0);
            //如果工单为离线工单那么修改点位pingOnline为在线
            if(!CollectionUtils.isEmpty(errorList) && errorList.contains(ErrorType.DEVICE_OFFLINE.getValue())){
                new LambdaUpdateChainWrapper<>(ywPointMapper)
                        .eq(YwPoint::getSerialNumber, workOrder.getSerialNumber())
                        .set(YwPoint::getUpdateTime, new Date())
                        .set(YwPoint::getPingOnline, 1)
                        .update();
            if (!CollectionUtils.isEmpty(workOrderVOS)) {
                List<String> ips = new ArrayList<>();
                for (WorkOrderVO workOrderVO : workOrderVOS) {
                    if(ErrorType.DEVICE_OFFLINE.getValue().equals(workOrderVO.getErrorType())){
                        ips.add(workOrderVO.getIp());
                    }
                }
                if(!CollectionUtils.isEmpty(ips)) {
                    monitorMapper.batchUpdateOnline(ips, new Date(), ApiConstants.UY_OnlineSite_Online);
                }
            }
        }
@@ -525,11 +534,30 @@
                    workOrder.getWorkOrderNo());
            notifies.add(notify);
        }
        notifyService.saveBatch(notifies);
        // 同步点位状态
        if (form.getAuditingResult() == WorkOrderStatusEnum.AUDITING_SUCCESS) {
            ywPointService.updateRecovery(serialNumbers, 0);
            //筛选出离线工单ip并修改在线状态
            if (!CollectionUtils.isEmpty(serialNumbers)) {
                Map<String, List<String>> errorTypes = workOrderErrorTypeMapper.getErrorListByNumbers(workOrderNoList).stream().collect(Collectors.groupingBy(
                        WorkOrderVO::getIp,
                        Collectors.mapping(
                                WorkOrderVO::getErrorType,
                                Collectors.toList()
                        )
                ));
                List<String> ips = new ArrayList<>();
                errorTypes.forEach((key, value) -> {
                    if (!CollectionUtils.isEmpty(value) && value.contains(ErrorType.DEVICE_OFFLINE.getValue())) {
                        ips.add(key);
                    }
                });
                if(!CollectionUtils.isEmpty(ips)) {
                    monitorMapper.batchUpdateOnline(ips, new Date(), ApiConstants.UY_OnlineSite_Online);
                }
            }
        }
        notifyService.saveBatch(notifies);
        return Result.ok("操作成功");
    }
@@ -581,6 +609,30 @@
            img.setWorkOrderNo(workOrder.getWorkOrderNo());
            img.setImgUrl(frameImg);
            img.setCreateTime(new Date());
            //判断该工单的图片是否已经大于5张了
            LambdaQueryChainWrapper<WorkOrderCheckImg> qw = new LambdaQueryChainWrapper<>(workOrderCheckImgMapper);
            //按照创建日期降序排列
            List<WorkOrderCheckImg> workOrderList = workOrderCheckImgMapper.selectList(
                    new LambdaQueryChainWrapper<>(workOrderCheckImgMapper)
                            .eq(WorkOrderCheckImg::getWorkOrderNo, workOrder.getWorkOrderNo())
                            .orderByDesc(WorkOrderCheckImg::getCreateTime)
            );
            //保留最新的5张
            if (workOrderList.size()>=5){
                List<String> imgList = workOrderList.subList(4,workOrderList.size()).stream().map(WorkOrderCheckImg::getImgUrl).collect(Collectors.toList());
                List<Integer> idList = workOrderList.subList(4, workOrderList.size()).stream().map(WorkOrderCheckImg::getId).collect(Collectors.toList());
                //删除照片 ,并且物理删除服务器内对应照片的名字
//                /profile/2024-11-18_1d8e6d37-a4d0-4bba-8473-ff4e50eda83d.png
                for (String filePath: imgList){
                    delImgFormClient(filePath);
                }
                workOrderCheckImgMapper.deleteBatchIds(idList);
            }
            workOrderCheckImgMapper.insert(img);
        }
    }
@@ -626,9 +678,28 @@
    @Override
    public Result remove(List<String> ids) {
        if (baseMapper.deleteBatchIds(ids) > 0) {
            //批量删除是否被用到?
            return Result.ok("删除成功");
        }
        return Result.error("删除失败");
    }
    /***
     * 通过url删除服务器内的图片
     * @param url
     */
    public void delImgFormClient(String url){
        //提取文件名  /profile/2024-11-17_79c02666-da1e-45ba-9f29-7523c848fa4a.png
        // 这部分2024-11-17_79c02666-da1e-45ba-9f29-7523c848fa4a.png
        String imgPath = FileUtils.getImgName(url);
        if (imgPath.isEmpty()){
            log.error("url错误:{}",imgPath);
        }else{
            //提取日期部分 组装目录 : /opt/zgyw/uploadPath  + /  + yyyy-MM-dd +
            String pathName = PlatformConfig.getUploadPath() + "/" + FileUtils.extractDateFromString(url);
            FileUtils.deleteFile(pathName+"/" + imgPath);
        }
    }
    /**
@@ -643,6 +714,18 @@
        String workOrderNo = workOrder.getWorkOrderNo();
        //删除工单审核记录
        workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().eq("work_order_no", workOrderNo));
        //需要物理删除服务器中的图片
        //查询到工单照片集合
        List<String> workOrderImg = workOrderCheckImgMapper
                .selectList(new QueryWrapper<WorkOrderCheckImg>().eq("work_order_no", workOrderNo))
                .stream().map(WorkOrderCheckImg::getImgUrl).collect(Collectors.toList());
        log.error("删除工单图片集合:{}",workOrderImg);
        log.error("删除路径:{}",PlatformConfig.getUploadPath());
        for (String filePath: workOrderImg){
            delImgFormClient(filePath);
        }
        //删除工单图片记录
        workOrderCheckImgMapper.delete(new QueryWrapper<WorkOrderCheckImg>().eq("work_order_no", workOrderNo));
        //删除工单下发记录
@@ -657,6 +740,9 @@
        }
        return Result.error("删除失败");
    }
    /**
     * 分页查询
@@ -721,6 +807,11 @@
    }
    @Override
    public List<WorkOrderVO> distributeList(){
        return  baseMapper.distributeList();
    }
    @Override
    @Transactional
    public Result distributeFast(DistributeWorkOrderVO data) {
        // 获取当前时间
@@ -776,6 +867,9 @@
            distributeUnLock();
        }
    }
    @Override
    @Transactional
@@ -1123,6 +1217,11 @@
    @Override
    public Result detailByNo(String workOrderNo) {
        WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo);
        //报空原因1. sql 中 inner join 表 t_work_order_distribute_record 中 无与该表关联的记录 wo.work_order_no = dr.work_order_no
        if(workOrder == null){
            workOrder = baseMapper.detailByNoButNoDistributeRecord(workOrderNo);
        }
        // 是否报备
        boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper)
                .eq(Report::getSerialNumber, workOrder.getSerialNumber())
@@ -1141,6 +1240,9 @@
        workOrder.setImgList(imgList);
        return Result.ok().data(workOrder);
    }
    @Autowired
    private WorkOrderMapper workOrderMapper;
    /**
     * 工单导出的逻辑
@@ -1171,6 +1273,30 @@
            query.setErrorTypeList(errorTypeList);
        }
        List<WorkOrderVO> export = baseMapper.export(query);
        List<String> workOrderNos = export.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())));
        if (!CollectionUtils.isEmpty(workOrderNos)){
           export.forEach(workOrderVO -> {
               List<Date> auditTimes = auditTimeMap.get(workOrderVO.getWorkOrderNo());
               if (!CollectionUtils.isEmpty(auditTimes)){
                   //审核通过时间
                   Date passTime = Collections.max(auditTimes);
                   ZoneId zoneId = ZoneId.systemDefault();
                   workOrderVO.setPassTime(passTime.toInstant().atZone(zoneId).toLocalDateTime());
               }
           });
        }
        if (CollectionUtils.isEmpty(export)) return new ArrayList<WorkOrderVO>();
        List<String> ips = export.stream().map(WorkOrderVO::getIp).collect(Collectors.toList());
        //查出相同ip的设备、并查出标签