From 75a7a760a699f36219f036a721b8a5172238cbaa Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 22 Jan 2026 14:53:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=80=E7=BA=A7=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=8F=91=E8=B5=B7=E4=BB=BB=E5=8A=A1=E5=BF=85?= =?UTF-8?q?=E9=A1=BB=E4=B8=8A=E4=BC=A0=E9=A2=84=E8=A7=88=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 前端 CreateTask.vue: - 预览图表单项添加 required 属性(当是一级需求部门用户时) - 添加预览图的动态验证规则,一级需求部门用户必须上传预览图 - 在提交时添加额外的预览图验证 - 预览图提示信息针对一级需求部门用户显示必填提示 2. 后端 TaskService.java: - createTask 方法中添加一级需求部门用户预览图必填验证 - createPipelineTask 方法中添加一级需求部门用户预览图必填验证 --- .../com/designhub/service/TaskService.java | 10 ++++++ frontend/src/views/CreateTask.vue | 35 ++++++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 346d2b6..45db4dd 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -116,6 +116,11 @@ public class TaskService { // 如果是一级需求部门发起的任务,设置相关字段 if (isPrimaryTask) { + // 一级需求部门发起任务必须上传预览图 + if (task.getPreviewImage() == null || task.getPreviewImage().trim().isEmpty()) { + throw new BusinessException(ResultCode.PARAM_ERROR, "一级需求部门发起任务必须上传预览图"); + } + task.setIsPrimaryTask(1); task.setPrimaryPublisherId(task.getPublisherId()); task.setPrimaryPublisherDeptId(task.getPublisherDeptId()); @@ -294,6 +299,11 @@ public class TaskService { // 检查一级需求部门是否可以跳过任务明细 boolean canSkipTaskDetail = false; if (isPrimaryTask) { + // 一级需求部门发起任务必须上传预览图 + if (dto.getPreviewImage() == null || dto.getPreviewImage().trim().isEmpty()) { + throw new BusinessException(ResultCode.PARAM_ERROR, "一级需求部门发起任务必须上传预览图"); + } + Boolean canFillDetail = systemConfigService.getBooleanValue("task.primary_dept_can_fill_detail", true); canSkipTaskDetail = !canFillDetail; log.info("一级需求部门流水线任务,canFillDetail={}, canSkipTaskDetail={}", canFillDetail, canSkipTaskDetail); diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index 94200f0..bd38bcb 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -430,7 +430,11 @@ - +
- 建议上传正方形图片,系统将自动压缩处理,显示在任务卡片上。支持 Ctrl+V 粘贴图片 + + + 一级需求部门发起任务必须上传预览图 + + 建议上传正方形图片,系统将自动压缩处理,显示在任务卡片上。支持 Ctrl+V 粘贴图片
@@ -815,7 +823,7 @@ const removeBarcode = (index: number) => { const handleCheckInventory = handleAddBarcode // 表单验证规则 -const formRules = { +const formRules = computed(() => ({ title: [ { required: true, message: '请输入任务标题', trigger: 'blur' }, { min: 2, max: 100, message: '标题长度在2-100个字符', trigger: 'blur' } @@ -846,8 +854,21 @@ const formRules = { ], releaseType: [ { required: true, message: '请选择发布类型', trigger: 'change' } + ], + previewImage: [ + { + required: isPrimaryDeptUser.value, + message: '一级需求部门发起任务必须上传预览图', + trigger: 'change', + validator: (_rule: any, value: string) => { + if (isPrimaryDeptUser.value && !value) { + return Promise.reject('一级需求部门发起任务必须上传预览图') + } + return Promise.resolve() + } + } ] -} +})) // 使用全局配置store的数据 const taskTypes = computed(() => configStore.demandTypes) @@ -1536,6 +1557,12 @@ const handleSubmit = async () => { // 验证表单 await formRef.value.validate() + // 一级需求部门用户必须上传预览图 + if (isPrimaryDeptUser.value && !formData.previewImage) { + message.error('一级需求部门发起任务必须上传预览图') + return + } + // 验证任务类型(一级需求部门且关闭任务明细时跳过验证) const validTaskTypes = formData.taskTypes.filter(item => item.taskTypeId && item.quantity > 0) if (shouldShowTaskDetail.value) {