From 901cd64de961d1cf01b2e038ae302eb5dd93fa00 Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Wed, 25 Jun 2025 10:35:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E6=89=B9=E9=87=8F=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E4=BC=98=E5=8C=96v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/controller/ExcelController.java | 33 +++++----- .../controller/WorkOrderInfoController.java | 47 ++++++------- .../listener/WorkOrderInfoListener.java | 66 +++++++++++-------- .../service/IWorkOrderInfoService.java | 3 + .../impl/WorkOrderInfoServiceImpl.java | 26 ++++++-- 5 files changed, 103 insertions(+), 72 deletions(-) diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java index 57e34e8..2a1e3cf 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java +++ b/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> 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 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 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()); } } } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java index 880a761..b32b848 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java +++ b/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> getFaultLocationList(String maintenanceUnit) { + Set rs = workOrderInfoService.getFaultLocationList(maintenanceUnit); + return R.ok(rs); + } + //@SaCheckPermission("platform:workOrder:dealWithList") @GetMapping("/dealWithList") public TableDataInfo dealWithList(WorkOrderInfoBo bo, PageQuery pageQuery) { diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java index 90259d8..43e8a81 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java +++ b/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 { // 合同名称列表 private final List contractNames; + private final Set faultLocationList; + // 服务依赖由外部传入 private final IWorkOrderInfoService workOrderInfoService; private final IContractInfoService contractInfoService; @@ -49,6 +42,7 @@ public class WorkOrderInfoListener implements ReadListener { this.workOrderInfoService = workOrderInfoService; this.contractInfoService = contractInfoService; this.contractNames = loadContractNames(); + this.faultLocationList = workOrderInfoService.getFaultLocationList(null); } private List loadContractNames() { @@ -61,36 +55,52 @@ public class WorkOrderInfoListener implements ReadListener { @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 (contractNames.contains(contractName)) { - 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); + 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; + } - } else { - throw new IllegalArgumentException("合同名称不存在:" + 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); } 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 diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java index b60cc42..e3ddfa3 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java +++ b/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 list); + + Set getFaultLocationList(String maintenanceUnit); } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java index 3990b94..af9ef05 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java +++ b/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 getFaultLocationList(String maintenanceUnit) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(maintenanceUnit), WorkOrderInfo::getMaintenanceUnit, maintenanceUnit); + + List workOrderInfos = baseMapper.selectList(queryWrapper); + Set faultLocationList = workOrderInfos.stream() + .map(WorkOrderInfo::getFaultLocation) + .collect(Collectors.toSet()); + return faultLocationList; + } + /** * 截取“超时”后面的部分 */