feat : 项目验收新增字段

This commit is contained in:
dj
2025-04-20 19:49:57 +08:00
parent afda146103
commit 8aefca0c82
7 changed files with 766 additions and 266 deletions

View File

@@ -1,5 +1,5 @@
<template>
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" style="margin-left: 5px">
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" :style="{marginLeft: label==='项目验收附件'?'25px':'5px'}">
<el-row>
<!-- <el-col :span="24">-->
<!-- <el-form-item :label="label" prop="attachment" >-->

View File

@@ -29,7 +29,7 @@
/>
</div>
<el-button color="#DED0B2" style="margin-left: 10px"
@click="handleCarbonCopy()" >立即抄送
@click="handleCarbonCopy()">立即抄送
</el-button>
</div>
<div class="process">
@@ -290,23 +290,207 @@ const schema = computed(() => {
// }
// })
} else if (props.type == 'execute') {
arr = [{
label: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
span: 24
arr = [
{
label: '实际专利(项)',
prop: 'actualNewPatent',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewPatent ? props.formData.actualNewPatent : <span>{'--'}</span>
}
</div>
)
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.optionalChargeLeadership?.length > 0 ? props.formData.optionalChargeLeadership.map(item => {
return <span>{item.name} </span>
}) : <span>{'--'}</span>
}
</div>
)
},]
{
label: '实际软件著作权(项)',
prop: 'actualSoftwareCopyright',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualSoftwareCopyright ? props.formData.actualSoftwareCopyright : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际技术标准(项)',
prop: 'actualTechnicalNorms',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTechnicalNorms ? props.formData.actualTechnicalNorms : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新产品(项)',
prop: 'actualNewProduct',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProduct ? props.formData.actualNewProduct : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新工艺(项)',
prop: 'actualNewProcess',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProcess ? props.formData.actualNewProcess : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新装置(项)',
prop: 'actualNewDevice',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewDevice ? props.formData.actualNewDevice : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新材料(项)',
prop: 'actualNewMaterials',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewMaterials ? props.formData.actualNewMaterials : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际计算机软件(项)',
prop: 'actualComputerSoftware',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualComputerSoftware ? props.formData.actualComputerSoftware : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际论文论著(项)',
prop: 'actualThesis',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualThesis ? props.formData.actualThesis : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际研究报告(项)',
prop: 'actualResearchReport',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualResearchReport ? props.formData.actualResearchReport : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际商标(项)',
prop: 'actualTrademark',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTrademark ? props.formData.actualTrademark : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际其他(项)',
prop: 'actualOther',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div style="white-space: pre-wrap;">
{
props.formData.actualOther ? props.formData.actualOther : <span>{'--'}</span>
}
</div>
)
},
{
label: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.optionalChargeLeadership?.length > 0 ? props.formData.optionalChargeLeadership.map(item => {
return <span>{item.name} </span>
}) : <span>{'--'}</span>
}
</div>
)
}
]
if (props.preProcessShow == 'EDIT') {
preProcess = {
@@ -345,22 +529,22 @@ const schema = computed(() => {
// })
} else if (props.type == 'archivist') {
arr = [
// {
// label: '项目归档附件',
// prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// },
// {
// label: '项目归档附件',
// prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// },
]
} else if (props.type == 'phase') {
arr = [
@@ -392,7 +576,7 @@ const filePreviewParam = ref({
})
const filePreviewShow = ref(false)
const route = useRoute()
const emit = defineEmits(['update:value','ccSend'])
const emit = defineEmits(['update:value', 'ccSend'])
const _value = computed({
get() {
return props.value;

View File

@@ -2,23 +2,97 @@
<div class="apply-block">
<baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
<el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'" :rules="rules">
<el-row>
<el-col :span="6" v-if="title==='apply'">
<el-row v-if="title==='apply'">
<el-col :span="6">
<!-- label-width="106"-->
<el-form-item label="实际经费预算" prop="actualEconomicEstimate" label-width="111" >
<el-form-item label="实际经费预算" prop="actualEconomicEstimate" label-width="111">
<el-input v-model="localFormData.actualEconomicEstimate" placeholder="请输入实际经费预算">
</el-input>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="6" v-if="title==='apply'&&detail">
<el-col :span="6" v-if="isSpecialFund">
<!-- label-width="106"-->
<el-form-item label="实际专项资金" prop="specialFundAmount" label-width="121" >
<el-form-item label="实际专项资金" prop="specialFundAmount" label-width="121">
<el-input v-model="localFormData.specialFundAmount" placeholder="请输入实际专项资金">
</el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row>
</el-row>
<el-row v-if="title==='check'">
<el-col :span="6">
<el-form-item label="实际专利(项)" prop="actualNewPatent" label-width="130">
<el-input v-model="localFormData.actualNewPatent" placeholder="请输入实际专利数量" style="margin-right: 20px">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -10px">
<el-form-item label="实际软件著作权(项)" prop="actualSoftwareCopyright" label-width="150">
<el-input v-model="localFormData.actualSoftwareCopyright" placeholder="请输入实际软件著作权数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -5px">
<el-form-item label="实际技术标准(项)" prop="actualTechnicalNorms" label-width="150">
<el-input v-model="localFormData.actualTechnicalNorms" placeholder="请输入实际技术标准数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实际新产品(项)" prop="actualNewProduct" label-width="160" style="margin-right: -10px">
<el-input v-model="localFormData.actualNewProduct" placeholder="请输入实际新产品数量" >
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实际新工艺(项)" prop="actualNewProcess" label-width="130" >
<el-input v-model="localFormData.actualNewProcess" placeholder="请输入实际新工艺数量" style="margin-right: 20px">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -10px">
<el-form-item label="实际新装置(项)" prop="actualNewDevice" label-width="150">
<el-input v-model="localFormData.actualNewDevice" placeholder="请输入实际新装置数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -5px">
<el-form-item label="实际新材料(项)" prop="actualNewMaterials" label-width="150">
<el-input v-model="localFormData.actualNewMaterials" placeholder="请输入实际新材料数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实际计算机软件(项)" prop="actualComputerSoftware" label-width="160" style="margin-right: -10px">
<el-input v-model="localFormData.actualComputerSoftware" placeholder="请输入实际计算机软件数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实际论文论著(项)" prop="actualThesis" label-width="130" style="margin-right: 20px">
<el-input v-model="localFormData.actualThesis" placeholder="请输入实际论文论著数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -10px">
<el-form-item label="实际研究报告(项)" prop="actualResearchReport" label-width="150">
<el-input v-model="localFormData.actualResearchReport" placeholder="请输入实际研究报告数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -5px">
<el-form-item label="实际商标(项)" prop="actualTrademark" label-width="150">
<el-input v-model="localFormData.actualTrademark" placeholder="请输入实际商标数量">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="实际其他(项)" prop="actualOther" label-width="130" style="margin-right: 10px">
<el-input rows="4" type="textarea" v-model="localFormData.actualOther" placeholder="请输入实际其他项">
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6" v-if="title==='apply'">
<!-- label-width="106"-->
<el-form-item label="项目负责人" :required="true" prop="" label-width="111">
@@ -29,34 +103,41 @@
{{ item.name }}
</div>
<user-picker :multiple="false" ref="projectChargePersonUserPicker" title="请选择项目负责人"
v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk" @cancelOrClear="projectChargePersonUserPickerCancel"/>
v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk"
@cancelOrClear="projectChargePersonUserPickerCancel"/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="title==='apply'">
<el-form-item label="项目成员" :required="true" prop="" label-width="120"
>
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
{{ projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择' }}
{{
projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择'
}}
</el-button>
<div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id" >
{{ item.name }}{{index != getProjectPerson(projectPersonUserList)?.length - 1 ? '' : ''}}
<div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id">
{{ item.name }}{{ index != getProjectPerson(projectPersonUserList)?.length - 1 ? '' : '' }}
</div>
<user-picker :multiple="true" ref="projectPersonUserPicker" title="请选择项目成员"
v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk" @cancelOrClear="projectPersonUserPickerCancel"/>
v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk"
@cancelOrClear="projectPersonUserPickerCancel"/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="title==='apply'||title==='check'">
<el-form-item label="部门分管领导" :label-width="title==='check'?110:115">
<el-form-item label="部门分管领导" :label-width="title==='check'?130:115">
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowOptionalChargeLeadershipPicker">
{{
optionalChargeLeadershipList?.length !== 0 ? '更改' : getOptionalChargeLeadershipList(optionalChargeLeadershipList) ? '更改' : '请选择'
}}
</el-button>
<div v-for="(item,index) in getOptionalChargeLeadershipList(optionalChargeLeadershipList)" :key="item.id">
{{ item.name }}{{index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? '' : ''}}
{{
item.name
}}{{ index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? '' : '' }}
</div>
<user-picker :multiple="true" ref="optionalChargeLeadershipPickerRef" title="请选择部门分管领导"
v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk" @cancelOrClear="optionalChargeLeaderPickerCancel"/>
v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk"
@cancelOrClear="optionalChargeLeaderPickerCancel"/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="preProcessShow === 'EDIT'">
@@ -78,7 +159,9 @@
</el-form>
<!-- v-if="showAttachment"-->
<AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)" :templateName="getTemplateName(props.title)" :templateDownloadBtnShow="props.title==='apply'?true:props.title==='check'"
v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)"
:templateName="getTemplateName(props.title)"
:templateDownloadBtnShow="props.title==='apply'?true:props.title==='check'"
@getAttachment="getAttachment" v-model:singleList="singleList" :showSingleTable="showSingleTable"
@getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
:preview="mode == 'resubmit'"/>
@@ -156,7 +239,7 @@
<script setup lang="jsx">
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import {ElNotification} from "element-plus";
import {ElLoading, ElNotification} from "element-plus";
import {
getApplyProcess,
getPreProcess,
@@ -173,7 +256,7 @@ import {useProcessStore} from '@/stores/processStore.js';
import {useTagsView} from '@/stores/tagsview.js'
import Paging from "@/components/pagination/index.vue";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
import {getBaseInfoApi} from "@/components/steps/api";
import {getBaseInfoApi, getMapProjectStateInfo} from "@/components/steps/api";
const router = useRouter()
const route = useRoute()
@@ -230,9 +313,22 @@ const pageInfo = reactive({
pageSize: 10,
})
const rules = reactive({
actualEconomicEstimate: [{required: true, message: '请输入实际经费预算', trigger: ['blur','change']}],
actualEconomicEstimate: [{required: true, message: '请输入实际经费预算', trigger: ['blur', 'change']}],
specialFundAmount: [{required: true, message: '请输入实际专项资金', trigger: 'blur'}],
// projectPerson: [{required: true, message: '请选择项目成员', trigger: 'blur'}],
actualNewPatent: [{required: true, message: '请输入实际专利数量', trigger: ['blur', 'change']}],
actualTechnicalNorms: [{required: true, message: '请输入实际技术标准数量', trigger: ['blur', 'change']}],
actualSoftwareCopyright: [{required: true, message: '请输入实际软件著作权数量', trigger: ['blur', 'change']}],
actualNewProduct: [{required: true, message: '请输入实际新产品数量', trigger: ['blur', 'change']}],
actualNewProcess: [{required: true, message: '请输入实际新工艺数量', trigger: ['blur', 'change']}],
actualNewMaterials: [{required: true, message: '请输入实际新材料数量', trigger: ['blur', 'change']}],
actualNewDevice: [{required: true, message: '请输入实际新装置数量', trigger: ['blur', 'change']}],
actualComputerSoftware: [{required: true, message: '请输入实际计算机软件数量', trigger: ['blur', 'change']}],
actualThesis: [{required: true, message: '请输入实际论文论著数量', trigger: ['blur', 'change']}],
actualResearchReport: [{required: true, message: '请输入实际研究报告数量', trigger: ['blur', 'change']}],
actualTrademark: [{required: true, message: '请输入实际商标数量', trigger: ['blur', 'change']}],
actualOther: [{required: true, message: '请输入实际其他项数量', trigger: ['blur', 'change']}],
})
const tagsViewStore = useTagsView()
const processStore = useProcessStore()
@@ -261,7 +357,7 @@ const selectRows = ref([])
const projectId = ref(route.query.projectId)
const sessionParams = ref({})
const optionalChargeLeadershipPickerRef = ref()
const detail = ref(false)
const isSpecialFund = ref(false)
const optionalChargeLeadershipList = ref([])
const filePreviewParam = ref({
fileUrl: '',
@@ -269,14 +365,52 @@ const filePreviewParam = ref({
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const getInfo=async ()=>{
const getSummaryInfo = async () => {
if (props.mode === 'resubmit') return;
if(props.title === 'check'){
const loading = ElLoading.service({fullscreen: true})
try {
const projectId = route.query.projectId
const {code, data, msg} = await getMapProjectStateInfo(projectId, '10')
if (code === 1000) {
localFormData.value.actualNewPatent= data.formData.newPatent
localFormData.value.actualSoftwareCopyright= data.formData.softwareCopyright
localFormData.value.actualTechnicalNorms= data.formData.technicalNorms
localFormData.value.actualNewProduct= data.formData.newProduct
localFormData.value.actualNewProcess= data.formData.newProcess
localFormData.value.actualNewDevice= data.formData.newDevice
localFormData.value.actualNewMaterials= data.formData.newMaterials
localFormData.value.actualComputerSoftware= data.formData.computerSoftware
localFormData.value.actualThesis= data.formData.thesis
localFormData.value.actualResearchReport= data.formData.researchReport
localFormData.value.actualTrademark= data.formData.trademark
localFormData.value.actualOther= data.formData.other
loading.close()
} else {
ElNotification({
title: '提示',
message: msg,
type: 'error'
})
loading.close()
}
} catch {
loading.close()
}
}
}
getSummaryInfo()
const getInfo = async () => {
const {code, data} = await getBaseInfoApi(route.query.projectId)
console.log('data',code,data)
detail.value=data.isSpecialFund
isSpecialFund.value = data.isSpecialFund
}
getInfo()
const getTemplateName=(type)=>{
const getTemplateName = (type) => {
switch (type) {
case 'apply':
return '科技创新项目立项模板'
@@ -291,9 +425,9 @@ const handleShowOptionalChargeLeadershipPicker = () => {
const optionalChargeLeaderPickerOk = (userList) => {
optionalChargeLeadershipList.value = userList
if(userList?.length>0){
if (userList?.length > 0) {
localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(optionalChargeLeadershipList.value))
}else {
} else {
localStorage.removeItem('optionalChargeLeadershipList')
}
}
@@ -372,27 +506,27 @@ const handleShowProjectChargePersonTable = () => {
}
const projectChargePersonUserPickerOk = (userList) => {
projectChargePersonUserList.value = userList
if(userList?.length>0){
if (userList?.length > 0) {
localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
}else {
} else {
localStorage.removeItem('projectPersonUserList')
}
}
const handleShowProjectPersonTable = () => {
projectPersonUserPicker.value.showUserPicker()
}
const projectChargePersonUserPickerCancel=(userList)=>{
const projectChargePersonUserPickerCancel = (userList) => {
projectChargePersonUserList.value = userList
}
const projectPersonUserPickerCancel=(userList)=>{
const projectPersonUserPickerCancel = (userList) => {
projectPersonUserList.value = userList
}
const projectPersonUserPickerOk = (userList) => {
projectPersonUserList.value = userList
if(userList?.length>0){
if (userList?.length > 0) {
localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
}else {
} else {
localStorage.removeItem('projectPersonUserList')
}
}
@@ -515,7 +649,7 @@ const getFileParam = (item) => {
}
}
const handleSubmit = async (instance) => {
if(props.step==50){
if (props.step == 50) {
let files = []
if (props.mode === 'resubmit') {
attachment.value.allFileList.forEach(item => {
@@ -547,7 +681,8 @@ const handleSubmit = async (instance) => {
requirementId: route.query.id,
fileList: files,
// singleFile: attachment.value.singleFile,
projectId: projectId.value,
projectId: route.query.projectId,
...localFormData.value,
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate),
specialFundAmount: parseFloat(localFormData.value.specialFundAmount),
preProcess: JSON.stringify(localFormData.value.preProcess)
@@ -555,108 +690,12 @@ const handleSubmit = async (instance) => {
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
}
console.log('params',params)
console.log('params', params)
let res
if (props.mode === 'resubmit') {
res = await resubmitConclusion(params)
} else {
res = await projectConclusion(params)
}
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
await router.push({
name: 'Filing'
})
}
}else{
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
let files = []
if (props.mode === 'resubmit') {
attachment.value.allFileList.forEach(item => {
files.push(getFileParam(item))
})
res = await resubmitConclusion(params)
} else {
otherFileList.value.forEach(item => {
files.push(getFileParam(item))
})
}
// console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile)
if (!attachment.value.isHaveOneFile) {
attachment.value.validate()
ElNotification({
title: '提示',
message: '请上传附件',
type: 'error'
})
return;
} else {
attachment.value.clearValidate()
}
let projectPersonIds = []
for (const item of projectPersonUserList.value) {
projectPersonIds.push(parseInt(item.id))
}
let params = {
deploymentId: deploymentId.value,
requirementId: route.query.id,
fileList: files,
// singleFile: attachment.value.singleFile,
projectId: projectId.value,
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate),
specialFundAmount: parseFloat(localFormData.value.specialFundAmount),
preProcess: JSON.stringify(localFormData.value.preProcess)
}
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
}
console.log('params',params)
let res
if (props.step === '20') {
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目负责人!',
type: 'error'
})
return;
}
if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目成员!',
type: 'error'
})
return;
}
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
params.projectPersonIds = projectPersonIds
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitApply(params)
} else {
res = await projectApply(params)
}
} else if (props.step === '40') {
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitCheck(params)
} else {
res = await projectCheck(params)
}
res = await projectConclusion(params)
}
ElNotification({
title: '提示',
@@ -665,21 +704,118 @@ const handleSubmit = async (instance) => {
})
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
await router.push({
name: 'Filing'
})
}
} else {
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
let files = []
if (props.mode === 'resubmit') {
attachment.value.allFileList.forEach(item => {
files.push(getFileParam(item))
})
} else {
otherFileList.value.forEach(item => {
files.push(getFileParam(item))
})
}
// console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile)
if (!attachment.value.isHaveOneFile) {
attachment.value.validate()
ElNotification({
title: '提示',
message: '请上传附件',
type: 'error'
})
return;
} else {
attachment.value.clearValidate()
}
let projectPersonIds = []
for (const item of projectPersonUserList.value) {
projectPersonIds.push(parseInt(item.id))
}
let params = {
// singleFile: attachment.value.singleFile,
...localFormData.value,
projectId: route.query.projectId,
deploymentId: deploymentId.value,
requirementId: route.query.id,
fileList: files,
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate)||null,
specialFundAmount: parseFloat(localFormData.value.specialFundAmount)||null,
preProcess: JSON.stringify(localFormData.value.preProcess)
}
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
}
console.log('params', params)
let res
if (props.step === '20') {
await router.push({
name: 'Initiation'
})
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目负责人!',
type: 'error'
})
return;
}
if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目成员!',
type: 'error'
})
return;
}
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
params.projectPersonIds = projectPersonIds
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitApply(params)
} else {
res = await projectApply(params)
}
} else if (props.step === '40') {
await router.push({
name: 'Implementation'
})
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitCheck(params)
} else {
res = await projectCheck(params)
}
}
}
})
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
if (props.step === '20') {
await router.push({
name: 'Initiation'
})
} else if (props.step === '40') {
await router.push({
name: 'Implementation'
})
}
}
})
}
}
const init = async () => {
let id = projectId.value
let id = route.query.projectId
if (!id) return;
processDiagramViewer.value = false
let res
@@ -694,6 +830,7 @@ const init = async () => {
let data = res.data
deploymentId.value = data.deploymentId
deploymentData.value = data
console.log('data,',data)
preProcessRequired.value = data.deploymentName === '重大项目立项' || data.deploymentName === '重大项目验收';
processStore.setDesign(data)
processStore.runningList.value = data.runningList;

View File

@@ -16,74 +16,74 @@
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专利(项)" prop="newPatent">
<el-form-item label="预估专利(项)" prop="newPatent">
<span>{{ localFormData.newPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
<span>{{ localFormData.softwareCopyright }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="技术标准(项)" prop="technicalNorms">
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
<span>{{ localFormData.technicalNorms }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="新产品(项)" prop="newProduct">
<el-form-item label="预估新产品(项)" prop="newProduct">
<span>{{ localFormData.newProduct }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="新工艺(项)" prop="newProcess">
<el-form-item label="预估新工艺(项)" prop="newProcess">
<span>{{ localFormData.newProcess }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="新装置(项)" prop="newDevice">
<el-form-item label="预估新装置(项)" prop="newDevice">
<span>{{ localFormData.newDevice }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="新材料(项)" prop="newMaterials">
<el-form-item label="预估新材料(项)" prop="newMaterials">
<span>{{ localFormData.newMaterials }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计算机软件(项)" prop="computerSoftware">
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
<span>{{ localFormData.computerSoftware }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="论文论著(项)" prop="thesis">
<el-form-item label="预估论文论著(项)" prop="thesis">
<span>{{ localFormData.thesis }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="研究报告(项)" prop="researchReport">
<el-form-item label="预估研究报告(项)" prop="researchReport">
<span>{{ localFormData.researchReport }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="商标(项)" prop="trademark">
<el-form-item label="预估商标(项)" prop="trademark">
<span>{{ localFormData.trademark }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其他(项)" prop="other">
<el-form-item label="预估其他(项)" prop="other">
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
</el-form-item>
</el-col>

View File

@@ -1,7 +1,7 @@
<template>
<div class="detail-block" v-loading="loading" :style="{padding:!formData.isSpecialFund?'0 30px':'0 0 0 30px'}">
<baseTitle title="项目基本信息"></baseTitle>
<el-form :model="formData" ref="summaryForm" :rules="rules" :label-width="!formData.isSpecialFund?130:160"
<el-form :model="formData" ref="summaryForm" :rules="rules" :label-width="!formData.isSpecialFund?145:160"
:scroll-to-error="true">
<el-row gutter="30" style="margin-bottom: -18px;"
:style="{marginLeft:!formData.isSpecialFund?'-8.5px':'-48.5px'}">
@@ -277,76 +277,76 @@
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}" >
<el-form-item label="专利(项)" prop="newPatent">
<el-input-number v-model="formData.newPatent" placeholder="请输入专利数量" :controls="false"
<el-form-item label="预估专利(项)" prop="newPatent">
<el-input-number v-model="formData.newPatent" placeholder="请输入预估专利数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
<el-input-number v-model="formData.softwareCopyright" placeholder="请输入软件著作权数量" :controls="false"
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
<el-input-number v-model="formData.softwareCopyright" placeholder="请输入预估软件著作权数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
<el-form-item label="技术标准(项)" prop="technicalNorms">
<el-input-number v-model="formData.technicalNorms" placeholder="请输入技术标准数量" :controls="false"
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
<el-input-number v-model="formData.technicalNorms" placeholder="请输入预估技术标准数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'0'}">
<el-form-item label="新产品(项)" prop="newProduct">
<el-input-number v-model="formData.newProduct" placeholder="请输入新产品数量" :controls="false"
<el-form-item label="预估新产品(项)" prop="newProduct">
<el-input-number v-model="formData.newProduct" placeholder="请输入预估新产品数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}">
<el-form-item label="新工艺(项)" prop="newProcess">
<el-input-number v-model="formData.newProcess" placeholder="请输入新工艺数量" :controls="false"
<el-form-item label="预估新工艺(项)" prop="newProcess">
<el-input-number v-model="formData.newProcess" placeholder="请输入预估新工艺数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
<el-form-item label="新装置(项)" prop="newDevice">
<el-input-number v-model="formData.newDevice" placeholder="请输入新装置数量" :controls="false"
<el-form-item label="预估新装置(项)" prop="newDevice">
<el-input-number v-model="formData.newDevice" placeholder="请输入预估新装置数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
<el-form-item label="新材料(项)" prop="newMaterials">
<el-input-number v-model="formData.newMaterials" placeholder="请输入新材料数量" :controls="false"
<el-form-item label="预估新材料(项)" prop="newMaterials">
<el-input-number v-model="formData.newMaterials" placeholder="请输入预估新材料数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'0'}">
<el-form-item label="计算机软件(项)" prop="computerSoftware">
<el-input-number v-model="formData.computerSoftware" placeholder="请输入计算机软件数量" :controls="false"
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
<el-input-number v-model="formData.computerSoftware" placeholder="请输入预估计算机软件数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}">
<el-form-item label="论文论著(项)" prop="thesis">
<el-input-number v-model="formData.thesis" placeholder="请输入论文论著数量" :controls="false"
<el-form-item label="预估论文论著(项)" prop="thesis">
<el-input-number v-model="formData.thesis" placeholder="请输入预估论文论著数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
<el-form-item label="研究报告(项)" prop="researchReport">
<el-input-number v-model="formData.researchReport" placeholder="请输入研究报告数量" :controls="false"
<el-form-item label="预估研究报告(项)" prop="researchReport">
<el-input-number v-model="formData.researchReport" placeholder="请输入预估研究报告数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
<el-form-item label="商标(项)" prop="trademark">
<el-input-number v-model="formData.trademark" placeholder="请输入商标数量" :controls="false"
<el-form-item label="预估商标(项)" prop="trademark">
<el-input-number v-model="formData.trademark" placeholder="请输入预估商标数量" :controls="false"
@change="changeCollectData"/>
</el-form-item>
</el-col>
<el-col :span="24" >
<el-form-item label="其他(项)" prop="other">
<el-input rows="4" type="textarea" v-model="formData.other"
<el-form-item label="预估其他(项)" prop="other">
<el-input rows="4" type="textarea" v-model="formData.other" placeholder="请输入预估其他项"
@change="changeCollectData" :style="{marginRight:!formData.isSpecialFund?'20px':'80px'}"/>
</el-form-item>
</el-col>
@@ -491,7 +491,7 @@ const rules = reactive({
newProduct: [{required: true, message: '请输入新产品数量', trigger: ['blur', 'change']}],
newProcess: [{required: true, message: '请输入新工艺数量', trigger: ['blur', 'change']}],
newMaterials: [{required: true, message: '请输入新材料数量', trigger: ['blur', 'change']}],
newDevice: [{required: true, message: '请输入新装数量', trigger: ['blur', 'change']}],
newDevice: [{required: true, message: '请输入新装数量', trigger: ['blur', 'change']}],
computerSoftware: [{required: true, message: '请输入计算机软件数量', trigger: ['blur', 'change']}],
thesis: [{required: true, message: '请输入论文论著数量', trigger: ['blur', 'change']}],
researchReport: [{required: true, message: '请输入研究报告数量', trigger: ['blur', 'change']}],

View File

@@ -1,16 +1,16 @@
<template>
<div v-loading="loading">
<baseTitle v-if="type!='phase'" :title="getTagName(type)+'信息'" ></baseTitle>
<baseTitle v-if="type!='phase'" :title="getTagName(type)+'信息'"></baseTitle>
<fvForm :schema="schema" @getInstance="(e)=>form = e" style="margin-left: 15px"></fvForm>
<el-form :model="formData" label-width="auto">
<file-component
:title="getTagName(type)+'附件'"
:fileNameTableWidth="150"
:tag="getTagName(type)"
v-model:value="formData.fileList"
:processViewer="processViewer"
:file-list-show="fileListShow"
labelAlign="top"
:title="getTagName(type)+'附件'"
:fileNameTableWidth="150"
:tag="getTagName(type)"
v-model:value="formData.fileList"
:processViewer="processViewer"
:file-list-show="fileListShow"
labelAlign="top"
/>
</el-form>
<div v-if="data.taskId">
@@ -36,7 +36,8 @@
</div>
</div>
<div class="process">
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram" :isColumn="true"
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
:isColumn="true"
:operation-list="data.operationList"
:state="data.state"/>
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
@@ -115,7 +116,8 @@ const editSingleTableConfig = reactive({
label: '文件名',
align: 'center',
width: 300,
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
@@ -192,7 +194,7 @@ const schema = computed(() => {
colProps: {
span: 24
},
labelWidth:'left',
labelWidth: 'left',
component: () => (
<div>
{
@@ -209,12 +211,13 @@ const schema = computed(() => {
colProps: {
span: 24
},
labelWidth:'left',
labelWidth: 'left',
component: () => (
<div>
{
props.formData.projectPersonList ? props.formData.projectPersonList.map((item, index) => {
return <span>{item.name} <span>{index != props.formData.projectPersonList?.length - 1 ? '' : ''}</span></span>
return <span>{item.name}
<span>{index != props.formData.projectPersonList?.length - 1 ? '' : ''}</span></span>
}) : <span>{'--'}</span>
}
</div>
@@ -273,7 +276,188 @@ const schema = computed(() => {
// }
// })
} else if (props.type == 'execute') {
arr = [{
arr = [
{
label: '实际专利(项)',
prop: 'actualNewPatent',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewPatent ? props.formData.actualNewPatent : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际软件著作权(项)',
prop: 'actualSoftwareCopyright',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualSoftwareCopyright ? props.formData.actualSoftwareCopyright : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际技术标准(项)',
prop: 'actualTechnicalNorms',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTechnicalNorms ? props.formData.actualTechnicalNorms : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新产品(项)',
prop: 'actualNewProduct',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProduct ? props.formData.actualNewProduct : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新工艺(项)',
prop: 'actualNewProcess',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProcess ? props.formData.actualNewProcess : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新装置(项)',
prop: 'actualNewDevice',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewDevice ? props.formData.actualNewDevice : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新材料(项)',
prop: 'actualNewMaterials',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewMaterials ? props.formData.actualNewMaterials : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际计算机软件(项)',
prop: 'actualComputerSoftware',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualComputerSoftware ? props.formData.actualComputerSoftware : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际论文论著(项)',
prop: 'actualThesis',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualThesis ? props.formData.actualThesis : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际研究报告(项)',
prop: 'actualResearchReport',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualResearchReport ? props.formData.actualResearchReport : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际商标(项)',
prop: 'actualTrademark',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTrademark ? props.formData.actualTrademark : <span>{'--'}</span>
}
</div>
)
},
{
label: '实际其他(项)',
prop: 'actualOther',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div style="white-space: pre-wrap;">
{
props.formData.actualOther ? props.formData.actualOther : <span>{'--'}</span>
}
</div>
)
},
{
label: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
@@ -309,22 +493,22 @@ const schema = computed(() => {
}
arr.push(preProcess)
// arr.push(
// {
// label: '项目验收附件',
// prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// })
// {
// label: '项目验收附件',
// prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// })
} else if (props.type == 'archivist') {
arr = [
// {
@@ -377,14 +561,14 @@ const _value = computed({
emit("update:value", val);
}
})
const clickToPreview=(row)=>{
const clickToPreview = (row) => {
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
nextTick(() => {
filePreviewShow.value = true
})
}

View File

@@ -3,11 +3,6 @@
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
<baseTitle title="预期知识产权"></baseTitle>
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
<!-- <el-col :span="24">-->
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24">
<el-form-item label="知识产权归属" prop="intellectualProperty">
<span>{{
@@ -17,74 +12,74 @@
</el-col>
<el-col :span="24">
<el-form-item label="专利(项)" prop="newPatent">
<el-form-item label="预估专利(项)" prop="newPatent">
<span>{{ localFormData.newPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
<span>{{ localFormData.softwareCopyright }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="技术标准(项)" prop="technicalNorms">
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
<span>{{ localFormData.technicalNorms }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="新产品(项)" prop="newProduct">
<el-form-item label="预估新产品(项)" prop="newProduct">
<span>{{ localFormData.newProduct }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="新工艺(项)" prop="newProcess">
<el-form-item label="预估新工艺(项)" prop="newProcess">
<span>{{ localFormData.newProcess }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="新装置(项)" prop="newDevice">
<el-form-item label="预估新装置(项)" prop="newDevice">
<span>{{ localFormData.newDevice }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="新材料(项)" prop="newMaterials">
<el-form-item label="预估新材料(项)" prop="newMaterials">
<span>{{ localFormData.newMaterials }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="计算机软件(项)" prop="computerSoftware">
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
<span>{{ localFormData.computerSoftware }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="论文论著(项)" prop="thesis">
<el-form-item label="预估论文论著(项)" prop="thesis">
<span>{{ localFormData.thesis }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="研究报告(项)" prop="researchReport">
<el-form-item label="预估研究报告(项)" prop="researchReport">
<span>{{ localFormData.researchReport }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="商标(项)" prop="trademark">
<el-form-item label="预估商标(项)" prop="trademark">
<span>{{ localFormData.trademark }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他(项)" prop="other">
<el-form-item label="预估其他(项)" prop="other">
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
</el-form-item>
</el-col>