fix: 新增需求页面添加需求编号和客户ID字段,修正需求名称字段

This commit is contained in:
zhangjf 2026-02-23 14:14:38 +08:00
parent f87ee0b51d
commit 9498201313
2 changed files with 65 additions and 19 deletions

View File

@ -3,7 +3,7 @@
<el-card shadow="never" class="search-card"> <el-card shadow="never" class="search-card">
<el-form :inline="true" :model="queryParams"> <el-form :inline="true" :model="queryParams">
<el-form-item label="需求标题"> <el-form-item label="需求标题">
<el-input v-model="queryParams.requirementTitle" placeholder="请输入需求标题" clearable style="width: 200px" /> <el-input v-model="queryParams.requirementName" placeholder="请输入需求标题" clearable style="width: 200px" />
</el-form-item> </el-form-item>
<el-form-item label="项目名称"> <el-form-item label="项目名称">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable style="width: 180px" /> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable style="width: 180px" />
@ -40,7 +40,7 @@
<el-table :data="tableData" v-loading="loading" border stripe> <el-table :data="tableData" v-loading="loading" border stripe>
<el-table-column prop="requirementId" label="需求ID" width="80" /> <el-table-column prop="requirementId" label="需求ID" width="80" />
<el-table-column prop="requirementCode" label="需求编号" width="140" /> <el-table-column prop="requirementCode" label="需求编号" width="140" />
<el-table-column prop="requirementTitle" label="需求标题" min-width="200" show-overflow-tooltip /> <el-table-column prop="requirementName" label="需求名称" min-width="200" show-overflow-tooltip />
<el-table-column prop="projectName" label="项目名称" width="150" show-overflow-tooltip /> <el-table-column prop="projectName" label="项目名称" width="150" show-overflow-tooltip />
<el-table-column prop="requirementType" label="需求类型" width="100"> <el-table-column prop="requirementType" label="需求类型" width="100">
<template #default="{ row }"> <template #default="{ row }">
@ -113,8 +113,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="需求标题" prop="requirementTitle"> <el-form-item label="需求名称" prop="requirementName">
<el-input v-model="form.requirementTitle" placeholder="请输入需求标题" /> <el-input v-model="form.requirementName" placeholder="请输入需求名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -132,6 +132,21 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="客户" prop="customerId">
<el-select v-model="form.customerId" placeholder="请选择客户" filterable style="width: 100%">
<el-option
v-for="item in customerList"
:key="item.customerId"
:label="item.customerName"
:value="item.customerId"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="需求类型" prop="requirementType"> <el-form-item label="需求类型" prop="requirementType">
<el-select v-model="form.requirementType" placeholder="请选择" style="width: 100%"> <el-select v-model="form.requirementType" placeholder="请选择" style="width: 100%">
@ -249,8 +264,9 @@
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="需求ID">{{ detailData.requirementId }}</el-descriptions-item> <el-descriptions-item label="需求ID">{{ detailData.requirementId }}</el-descriptions-item>
<el-descriptions-item label="需求编号">{{ detailData.requirementCode }}</el-descriptions-item> <el-descriptions-item label="需求编号">{{ detailData.requirementCode }}</el-descriptions-item>
<el-descriptions-item label="需求标题" :span="2">{{ detailData.requirementTitle }}</el-descriptions-item> <el-descriptions-item label="需求名称" :span="2">{{ detailData.requirementName }}</el-descriptions-item>
<el-descriptions-item label="项目名称">{{ detailData.projectName }}</el-descriptions-item> <el-descriptions-item label="项目名称">{{ detailData.projectName }}</el-descriptions-item>
<el-descriptions-item label="客户名称">{{ detailData.customerName }}</el-descriptions-item>
<el-descriptions-item label="需求类型"> <el-descriptions-item label="需求类型">
<el-tag v-if="detailData.requirementType === 'FEATURE'" type="primary">功能</el-tag> <el-tag v-if="detailData.requirementType === 'FEATURE'" type="primary">功能</el-tag>
<el-tag v-else-if="detailData.requirementType === 'BUG'" type="danger">缺陷</el-tag> <el-tag v-else-if="detailData.requirementType === 'BUG'" type="danger">缺陷</el-tag>
@ -293,6 +309,7 @@ import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'elem
import { Search, Refresh, Plus, Edit, Delete, View, Check, Document } from '@element-plus/icons-vue' import { Search, Refresh, Plus, Edit, Delete, View, Check, Document } from '@element-plus/icons-vue'
import { getRequirementList, createRequirement, updateRequirement, deleteRequirement } from '@/api/project' import { getRequirementList, createRequirement, updateRequirement, deleteRequirement } from '@/api/project'
import { getProjectList } from '@/api/project' import { getProjectList } from '@/api/project'
import { getCustomerList } from '@/api/customer'
// //
const uploadUrl = '/file/api/v1/file/upload' const uploadUrl = '/file/api/v1/file/upload'
@ -307,11 +324,12 @@ const submitLoading = ref(false)
const tableData = ref<any[]>([]) const tableData = ref<any[]>([])
const total = ref(0) const total = ref(0)
const projectList = ref<any[]>([]) const projectList = ref<any[]>([])
const customerList = ref<any[]>([])
const queryParams = reactive({ const queryParams = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
requirementTitle: '', requirementName: '',
projectName: '', projectName: '',
requirementStatus: '', requirementStatus: '',
priority: '' priority: ''
@ -324,8 +342,9 @@ const formRef = ref<FormInstance>()
const form = reactive({ const form = reactive({
requirementId: null as number | null, requirementId: null as number | null,
requirementCode: '', requirementCode: '',
requirementTitle: '', requirementName: '',
projectId: null as number | null, projectId: null as number | null,
customerId: null as number | null,
requirementType: 'FEATURE', requirementType: 'FEATURE',
priority: 'MEDIUM', priority: 'MEDIUM',
requirementStatus: 'PENDING', requirementStatus: 'PENDING',
@ -338,8 +357,9 @@ const form = reactive({
const rules = reactive<FormRules>({ const rules = reactive<FormRules>({
requirementCode: [{ required: true, message: '请输入需求编号', trigger: 'blur' }], requirementCode: [{ required: true, message: '请输入需求编号', trigger: 'blur' }],
requirementTitle: [{ required: true, message: '请输入需求标题', trigger: 'blur' }], requirementName: [{ required: true, message: '请输入需求名称', trigger: 'blur' }],
projectId: [{ required: true, message: '请选择项目', trigger: 'change' }], projectId: [{ required: true, message: '请选择项目', trigger: 'change' }],
customerId: [{ required: true, message: '请选择客户', trigger: 'change' }],
requirementType: [{ required: true, message: '请选择需求类型', trigger: 'change' }], requirementType: [{ required: true, message: '请选择需求类型', trigger: 'change' }],
priority: [{ required: true, message: '请选择优先级', trigger: 'change' }] priority: [{ required: true, message: '请选择优先级', trigger: 'change' }]
}) })
@ -389,6 +409,15 @@ const getFileUrl = (path: string) => {
return `/file/api/v1/file/download/${path}` return `/file/api/v1/file/download/${path}`
} }
const fetchCustomers = async () => {
try {
const res: any = await getCustomerList({ pageNum: 1, pageSize: 1000 })
customerList.value = res.data?.records || []
} catch (e) {
console.error(e)
}
}
const fetchData = async () => { const fetchData = async () => {
loading.value = true loading.value = true
try { try {
@ -417,7 +446,7 @@ const handleSearch = () => {
} }
const handleReset = () => { const handleReset = () => {
queryParams.requirementTitle = '' queryParams.requirementName = ''
queryParams.projectName = '' queryParams.projectName = ''
queryParams.requirementStatus = '' queryParams.requirementStatus = ''
queryParams.priority = '' queryParams.priority = ''
@ -520,8 +549,9 @@ const handleSubmit = async () => {
const resetForm = () => { const resetForm = () => {
form.requirementId = null form.requirementId = null
form.requirementCode = '' form.requirementCode = ''
form.requirementTitle = '' form.requirementName = ''
form.projectId = null form.projectId = null
form.customerId = null
form.requirementType = 'FEATURE' form.requirementType = 'FEATURE'
form.priority = 'MEDIUM' form.priority = 'MEDIUM'
form.requirementStatus = 'PENDING' form.requirementStatus = 'PENDING'
@ -537,6 +567,7 @@ const resetForm = () => {
onMounted(() => { onMounted(() => {
fetchData() fetchData()
fetchProjects() fetchProjects()
fetchCustomers()
}) })
</script> </script>

View File

@ -5,11 +5,20 @@
<van-form @submit="onSubmit"> <van-form @submit="onSubmit">
<van-cell-group inset> <van-cell-group inset>
<van-field <van-field
v-model="form.title" v-model="form.requirementCode"
name="title" name="requirementCode"
label="需求标题" label="需求编号"
placeholder="请输入需求标题" placeholder="请输入需求编号"
:rules="[{ required: true, message: '请输入需求标题' }]" :rules="[{ required: true, message: '请输入需求编号' }]"
required
/>
<van-field
v-model="form.requirementName"
name="requirementName"
label="需求名称"
placeholder="请输入需求名称"
:rules="[{ required: true, message: '请输入需求名称' }]"
required required
/> />
@ -103,7 +112,8 @@ const showCustomerPicker = ref(false)
const showProjectPicker = ref(false) const showProjectPicker = ref(false)
const form = ref({ const form = ref({
title: '', requirementCode: '',
requirementName: '',
customerId: null as number | null, customerId: null as number | null,
customerName: '', customerName: '',
projectId: null as number | null, projectId: null as number | null,
@ -165,15 +175,20 @@ const loadOptions = async () => {
} }
const onSubmit = async () => { const onSubmit = async () => {
if (!form.value.title) { if (!form.value.requirementCode) {
showFailToast('请输入需求标题') showFailToast('请输入需求编号')
return
}
if (!form.value.requirementName) {
showFailToast('请输入需求名称')
return return
} }
submitting.value = true submitting.value = true
try { try {
await createRequirement({ await createRequirement({
title: form.value.title, requirementCode: form.value.requirementCode,
requirementName: form.value.requirementName,
customerId: form.value.customerId, customerId: form.value.customerId,
projectId: form.value.projectId, projectId: form.value.projectId,
priority: form.value.priority, priority: form.value.priority,