Browse Source

工单批量上传优化v2

ops-management-platform-backend-dev
gjh 3 days ago
parent
commit
901cd64de9
  1. 31
      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. 56
      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

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

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

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

@ -1,35 +1,31 @@
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.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.ibatis.annotations.Param;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
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.WorkOrderInfo;
import org.dromara.platform.domain.WorkReviewInfo;
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.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.bo.WorkOrderInfoBo;
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("批量审核工单!");
}
@GetMapping("/getFaultLocationList")
public R<Set<String>> getFaultLocationList(String maintenanceUnit) {
Set<String> rs = workOrderInfoService.getFaultLocationList(maintenanceUnit);
return R.ok(rs);
}
//@SaCheckPermission("platform:workOrder:dealWithList")
@GetMapping("/dealWithList")
public TableDataInfo<WorkOrderInfoVo> dealWithList(WorkOrderInfoBo bo, PageQuery pageQuery) {

56
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 com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.platform.domain.PointInfo;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.platform.domain.WorkOrderInfo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.platform.domain.vo.ContractSelectVo;
import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.mapper.ContractInfoMapper;
import org.dromara.platform.service.IContractInfoService;
import org.dromara.platform.service.IWorkOrderInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.*;
/**
* 自定义监听器读数据
@ -37,6 +28,8 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
// 合同名称列表
private final List<String> contractNames;
private final Set<String> faultLocationList;
// 服务依赖由外部传入
private final IWorkOrderInfoService workOrderInfoService;
private final IContractInfoService contractInfoService;
@ -49,6 +42,7 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
this.workOrderInfoService = workOrderInfoService;
this.contractInfoService = contractInfoService;
this.contractNames = loadContractNames();
this.faultLocationList = workOrderInfoService.getFaultLocationList(null);
}
private List<String> loadContractNames() {
@ -61,36 +55,52 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
@Override
public void invoke(WorkOrderInfoVo workOrderInfoVo, AnalysisContext analysisContext) {
try {
WorkOrderInfo info = new WorkOrderInfo();
BeanUtils.copyProperties(workOrderInfoVo, info, "id");
String contractName = info.getContractName();
if (contractName == null || contractName.trim().isEmpty()) {
throw new IllegalArgumentException("合同名称为空");
if (StringUtils.isBlank(contractName)) {
int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:合同名称为空 故障地点: %s",
rowNum, workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
return;
}
if (!contractNames.contains(contractName)) {
int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:合同名称不存在:%s 故障地点: %s",
rowNum, contractName, workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
return;
}
if (contractNames.contains(contractName)) {
/* if (faultLocationList.contains(info.getFaultLocation())) {
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);
} else {
throw new IllegalArgumentException("合同名称不存在:" + contractName);
}
WorkOrderInfoBo convert = BeanUtil.copyProperties(info, WorkOrderInfoBo.class);
workOrderInfoService.insertByBo(convert);
} catch (Exception e) {
int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:%s", rowNum, e.getMessage());
log.error(errorMsg, e);
String errorMsg = String.format("第 %d 行数据导入失败:系统异常 - %s 故障地点: %s",
rowNum, e.getMessage(), workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
}
}
@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.List;
import java.util.Set;
/**
* 工单信息Service接口
@ -145,4 +146,6 @@ public interface IWorkOrderInfoService {
void batchReviewOrder(WorkReviewInfoBo bo);
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.collection.CollectionUtil;
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.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.RoleDTO;
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.StringUtils;
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 com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.platform.domain.*;
import org.dromara.platform.domain.bo.*;
import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.dromara.platform.domain.vo.WorkOrderDelayVo;
import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.mapper.*;
import org.dromara.platform.service.*;
import org.dromara.workflow.domain.bo.TaskBo;
import org.dromara.workflow.domain.vo.TaskVo;
import org.dromara.workflow.service.IActTaskService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
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.Instant;
@ -1740,6 +1740,18 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
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