From 738deb04df0a3add9c2493c1541ef6df03edd296 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Fri, 21 Nov 2025 17:02:48 +0800 Subject: [PATCH] =?UTF-8?q?opt:=20=E9=99=84=E4=BB=B6=E4=B8=8A=E4=BC=A0/?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/nl/dev/api/DevFileApi.java | 11 ++ .../file/provider/DevFileApiProvider.java | 5 + .../controller/ProjectFileController.java | 48 ++++-- .../projectfile/param/ProjectFileParam.java | 12 ++ .../service/ProjectFileService.java | 2 + .../service/impl/ProjectFileServiceImpl.java | 14 +- .../controller/ProjectStageController.java | 19 ++- .../param/ProjectStageAddBatchParam.java | 31 ++++ .../service/ProjectStageService.java | 7 +- .../service/impl/ProjectStageServiceImpl.java | 41 ++++- nl-vue/src/api/pmm/projectFileApi.js | 4 + nl-vue/src/api/pmm/projectStageApi.js | 4 + .../project/request/batchStageAddDialog.vue | 153 ++++++++++++++++++ .../views/pmm/project/request/description.vue | 60 ++++++- .../pmm/project/request/stageAddDialog.vue | 1 - 15 files changed, 376 insertions(+), 36 deletions(-) create mode 100644 nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/param/ProjectFileParam.java create mode 100644 nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/param/ProjectStageAddBatchParam.java create mode 100644 nl-vue/src/views/pmm/project/request/batchStageAddDialog.vue diff --git a/nl-plugin-api/nl-plugin-dev-api/src/main/java/org/nl/dev/api/DevFileApi.java b/nl-plugin-api/nl-plugin-dev-api/src/main/java/org/nl/dev/api/DevFileApi.java index 8c15cde..8dae2f5 100644 --- a/nl-plugin-api/nl-plugin-dev-api/src/main/java/org/nl/dev/api/DevFileApi.java +++ b/nl-plugin-api/nl-plugin-dev-api/src/main/java/org/nl/dev/api/DevFileApi.java @@ -111,5 +111,16 @@ public interface DevFileApi { */ JSONObject getFileInfoById(String id); + /** + * 通过文件地址获取文件信息 + * @param fileAddress 文件地址 + * @return + */ JSONObject getFileInfoByUrl(String fileAddress); + + /** + * 通过文件id删除文件 + * @param fileId + */ + void deleteById(String fileId); } diff --git a/nl-plugin/nl-plugin-dev/src/main/java/org/nl/dev/modular/file/provider/DevFileApiProvider.java b/nl-plugin/nl-plugin-dev/src/main/java/org/nl/dev/modular/file/provider/DevFileApiProvider.java index aed5bbe..ec5f3a2 100644 --- a/nl-plugin/nl-plugin-dev/src/main/java/org/nl/dev/modular/file/provider/DevFileApiProvider.java +++ b/nl-plugin/nl-plugin-dev/src/main/java/org/nl/dev/modular/file/provider/DevFileApiProvider.java @@ -91,4 +91,9 @@ public class DevFileApiProvider implements DevFileApi { .map(JSONUtil::parseObj) .orElse(new JSONObject()); } + + @Override + public void deleteById(String fileId) { + devFileService.removeById(fileId); + } } diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/controller/ProjectFileController.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/controller/ProjectFileController.java index cc86c59..fbe8323 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/controller/ProjectFileController.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/controller/ProjectFileController.java @@ -15,29 +15,29 @@ package org.nl.pmm.modular.projectfile.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaIgnore; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import org.nl.common.annotation.CommonLog; +import org.nl.common.pojo.CommonResult; +import org.nl.pmm.modular.projectfile.entity.ProjectFile; import org.nl.pmm.modular.projectfile.param.*; +import org.nl.pmm.modular.projectfile.service.ProjectFileService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import org.nl.common.annotation.CommonLog; -import org.nl.common.pojo.CommonResult; -import org.nl.pmm.modular.projectfile.entity.ProjectFile; -import org.nl.pmm.modular.projectfile.service.ProjectFileService; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; import java.util.List; /** * 项目附件表控制器 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Tag(name = "项目附件表控制器") @RestController @@ -51,7 +51,7 @@ public class ProjectFileController { * 获取项目附件表分页 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "获取项目附件表分页") @SaCheckPermission("/pmm/projectfile/page") @@ -64,7 +64,7 @@ public class ProjectFileController { * 添加项目附件表 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "添加项目附件表") @CommonLog("添加项目附件表") @@ -79,7 +79,7 @@ public class ProjectFileController { * 编辑项目附件表 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "编辑项目附件表") @CommonLog("编辑项目附件表") @@ -94,22 +94,23 @@ public class ProjectFileController { * 删除项目附件表 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "删除项目附件表") @CommonLog("删除项目附件表") @SaCheckPermission("/pmm/projectfile/delete") @PostMapping("/pmm/projectfile/delete") public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") - List projectFileIdParamList) { + List projectFileIdParamList) { projectFileService.delete(projectFileIdParamList); return CommonResult.ok(); } + /** * 删除项目附件表 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "保存项目附件表") @CommonLog("保存项目附件表") @@ -125,7 +126,7 @@ public class ProjectFileController { * 获取项目附件表详情 * * @author liyongde - * @date 2025/11/17 20:24 + * @date 2025/11/17 20:24 */ @Operation(summary = "获取项目附件表详情") @SaCheckPermission("/pmm/projectfile/detail") @@ -133,4 +134,19 @@ public class ProjectFileController { public CommonResult detail(@Valid ProjectFileIdParam projectFileIdParam) { return CommonResult.data(projectFileService.detail(projectFileIdParam)); } + + /** + * 删除项目附件表 + * + * @author liyongde + * @date 2025/11/17 20:24 + */ + @Operation(summary = "删除项目附件表") + @CommonLog("删除项目附件表") + @SaCheckPermission("/pmm/projectfile/delete-file") + @PostMapping("/pmm/projectfile/delete-file") + public CommonResult deleteFile(@RequestBody ProjectFileParam param) { + projectFileService.deleteAttachment(param); + return CommonResult.ok(); + } } diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/param/ProjectFileParam.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/param/ProjectFileParam.java new file mode 100644 index 0000000..8bb8e36 --- /dev/null +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/param/ProjectFileParam.java @@ -0,0 +1,12 @@ +package org.nl.pmm.modular.projectfile.param; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/11/21 + */ +@Data +public class ProjectFileParam { + private String id; +} diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/ProjectFileService.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/ProjectFileService.java index 82c16e9..73433b7 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/ProjectFileService.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/ProjectFileService.java @@ -79,4 +79,6 @@ public interface ProjectFileService extends IService { List getFileByProjectId(String projectId); void bindProjectFile(ProjectFileAddParam param); + + void deleteAttachment(ProjectFileParam param); } diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/impl/ProjectFileServiceImpl.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/impl/ProjectFileServiceImpl.java index b7c31f8..07548fc 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/impl/ProjectFileServiceImpl.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectfile/service/impl/ProjectFileServiceImpl.java @@ -17,6 +17,7 @@ import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -28,10 +29,7 @@ import org.nl.dev.api.DevFileApi; import org.nl.pmm.modular.project.entity.vo.ProjectAttachmentVo; import org.nl.pmm.modular.projectfile.entity.ProjectFile; import org.nl.pmm.modular.projectfile.mapper.ProjectFileMapper; -import org.nl.pmm.modular.projectfile.param.ProjectFileAddParam; -import org.nl.pmm.modular.projectfile.param.ProjectFileEditParam; -import org.nl.pmm.modular.projectfile.param.ProjectFileIdParam; -import org.nl.pmm.modular.projectfile.param.ProjectFilePageParam; +import org.nl.pmm.modular.projectfile.param.*; import org.nl.pmm.modular.projectfile.service.ProjectFileService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -111,4 +109,12 @@ public class ProjectFileServiceImpl extends ServiceImpl().eq(ProjectFile::getFileId, param.getId())); + } } diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/controller/ProjectStageController.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/controller/ProjectStageController.java index 84f9e9e..f47c4eb 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/controller/ProjectStageController.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/controller/ProjectStageController.java @@ -16,6 +16,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; +import org.nl.pmm.modular.projectstage.param.*; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -24,10 +25,6 @@ import org.springframework.web.bind.annotation.RestController; import org.nl.common.annotation.CommonLog; import org.nl.common.pojo.CommonResult; import org.nl.pmm.modular.projectstage.entity.ProjectStage; -import org.nl.pmm.modular.projectstage.param.ProjectStageAddParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageEditParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageIdParam; -import org.nl.pmm.modular.projectstage.param.ProjectStagePageParam; import org.nl.pmm.modular.projectstage.service.ProjectStageService; import jakarta.annotation.Resource; @@ -91,6 +88,20 @@ public class ProjectStageController { projectStageService.edit(projectStageEditParam); return CommonResult.ok(); } + /** + * 编辑项目阶段 + * + * @author liyongde + * @date 2025/11/17 20:32 + */ + @Operation(summary = "编辑项目阶段") + @CommonLog("编辑项目阶段") +// @SaCheckPermission("/pmm/projectstage/batch-edit") + @PostMapping("/pmm/projectstage/batch-edit") + public CommonResult batchEdit(@RequestBody @Valid List param) { + projectStageService.batchEdit(param); + return CommonResult.ok(); + } /** * 删除项目阶段 diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/param/ProjectStageAddBatchParam.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/param/ProjectStageAddBatchParam.java new file mode 100644 index 0000000..a2bef9d --- /dev/null +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/param/ProjectStageAddBatchParam.java @@ -0,0 +1,31 @@ +package org.nl.pmm.modular.projectstage.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/11/19 + */ +@Data +public class ProjectStageAddBatchParam { + /** 阶段名称 */ + @Schema(description = "阶段名称") + private String stageName; + + /** 阶段序号 */ + @Schema(description = "阶段序号") + private String stageSeq; + + /** 项目id */ + @Schema(description = "项目id") + private String projectId; + + /** 阶段id */ + @Schema(description = "阶段id") + private String stageId; + + /** 是否删除 */ + @Schema(description = "是否删除") + private Boolean isDeleted; +} diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/ProjectStageService.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/ProjectStageService.java index fe6dca3..a0311fe 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/ProjectStageService.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/ProjectStageService.java @@ -15,10 +15,7 @@ package org.nl.pmm.modular.projectstage.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.nl.pmm.modular.projectstage.entity.ProjectStage; -import org.nl.pmm.modular.projectstage.param.ProjectStageAddParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageEditParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageIdParam; -import org.nl.pmm.modular.projectstage.param.ProjectStagePageParam; +import org.nl.pmm.modular.projectstage.param.*; import java.util.List; @@ -84,4 +81,6 @@ public interface ProjectStageService extends IService { * @return */ List getByProjectId(String projectId); + + void batchEdit(List param); } diff --git a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/impl/ProjectStageServiceImpl.java b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/impl/ProjectStageServiceImpl.java index a301e5d..b65fee7 100644 --- a/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/impl/ProjectStageServiceImpl.java +++ b/nl-plugin/nl-plugin-pmm/src/main/java/org/nl/pmm/modular/projectstage/service/impl/ProjectStageServiceImpl.java @@ -20,6 +20,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.nl.pmm.modular.projectstage.param.*; +import org.nl.pmm.modular.stagedetail.entity.StageDetail; +import org.nl.pmm.modular.stagedetail.service.StageDetailService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.nl.common.enums.CommonSortOrderEnum; @@ -27,13 +31,12 @@ import org.nl.common.exception.CommonException; import org.nl.common.page.CommonPageRequest; import org.nl.pmm.modular.projectstage.entity.ProjectStage; import org.nl.pmm.modular.projectstage.mapper.ProjectStageMapper; -import org.nl.pmm.modular.projectstage.param.ProjectStageAddParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageEditParam; -import org.nl.pmm.modular.projectstage.param.ProjectStageIdParam; -import org.nl.pmm.modular.projectstage.param.ProjectStagePageParam; import org.nl.pmm.modular.projectstage.service.ProjectStageService; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 项目阶段Service接口实现类 @@ -44,6 +47,9 @@ import java.util.List; @Service public class ProjectStageServiceImpl extends ServiceImpl implements ProjectStageService { + @Resource + private StageDetailService stageDetailService; + @Override public Page page(ProjectStagePageParam projectStagePageParam) { QueryWrapper queryWrapper = new QueryWrapper().checkSqlInjection(); @@ -100,4 +106,31 @@ public class ProjectStageServiceImpl extends ServiceImpl param) { + // 获取新增的 / 修改的 + List addItems = param.stream().filter(p -> + (ObjectUtil.isEmpty(p.getStageId()) && !p.getIsDeleted()) + || (ObjectUtil.isNotEmpty(p.getStageId()) && !p.getIsDeleted())).toList(); + if (addItems.size() > 0) { + List projectStageList = new ArrayList<>(); + for (ProjectStageAddBatchParam addItem : addItems) { + ProjectStage projectStage = BeanUtil.toBean(addItem, ProjectStage.class); + projectStageList.add(projectStage); + } + saveOrUpdateBatch(projectStageList); + } + // 获取删除的 + List deletedItems = param.stream().filter(p -> ObjectUtil.isNotEmpty(p.getStageId()) && p.getIsDeleted()).toList(); + if (deletedItems.size() > 0) { + List ids = new ArrayList<>(); + for (ProjectStageAddBatchParam deletedItem : deletedItems) { + ids.add(deletedItem.getStageId()); + } + // 删除明细 + stageDetailService.remove(new LambdaQueryWrapper().in(StageDetail::getStageId, ids)); + removeBatchByIds(ids); + } + } } diff --git a/nl-vue/src/api/pmm/projectFileApi.js b/nl-vue/src/api/pmm/projectFileApi.js index aae4580..cda97ab 100644 --- a/nl-vue/src/api/pmm/projectFileApi.js +++ b/nl-vue/src/api/pmm/projectFileApi.js @@ -28,5 +28,9 @@ export default { // 获取项目附件表详情 bindProjectFile(data) { return request('bindProjectFile', data, 'post') + }, + // 获取项目附件表详情 + deleteFile(data) { + return request('delete-file', data, 'post') } } diff --git a/nl-vue/src/api/pmm/projectStageApi.js b/nl-vue/src/api/pmm/projectStageApi.js index f0bba43..08db7d2 100644 --- a/nl-vue/src/api/pmm/projectStageApi.js +++ b/nl-vue/src/api/pmm/projectStageApi.js @@ -24,5 +24,9 @@ export default { // 获取项目阶段详情 projectStageDetail(data) { return request('detail', data, 'get') + }, + // 获取项目阶段详情 + batchEdit(data) { + return request('batch-edit', data, 'post') } } diff --git a/nl-vue/src/views/pmm/project/request/batchStageAddDialog.vue b/nl-vue/src/views/pmm/project/request/batchStageAddDialog.vue new file mode 100644 index 0000000..7166156 --- /dev/null +++ b/nl-vue/src/views/pmm/project/request/batchStageAddDialog.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/nl-vue/src/views/pmm/project/request/description.vue b/nl-vue/src/views/pmm/project/request/description.vue index 9a0aa15..1f251ca 100644 --- a/nl-vue/src/views/pmm/project/request/description.vue +++ b/nl-vue/src/views/pmm/project/request/description.vue @@ -60,6 +60,7 @@ 计划工时: {{ plannedHours }} 创建项目阶段 + 编辑项目阶段 @@ -156,6 +157,14 @@ class="attachment-item" @click="handlePreview(file)" > + + +
@@ -173,6 +182,7 @@ + @@ -180,10 +190,13 @@ import { computed, nextTick, ref, watch } from 'vue' import { useRoute } from 'vue-router' import projectApi from '@/api/pmm/projectApi' - import { message } from 'ant-design-vue' + import projectFileApi from '@/api/pmm/projectFileApi' + import { Modal, message } from 'ant-design-vue' import StageAddDialog from "@/views/pmm/project/request/stageAddDialog.vue"; import Preview from '@/views/dev/file/preview.vue' import FjUploadForm from "@/views/pmm/project/request/fjUploadForm.vue"; + import BatchStageAddDialog from "@/views/pmm/project/request/batchStageAddDialog.vue"; + import { CloseOutlined } from '@ant-design/icons-vue' interface AttachmentItem { id: number | string @@ -199,6 +212,7 @@ const stageList = ref([]) const plannedHours = ref(0) const formRef = ref() + const form2Ref = ref() const previewRef = ref() const uploadFormRef = ref() const previewVisible = ref(false) @@ -324,7 +338,7 @@ const attachmentList = ref([]) return total } - // 计算计划工时(所有阶段的总天数 * 24) + // 计算计划工时(所有阶段的总天数 * 8) const calculatePlannedHours = (stages: any[]) => { let total = 0 stages.forEach((stage) => { @@ -332,7 +346,7 @@ const attachmentList = ref([]) total += getStageTotalDays(stage.descriptions) } }) - return total * 24 + return total * 8 } // 获取项目需求明细 @@ -512,6 +526,29 @@ watch(projectId, () => { const handlePreviewClose = () => { previewVisible.value = false } + + const handleAttachmentDelete = (file: AttachmentItem) => { + const param = { + id: file.id + } + Modal.confirm({ + title: '确认删除该附件?', + content: `附件:${file.name}`, + okText: '确认', + cancelText: '取消', + onOk: () => { + projectFileApi + .deleteFile(param) + .then(() => { + message.success(`已确认删除:${file.name}`) + fetchAttachments() + }) + }, + onCancel: () => { + console.log('取消删除附件:', file) + } + }) + }