| | |
| | | import com.ycl.utils.redis.RedisCache; |
| | | import com.ycl.utils.uuid.IdUtils; |
| | | import constant.Constants; |
| | | import constant.RedisConstant; |
| | | import enumeration.general.*; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | 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; |
| | |
| | | private final SysConfigMapper configMapper; |
| | | private final ReportMapper reportMapper; |
| | | private final WorkOrderCheckImgMapper workOrderCheckImgMapper; |
| | | |
| | | @Value("${rtsp.server:http://127.0.0.1:7788}") |
| | | private String rtspServer; |
| | | |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | //TODO:Redis加锁,从Redis读取当日工单数据量 |
| | | public synchronized Boolean innerAddWorkOrder(List<WorkOrder> workOrderList) { |
| | | int total = workOrderList.size(); |
| | | workOrderList.stream().filter(item -> { |
| | |
| | | continue; |
| | | } else { |
| | | for (String errorType : errorTypes) { |
| | | if (! errorNameList.contains(errorType)) { |
| | | if (!errorNameList.contains(errorType)) { |
| | | // 错误类型不一样,就新增一个错误类型,并且重置工单状态为待处理 |
| | | WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType(); |
| | | workOrderErrorType.setWorkOrderNo(databaseWorkOrder.getWorkOrderNo()); |
| | |
| | | SysConfig normal = configMapper.checkConfigKeyUnique("normal.wordkorder.alarm.time"); |
| | | // 如果即将生成工单,但是设备国标码查不到点位,则不添加? |
| | | List<WorkOrder> notAddList = new ArrayList<>(); |
| | | //查redis今日工单数量 |
| | | int workOrderNum = 1; |
| | | //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 ? 1 : (Integer) redisNum; |
| | | break; |
| | | } else { |
| | | if (i == 2) { |
| | | log.error("锁被占用"); |
| | | return Boolean.FALSE; |
| | | } |
| | | //等待一段时间后继续 |
| | | Thread.sleep(3000); |
| | | } |
| | | } |
| | | } catch (InterruptedException e) { |
| | | log.error("获取锁异常"); |
| | | return Boolean.FALSE; |
| | | } finally { |
| | | redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId); |
| | | } |
| | | |
| | | for (WorkOrder workOrder : waitAddList) { |
| | | YwPoint point = pointMapping.get(workOrder.getSerialNumber()); |
| | | if (Objects.isNull(point)) { |
| | | notAddList.add(workOrder); |
| | | continue; |
| | | } |
| | | workOrder.setWorkOrderNo(IdUtils.randomNO(now)); |
| | | //数字前面补0 |
| | | workOrder.setWorkOrderNo(IdUtils.randomNO(now, String.format("%05d", workOrderNum))); |
| | | workOrderNum++; |
| | | if (Objects.nonNull(point.getUnitId())) { |
| | | workOrder.setUnitId(Math.toIntExact(point.getUnitId())); |
| | | } |
| | |
| | | if (CollectionUtils.isEmpty(waitAddList)) { |
| | | return Boolean.TRUE; |
| | | } |
| | | //记录工单数 |
| | | redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum); |
| | | // 保存工单和故障类型 |
| | | baseMapper.addMany(waitAddList); |
| | | if (! CollectionUtils.isEmpty(waitAddErrorTypeList)) { |
| | | if (!CollectionUtils.isEmpty(waitAddErrorTypeList)) { |
| | | workOrderErrorTypeService.getBaseMapper().addMany(waitAddErrorTypeList); |
| | | } |
| | | // 如果是直接下发,添加下发记录 |
| | |
| | | |
| | | /** |
| | | * 添加 |
| | | * |
| | | * @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; |
| | | 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.randomNO(now, String.format("%05d", workOrderNum))); |
| | | workOrderNum++; |
| | | redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, 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("添加失败"); |
| | |
| | | |
| | | /** |
| | | * 修改 |
| | | * |
| | | * @param form |
| | | * @return |
| | | */ |
| | |
| | | @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 |
| | |
| | | |
| | | /** |
| | | * 批量删除 |
| | | * |
| | | * @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("删除失败"); |
| | |
| | | |
| | | /** |
| | | * 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("删除失败"); |
| | |
| | | |
| | | /** |
| | | * 分页查询 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | |
| | | 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(","))); |
| | |
| | | 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("无法生成快速下发的时间范围,请选择正确的快速下发方式"); |
| | | } |
| | |
| | | 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) |
| | |
| | | @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) |
| | |
| | | .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()) |
| | |
| | | |
| | | /** |
| | | * 申请工单下发锁 |
| | | * |
| | | * @return 工单下发锁申请结果 |
| | | */ |
| | | public synchronized Boolean getDistributeLock() { |
| | |
| | | |
| | | /** |
| | | * 添加工单下发记录 |
| | | * |
| | | * @param workOrderNoList 工单id |
| | | */ |
| | | private void addDistributeRecord(List<String> workOrderNoList, WorkOrderDistributeWayEnum distributeWay) { |
| | |
| | | |
| | | /** |
| | | * 根据id查找 |
| | | * |
| | | * @param id |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 列表 |
| | | * |
| | | * @return |
| | | */ |
| | | @Override |
| | |
| | | for (WorkOrderRegionVO vo : vos) { |
| | | for (WorkOrderRegionVO workOrder : workOrderRegionVOS) { |
| | | //赋值 |
| | | if(vo.getArea().equals(workOrder.getArea())){ |
| | | BeanUtils.copyProperties(workOrder,vo); |
| | | if (vo.getArea().equals(workOrder.getArea())) { |
| | | BeanUtils.copyProperties(workOrder, vo); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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("已事前报备"); |
| | |
| | | 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("已事后报备"); |