wuzhen 1 год назад
Родитель
Сommit
1da0a6743f
1 измененных файлов с 86 добавлено и 24 удалено
  1. 86 24
      web/src/views/cw/application/form.vue

+ 86 - 24
web/src/views/cw/application/form.vue

@@ -381,10 +381,10 @@
         </template>
         </template>
 
 
         <el-form ref="performanceFormRef" :model="form" label-width="120px" label-position="top">
         <el-form ref="performanceFormRef" :model="form" label-width="120px" label-position="top">
-          <PerformanceIndicators 
+          <PerformanceIndicators
             ref="performanceIndicatorsRef"
             ref="performanceIndicatorsRef"
-            v-model="form.performanceIndicators" 
-            @change="handlePerformanceIndicatorsChange" 
+            v-model="form.performanceIndicators"
+            @change="handlePerformanceIndicatorsChange"
           />
           />
         </el-form>
         </el-form>
       </el-card>
       </el-card>
@@ -450,7 +450,7 @@
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { ref, reactive, computed, onMounted, nextTick } from 'vue'
+import { ref, reactive, computed, onMounted, nextTick, watch } from 'vue'
 import { useRouter, useRoute } from 'vue-router'
 import { useRouter, useRoute } from 'vue-router'
 import { ElMessage, ElMessageBox, FormInstance } from 'element-plus'
 import { ElMessage, ElMessageBox, FormInstance } from 'element-plus'
 import {
 import {
@@ -467,6 +467,11 @@ import {
 } from '@/api/cw/projectApplication'
 } from '@/api/cw/projectApplication'
 import PerformanceIndicators from './components/PerformanceIndicators.vue'
 import PerformanceIndicators from './components/PerformanceIndicators.vue'
 
 
+// 接收父组件传递的数据
+const props = defineProps<{
+  formData?: any
+}>()
+
 const router = useRouter()
 const router = useRouter()
 const route = useRoute()
 const route = useRoute()
 
 
@@ -531,6 +536,51 @@ const form = reactive({
   approvalStatus: 'draft'
   approvalStatus: 'draft'
 })
 })
 
 
+// 监听父组件传递的数据变化
+watch(() => props.formData, (newData) => {
+  if (newData && typeof newData === 'object' && Object.keys(newData).length > 0) {
+    console.log('接收到父组件传递的数据:', newData)
+    // 安全地更新form数据
+    Object.keys(form).forEach(key => {
+      if (newData.hasOwnProperty(key) && newData[key] !== null && newData[key] !== undefined) {
+        // 特殊处理不同类型的字段
+        if (key === 'year' && newData[key]) {
+          form[key] = newData[key].toString()
+        } else if (key === 'startDate' || key === 'endDate') {
+          form[key] = newData[key] ? formatDateString(newData[key]) : ''
+        } else if (key.includes('Investment') || key.includes('Fiscal') || key.includes('Funding') || 
+                   key.includes('Total') || key.includes('Municipal') || key.includes('Self') || key.includes('Other')) {
+          // 金额字段
+          form[key] = Number(newData[key]) || 0
+        } else {
+          form[key] = newData[key]
+        }
+      }
+    })
+    console.log('form数据更新完成:', form)
+  }
+}, { deep: true, immediate: true })
+
+// 日期格式化函数
+const formatDateString = (dateValue: any): string => {
+  if (!dateValue) return ''
+  let date: Date
+  if (typeof dateValue === 'string') {
+    date = new Date(dateValue)
+  } else if (dateValue instanceof Date) {
+    date = dateValue
+  } else {
+    return ''
+  }
+  
+  if (isNaN(date.getTime())) return ''
+  
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
 // 表单验证规则
 // 表单验证规则
 const rules = {
 const rules = {
   projectName: [
   projectName: [
@@ -648,30 +698,30 @@ const initBudgetChart = async () => {
 // 验证绩效指标分值占比总和
 // 验证绩效指标分值占比总和
 const validatePerformanceIndicators = () => {
 const validatePerformanceIndicators = () => {
   console.log('=== 校验绩效指标 ===')
   console.log('=== 校验绩效指标 ===')
-  
+
   // 直接使用绩效指标组件的校验方法
   // 直接使用绩效指标组件的校验方法
   if (performanceIndicatorsRef?.value && typeof performanceIndicatorsRef.value.validate === 'function') {
   if (performanceIndicatorsRef?.value && typeof performanceIndicatorsRef.value.validate === 'function') {
     const validationResult = performanceIndicatorsRef.value.validate()
     const validationResult = performanceIndicatorsRef.value.validate()
     console.log('绩效指标校验结果:', validationResult)
     console.log('绩效指标校验结果:', validationResult)
     return validationResult
     return validationResult
   }
   }
-  
+
   // 回退方案:检查form中的数据
   // 回退方案:检查form中的数据
   if (!form.performanceIndicators || form.performanceIndicators.length === 0) {
   if (!form.performanceIndicators || form.performanceIndicators.length === 0) {
     return { valid: false, message: '请至少添加一个绩效指标' }
     return { valid: false, message: '请至少添加一个绩效指标' }
   }
   }
-  
+
   const totalWeight = form.performanceIndicators.reduce((sum, item) => {
   const totalWeight = form.performanceIndicators.reduce((sum, item) => {
     return sum + (Number(item.weightPercentage) || 0)
     return sum + (Number(item.weightPercentage) || 0)
   }, 0)
   }, 0)
-  
+
   if (Math.abs(totalWeight - 100) > 0.1) {
   if (Math.abs(totalWeight - 100) > 0.1) {
-    return { 
-      valid: false, 
-      message: `绩效指标分值占比总和必须等于100%,当前为${totalWeight}%` 
+    return {
+      valid: false,
+      message: `绩效指标分值占比总和必须等于100%,当前为${totalWeight}%`
     }
     }
   }
   }
-  
+
   return { valid: true }
   return { valid: true }
 }
 }
 
 
@@ -683,7 +733,7 @@ const handleNextStep = async () => {
   if (currentFormRef?.value) {
   if (currentFormRef?.value) {
     try {
     try {
       await currentFormRef.value.validate()
       await currentFormRef.value.validate()
-      
+
       // 如果是绩效指标步骤(第3步),额外校验分值占比
       // 如果是绩效指标步骤(第3步),额外校验分值占比
       if (currentStep.value === 3) {
       if (currentStep.value === 3) {
         const validationResult = validatePerformanceIndicators()
         const validationResult = validatePerformanceIndicators()
@@ -692,7 +742,7 @@ const handleNextStep = async () => {
           return
           return
         }
         }
       }
       }
-      
+
       currentStep.value++
       currentStep.value++
 
 
       // 初始化图表
       // 初始化图表
@@ -711,7 +761,7 @@ const handleNextStep = async () => {
         return
         return
       }
       }
     }
     }
-    
+
     currentStep.value++
     currentStep.value++
 
 
     // 初始化图表
     // 初始化图表
@@ -729,7 +779,7 @@ const handlePrevStep = () => {
 const handlePerformanceIndicatorsChange = (indicators) => {
 const handlePerformanceIndicatorsChange = (indicators) => {
   console.log('=== 绩效指标数据变化 ===')
   console.log('=== 绩效指标数据变化 ===')
   console.log('接收到的indicators:', indicators)
   console.log('接收到的indicators:', indicators)
-  
+
   // 为每个指标添加必要的字段
   // 为每个指标添加必要的字段
   const processedIndicators = indicators.map((item, index) => ({
   const processedIndicators = indicators.map((item, index) => ({
     ...item,
     ...item,
@@ -751,15 +801,15 @@ const handlePerformanceIndicatorsChange = (indicators) => {
     dataSource: item.dataSource || '',
     dataSource: item.dataSource || '',
     isQuantitative: item.isQuantitative !== undefined ? item.isQuantitative : true
     isQuantitative: item.isQuantitative !== undefined ? item.isQuantitative : true
   }))
   }))
-  
+
   form.performanceIndicators = processedIndicators
   form.performanceIndicators = processedIndicators
   console.log('处理后的绩效指标数据:', form.performanceIndicators)
   console.log('处理后的绩效指标数据:', form.performanceIndicators)
-  
+
   // 自动生成总绩效目标和当年目标(如果有目标值)
   // 自动生成总绩效目标和当年目标(如果有目标值)
   const totalGoals = processedIndicators
   const totalGoals = processedIndicators
     .filter(item => item.targetValue && !isNaN(Number(item.targetValue)))
     .filter(item => item.targetValue && !isNaN(Number(item.targetValue)))
     .reduce((sum, item) => sum + Number(item.targetValue), 0)
     .reduce((sum, item) => sum + Number(item.targetValue), 0)
-  
+
   if (totalGoals > 0) {
   if (totalGoals > 0) {
     form.totalPerformanceGoal = totalGoals
     form.totalPerformanceGoal = totalGoals
     form.currentYearGoal = totalGoals
     form.currentYearGoal = totalGoals
@@ -771,7 +821,7 @@ const handlePerformanceIndicatorsChange = (indicators) => {
 const handleSaveDraft = async () => {
 const handleSaveDraft = async () => {
   try {
   try {
     savingDraft.value = true
     savingDraft.value = true
-    
+
     // 如果当前在绩效指标步骤(第3步),校验分值占比总和
     // 如果当前在绩效指标步骤(第3步),校验分值占比总和
     if (currentStep.value === 3 && form.performanceIndicators && form.performanceIndicators.length > 0) {
     if (currentStep.value === 3 && form.performanceIndicators && form.performanceIndicators.length > 0) {
       const validationResult = validatePerformanceIndicators()
       const validationResult = validatePerformanceIndicators()
@@ -780,7 +830,7 @@ const handleSaveDraft = async () => {
         // 注意:这里只是警告,不阻止保存草稿
         // 注意:这里只是警告,不阻止保存草稿
       }
       }
     }
     }
-    
+
     // 详细调试信息
     // 详细调试信息
     console.log('=== 前端保存草稿调试信息 ===')
     console.log('=== 前端保存草稿调试信息 ===')
     console.log('form.performanceIndicators 是否存在:', !!form.performanceIndicators)
     console.log('form.performanceIndicators 是否存在:', !!form.performanceIndicators)
@@ -799,10 +849,10 @@ const handleSaveDraft = async () => {
         form.applicationNo = result.data.applicationNo
         form.applicationNo = result.data.applicationNo
         console.log('草稿保存成功,获得ID:', form.id, '申报编号:', form.applicationNo)
         console.log('草稿保存成功,获得ID:', form.id, '申报编号:', form.applicationNo)
       }
       }
-      
+
       // 绩效指标数据已经作为form的一部分传递给后端,无需单独处理
       // 绩效指标数据已经作为form的一部分传递给后端,无需单独处理
       console.log('绩效指标数据已随草稿数据一起保存,数量:', form.performanceIndicators ? form.performanceIndicators.length : 0)
       console.log('绩效指标数据已随草稿数据一起保存,数量:', form.performanceIndicators ? form.performanceIndicators.length : 0)
-      
+
       ElMessage.success('草稿保存成功')
       ElMessage.success('草稿保存成功')
     }
     }
   } catch (error) {
   } catch (error) {
@@ -913,7 +963,7 @@ const loadData = async () => {
       if (response.code === 200) {
       if (response.code === 200) {
         console.log('申报基础数据加载成功:', response.data)
         console.log('申报基础数据加载成功:', response.data)
         Object.assign(form, response.data)
         Object.assign(form, response.data)
-        
+
         // 检查是否有绩效指标数据
         // 检查是否有绩效指标数据
         if (response.data.performanceIndicators && response.data.performanceIndicators.length > 0) {
         if (response.data.performanceIndicators && response.data.performanceIndicators.length > 0) {
           console.log('发现绩效指标数据,数量:', response.data.performanceIndicators.length)
           console.log('发现绩效指标数据,数量:', response.data.performanceIndicators.length)
@@ -931,6 +981,18 @@ const loadData = async () => {
   }
   }
 }
 }
 
 
+// 暴露给父组件的方法
+const validate = (callback: (valid: boolean) => void) => {
+  // 简单的验证逻辑,检查必填字段
+  const isValid = !!(form.projectName && form.principal && form.totalInvestment > 0)
+  callback(isValid)
+}
+
+// 暴露方法给父组件
+defineExpose({
+  validate
+})
+
 // 组件挂载
 // 组件挂载
 onMounted(() => {
 onMounted(() => {
   loadData()
   loadData()