Browse Source

工单批量上传优化v2

ops-management-platform-backend-dev
gjh 3 days ago
parent
commit
901cd64de9
  1. 33
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java
  2. 47
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java
  3. 66
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java
  4. 3
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java
  5. 26
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java

33
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java

@ -1,13 +1,16 @@
package org.dromara.platform.controller; package org.dromara.platform.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.platform.domain.bo.PointInfoBo; import org.dromara.platform.domain.bo.PointInfoBo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo; import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.platform.domain.vo.DocumentTypeVo;
import org.dromara.platform.domain.vo.PointInfoVo; import org.dromara.platform.domain.vo.PointInfoVo;
import org.dromara.platform.domain.vo.WorkOrderInfoVo; import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.listener.PointInfoListener; import org.dromara.platform.listener.PointInfoListener;
@ -24,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
@ -99,7 +103,7 @@ public class ExcelController {
@PostMapping("/uploadWorkOrderInfo") @PostMapping("/uploadWorkOrderInfo")
public void uploadWorkOrderInfo(MultipartFile file, HttpServletResponse response) throws IOException { public R<List<String>> uploadWorkOrderInfo(MultipartFile file, HttpServletResponse response) throws IOException {
long t1 = System.currentTimeMillis(); long t1 = System.currentTimeMillis();
WorkOrderInfoListener listener = new WorkOrderInfoListener(workOrderInfoService, contractInfoService); WorkOrderInfoListener listener = new WorkOrderInfoListener(workOrderInfoService, contractInfoService);
@ -110,24 +114,23 @@ public class ExcelController {
.sheet() .sheet()
.doRead(); .doRead();
// ✅ 提前检查错误信息,若有则直接抛出异常 List<String> errorMessages = listener.getErrorMessages();
if (!listener.getErrorMessages().isEmpty()) {
throw new ServiceException("部分数据导入失败:" + listener.getErrorMessages()); // ✅ 提前检查错误信息,存在则汇总返回给前端
if (CollectionUtil.isNotEmpty(errorMessages)) {
// 返回错误信息列表
return R.ok("部分数据导入失败", errorMessages);
} }
// ⬇️ 只有在没有错误的情况下才执行以下内容 // ⬇️只有在没有错误的情况下才执行以下内容
long t2 = System.currentTimeMillis(); long t2 = System.currentTimeMillis();
response.setContentType("text/html;charset=utf8"); String message = "导入全部数据成功! 共用时:"+(t2-t1)+"ms";
response.getWriter().println("导入数据成功!,共用时:" + (t2 - t1) + "ms"); List<String> successMessages = new ArrayList<>();
log.info("工单数据导入完成,共用时:{}ms", (t2 - t1)); successMessages.add(message);
return R.ok(message,successMessages);
} catch (Exception e) { } catch (Exception e) {
log.error("导入失败", e); log.error("文件导入失败: ", e);
// 系统异常:部分数据导入失败:[第 19 行数据导入失败:合同名称不存在:2023年江北区1812路公共视频监控服务项目(盈力222)] return R.fail("文件导入失败: " + e.getMessage());
throw new ServiceException("导入失败:" + e.getMessage());
} finally {
// 清空错误信息
listener.clearErrors();
} }
} }
} }

47
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java

@ -1,35 +1,31 @@
package org.dromara.platform.controller; package org.dromara.platform.controller;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.NotEmpty;
import cn.dev33.satoken.annotation.SaCheckPermission; import jakarta.validation.constraints.NotNull;
import org.apache.ibatis.annotations.Param; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.platform.domain.InspectionPlanInfo; import org.dromara.platform.domain.InspectionPlanInfo;
import org.dromara.platform.domain.WorkOrderInfo; import org.dromara.platform.domain.WorkOrderInfo;
import org.dromara.platform.domain.WorkReviewInfo;
import org.dromara.platform.domain.bo.WorkOrderDelayBo; import org.dromara.platform.domain.bo.WorkOrderDelayBo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.platform.domain.bo.WorkReviewInfoBo; import org.dromara.platform.domain.bo.WorkReviewInfoBo;
import org.dromara.platform.domain.dto.WorkOrderInfoDto; import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.platform.domain.vo.WorkOrderInfoVo; import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.platform.service.IWorkOrderInfoService; import org.dromara.platform.service.IWorkOrderInfoService;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
/** /**
* 工单信息 * 工单信息
@ -188,6 +184,13 @@ public class WorkOrderInfoController extends BaseController {
return R.ok("批量审核工单!"); return R.ok("批量审核工单!");
} }
@GetMapping("/getFaultLocationList")
public R<Set<String>> getFaultLocationList(String maintenanceUnit) {
Set<String> rs = workOrderInfoService.getFaultLocationList(maintenanceUnit);
return R.ok(rs);
}
//@SaCheckPermission("platform:workOrder:dealWithList") //@SaCheckPermission("platform:workOrder:dealWithList")
@GetMapping("/dealWithList") @GetMapping("/dealWithList")
public TableDataInfo<WorkOrderInfoVo> dealWithList(WorkOrderInfoBo bo, PageQuery pageQuery) { public TableDataInfo<WorkOrderInfoVo> dealWithList(WorkOrderInfoBo bo, PageQuery pageQuery) {

66
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java

@ -3,26 +3,17 @@ package org.dromara.platform.listener;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.listener.ReadListener;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.platform.domain.PointInfo;
import org.dromara.platform.domain.WorkOrderInfo; import org.dromara.platform.domain.WorkOrderInfo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo; import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.platform.domain.vo.ContractSelectVo; import org.dromara.platform.domain.vo.ContractSelectVo;
import org.dromara.platform.domain.vo.WorkOrderInfoVo; import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.mapper.ContractInfoMapper;
import org.dromara.platform.service.IContractInfoService; import org.dromara.platform.service.IContractInfoService;
import org.dromara.platform.service.IWorkOrderInfoService; import org.dromara.platform.service.IWorkOrderInfoService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;
import java.time.LocalDate; import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 自定义监听器读数据 * 自定义监听器读数据
@ -37,6 +28,8 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
// 合同名称列表 // 合同名称列表
private final List<String> contractNames; private final List<String> contractNames;
private final Set<String> faultLocationList;
// 服务依赖由外部传入 // 服务依赖由外部传入
private final IWorkOrderInfoService workOrderInfoService; private final IWorkOrderInfoService workOrderInfoService;
private final IContractInfoService contractInfoService; private final IContractInfoService contractInfoService;
@ -49,6 +42,7 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
this.workOrderInfoService = workOrderInfoService; this.workOrderInfoService = workOrderInfoService;
this.contractInfoService = contractInfoService; this.contractInfoService = contractInfoService;
this.contractNames = loadContractNames(); this.contractNames = loadContractNames();
this.faultLocationList = workOrderInfoService.getFaultLocationList(null);
} }
private List<String> loadContractNames() { private List<String> loadContractNames() {
@ -61,36 +55,52 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
@Override @Override
public void invoke(WorkOrderInfoVo workOrderInfoVo, AnalysisContext analysisContext) { public void invoke(WorkOrderInfoVo workOrderInfoVo, AnalysisContext analysisContext) {
try { try {
WorkOrderInfo info = new WorkOrderInfo(); WorkOrderInfo info = new WorkOrderInfo();
BeanUtils.copyProperties(workOrderInfoVo, info, "id"); BeanUtils.copyProperties(workOrderInfoVo, info, "id");
String contractName = info.getContractName(); String contractName = info.getContractName();
if (contractName == null || contractName.trim().isEmpty()) {
throw new IllegalArgumentException("合同名称为空");
}
if (contractNames.contains(contractName)) { if (StringUtils.isBlank(contractName)) {
String unit = contractInfoService.getIoCompany(contractName); int rowNum = analysisContext.readRowHolder().getRowIndex();
if (unit != null) { String errorMsg = String.format("第 %d 行数据导入失败:合同名称为空 故障地点: %s",
info.setMaintenanceUnit(unit); rowNum, workOrderInfoVo.getFaultLocation());
} errorMessages.add(errorMsg);
info.setRepairTime(new Date()); return;
// 创建工单 }
WorkOrderInfoBo convert = BeanUtil.copyProperties(info, WorkOrderInfoBo.class);
workOrderInfoService.insertByBo(convert);
if (!contractNames.contains(contractName)) {
int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:合同名称不存在:%s 故障地点: %s",
rowNum, contractName, workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
return;
}
} else { /* if (faultLocationList.contains(info.getFaultLocation())) {
throw new IllegalArgumentException("合同名称不存在:" + contractName); int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:该点位正在维修 故障地点: %s",
rowNum, workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
return;
}*/
String unit = contractInfoService.getIoCompany(contractName);
if (unit != null) {
info.setMaintenanceUnit(unit);
} }
info.setRepairTime(new Date());
WorkOrderInfoBo convert = BeanUtil.copyProperties(info, WorkOrderInfoBo.class);
workOrderInfoService.insertByBo(convert);
} catch (Exception e) { } catch (Exception e) {
int rowNum = analysisContext.readRowHolder().getRowIndex(); int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:%s", rowNum, e.getMessage()); String errorMsg = String.format("第 %d 行数据导入失败:系统异常 - %s 故障地点: %s",
log.error(errorMsg, e); rowNum, e.getMessage(), workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg); errorMessages.add(errorMsg);
} }
} }
@Override @Override

3
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java

@ -13,6 +13,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 工单信息Service接口 * 工单信息Service接口
@ -145,4 +146,6 @@ public interface IWorkOrderInfoService {
void batchReviewOrder(WorkReviewInfoBo bo); void batchReviewOrder(WorkReviewInfoBo bo);
void addData(List<WorkOrderInfo> list); void addData(List<WorkOrderInfo> list);
Set<String> getFaultLocationList(String maintenanceUnit);
} }

26
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java

@ -3,8 +3,12 @@ package org.dromara.platform.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
@ -13,26 +17,22 @@ import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.dromara.common.mybatis.core.page.TableDataInfo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.platform.domain.*; import org.dromara.platform.domain.*;
import org.dromara.platform.domain.bo.*; import org.dromara.platform.domain.bo.*;
import org.dromara.platform.domain.dto.WorkOrderInfoDto; import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.dromara.platform.domain.vo.WorkOrderDelayVo; import org.dromara.platform.domain.vo.WorkOrderDelayVo;
import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.mapper.*; import org.dromara.platform.mapper.*;
import org.dromara.platform.service.*; import org.dromara.platform.service.*;
import org.dromara.workflow.domain.bo.TaskBo; import org.dromara.workflow.domain.bo.TaskBo;
import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.domain.vo.TaskVo;
import org.dromara.workflow.service.IActTaskService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.workflow.service.IActTaskService;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
@ -1740,6 +1740,18 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
baseMapper.insert(list); baseMapper.insert(list);
} }
@Override
public Set<String> getFaultLocationList(String maintenanceUnit) {
LambdaQueryWrapper<WorkOrderInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(maintenanceUnit), WorkOrderInfo::getMaintenanceUnit, maintenanceUnit);
List<WorkOrderInfo> workOrderInfos = baseMapper.selectList(queryWrapper);
Set<String> faultLocationList = workOrderInfos.stream()
.map(WorkOrderInfo::getFaultLocation)
.collect(Collectors.toSet());
return faultLocationList;
}
/** /**
* 截取超时后面的部分 * 截取超时后面的部分
*/ */

Loading…
Cancel
Save