Industrial-image-management.../src/views/system-resource/device-management/procurement/components/ProcurementApplicationModal...

351 lines
10 KiB
Vue
Raw Normal View History

<template>
<a-modal
:visible="visible"
:title="modalTitle"
width="800px"
@ok="handleSubmit"
@cancel="handleCancel"
@update:visible="(value) => emit('update:visible', value)"
:confirm-loading="submitLoading"
>
<a-form
ref="formRef"
:model="formData"
:rules="rules"
layout="vertical"
class="procurement-application-form"
>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="设备名称" field="equipmentName">
<a-input
v-model="formData.equipmentName"
placeholder="请输入设备名称"
allow-clear
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="设备类型" field="equipmentType">
<a-select
v-model="formData.equipmentType"
placeholder="请选择设备类型"
allow-clear
>
<a-option value="服务器">服务器</a-option>
<a-option value="网络设备">网络设备</a-option>
<a-option value="办公设备">办公设备</a-option>
<a-option value="计算机">计算机</a-option>
<a-option value="安防设备">安防设备</a-option>
<a-option value="显示设备">显示设备</a-option>
<a-option value="测试设备">测试设备</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="设备型号" field="equipmentModel">
<a-input
v-model="formData.equipmentModel"
placeholder="请输入设备型号"
allow-clear
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="品牌" field="brand">
<a-input
v-model="formData.brand"
placeholder="请输入品牌"
allow-clear
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="供应商名称" field="supplierName">
<a-input
v-model="formData.supplierName"
placeholder="请输入供应商名称"
allow-clear
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="数量" field="quantity">
<a-input-number
v-model="formData.quantity"
placeholder="请输入数量"
:min="1"
:precision="0"
style="width: 100%"
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="预算金额" field="budgetAmount">
<a-input-number
v-model="formData.budgetAmount"
placeholder="请输入预算金额"
:min="0"
:precision="2"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="紧急程度" field="urgencyLevel">
<a-select
v-model="formData.urgencyLevel"
placeholder="请选择紧急程度"
allow-clear
>
<a-option value="LOW"></a-option>
<a-option value="NORMAL">普通</a-option>
<a-option value="HIGH"></a-option>
<a-option value="URGENT">紧急</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="采购类型" field="procurementType">
<a-select
v-model="formData.procurementType"
placeholder="请选择采购类型"
allow-clear
>
<a-option value="NEW_PURCHASE">新采购</a-option>
<a-option value="REPLACEMENT">更换</a-option>
<a-option value="UPGRADE">升级</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="预期交付日期" field="expectedDeliveryDate">
<a-date-picker
v-model="formData.expectedDeliveryDate"
placeholder="请选择预期交付日期"
style="width: 100%"
/>
</a-form-item>
</a-col>
</a-row>
<a-form-item label="申请原因" field="applyReason">
<a-textarea
v-model="formData.applyReason"
placeholder="请详细说明采购原因"
:rows="4"
allow-clear
/>
</a-form-item>
<a-form-item label="技术要求" field="technicalRequirements">
<a-textarea
v-model="formData.technicalRequirements"
placeholder="请描述设备的技术要求(可选)"
:rows="3"
allow-clear
/>
</a-form-item>
<a-form-item label="业务合理性说明" field="businessJustification">
<a-textarea
v-model="formData.businessJustification"
placeholder="请说明采购的业务合理性(可选)"
:rows="3"
allow-clear
/>
</a-form-item>
</a-form>
</a-modal>
</template>
<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
import { Message } from '@arco-design/web-vue'
import { equipmentApprovalApi } from '@/apis/equipment/approval'
import notificationService from '@/services/notificationService'
interface Props {
visible: boolean
equipmentData?: any
}
interface Emits {
(e: 'update:visible', value: boolean): void
(e: 'success'): void
}
const props = defineProps<Props>()
const emit = defineEmits<Emits>()
const modalTitle = ref('申请采购')
const submitLoading = ref(false)
const formRef = ref()
// 表单数据
const formData = reactive({
equipmentId: '', // 添加设备ID字段
equipmentName: '',
equipmentType: '',
equipmentModel: '',
brand: '',
supplierName: '',
quantity: 1,
budgetAmount: undefined,
urgencyLevel: 'NORMAL',
procurementType: 'NEW_PURCHASE',
expectedDeliveryDate: null,
applyReason: '',
technicalRequirements: '',
businessJustification: ''
})
// 表单验证规则
const rules = {
equipmentId: [{ required: true, message: '设备ID不能为空' }],
equipmentName: [{ required: true, message: '请输入设备名称' }],
equipmentType: [{ required: true, message: '请选择设备类型' }],
quantity: [{ required: true, message: '请输入数量' }],
budgetAmount: [{ required: true, message: '请输入预算金额' }],
urgencyLevel: [{ required: true, message: '请选择紧急程度' }],
procurementType: [{ required: true, message: '请选择采购类型' }],
applyReason: [
{ required: true, message: '请输入申请原因' },
{
validator: (value: string) => {
if (!value || value.trim() === '') {
return new Error('申请原因不能为空')
}
return true
}
}
]
}
// 监听设备数据变化,填充表单
watch(() => props.equipmentData, (newData) => {
if (newData) {
// 填充设备数据到表单
Object.assign(formData, {
equipmentId: newData.equipmentId || '', // 添加设备ID
equipmentName: newData.equipmentName || '',
equipmentType: newData.equipmentType || '',
equipmentModel: newData.equipmentModel || '',
brand: newData.brand || '',
supplierName: newData.supplierName || '',
quantity: newData.quantity || 1,
budgetAmount: newData.unitPrice || undefined,
urgencyLevel: 'NORMAL',
procurementType: 'NEW_PURCHASE',
expectedDeliveryDate: null,
applyReason: '', // 申请原因需要用户填写
technicalRequirements: '',
businessJustification: ''
})
}
}, { immediate: true })
// 监听模态框显示状态
watch(() => props.visible, (visible) => {
if (visible) {
// 模态框打开时,如果有设备数据则填充,否则重置表单
if (props.equipmentData) {
// 设备数据会在上面的 watch 中处理
} else {
// 没有设备数据时重置表单
formRef.value?.resetFields()
}
}
})
// 提交表单
const handleSubmit = async () => {
try {
// 手动验证 applyReason 字段
if (!formData.applyReason || formData.applyReason.trim() === '') {
Message.error('请输入申请原因')
return
}
await formRef.value.validate()
submitLoading.value = true
const submitData = {
...formData,
applyReason: formData.applyReason.trim(), // 确保去除空格
expectedDeliveryDate: formData.expectedDeliveryDate ?
(formData.expectedDeliveryDate as any).format('YYYY-MM-DD') : null
}
// 调试信息:打印提交的数据
console.log('提交的表单数据:', submitData)
console.log('applyReason 值:', submitData.applyReason)
console.log('applyReason 类型:', typeof submitData.applyReason)
console.log('applyReason 长度:', submitData.applyReason?.length)
await equipmentApprovalApi.submitProcurementApplication(submitData)
// 添加采购申请通知
const currentUser = JSON.parse(localStorage.getItem('userInfo') || '{}')
const applicantName = currentUser.nickname || currentUser.username || '未知用户'
notificationService.addProcurementNotification(
submitData.equipmentName,
applicantName
)
Message.success('采购申请提交成功')
emit('success')
handleCancel()
} catch (error: any) {
console.error('提交采购申请失败:', error)
Message.error(error?.message || '提交失败')
} finally {
submitLoading.value = false
}
}
// 取消
const handleCancel = () => {
emit('update:visible', false)
// 清空用户输入的数据,保留设备基本信息
formData.equipmentId = ''
formData.applyReason = ''
formData.technicalRequirements = ''
formData.businessJustification = ''
formData.expectedDeliveryDate = null
formRef.value?.resetFields()
}
</script>
<style scoped lang="scss">
.procurement-application-form {
.arco-form-item {
margin-bottom: 16px;
}
.arco-input,
.arco-select,
.arco-input-number,
.arco-date-picker {
border-radius: 6px;
}
.arco-textarea {
border-radius: 6px;
}
}
</style>