车间能级提升-智能设备管理系统
baoshiwei
2025-05-29 21811bad262b3f774ca7c12a68e0bf64a8321501
feat(eims): 支持多文件导入点检计划

- 修改了 EimsInspectPlanController 中的 importData 方法,支持接收多个文件
- 更新了 EimsInspectPlanServiceImpl 中的 importData 方法,增加了对多个文件的处理逻辑
- 在前端 insp-plan-import-modal组件中,增加了多文件上传的支持
- 优化了文件读取和错误处理逻辑,提高了导入的稳定性和用户体验
已修改5个文件
66 ■■■■■ 文件已修改
eims-ui/apps/web-antd/src/views/_core/authentication/login.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/eims/insp-plan/insp-plan-import-modal.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInspectPlanController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/InspectCheckItemVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectPlanServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eims-ui/apps/web-antd/src/views/_core/authentication/login.vue
@@ -51,10 +51,10 @@
onMounted(async () => {
  // 启动单点登录注释掉下边这一行,否则放开
  await Promise.all([loadCaptcha(), loadTenant()]);
  // await Promise.all([loadCaptcha(), loadTenant()]);
  // 启动单点登录放开下边两行注释,否则注释掉
  // const href = await authBinding('keycloak', '000000');
  // window.location.href = href;
  const href = await authBinding('keycloak', '000000');
  window.location.href = href;
});
const formSchema = computed((): VbenFormSchema[] => {
eims-ui/apps/web-antd/src/views/eims/insp-plan/insp-plan-import-modal.vue
@@ -26,15 +26,21 @@
async function handleSubmit() {
  try {
    modalApi.modalLoading(true);
    if (fileList.value.length !== 1) {
    if (fileList.value.length === 0) {
      handleCancel();
      return;
    }
    const data = {
      file: fileList.value[0]!.originFileObj as Blob,
      updateSupport: unref(checked),
    };
    const { code, msg } = await inspPlanImportData(data);
    // 构建包含多个文件的请求数据,支持多文件上传
    const formData = new FormData();
    fileList.value.forEach((file) => {
      const blob = file.originFileObj as Blob;
      formData.append('files', blob); // 将多个文件以数组形式添加到表单数据中
    });
    formData.append('updateSupport', unref(checked).toString()); // 添加 updateSupport 参数
    // 调用接口上传多文件
    const { code, msg } = await inspPlanImportData(formData);
    let modal = Modal.success;
    if (code === 200) {
      emit('reload');
@@ -76,7 +82,7 @@
    <UploadDragger
      v-model:file-list="fileList"
      :before-upload="() => false"
      :max-count="1"
      :multiple="true"
      :show-upload-list="true"
      accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
    >
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInspectPlanController.java
@@ -121,10 +121,13 @@
    @Log(title = "点检计划", businessType = BusinessType.IMPORT)
    @SaCheckPermission("eims:inspectPlan:import")
    @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
        // ExcelResult<InspectCheckItemVo> result = ExcelUtil.importExcel(file.getInputStream(), InspectCheckItemVo.class, new InspectCheckItemImportListener(updateSupport));
    public R<Void> importData(@RequestPart("files") List<MultipartFile> files, boolean updateSupport) throws Exception {
        StringBuilder successMsg = new StringBuilder();
        for (MultipartFile file : files) {
        String res = eimsInspectPlanService.importData(file, updateSupport);
        return R.ok(res);
            successMsg.append(res).append(";");
        }
        return R.ok(successMsg.toString());
    }
    /**
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/InspectCheckItemVo.java
@@ -25,7 +25,7 @@
    /**
     * 点检项名称
     */
    @ExcelProperty(value = "内容")
    @ExcelProperty(value = {"内容", "点检项目", "项目"}, index = 1)
    private String itemName;
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectPlanServiceImpl.java
@@ -208,10 +208,12 @@
    }
    @Override
    public String importData(MultipartFile file, boolean updateSupport) throws IOException, IOException {
    public String importData(MultipartFile file, boolean updateSupport) {
        try {
        // 点检项目列表(假设存在对应的点检项VO)
        InspectCheckItemImportListener checkItemImportListener = new InspectCheckItemImportListener(updateSupport);
        EasyExcel.read(file.getInputStream(), InspectCheckItemVo.class, checkItemImportListener).headRowNumber(3).sheet().doRead();
            EasyExcel.read(file.getInputStream(), InspectCheckItemVo.class, checkItemImportListener)
                .headRowNumber(3).sheet().doRead();
        List<InspectCheckItemVo> successList = checkItemImportListener.getSuccessList();
        // 读取固定资产编号(假设位置不同)
@@ -223,21 +225,27 @@
                return colonIndex != -1 ? value.substring(colonIndex + 1) : value;
            })
            .map(String::trim)
            .orElseThrow(() -> new ServiceException("导入失败,无法读取固定资产编号"));
                .orElse("");
            if (assetNo.isEmpty()) {
                return file.getOriginalFilename() + " 导入失败,无法读取固定资产编号";
            }
        // 查询设备信息
        QueryWrapper<EimsEqu> query = new QueryWrapper<>();
        query.eq("asset_no", assetNo);
        EimsEquVo equVo = equMapper.selectVoOne(query);
        if (equVo == null) throw new ServiceException("设备未找到,请先在设备台帐中添加");
            if (equVo == null) {
                return file.getOriginalFilename() + " 设备未找到,请先在设备台帐中添加";
            }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (InspectCheckItemVo itemVo : successList) {
            if ("设备状态卡状态".equals(itemVo.getItemName())) break;
                if ("设备状态卡状态".equals(itemVo.getItemName()) || itemVo.getItemName().contains("运行时间")) {
                    break;
                }
            // 如果允许覆盖,则删除已存在的记录
            if (updateSupport) {
@@ -258,14 +266,15 @@
            if (!insertByBo(bo)) {
                failureNum++;
                failureMsg.append(failureNum).append("、导入失败<br>");
            } else {
                successNum++;
                successMsg.append(successNum).append("、导入成功<br>");
            }
        }
        return failureNum > 0 ? failureMsg.toString() : successMsg.toString();
            return file.getOriginalFilename() + " 导入成功:" + successNum + "条,导入失败:" + failureNum + "条";
        } catch (Exception e) {
            return file.getOriginalFilename() + " 导入异常:" + e.getMessage();
        }
    }