fuliqi
2024-11-12 397eda7e04fd23016ba55b1b12af63bfeb00e482
bug+检测按钮+新的故障下拉框+工单删除+记录检测离线具体时间点等等
20个文件已修改
1个文件已添加
441 ■■■■ 已修改文件
ycl-common/src/main/java/enumeration/ErrorType.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/pojo/CascadeOption.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/query/DistributeWorkOrderQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderExportQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderQuery.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderYwConditionRecordVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/WorkOrderController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ContractTask.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/MonitorTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderYwConditionRecordMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/YwUnitMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/enumeration/ErrorType.java
@@ -3,52 +3,70 @@
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author:xp
 * @date:2024/8/19 11:39
 */
@Getter
public enum ErrorType {
    PLATFORM_OFFLINE("PLATFORMOFFLINE", "平台离线"),
    SEVER_INTERRUPT("SEVERINTERRUPT", "服务中断"),
    DEVICE_OFFLINE("DEVICEOFFLINE", "设备离线"),
    VIDEO_LOSS("VIDEOMISS", "录像缺失"),
    VIDEO_NONE("NOVIDEO", "无录像"),
    POINT_INFO_ERROR("POINTINFOERRO", "点位信息错误"),
    POINT_INFO_MISS("POINTINFOMISS", "点位信息不全"),
    SIGNAL_LOSS("SIGNALMISS", "信号缺失"),
    SCREEN_COLOR_DEVIATION("SCREENCOLOR", "画面偏色"),
    SNOW_STORM("SCREENSNOW", "雪花干扰"),
    STRIPE_INTERFERENCE("SCREENSTRIP", "条纹干扰"),
    SCREEN_OCCLUSION("SCREENSHADE", "画面遮挡"),
    ABNORMAL_CLARITY("SCREENBLUR", "清晰度异常"),
    ABNORMAL_BRIGHTNESS("SCREENLIGHT", "亮度异常"),
    UNKNOWN("UNKNOWN", "未知"),
    CLOCK_SKEW("CLOCKSKEW", "时钟偏差"),
    OSD_ERROR("OSD", "osd异常"),
    PIC_URLABNORMAL("PICURLABNORMAL","图片访问异常"),
    MONITOR_UNQUALIFY("MONITORUNQUALIFY", "一机一档不合格"),
    PIC_UNUSEFUL("PICUNUSEFUL", "大图不可用"),
    VIDEO_ORPIC_UNNORMAL("VIDEOORPICUNNORMAL", "视频拉流、图片获取异常"),
    //通用
//    PLATFORM_OFFLINE("PLATFORMOFFLINE", "平台离线","COMMON"),
//    SEVER_INTERRUPT("SEVERINTERRUPT", "服务中断","COMMON"),
    DEVICE_OFFLINE("DEVICEOFFLINE", "设备离线","COMMON"),
    POINT_INFO_ERROR("POINTINFOERRO", "点位信息错误","COMMON"),
    //视频
    CLOCK_SKEW("CLOCKSKEW", "时钟偏差","VIDEO"),
    SIGNAL_LOSS("SIGNALMISS", "信号缺失","VIDEO"),
    SCREEN_COLOR_DEVIATION("SCREENCOLOR", "画面偏色","VIDEO"),
    SNOW_STORM("SCREENSNOW", "雪花干扰","VIDEO"),
    STRIPE_INTERFERENCE("SCREENSTRIP", "条纹干扰","VIDEO"),
    SCREEN_OCCLUSION("SCREENSHADE", "画面遮挡","VIDEO"),
    ABNORMAL_CLARITY("SCREENBLUR", "清晰度异常","VIDEO"),
    ABNORMAL_BRIGHTNESS("SCREENLIGHT", "亮度异常","VIDEO"),
    OSD_ERROR("OSD", "osd异常","VIDEO"),
//    VIDEO_LOSS("VIDEOMISS", "录像缺失","VIDEO"),
//    VIDEO_NONE("NOVIDEO", "无录像","VIDEO"),
//    POINT_INFO_MISS("POINTINFOMISS", "点位信息不全","COMMON"),
//    UNKNOWN("UNKNOWN", "未知"),
//    PIC_URLABNORMAL("PICURLABNORMAL","图片访问异常",""),
//    MONITOR_UNQUALIFY("MONITORUNQUALIFY", "一机一档不合格"),
//    PIC_UNUSEFUL("PICUNUSEFUL", "大图不可用"),
//    VIDEO_ORPIC_UNNORMAL("VIDEOORPICUNNORMAL", "视频拉流、图片获取异常"),
    // 阈值
    CLOCK_RIGHT("CLOCK_RIGHT", "时钟准确率异常"),
    LONG_DAY_NO_DATA("LONG_DAY_NO_DATA", "长时间无数据"),
    DATA_TIMELY_ERROR("DATA_TIMELY_ERROR", "数据及时性异常"),
    NOT_UNIQUE_DATA_VOLUME("NOT_UNIQUE_DATA_VOLUME", "不唯一数据量异常"),
    UNRECOGNIZED_DAY_VOLUME("UNRECOGNIZED_DAY_VOLUME", "白天未识别数据量异常"),
    CAR_SIX("CAR_SIX", "车辆六项属性不完整"),
    MODELING_FAIL("MODELING_FAIL", "建模失败率异常"),
    FACE_LOW("FACE_LOW", "人脸低分率异常"),
    //车辆人脸通用
    CLOCK_RIGHT("CLOCK_RIGHT", "时钟准确率异常","CARORFACE"),
    LONG_DAY_NO_DATA("LONG_DAY_NO_DATA", "长时间无数据","CARORFACE"),
    DATA_TIMELY_ERROR("DATA_TIMELY_ERROR", "数据及时性异常","CARORFACE"),
    NOT_UNIQUE_DATA_VOLUME("NOT_UNIQUE_DATA_VOLUME", "不唯一数据量异常","CARORFACE"),
    UNRECOGNIZED_DAY_VOLUME("UNRECOGNIZED_DAY_VOLUME", "白天未识别数据量异常","CARORFACE"),
    //车辆
    CAR_SIX("CAR_SIX", "车辆六项属性不完整","CAR"),
    //人脸
    MODELING_FAIL("MODELING_FAIL", "建模失败率异常","FACE"),
    FACE_LOW("FACE_LOW", "人脸低分率异常","FACE"),
    ;
    private String value;
    private String desc;
    ErrorType(String value, String desc) {
    private String category;
    ErrorType(String value, String desc,String category) {
        this.value = value;
        this.desc = desc;
        this.category = category;
    }
    // 根据分类获取错误类型列表
    public static List<ErrorType> getErrorTypesByCategory(String category) {
        return Arrays.stream(values())
                .filter(errorType -> errorType.getCategory() == category)
                .collect(Collectors.toList());
    }
}
ycl-common/src/main/java/pojo/CascadeOption.java
New file
@@ -0,0 +1,18 @@
package pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
//前端级联选择数据
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CascadeOption {
    private String value;
    private String label;
    private List<CascadeOption> children;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/query/DistributeWorkOrderQuery.java
@@ -30,7 +30,7 @@
    /**
     * 故障类型
     */
    private List<String> errorTypeList;
    private String errorType;
    /**
     * 工单id
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderExportQuery.java
@@ -38,7 +38,7 @@
    /**
     * 故障类型
     */
    private List<String> errorTypeList;
    private String errorType;
    /**
     * 状态
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderQuery.java
@@ -42,8 +42,11 @@
    /**
     * 故障类型
     */
    private List<String> errorTypeList;
    private String errorType;
    /**
     * 故障类型
     */
    private String errorTypeLabel;
    /**
     * 状态
     */
ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
@@ -7,6 +7,7 @@
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
/**
@@ -30,6 +31,11 @@
    private Integer checkCount;
    /** 当日离线 */
    private Integer offLineCount;
    /**
     * 离线时间点
     */
    private List<Date> offLineTime;
    private List<String> offLineTimeStr;
    /** 设备类型 */
    private String monitorType;
    /** 设备名 */
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderYwConditionRecordVO.java
@@ -37,6 +37,9 @@
    /** 是否系统消息 */
    private Boolean sysMsg;
    /** 是否系统消息 */
    private Integer userId;
    public static WorkOrderYwConditionRecordVO getVoByEntity(@NonNull WorkOrderYwConditionRecord entity, WorkOrderYwConditionRecordVO vo) {
        if(vo == null) {
            vo = new WorkOrderYwConditionRecordVO();
ycl-server/src/main/java/com/ycl/platform/controller/WorkOrderController.java
@@ -156,6 +156,13 @@
        return workOrderService.detail(id);
    }
    @GetMapping("/check")
    @ApiOperation(value = "图片检测", notes = "图片检测")
    @PreAuthorize("@ss.hasPermi('work:order:check')")
    public Result check(String workOrderNo,String serialNumber) {
        return workOrderService.checkImage(workOrderNo,serialNumber);
    }
    @GetMapping("/list")
    @ApiOperation(value = "列表", notes = "列表")
    @PreAuthorize("@ss.hasPermi('work:order:list')")
@@ -163,6 +170,12 @@
        return workOrderService.all();
    }
    @GetMapping("/errorType/list")
    @ApiOperation(value = "故障列表", notes = "故障列表")
    @PreAuthorize("@ss.hasPermi('work:order:list')")
    public Result errorList() {
        return workOrderService.errorAll();
    }
    @GetMapping("/detail/info/{workOrderNo}")
    @ApiOperation(value = "详情", notes = "详情")
    @PreAuthorize("@ss.hasPermi('work:order:detail')")
@@ -219,4 +232,17 @@
    public Result batchDeleteWorkOrderWhite(@RequestBody List<String> ids) {
        return workOrderService.batchDeleteWorkOrderWhite(ids);
    }
    /**
     * 批量删除工单
     *
     * @return {@link Result }
     * @author
     */
    @DeleteMapping("/batchDelete")
    @PreAuthorize("@ss.hasPermi('work:order:delete')")
    @ApiOperation(value = "批量删除工单白名单", notes = "批量删除工单白名单")
    public Result batchDeleteWorkOrder(@RequestBody List<String> workOrderNos) {
        return workOrderService.batchDeleteWorkOrder(workOrderNos);
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.platform.domain.entity.WorkOrder;
import com.ycl.platform.domain.form.WorkOrderBatchAuditingForm;
import com.ycl.platform.domain.query.*;
import com.ycl.platform.domain.vo.DeviceInfoVO;
import com.ycl.platform.domain.vo.WorkOrderDetailVO;
@@ -109,4 +110,7 @@
     * @return
     */
    List<WorkOrderVO> getRecoveryInfo(List<String> orders);
    List<WorkOrder> batchGetByError(@Param("form") WorkOrderBatchAuditingForm form);
}
ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -271,4 +271,15 @@
     */
    void batchImportWhite(List<PointExport> dataList);
    /**
     * 检测按钮
     * @param workOrderNo
     * @return
     */
    Result checkImage(String workOrderNo,String serialNumber);
    Result batchDeleteWorkOrder(List<String> workOrderNos);
    Result errorAll();
}
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -43,6 +43,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -106,6 +107,18 @@
            } else {
                item.setOnlineStr("未知");
            }
            List<Date> offLineTime = item.getOffLineTime();
            //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            if(CollectionUtils.isNotEmpty(offLineTime) && offLineTime.size()>1){
                offLineTime = offLineTime.subList(0,1);
            }
            List<String> dateStr = new ArrayList<>();
            for (Date date : offLineTime) {
                String formatDate = format.format(date);
                dateStr.add(formatDate);
            }
            item.setOffLineTimeStr(dateStr);
        });
        params.setDeptTag(-1);
        params.setDeviceType(1);
ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java
@@ -119,16 +119,16 @@
    @Override
    public void recordMetaDSumCheck(List<RecordMetaDSumResult> dataList) {
        List<WorkOrder> workOrderList = dataList.stream().map(item -> {
            WorkOrder workOrder = new WorkOrder();
            if (0 == item.getRecordStatus()) {
                this.genWorkOrder(workOrder, ErrorType.VIDEO_LOSS, item.getDeviceId());
            } else if (-1 == item.getRecordStatus()) {
                this.genWorkOrder(workOrder, ErrorType.VIDEO_NONE, item.getDeviceId());
            }
            return workOrder;
        }).collect(Collectors.toList());
        workOrderService.innerAddWorkOrder(workOrderList);
//        List<WorkOrder> workOrderList = dataList.stream().map(item -> {
//            WorkOrder workOrder = new WorkOrder();
//            if (0 == item.getRecordStatus()) {
//                this.genWorkOrder(workOrder, ErrorType.VIDEO_LOSS, item.getDeviceId());
//            } else if (-1 == item.getRecordStatus()) {
//                this.genWorkOrder(workOrder, ErrorType.VIDEO_NONE, item.getDeviceId());
//            }
//            return workOrder;
//        }).collect(Collectors.toList());
//        workOrderService.innerAddWorkOrder(workOrderList);
    }
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -44,6 +44,7 @@
import constant.CheckConstants;
import constant.Constants;
import constant.RedisConstant;
import enumeration.ErrorType;
import enumeration.general.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -62,6 +63,7 @@
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import pojo.CascadeOption;
import javax.imageio.ImageIO;
import javax.swing.*;
@@ -98,6 +100,7 @@
    private final NotifyService notifyService;
    private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper;
    private final WorkOrderErrorTypeServiceImpl workOrderErrorTypeService;
    private final WorkOrderErrorTypeMapper workOrderErrorTypeMapper;
    private final SysConfigMapper configMapper;
    private final ReportMapper reportMapper;
    private final WorkOrderCheckImgMapper workOrderCheckImgMapper;
@@ -422,11 +425,12 @@
    @Transactional(rollbackFor = Exception.class)
    public Result batchAuditing(WorkOrderBatchAuditingForm form) {
        // 根据故障类型获取列表
        List<WorkOrder> list = new LambdaQueryChainWrapper<>(baseMapper)
                .in(WorkOrder::getStatus, WorkOrderStatusEnum.YW_HANDLE.getValue())
                .in(WorkOrder::getErrorType, form.getErrorTypes())
                .select(WorkOrder::getId, WorkOrder::getUnitId, WorkOrder::getWorkOrderNo, WorkOrder::getSerialNumber)
                .list();
        List<WorkOrder> list = baseMapper.batchGetByError(form);
//        List<WorkOrder> list = new LambdaQueryChainWrapper<>(baseMapper)
//                .in(WorkOrder::getStatus, WorkOrderStatusEnum.YW_HANDLE.getValue())
//                .in(WorkOrder::getErrorType, form.getErrorTypes())
//                .select(WorkOrder::getId, WorkOrder::getUnitId, WorkOrder::getWorkOrderNo, WorkOrder::getSerialNumber)
//                .list();
        if (list.isEmpty()) {
            return Result.error("没有工单可以审核");
        }
@@ -521,6 +525,9 @@
    public List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(String workOrderNo) {
        List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(workOrderNo);
        ywConditionList.stream().forEach(item -> {
            if(item.getUserId().equals(1)){
                item.setUnitName("管理员");
            }
            if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) {
                item.setUnitName("系统消息");
            }
@@ -595,7 +602,18 @@
        if (!CollectionUtils.isEmpty(page.getRecords())) {
            page.getRecords().stream().forEach(item -> {
                if (StringUtils.hasText(item.getErrorType())) {
                    item.setErrorTypeList(List.of(item.getErrorType().split(",")));
                    List<String> errorTypeList = new ArrayList<>(List.of(item.getErrorType().split(",")));
                    int index = errorTypeList.indexOf(query.getErrorTypeLabel());
                    if (index != -1) {
                        // 保存要移动的元素
                        String firstOccurrence = errorTypeList.get(index);
                        // 从列表中移除该元素(第一次出现的位置)
                        errorTypeList.remove(index);
                        // 将该元素添加到列表的首位
                        errorTypeList.add(0, firstOccurrence);
                    }
                    // 设置更新后的列表
                    item.setErrorTypeList(errorTypeList);
                }
                if (StringUtils.hasText(item.getImgListStr())) {
                    item.setImgList(List.of(item.getImgListStr().split(",")));
@@ -835,7 +853,7 @@
    @Override
    public synchronized String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception {
    public String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception {
        String url = String.format(this.rtspServer + "/api/play/start/img/%s/%s", deviceId, channelId);
        log.info("访问路径{}",url);
        String result = HttpUtils.sendGet(url);
@@ -1037,7 +1055,9 @@
    @Override
    public List<WorkOrderVO> export (WorkOrderExportQuery query){
        query.setUnitId(SecurityUtils.getUnitId());
        if(query.getUnitId()==null) {
            query.setUnitId(SecurityUtils.getUnitId());
        }
        if (query.getStart() != null) query.setStart(query.getStart() + " 00:00:00");
        if (query.getEnd() != null) query.setEnd(query.getEnd() + " 23:59:59");
@@ -1119,5 +1139,102 @@
        insertWhiteList.stream().forEach(white -> workOrderWhiteMapper.insert(white));
    }
    /**
     * 检测工单按钮
     * @param workOrderNo
     * @return
     */
    @Override
    public Result checkImage(String workOrderNo,String serialNumber) {
        // 查出国标设备,就一条数据
        List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper)
                .orderByDesc(DeviceInfo::getUpdateTime)
                .last("limit 1")
                .list();
        if (!CollectionUtils.isEmpty(gbDevices)) {
            try {
                String imgUrl = this.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), serialNumber,workOrderNo);
                if (StringUtils.hasText(imgUrl)) {
                    WorkOrderCheckImg img = new WorkOrderCheckImg();
                    img.setWorkOrderNo(workOrderNo);
                    img.setImgUrl(imgUrl);
                    img.setCreateTime(new Date());
                    workOrderCheckImgMapper.insert(img);
                }
                return Result.ok().data(imgUrl);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return Result.ok();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result batchDeleteWorkOrder(List<String> workOrderNos) {
        if(!CollectionUtils.isEmpty(workOrderNos)) {
            //删除工单审核记录
            workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().in("work_order_no", workOrderNos));
            //删除工单图片记录
            workOrderCheckImgMapper.delete(new QueryWrapper<WorkOrderCheckImg>().in("work_order_no", workOrderNos));
            //删除工单下发记录
            workOrderDistributeRecordMapper.delete(new QueryWrapper<WorkOrderDistributeRecord>().in("work_order_no", workOrderNos));
            //删除工单故障类型
            workOrderErrorTypeMapper.delete(new QueryWrapper<WorkOrderErrorType>().in("work_order_no", workOrderNos));
            //删除工单情况记录
            workOrderYwConditionRecordMapper.delete(new QueryWrapper<WorkOrderYwConditionRecord>().in("work_order_no", workOrderNos));
            //删除工单
            this.baseMapper.delete(new QueryWrapper<WorkOrder>().in("work_order_no", workOrderNos));
        }
        return Result.ok();
    }
    @Override
    public Result errorAll() {
        List<CascadeOption> results = new ArrayList<>();
        CascadeOption video = new CascadeOption();
        video.setLabel("视频");
        video.setValue("VIDEO");
        List<ErrorType> videoErr = ErrorType.getErrorTypesByCategory("VIDEO");
        List<ErrorType> videoErr1 = ErrorType.getErrorTypesByCategory("COMMON");
        videoErr.addAll(videoErr1);
        List<CascadeOption> videoChildren = videoErr.stream().map(item -> CascadeOption.builder()
                .value(item.getValue())
                .label(item.getDesc())
                .build()).collect(Collectors.toList());
        video.setChildren(videoChildren);
        CascadeOption car = new CascadeOption();
        car.setLabel("车辆");
        car.setValue("CAR");
        List<ErrorType> carErr = ErrorType.getErrorTypesByCategory("CAR");
        List<ErrorType> carErr1 = ErrorType.getErrorTypesByCategory("COMMON");
        List<ErrorType> carErr2 = ErrorType.getErrorTypesByCategory("CARORFACE");
        carErr.addAll(carErr1);
        carErr.addAll(carErr2);
        List<CascadeOption> carChildren = carErr.stream().map(item -> CascadeOption.builder()
                .value(item.getValue())
                .label(item.getDesc())
                .build()).collect(Collectors.toList());
        car.setChildren(carChildren);
        CascadeOption face = new CascadeOption();
        face.setLabel("人脸");
        face.setValue("FACE");
        List<ErrorType> faceErr = ErrorType.getErrorTypesByCategory("FACE");
        List<ErrorType> faceErr1 = ErrorType.getErrorTypesByCategory("COMMON");
        List<ErrorType> faceErr2 = ErrorType.getErrorTypesByCategory("CARORFACE");
        faceErr.addAll(faceErr1);
        faceErr.addAll(faceErr2);
        List<CascadeOption> faceChildren = faceErr.stream().map(item -> CascadeOption.builder()
                .value(item.getValue())
                .label(item.getDesc())
                .build()).collect(Collectors.toList());
        face.setChildren(faceChildren);
        results.add(video);
        results.add(car);
        results.add(face);
        return Result.ok().data(results);
    }
}
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -222,31 +222,31 @@
            }
            String errorType = workOrder.getErrorType();
            //存储故障 录像或图片访问异常
            if (ErrorType.VIDEO_NONE.getValue().equals(errorType) || ErrorType.PIC_URLABNORMAL.getValue().equals(errorType)) {
                if (!CollectionUtils.isEmpty(storeRuleMap)) {
                    storeRuleMap.forEach((contractId, rules) -> {
                        Integer unitId = rules.get(0).getUnitId();
                        //找到对应的规则
                        if (workOrder.getUnitId().equals(unitId)) {
                            //工单下发时间
                            Date createTime = workOrder.getDistributeTime();
                            Date auditTime = workOrder.getAuditTime();
                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
                            //选择时间范围内的规则
                            for (CalculateRuleVO rule : rules) {
                                if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) {
                                    double deductScore = rule.getCalcFraction() * Math.ceil(diffTime);
                                    ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "工单编号为:" + workOrder.getWorkOrderNo() + "处理超时,扣除" + deductScore + "分");
                                    contractScoreList.add(contractScore);
                                    workOrderList.add(workOrder.getWorkOrderNo());
                                }
                            }
                        }
                    });
                }
            }
//            if (ErrorType.VIDEO_NONE.getValue().equals(errorType) || ErrorType.PIC_URLABNORMAL.getValue().equals(errorType)) {
//                if (!CollectionUtils.isEmpty(storeRuleMap)) {
//                    storeRuleMap.forEach((contractId, rules) -> {
//                        Integer unitId = rules.get(0).getUnitId();
//                        //找到对应的规则
//                        if (workOrder.getUnitId().equals(unitId)) {
//                            //工单下发时间
//                            Date createTime = workOrder.getDistributeTime();
//                            Date auditTime = workOrder.getAuditTime();
//                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
//                            //选择时间范围内的规则
//                            for (CalculateRuleVO rule : rules) {
//                                if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) {
//                                    double deductScore = rule.getCalcFraction() * Math.ceil(diffTime);
//                                    ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "工单编号为:" + workOrder.getWorkOrderNo() + "处理超时,扣除" + deductScore + "分");
//                                    contractScoreList.add(contractScore);
//                                    workOrderList.add(workOrder.getWorkOrderNo());
//                                }
//                            }
//                        }
//                    });
//                }
//            }
            //前端感知源治理工作(时钟同步规则、OSD规则、一机一档规则)
            if (ErrorType.MONITOR_UNQUALIFY.getValue().equals(errorType) || ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType)) {
            if (ErrorType.POINT_INFO_ERROR.getValue().equals(errorType) || ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType)) {
                if (!CollectionUtils.isEmpty(monitorRuleMap)) {
                    monitorRuleMap.forEach((contractId, rules) -> {
                        Integer unitId = rules.get(0).getUnitId();
ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -122,6 +122,7 @@
                if (osdCheckResult != null) {
                    monitor.setDeviceType(osdCheckResult.getDeviceBrand());
                }
                monitorList.add(monitor);
            }
        });
@@ -130,6 +131,8 @@
            //老设备状态改为不参与考核
            if (!points.contains(key)) {
                value.setExamineStatus(Boolean.FALSE);
                //单位设置为空
                value.setUnitId(null);
                ywPointList.add(value);
            }
        });
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
@@ -63,8 +63,8 @@
    @Override
    public TMonitorResult call() {
        TMonitorResult result = checkPointUtil.check(monitor);
        // 一天内监测到离线1次以上,生成工单
        if (result.getOffLineCount() >= times) {
        // 这次不在线且一天内监测到离线2次及以上,生成工单
        if (!result.getPingOnline() && result.getOffLineCount() >= times) {
            WorkOrder workOrder = new WorkOrder();
            workOrder.setSerialNumber(result.getNo());
            List<String> errList = new ArrayList<>();
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
@@ -71,6 +71,7 @@
        } else {
            map = new HashMap<>();
        }
        if (!monitor.getPingOnline()) {
            try {
                reachable = InetAddress.getByName(monitor.getIp()).isReachable(5000);
@@ -81,6 +82,10 @@
        }
        if (!monitor.getPingOnline()) {
            offLineTimes++;
            List<Date> offLineTime = monitor.getOffLineTime();
            if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>();
            offLineTime.add(new Date());
            monitor.setOffLineTime(offLineTime);
        }
        map.put("checkTimes", checkTimes);
        map.put("offLineTimes", offLineTimes);
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -128,7 +128,7 @@
        left join (
        WITH cte AS (
        SELECT *,row_number() OVER(PARTITION BY serial_number ORDER BY create_time DESC) rn FROM t_work_order
        WHERE deleted = 0 AND status == 'AUDITING_SUCCESS'
        WHERE deleted = 0 AND status = 'AUDITING_SUCCESS'
        ) SELECT * FROM cte WHERE rn=1
        ) w on m.serial_number = w.serial_number and w.deleted = 0
        left join t_yw_unit u on p.unit_id = u.id and u.deleted = 0
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -58,8 +58,8 @@
        FROM
        t_work_order wo
        INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id AND u.deleted = 0
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN sys_dict_data da ON da.dict_value = et.error_name AND da.dict_type = 'error_type'
        LEFT JOIN t_work_order_check_img ci ON ci.work_order_no = wo.work_order_no
        LEFT JOIN t_yw_people p ON wo.yw_people_id = p.id AND p.deleted = 0
@@ -68,13 +68,12 @@
        <if test="query.unitId != null">
            AND wo.unit_id = #{query.unitId}
        </if>
        <if test="query.errorTypeList != null and query.errorTypeList.size() > 0">
        <if test="query.errorType != null and query.errorType != ''">
            AND (EXISTS (
            SELECT 1
            FROM t_work_order_error_type twoet
            WHERE twoet.work_order_no = wo.work_order_no
            AND twoet.error_name in
          <foreach collection="query.errorTypeList" open="(" separator="," close=")" item="errorType">#{errorType}</foreach>
            AND twoet.error_name = #{query.errorType}
            ))
        </if>
        <if test="query.keyword != null and query.keyword != ''">
@@ -118,8 +117,8 @@
        t_work_order wo
        INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id AND u.deleted = 0
        INNER JOIN sys_dict_data da ON da.dict_value = et.error_name AND da.dict_type = 'error_type'
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id AND u.deleted = 0
        LEFT JOIN t_work_order_check_img ci ON ci.work_order_no = wo.work_order_no
        LEFT JOIN t_yw_people p ON wo.yw_people_id = p.id AND p.deleted = 0
        WHERE
@@ -136,13 +135,12 @@
        <if test="query.start != null and query.end != null">
            AND wo.create_time BETWEEN #{query.start} AND #{query.end}
        </if>
        <if test="query.errorTypeList != null and query.errorTypeList.size() > 0">
        <if test="query.errorType != null and query.errorType !='' ">
            AND (EXISTS (
            SELECT 1
            FROM t_work_order_error_type twoet
            WHERE twoet.work_order_no = wo.work_order_no
            AND twoet.error_name in
            <foreach collection="query.errorTypeList" open="(" separator="," close=")" item="errorType">#{errorType}</foreach>
            AND twoet.error_name = #{query.errorType}
            ))
        </if>
        GROUP BY
@@ -170,9 +168,9 @@
        t_work_order wo
        INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        INNER JOIN t_yw_point yp ON yp.serial_number = wo.serial_number AND yp.deleted = 0
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id and u.deleted = 0
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN sys_dict_data da ON da.dict_value = et.error_name AND da.dict_type = 'error_type'
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id and u.deleted = 0
        LEFT JOIN t_yw_people p ON wo.yw_people_id = p.id and p.deleted = 0
        LEFT JOIN t_work_order_distribute_record odr ON odr.work_order_no = wo.work_order_no AND odr.deleted = 0
        LEFT JOIN sys_user su ON su.user_id = odr.user_id
@@ -194,14 +192,12 @@
        <if test="query.start != null and query.end != null">
            AND wo.create_time BETWEEN #{query.start} AND #{query.end}
        </if>
        <if test="query.errorTypeList != null and query.errorTypeList.size() > 0">
        <if test="query.errorType != null and query.errorType != ''">
            AND (EXISTS (
            SELECT 1
            FROM t_work_order_error_type twoet
            WHERE twoet.work_order_no = wo.work_order_no
            AND twoet.error_name in
            <foreach collection="query.errorTypeList" open="(" separator="," close=")" item="errorType">#{errorType}
            </foreach>
            AND twoet.error_name = #{query.errorType}
            ))
        </if>
        GROUP BY
@@ -292,8 +288,8 @@
    <select id="workOrderTotal" resultType="com.ycl.platform.domain.vo.screen.WorkOrderTotalVO">
        SELECT
            COUNT(*) AS totalNum,
            COUNT(IF(w.status != 'AUDITING_SUCCESS' and w.status != 'WAIT_DISTRIBUTED', 1, NULL)) AS todoNum,
            COUNT(IF(w.status != 'WAIT_DISTRIBUTE', 1, NULL)) AS totalNum,
            COUNT(IF(w.status != 'AUDITING_SUCCESS' and w.status != 'WAIT_DISTRIBUTE', 1, NULL)) AS todoNum,
            COUNT(IF(w.status = 'AUDITING_SUCCESS', 1, NULL)) AS doneNum
        FROM t_work_order w
        LEFT JOIN t_yw_point p ON w.serial_number = p.serial_number AND p.deleted = 0
@@ -437,5 +433,22 @@
        p.yw_person_name
    </select>
    <select id="batchGetByError" resultType="com.ycl.platform.domain.entity.WorkOrder">
        select wo.id,wo.unit_id,wo.work_order_no,wo.serial_number
        from t_work_order wo
        <where>
            wo.deleted = 0 and wo.status = 'YW_HANDLE'
            <if test="form.errorTypes != null and form.errorTypes.size() > 0">
                AND (EXISTS (
                SELECT 1
                FROM t_work_order_error_type twoet
                WHERE twoet.work_order_no = wo.work_order_no
                AND twoet.error_name in
                <foreach collection="form.errorTypes" open="(" separator="," close=")" item="errorType">
                    #{errorType}
                </foreach>
                ))
            </if>
        </where>
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderYwConditionRecordMapper.xml
@@ -11,10 +11,11 @@
        <result column="unit_name" property="unitName"/>
        <result column="sys_msg" property="sysMsg"/>
        <result column="yw_proofMaterials" property="ywProofMaterials"/>
        <result column="user_id" property="userId"/>
    </resultMap>
    <select id="selectYwConditionByYwId" resultMap="BaseResultMap">
        SELECT DISTINCT yw.id, yu.id as unit_id, yu.unit_name,yw.yw_condition, yw.yw_proofMaterials ,yw.create_time, yw.sys_msg, su.nick_name
        SELECT DISTINCT yw.id, yu.id as unit_id, yu.unit_name,yw.yw_condition, yw.yw_proofMaterials ,yw.create_time, yw.sys_msg, su.nick_name,su.user_id
        FROM t_work_order_yw_condition_record yw
                 LEFT JOIN sys_user su ON yw.commit_user = su.user_id AND yw.deleted = 0
                 LEFT JOIN t_yw_unit yu ON su.unit_id = yu.id
ycl-server/src/main/resources/mapper/zgyw/YwUnitMapper.xml
@@ -57,14 +57,12 @@
        <if test="query.start != null and query.end != null">
            AND wo.create_time BETWEEN #{query.start} AND #{query.end}
        </if>
        <if test="query.errorTypeList != null and query.errorTypeList.size() > 0">
        <if test="query.errorType != null and query.errorType !='' ">
            AND (EXISTS (
            SELECT 1
            FROM t_work_order_error_type twoet
            WHERE twoet.work_order_no = wo.work_order_no
            AND twoet.error_name in
            <foreach collection="query.errorTypeList" open="(" separator="," close=")" item="errorType">#{errorType}
            </foreach>
            AND twoet.error_name = #{query.errorType}
            ))
        </if>
    </select>