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) {