fuliqi
2024-09-29 c4df5d2cfaa12a1c8a72ef25934fdc31d5be65a1
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;
@@ -37,10 +38,8 @@
import com.ycl.utils.redis.RedisCache;
import com.ycl.utils.uuid.IdUtils;
import constant.Constants;
import enumeration.general.NotifyTypeEnum;
import enumeration.general.UrgentLevelEnum;
import enumeration.general.WorkOrderDistributeWayEnum;
import enumeration.general.WorkOrderStatusEnum;
import constant.RedisConstant;
import enumeration.general.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@@ -50,12 +49,14 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -83,7 +84,6 @@
    private final SysConfigMapper configMapper;
    private final ReportMapper reportMapper;
    private final WorkOrderCheckImgMapper workOrderCheckImgMapper;
    @Value("${rtsp.server:http://127.0.0.1:7788}")
    private String rtspServer;
@@ -141,7 +141,7 @@
                    continue;
                } else {
                    for (String errorType : errorTypes) {
                        if (! errorNameList.contains(errorType)) {
                        if (!errorNameList.contains(errorType)) {
                            // 错误类型不一样,就新增一个错误类型,并且重置工单状态为待处理
                            WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType();
                            workOrderErrorType.setWorkOrderNo(databaseWorkOrder.getWorkOrderNo());
@@ -199,13 +199,40 @@
        SysConfig normal = configMapper.checkConfigKeyUnique("normal.wordkorder.alarm.time");
        // 如果即将生成工单,但是设备国标码查不到点位,则不添加?
        List<WorkOrder> notAddList = new ArrayList<>();
        //查redis今日工单数量
        int workOrderNum = 0;
        //UUID作为value,保证上锁的线程自己解锁
        String requestId = IdUtils.fastSimpleUUID();
        try {
            for (int i = 0; i < 3; i++) {
                boolean result = redisCache.acquireLock(RedisConstant.WORKORDER_NUM_LOCK, requestId, 10000);
                if (result) {
                    //查今日工单量
                    Object redisNum = redisCache.getCacheObject(RedisConstant.WORKORDER_NUM);
                    workOrderNum = redisNum == null ? 0 : (Integer) redisNum;
                    break;
                } else {
                    if (i == 2) {
                        log.error("锁被占用");
                        return Boolean.FALSE;
                    }
                    //等待一段时间后继续
                    Thread.sleep(5000);
                }
            }
        } catch (InterruptedException e) {
            log.error("获取锁异常");
            return Boolean.FALSE;
        }
        for (WorkOrder workOrder : waitAddList) {
            YwPoint point = pointMapping.get(workOrder.getSerialNumber());
            if (Objects.isNull(point)) {
                notAddList.add(workOrder);
                continue;
            }
            workOrder.setWorkOrderNo(IdUtils.randomNO(now));
            //数字前面补0
            workOrderNum++;
            workOrder.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum)));
            if (Objects.nonNull(point.getUnitId())) {
                workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            }
@@ -228,9 +255,12 @@
        if (CollectionUtils.isEmpty(waitAddList)) {
            return Boolean.TRUE;
        }
        //记录工单数
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        // 保存工单和故障类型
        baseMapper.addMany(waitAddList);
        if (! CollectionUtils.isEmpty(waitAddErrorTypeList)) {
        if (!CollectionUtils.isEmpty(waitAddErrorTypeList)) {
            workOrderErrorTypeService.getBaseMapper().addMany(waitAddErrorTypeList);
        }
        // 如果是直接下发,添加下发记录
@@ -256,22 +286,38 @@
    /**
     * 添加
     *
     * @param form
     * @return
     */
    @Override
    public Result add(WorkOrderForm form) {
        //查redis今日工单数量
        int workOrderNum = 1;
        //UUID作为value,保证上锁的线程自己解锁
        String requestId = IdUtils.fastSimpleUUID();
        boolean result = redisCache.acquireLock(RedisConstant.WORKORDER_NUM_LOCK, requestId, 10000);
        if (result) {
            //查今日工单量
            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("工单正在添加,请稍后再试");
        }
        WorkOrder entity = WorkOrderForm.getEntityByForm(form, null);
        entity.setCreateTime(DateUtils.getNowDate());
        entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE);
        Date now = new Date();
        entity.setCreateTime(now);
        entity.setUpdateTime(now);
        entity.setWorkOrderNo(IdUtils.randomNO(now));
        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);
        if(baseMapper.insert(entity) > 0) {
        if (baseMapper.insert(entity) > 0) {
            return Result.ok("添加成功");
        }
        return Result.error("添加失败");
@@ -279,6 +325,7 @@
    /**
     * 修改
     *
     * @param form
     * @return
     */
@@ -409,9 +456,9 @@
    @Override
    public List<WorkOrderAuditingRecord> selectYwAuditingListByYwId(String workOrderNo) {
        return new LambdaQueryChainWrapper<>(workOrderAuditingRecordMapper)
                        .eq(WorkOrderAuditingRecord::getWorkOrderNo, workOrderNo)
                        .orderByAsc(WorkOrderAuditingRecord::getCreateTime)
                        .list();
                .eq(WorkOrderAuditingRecord::getWorkOrderNo, workOrderNo)
                .orderByAsc(WorkOrderAuditingRecord::getCreateTime)
                .list();
    }
    @Override
@@ -426,12 +473,13 @@
    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        if(baseMapper.deleteBatchIds(ids) > 0) {
        if (baseMapper.deleteBatchIds(ids) > 0) {
            return Result.ok("删除成功");
        }
        return Result.error("删除失败");
@@ -439,12 +487,13 @@
    /**
     * id删除
     *
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        if(baseMapper.deleteById(id) > 0) {
        if (baseMapper.deleteById(id) > 0) {
            return Result.ok("删除成功");
        }
        return Result.error("删除失败");
@@ -452,6 +501,7 @@
    /**
     * 分页查询
     *
     * @param query
     * @return
     */
@@ -459,8 +509,10 @@
    public Result page(WorkOrderQuery query) {
        IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class);
        query.setUnitId(SecurityUtils.getUnitId());
        query.setStart(DateUtils.getDayStart(query.getStart()));
        query.setEnd(DateUtils.getDayEnd(query.getEnd()));
        baseMapper.page(page, query);
        if (! CollectionUtils.isEmpty(page.getRecords())) {
        if (!CollectionUtils.isEmpty(page.getRecords())) {
            page.getRecords().stream().forEach(item -> {
                if (StringUtils.hasText(item.getErrorType())) {
                    item.setErrorTypeList(List.of(item.getErrorType().split(",")));
@@ -491,14 +543,14 @@
                data.setStart(now.minusHours(1));
                break;
            case LAST_TWO_HOUR:
               data.setStart(now.minusHours(2));
               break;
                data.setStart(now.minusHours(2));
                break;
            case LAST_DAY:
                data.setStart(now.minusDays(1));
                break;
            default:
                break;
           }
        }
        if (Objects.isNull(data.getStart())) {
            throw new RuntimeException("无法生成快速下发的时间范围,请选择正确的快速下发方式");
        }
@@ -515,8 +567,12 @@
        List<String> workOrderNoList = list.stream().map(WorkOrder::getWorkOrderNo).toList();
        List<String> serialNumberList = list.stream().map(WorkOrder::getSerialNumber).toList();
        if (workOrderNoList.isEmpty()) { return Result.error("没有符合条件的工单"); }
        if (!getDistributeLock()) { return Result.error("此刻有人下发中,为避免冲突,请稍后重试"); }
        if (workOrderNoList.isEmpty()) {
            return Result.error("没有符合条件的工单");
        }
        if (!getDistributeLock()) {
            return Result.error("此刻有人下发中,为避免冲突,请稍后重试");
        }
        try {
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
@@ -537,7 +593,9 @@
    @Transactional
    public Result selectedIdsDistribute(DistributeWorkOrderQuery query) {
        WorkOrderDistributeWayEnum distributeWayEnum = WorkOrderDistributeWayEnum.SELECTED_DISTRIBUTE;
        if (!getDistributeLock()) { return Result.error("此刻有人下发中,为避免冲突,请稍后重试"); }
        if (!getDistributeLock()) {
            return Result.error("此刻有人下发中,为避免冲突,请稍后重试");
        }
        try {
            if (query.getWorkOrderNOList().isEmpty()) {
                query.setWorkOrderNOList(new LambdaQueryChainWrapper<>(baseMapper)
@@ -550,7 +608,9 @@
                        .collect(Collectors.toList()));
                distributeWayEnum = WorkOrderDistributeWayEnum.ALL_DISTRIBUTE;
            }
            if (query.getWorkOrderNOList().isEmpty()) { return Result.error("没有工单待下发"); }
            if (query.getWorkOrderNOList().isEmpty()) {
                return Result.error("没有工单待下发");
            }
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                    .in(WorkOrder::getWorkOrderNo, query.getWorkOrderNOList())
@@ -569,6 +629,7 @@
    /**
     * 申请工单下发锁
     *
     * @return 工单下发锁申请结果
     */
    public synchronized Boolean getDistributeLock() {
@@ -589,6 +650,7 @@
    /**
     * 添加工单下发记录
     *
     * @param workOrderNoList 工单id
     */
    private void addDistributeRecord(List<String> workOrderNoList, WorkOrderDistributeWayEnum distributeWay) {
@@ -602,6 +664,7 @@
    /**
     * 根据id查找
     *
     * @param id
     * @return
     */
@@ -616,6 +679,7 @@
    /**
     * 列表
     *
     * @return
     */
    @Override
@@ -665,7 +729,25 @@
    @Override
    public List<WorkOrderRegionVO> workOrderRegion(DashboardQuery dashboardQuery) {
        return baseMapper.workOrderRegion(dashboardQuery);
        //初始化所有区域数据
        List<WorkOrderRegionVO> vos = new ArrayList<>();
        for (AreaDeptEnum value : AreaDeptEnum.values()) {
            WorkOrderRegionVO vo = new WorkOrderRegionVO();
            vo.setArea(value.getName());
            vo.setDoneNum(0);
            vo.setTodoNum(0);
            vos.add(vo);
        }
        List<WorkOrderRegionVO> workOrderRegionVOS = baseMapper.workOrderRegion(dashboardQuery);
        for (WorkOrderRegionVO vo : vos) {
            for (WorkOrderRegionVO workOrder : workOrderRegionVOS) {
                //赋值
                if (vo.getArea().equals(workOrder.getArea())) {
                    BeanUtils.copyProperties(workOrder, vo);
                }
            }
        }
        return vos;
    }
@@ -822,7 +904,7 @@
        if (Objects.nonNull(beforeRecord)) {
            if (now.before(beforeRecord.getBeginCreateTime())) {
                process.setBeforeReportMsg("事前报备已失效");
            } else if (now.after(beforeRecord.getEndCreateTime())){
            } else if (now.after(beforeRecord.getEndCreateTime())) {
                process.setBeforeReportMsg("事前报备未生效");
            } else {
                process.setBeforeReportMsg("已事前报备");
@@ -831,7 +913,7 @@
        if (Objects.nonNull(afterRecord)) {
            if (now.before(afterRecord.getBeginCreateTime())) {
                process.setAfterReportMsg("事后报备已失效");
            } else if (now.after(afterRecord.getEndCreateTime())){
            } else if (now.after(afterRecord.getEndCreateTime())) {
                process.setAfterReportMsg("事后报备未生效");
            } else {
                process.setAfterReportMsg("已事后报备");
@@ -861,4 +943,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;
    }
}