xiangpei
2024-08-24 8af39d20413790b72658675f3182714cc59011b3
工单检测生成优化、海康阈值校验优化
11个文件已修改
229 ■■■■ 已修改文件
ycl-common/src/main/java/enumeration/ErrorType.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrderYwConditionRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderErrorTypeMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderYwConditionRecordMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderYwConditionRecordMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/enumeration/ErrorType.java
@@ -31,6 +31,16 @@
    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", "人脸低分率异常"),
    ;
    private String value;
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrderYwConditionRecord.java
@@ -22,9 +22,9 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("工单ID")
    @TableField("work_order_id")
    private Integer workOrderId;
    @ApiModelProperty("工单号")
    @TableField("work_order_no")
    private String workOrderNo;
    @ApiModelProperty("提交人")
    @TableField("commit_user")
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java
@@ -120,7 +120,7 @@
    @Data
    public static class SnapClock {
        /**
         * 时钟准确率
         * 时钟准确率:1 == 100%
         */
        private Float clockPercent;
@@ -178,7 +178,7 @@
    @Data
    public static class SnapTimely {
        /**
         * 及时率
         * 及时率 1 == 100%
         */
        private Float timelyPercent;
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderErrorTypeMapper.java
@@ -86,4 +86,5 @@
     * @return
     */
    int addMany(@Param("errorTypeList") List<WorkOrderErrorType> errorTypeList);
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -75,4 +75,12 @@
    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("auditStatus") String auditStatus);
    int addMany(@Param("workOrderList") List<WorkOrder> workOrderList);
    /**
     * 批量修改状态
     *
     * @param workOrderList
     * @return
     */
    int updateMany(List<WorkOrder> workOrderList);
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderYwConditionRecordMapper.java
@@ -25,4 +25,10 @@
     */
    List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(@Param("workOrderId") Integer workOrderId);
    /**
     * 批量插入
     *
     * @param ywRecordList
     */
    Integer insertMany(@Param("ywRecordList") List<WorkOrderYwConditionRecord> ywRecordList);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -121,6 +121,12 @@
        List<WorkOrderErrorType> waitAddErrorTypeList = new ArrayList<>(48);
        Integer updateNum = 0;
        Date now = new Date();
        // 因故障类型不一致而要更新状态的工单
        List<WorkOrder> willUpdateStatusWorkOrderList = new ArrayList<>(48);
        // 更改工单类型而要增加的系统运维处理信息
        List<WorkOrderYwConditionRecord> willAddMsg = new ArrayList<>(48);
        // 即将要添加的错误类型
        List<WorkOrderErrorType> willAddErrorType = new ArrayList<>(96);
        for (WorkOrder workOrder : workOrderList) {
            WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber());
            if (Objects.nonNull(databaseWorkOrder)) {
@@ -138,20 +144,20 @@
                            workOrderErrorType.setCreateTime(now);
                            workOrderErrorType.setUpdateTime(now);
                            workOrderErrorType.setErrorName(errorType);
                            workOrderErrorTypeService.save(workOrderErrorType);
                            willAddErrorType.add(workOrderErrorType);
                        }
                    }
                    databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                    databaseWorkOrder.setUpdateTime(now);
                    baseMapper.updateById(databaseWorkOrder);
                    willUpdateStatusWorkOrderList.add(databaseWorkOrder);
                    updateNum++;
                    // 同时新增一个运维处理信息,表明此工单被调整
                    WorkOrderYwConditionRecord ywRecord = new WorkOrderYwConditionRecord();
                    ywRecord.setWorkOrderId(databaseWorkOrder.getId());
                    ywRecord.setWorkOrderNo(databaseWorkOrder.getWorkOrderNo());
                    ywRecord.setCommitUser(1);
                    ywRecord.setYwCondition("故障类型更新,工单状态调整为待处理");
                    ywRecord.setCreateTime(new Date());
                    workOrderYwConditionRecordMapper.insert(ywRecord);
                    willAddMsg.add(ywRecord);
                }
            } else {
                workOrder.setCreateTime(new Date());
@@ -163,6 +169,15 @@
//                }
                waitAddList.add(workOrder);
            }
        }
        if (willAddErrorType.size() > 0) {
            workOrderErrorTypeService.getBaseMapper().addMany(willAddErrorType);
        }
        if (willAddMsg.size() > 0) {
            workOrderYwConditionRecordMapper.insertMany(willAddMsg);
        }
        if (willUpdateStatusWorkOrderList.size() > 0) {
            this.baseMapper.updateMany(willUpdateStatusWorkOrderList);
        }
        if (CollectionUtils.isEmpty(waitAddList)) {
            return Boolean.TRUE;
@@ -360,7 +375,7 @@
        baseMapper.updateById(workOrder);
        // 添加一条运维情况记录
        WorkOrderYwConditionRecord workOrderYwConditionRecord = new WorkOrderYwConditionRecord();
        workOrderYwConditionRecord.setWorkOrderId(workOrder.getId());
        workOrderYwConditionRecord.setWorkOrderNo(workOrder.getWorkOrderNo());
        workOrderYwConditionRecord.setCommitUser(SecurityUtils.getLoginUser().getUserId().intValue());
        workOrderYwConditionRecord.setYwCondition(form.getYwCondition());
        workOrderYwConditionRecord.setYwProofMaterials(form.getYwProofMaterials());
ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
@@ -12,6 +12,7 @@
import com.ycl.utils.ip.PingUtil;
import constant.YwThreadConstants;
import enumeration.CompareType;
import enumeration.ErrorType;
import enumeration.general.BusinessTypeEnum;
import enumeration.general.WorkOrderStatusEnum;
import lombok.extern.slf4j.Slf4j;
@@ -163,24 +164,41 @@
                log.error("人脸对象数据为空");
                continue;
            }
            WorkOrder workOrder = new WorkOrder();
            //检查时钟准确率
            Float clockPercent = result.getSnapClock().getClockPercent();
            check(YwThreadConstants.Face_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Face_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue());
            //检查数据及时率
            Float timelyPercent = result.getSnapTimely().getTimelyPercent();
            check(YwThreadConstants.Face_TimelyPercent, timelyPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Face_TimelyPercent, timelyPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue());
            //检查持续无数据天数
            Integer continueNoDataCount = result.getContinueNoDataCount();
            check(YwThreadConstants.Face_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Face_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.LONG_DAY_NO_DATA.getValue());
            //检查不唯一数据量
            Integer nouniqueCount = result.getSnapUnique().getNouniqueCount();
            check(YwThreadConstants.Face_NouniqueCount, nouniqueCount, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Face_NouniqueCount, nouniqueCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue());
            //检查人脸低评分率
            Float lowScorePercent = result.getSnapValidity().getLowScorePercent();
            check(YwThreadConstants.Face_LowScorePercent, lowScorePercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Face_LowScorePercent, lowScorePercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.FACE_LOW.getValue());
            //检查建模失败率
            Float failPercent = result.getSnapValidity().getFailPercent();
            check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.MODELING_FAIL.getValue());
            // 点位在线率
            if (2 == result.getSnapResult()) {
                workOrder.setSerialNumber(result.getExternalIndexCode());
                workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                    workOrder.setErrorTypeList(new ArrayList<>());
                    workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue());
                } else {
                    workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue());
                }
            }
            if (WorkOrderStatusEnum.WAIT_DISTRIBUTE.equals(workOrder.getStatus())) {
                workOrderList.add(workOrder);
            } else if (WorkOrderStatusEnum.DISTRIBUTED.equals(workOrder.getStatus())) {
                distributeList.add(workOrder);
            }
        }
        /** 添加工单 */
        workOrderService.innerAddWorkOrder(workOrderList);
@@ -205,24 +223,41 @@
                log.error("车辆对象数据为空");
                continue;
            }
            WorkOrder workOrder = new WorkOrder();
            //检查持续无数据天数
            Integer continueNoDataCount = result.getContinueNoDataCount();
            check(YwThreadConstants.Car_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Car_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.LONG_DAY_NO_DATA.getValue());
            //检查时钟准确率
            Float clockPercent = result.getSnapClock().getClockPercent();
            check(YwThreadConstants.Car_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Car_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue());
            //检查数据及时率
            Float timelyPercentResult = result.getSnapTimely().getTimelyPercent();
            check(YwThreadConstants.Car_TimelyPercent, timelyPercentResult, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,"");
            check(YwThreadConstants.Car_TimelyPercent, timelyPercentResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue());
            //检查不唯一数据量
            Integer nouniqueCountResult = result.getSnapUnique().getNouniqueCount();
            check(YwThreadConstants.Car_NouniqueCount, nouniqueCountResult, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Car_NouniqueCount, nouniqueCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue());
            //检查白天未识别量
            Integer dayNoNumberCountResult = result.getSnapPlate().getDayNoNumberCount();
            check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.UNRECOGNIZED_DAY_VOLUME.getValue());
            //车辆六项属性不完整量
            Integer noIntegrityCountResult = result.getIntegrity().getNoIntegrityCount();
            check(YwThreadConstants.Car_NoIntegrityCount, noIntegrityCountResult, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,"");
            check(YwThreadConstants.Car_NoIntegrityCount, noIntegrityCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.CAR_SIX.getValue());
            // 点位在线率
            if (2 == result.getSnapResult()) {
                workOrder.setSerialNumber(result.getExternalIndexCode());
                workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                    workOrder.setErrorTypeList(new ArrayList<>());
                    workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue());
                } else {
                    workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue());
                }
            }
            if (WorkOrderStatusEnum.WAIT_DISTRIBUTE.equals(workOrder.getStatus())) {
                workOrderList.add(workOrder);
            } else if (WorkOrderStatusEnum.DISTRIBUTED.equals(workOrder.getStatus())) {
                distributeList.add(workOrder);
            }
        }
        /** 添加工单 */
        workOrderService.innerAddWorkOrder(workOrderList);
@@ -251,13 +286,11 @@
     * @param value 接口获取到的值
     * @param serialNumber 国标码
     * @param thresholds 阈值条件map
     * @param distributeList 要下发的工单容器
     * @param workOrderList 待下发的工单容器
     * @param compareType 比较方式:>=    <=
     * @param errorType 故障类型
     * @param <T>
     */
    private <T extends Comparable<T>> void check(String key, T value, String serialNumber, Map<String, YwThreshold> thresholds, List distributeList, List workOrderList, CompareType compareType,String errorType) {
    private <T extends Comparable<T>> void check(String key, T value, String serialNumber, Map<String, YwThreshold> thresholds, WorkOrder workOrder, CompareType compareType,String errorType) {
        Optional.ofNullable(value).ifPresentOrElse(
                v -> {
                    YwThreshold ywThreshold = thresholds.get(key);
@@ -267,18 +300,24 @@
                    //比较大小,加入到对应待处理集合
                    if (compareType.compare(v, thresholdAutoValue)) {
                        //自动下发工单
                        WorkOrder workOrder = new WorkOrder();
                        workOrder.setSerialNumber(serialNumber);
                        workOrder.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE);
                        workOrder.setErrorType(errorType);
                        workOrderList.add(workOrder);
                        if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                            workOrder.setErrorTypeList(new ArrayList<>());
                            workOrder.getErrorTypeList().add(errorType);
                        } else {
                            workOrder.getErrorTypeList().add(errorType);
                        }
                    } else if (compareType.compare(v, thresholdValue)) {
                        //进入工单代下发
                        WorkOrder workOrder = new WorkOrder();
                        workOrder.setSerialNumber(serialNumber);
                        workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                        workOrder.setErrorType(errorType);
                        distributeList.add(workOrder);
                        if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                            workOrder.setErrorTypeList(new ArrayList<>());
                            workOrder.getErrorTypeList().add(errorType);
                        } else {
                            workOrder.getErrorTypeList().add(errorType);
                        }
                    }
                },
                () -> log.error("{} 为空: {}", thresholds.get(key).getName(), serialNumber)
ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -144,40 +144,40 @@
    public void videoOnlineTask() {
        //视频图像质量
        log.info("开始执行点位在线数据同步");
        VideoOnlineParam param = new VideoOnlineParam();
        param.setPageNum(ApiConstants.PageNo);
        param.setPageSize(ApiConstants.PageSize);
        param.setArealayerno(ApiConstants.AreaNo);
        param.setStatus(ApiConstants.UY_OnlineStatus_All);
        param.setIcmpStatus(ApiConstants.UY_OnlineStatus_All);
        JSONObject jsonObject = uyClient.videoOnline(param);
        if (jsonObject != null) {
            Integer statusCode = jsonObject.getInteger("statusCode");
            if (ApiConstants.UYSuccessCode.equals(statusCode)) {
                JSONObject data = jsonObject.getJSONObject("data");
                if (data != null) {
                    List<VideoOnlineResult> records = data.getList("records", VideoOnlineResult.class);
                    if (!CollectionUtils.isEmpty(records)) {
                        //如果今天存在之前的数据先删除
                        Query query = new Query(Criteria
                                .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
                        DeleteResult result = mongoTemplate.remove(query, VideoOnlineResult.class);
                        //存放在mongo中
                        mongoTemplate.insertAll(records);
                        // 工单生成
                        uyErrorTypeCheckService.videoOnlineCheck(records);
                    } else {
                        log.error("点位在线结果数据为空{}", data);
                    }
                } else {
                    log.error("点位在线结果数据为空{}", jsonObject);
                }
            } else {
                log.error("点位在线结果请求失败{}", jsonObject);
            }
        } else {
            log.error("点位在线结果数据为空");
        }
//        VideoOnlineParam param = new VideoOnlineParam();
//        param.setPageNum(ApiConstants.PageNo);
//        param.setPageSize(ApiConstants.PageSize);
//        param.setArealayerno(ApiConstants.AreaNo);
//        param.setStatus(ApiConstants.UY_OnlineStatus_All);
//        param.setIcmpStatus(ApiConstants.UY_OnlineStatus_All);
//        JSONObject jsonObject = uyClient.videoOnline(param);
//        if (jsonObject != null) {
//            Integer statusCode = jsonObject.getInteger("statusCode");
//            if (ApiConstants.UYSuccessCode.equals(statusCode)) {
//                JSONObject data = jsonObject.getJSONObject("data");
//                if (data != null) {
//                    List<VideoOnlineResult> records = data.getList("records", VideoOnlineResult.class);
//                    if (!CollectionUtils.isEmpty(records)) {
//                        //如果今天存在之前的数据先删除
//                        Query query = new Query(Criteria
//                                .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
//                        DeleteResult result = mongoTemplate.remove(query, VideoOnlineResult.class);
//                        //存放在mongo中
//                        mongoTemplate.insertAll(records);
//                        // 工单生成
//                        uyErrorTypeCheckService.videoOnlineCheck(records);
//                    } else {
//                        log.error("点位在线结果数据为空{}", data);
//                    }
//                } else {
//                    log.error("点位在线结果数据为空{}", jsonObject);
//                }
//            } else {
//                log.error("点位在线结果请求失败{}", jsonObject);
//            }
//        } else {
//            log.error("点位在线结果数据为空");
//        }
        Query query = new Query(Criteria.where("mongoCreateTime").lt(DateUtils.getDayEnd(new Date())));
        uyErrorTypeCheckService.videoOnlineCheck(mongoTemplate.find(query, VideoOnlineResult.class));
        log.info("结束执行点位在线数据同步");
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -219,4 +219,14 @@
        WHERE wo.deleted = 0 AND wo.status = #{status}  AND woar.result = #{auditStatus}
        AND wo.deduct = 0 AND woar.create_time between #{startTime} and #{endTime}
    </select>
    <update id="updateMany">
        <foreach collection="workOrderList" separator=";" item="item">
            UPDATE t_work_order
            SET
            update_time = #{item.updateTime},
            status = #{item.status}
            WHERE id = #{item.id}
        </foreach>
    </update>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderYwConditionRecordMapper.xml
@@ -15,8 +15,16 @@
    <select id="selectYwConditionByYwId" resultMap="BaseResultMap">
        SELECT yw.id, yw.commit_user, yw.yw_condition, yw.yw_proofMaterials, yw.create_time, yw.sys_msg, su.nick_name
        FROM t_work_order_yw_condition_record yw
                 INNER JOIN sys_user su ON yw.commit_user = su.user_id AND yw.deleted = 0 AND yw.work_order_id = #{workOrderId}
                 INNER JOIN sys_user su ON yw.commit_user = su.user_id AND yw.deleted = 0 AND yw.work_order_no = #{workOrderId}
        ORDER BY yw.create_time DESC
    </select>
    <insert id="insertMany">
        insert into t_work_order_yw_condition_record (work_order_no, commit_user, yw_condition, deleted, create_time)
        values
        <foreach collection="ywRecordList" item="item" separator=",">
            (#{item.workOrderNo}, #{item.commitUser}, #{item.ywCondition}, 0, now())
        </foreach>
    </insert>
</mapper>