feat: 一级需求部门发起任务必须上传预览图

1. 前端 CreateTask.vue:
   - 预览图表单项添加 required 属性(当是一级需求部门用户时)
   - 添加预览图的动态验证规则,一级需求部门用户必须上传预览图
   - 在提交时添加额外的预览图验证
   - 预览图提示信息针对一级需求部门用户显示必填提示

2. 后端 TaskService.java:
   - createTask 方法中添加一级需求部门用户预览图必填验证
   - createPipelineTask 方法中添加一级需求部门用户预览图必填验证
This commit is contained in:
Your Name 2026-01-22 14:53:17 +08:00
parent 895de04138
commit 75a7a760a6
2 changed files with 41 additions and 4 deletions

View File

@ -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);

View File

@ -430,7 +430,11 @@
</a-form-item>
<!-- 预览图上传 -->
<a-form-item label="预览图" name="previewImage">
<a-form-item
label="预览图"
name="previewImage"
:required="isPrimaryDeptUser"
>
<div
class="preview-upload-area"
@paste="handlePasteImage"
@ -456,7 +460,11 @@
<span class="tip-icon">
<Icon name="image" size="sm" color="#31f08b" />
</span>
<span>建议上传正方形图片,系统将自动压缩处理,显示在任务卡片上。支持 Ctrl+V 粘贴图片</span>
<span v-if="isPrimaryDeptUser" style="color: #ff4d4f;">
<Icon name="warning" size="xs" style="margin-right: 4px;" />
一级需求部门发起任务必须上传预览图
</span>
<span v-else>建议上传正方形图片,系统将自动压缩处理,显示在任务卡片上。支持 Ctrl+V 粘贴图片</span>
</div>
</div>
</a-form-item>
@ -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) {