fix : 修复需求汇总详情功能

This commit is contained in:
2024-05-19 13:18:03 +08:00
parent 10bc019866
commit 89d5c86d8b
6 changed files with 383 additions and 93 deletions

View File

@@ -1,36 +1,70 @@
<template>
<div v-loading="loading">
<fvForm v-if="showForm" ref="form" :schema="schame">
</fvForm>
<baseTitle title="征集说明"></baseTitle>
<el-card style="width: 100%">
<div v-html="formData.collectExplain">
<el-form :model="formData" ref="form" label-width="auto">
<el-row>
<el-col :span="12">
<el-form-item label="名称">
<span>{{ formData.requirementName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属公司">
<span>{{ formData.companyIds }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="征集类型">
<span>{{ formData.collectType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="截止时间">
<span>{{ formData.deadline }}</span>
</el-form-item>
</el-col>
<baseTitle title="征集说明"></baseTitle>
<el-col :span="24">
<el-form-item>
<el-card style="width: 100%">
<div v-html="formData.collectExplain">
</div>
</el-card>
</el-form-item>
</el-col>
<baseTitle title="附件列表"></baseTitle>
<el-col :span="24">
<el-form-item>
<fvTable style="width: 100%;max-height: 200px" v-if="processViewer" :tableConfig="tableConfig"
:data="formData.fileList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-form-item>
</el-col>
<el-col :span="24">
<div v-if="formData.taskId">
<baseTitle title="审核意见"></baseTitle>
<el-form-item prop="auditOpinion">
<el-input
v-model="formData.auditOpinion"
:rows="3"
type="textarea"
placeholder="请输入审核意见"
/>
</el-form-item>
</div>
</el-col>
</el-row>
<div class="approval-record">
<baseTitle title="审批记录"></baseTitle>
<div class="process">
<operation-render v-if="processViewer" :operation-list="data.operationList"
:state="data.state"/>
<process-diagram-viewer v-if="processViewer"/>
</div>
</div>
</el-card>
<baseTitle title="附件列表"></baseTitle>
<fvTable style="width: 100%;max-height: 200px" v-if="processViewer" :tableConfig="tableConfig"
:data="formData.fileList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
<baseTitle title="审核意见"></baseTitle>
<el-form-item prop="auditOpinion">
<el-input
v-model="formData.auditOpinion"
:rows="3"
type="textarea"
placeholder="请输入审核意见"
/>
</el-form-item>
<div class="approval-record">
<baseTitle title="审批记录"></baseTitle>
<div class="process">
<operation-render v-if="processViewer" :operation-list="data.operationList"
:state="data.state"/>
<process-diagram-viewer v-if="processViewer"/>
</div>
</div>
</el-form>
</div>
</template>
@@ -38,8 +72,9 @@
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
import {matterTree} from '@/utils/matterTree.js';
import {downloadFile} from "@/api/project-demand";
const emit = defineEmits(['getInfo','download'])
const emit = defineEmits(['getInfo'])
const form = ref()
const showForm = ref(true)
const loading = ref(false)
@@ -64,36 +99,6 @@ const props = defineProps({
default: []
},
})
const schame = computed(() => {
return [
{
label: '名称',
prop: 'requirementName',
colProps: {
span: 12
}
},
{
label: '所属公司',
prop: 'companyIds',
colProps: {
span: 12
}
}, {
label: '征集类型',
prop: 'collectType',
colProps: {
span: 12
}
}, {
label: '截止时间',
prop: 'deadline',
colProps: {
span: 12
}
}
]
})
const tableConfig = reactive({
columns: [
{
@@ -132,15 +137,17 @@ const tableConfig = reactive({
]
})
const init = (newVal) => {
newVal.companyIds = getDataSourceOptionItem(newVal.companyIds)
form.value.setValues(newVal)
}
const getInfo = () => {
emit('getInfo')
}
const handleDownload = (row) => {
emit('download',row)
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
}
const getDataSourceOptionItem = (val) => {
if (val instanceof Array) {
@@ -155,7 +162,8 @@ watch(() => props.companyOption, (newVal) => {
}, {deep: true})
watch(() => props.formData, (newVal) => {
if (newVal) {
init(newVal)
newVal.companyIds = getDataSourceOptionItem(newVal.companyIds)
props.formData=newVal
}
}, {deep: true})
watch(() => props.processViewer, (newVal) => {

View File

@@ -0,0 +1,210 @@
<template>
<el-form :model="formData" ref="summaryForm">
<el-row gutter="50">
<el-col :span="12">
<el-form-item label="名称" prop="requirementName">
<span>{{ formData.requirementName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专项资金" prop="specialFund">
<span>{{ formData.specialFund }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开始时间" prop="startTime">
<span>{{ formData.startTime }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属公司" prop="companyName">
<span>{{ formData.companyName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目类型" prop="projectType">
<span>{{ formData.projectType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束时间" prop="endTime">
<span>{{ formData.endTime }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出资类型" prop="investmentType">
<span>{{ formData.investmentType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目影响" prop="projectImpact">
<span>{{ formData.projectImpact }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属业务板块" prop="businessSegment">
<span>{{ formData.businessSegment }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预期成果形式" prop="resultForm">
<span>{{ formData.resultForm }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预期技术标准制定" prop="technicalStandard">
<span>{{ formData.technicalStandard }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产学研联合" prop="industryUniversityResearch">
<span>{{ formData.industryUniversityResearch }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开展政府申报" prop="governmentDeclaration">
<span>{{ formData.governmentDeclaration }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="知识产权状况" prop="intellectualProperty">
<span>{{ formData.intellectualProperty }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发明专利(项)" prop="inventionPatent">
<span>{{ formData.inventionPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实用性新型专利(项)" prop="newPatent">
<span>{{ formData.newPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
<span>{{ formData.softwareCopyright }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="著作权(项)" prop="copyright">
<span>{{ formData.copyright }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其他(项)" prop="other">
<span>{{ formData.other }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="经济概算(万元)" prop="economicEstimate">
<span>{{ formData.economicEstimate }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其中申请公司总部科技创新专项资金(万元)" prop="specialFundAmount">
<span>{{ formData.specialFundAmount }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="现有业务描述" prop="serviceDescription">
<span>{{ formData.serviceDescription }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="研发项目关键内容描述" prop="contentDescription">
<span>{{ formData.contentDescription }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="需求上报申请书">
<el-button type="primary" link @click="handleDownload(formData.fileList)">{{formData.fileList}}</el-button>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="需求上报附件">
<fvTable style="width: 100%;max-height: 400px;" v-if="processViewer" :tableConfig="tableConfig"
:data="formData.fileList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup lang="jsx">
import {downloadFile} from "@/api/project-demand";
const props = defineProps({
formData: {
type: Array,
default: []
},
data: {
type: Array,
default: []
},
processViewer: {
type: Boolean,
default: false
},
})
const tableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: '80',
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
currentRender: ({row, index}) => {
return (
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
)
}
}
]
})
const handleDownload = (fileList) => {
// downloadFile(row.fileId).then(res => {
// const blob = new Blob([res])
// let a = document.createElement('a')
// a.href=URL.createObjectURL(blob)
// a.download = row.originalFileName
// a.click()
// })
}
</script>
<style scoped>
:deep(.el-table--fit) {
height: auto !important;
}
</style>

View File

@@ -61,10 +61,17 @@
<script setup lang="jsx">
import {useAuthStore} from '@/stores/userstore.js'
import {useProcessStore} from '@/stores/processStore.js';
import {getWorkflowInfo, addRequirement, getFormInfo, resubmit, deleteFile,downloadFile} from "@/api/project-demand/index.js";
import {
getWorkflowInfo,
addRequirement,
getFormInfo,
resubmit,
deleteFile,
downloadFile
} from "@/api/project-demand/index.js";
import FileUpload from "@/components/FileUpload.vue";
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import {ElMessage, ElMessageBox,ElNotification} from "element-plus";
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
import {useRoute, useRouter} from 'vue-router'
import {getSubCompOpt} from '@/api/user/user.js'
import {useTagsView} from '@/stores/tagsview.js'
@@ -151,15 +158,15 @@ const handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href=URL.createObjectURL(blob)
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
}
const compositeParam = (item) => {
let tag=''
if(!formData.value.collectType&&router.currentRoute.value.name==='Collection/add'){
tag='需求征集'
let tag = ''
if (!formData.value.collectType && router.currentRoute.value.name === 'Collection/add') {
tag = '需求征集'
}
return {
fileId: item.id,
@@ -191,7 +198,7 @@ const init = async () => {
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if(res.code === 1000){
if (res.code === 1000) {
let data = res.data
processInstanceData.value = data
processStore.setDesign(data)
@@ -203,19 +210,26 @@ const init = async () => {
nextTick(() => {
processDiagramViewer.value = true
})
}else {
} else {
}
})
}
const submitParam=(item)=>{
const submitParam = (item) => {
let files = []
item.fileList.forEach(item => {
let obj = {
fileId: item.fileId,
}
files.push(obj)
})
return {
collectExplain: item.collectExplain,
collectType: item.collectType,
companyIds: item.companyIds,
deadline: item.deadline,
requirementId: item.requirementId?item.requirementId:0,
requirementId: item.requirementId ? item.requirementId : 0,
requirementName: item.requirementName,
files: item.fileList,
files: files,
deploymentId: processInstanceData.value.deploymentId
}
}

View File

@@ -0,0 +1,33 @@
<template>
<summary-detail :formData="summaryData.formData" :data="summaryData" :processViewer="summaryProcessViewer"/>
</template>
<script setup lang="jsx">
import {getInfo} from "@/api/project-demand";
const summaryData = ref({})
const summaryProcessViewer = ref(false)
const getDemandSummaryInfo = async () => {
if (!route.query.id) return
// await getCompanyOption()
getInfo(74).then(res => {
let data = res.data
summaryData.value = data;
processStore.setDesign(data)
processStore.runningList.value = data.runningList;
processStore.endList.value = data.endList;
processStore.noTakeList.value = data.noTakeList;
processStore.refuseList.value = data.refuseList;
processStore.passList.value = data.passList;
nextTick(() => {
summaryProcessViewer.value = true
})
})
}
getDemandSummaryInfo()
</script>
<style scoped>
</style>

View File

@@ -124,7 +124,7 @@ const tableConfig = reactive({
currentRender: ({row, index}) => {
return (
<div>
<el-button type={'primary'} link onClick={()=>{}} >详情</el-button>
<el-button type={'primary'} link onClick={()=>handleDetail()} >详情</el-button>
<el-button type={'primary'} link onClick={()=>handleAdd()} >上报</el-button>
</div>
)
@@ -164,6 +164,12 @@ const handleAdd = () => {
query: {}
})
}
const handleDetail = () => {
router.push({
name: 'Summary/detail',
query: {}
})
}
</script>
<style lang="scss" scoped>

View File

@@ -7,10 +7,13 @@
@tab-click="handleClick"
>
<el-tab-pane label="需求征集" name="first">
<collection-detail :formData="collectionData.formData" :data="collectionData" :processViewer="processViewer"
:companyOption="companyOption" @getInfo="getDemandCollectionInfo" @download="downloadDetailFile"/>
<collection-detail :formData="collectionData.formData" :data="collectionData"
:processViewer="collectionProcessViewer"
:companyOption="companyOption" @getInfo="getDemandCollectionInfo"/>
</el-tab-pane>
<el-tab-pane label="需求上报" name="second">
<summary-detail :formData="summaryData.formData" :data="summaryData" :processViewer="summaryProcessViewer"/>
</el-tab-pane>
<el-tab-pane label="需求上报" name="second"></el-tab-pane>
<el-tab-pane label="项目立项" name="third" :disabled="true"></el-tab-pane>
</el-tabs>
</div>
@@ -22,14 +25,19 @@ import {getSubCompOpt} from '@/api/user/user.js'
import {useProcessStore} from '@/stores/processStore.js';
import CollectionDetail from "@/components/DetailComponent/CollectionDetail.vue";
import {downloadFile} from "@/api/project-demand";
import SummaryDetail from "@/components/DetailComponent/SummaryDetail.vue";
const route = useRoute()
const activeName = ref('first')
const collectionData = ref({})
const processViewer = ref(false)
const summaryData = ref({})
const collectionProcessViewer = ref(false)
const summaryProcessViewer = ref(false)
const processStore = useProcessStore()
const companyOption = ref([])
const rules = reactive({
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
})
const getCompanyOption = async () => {
const res = await getSubCompOpt()
companyOption.value = res.data
@@ -48,23 +56,34 @@ const getDemandCollectionInfo = async () => {
processStore.refuseList.value = data.refuseList;
processStore.passList.value = data.passList;
nextTick(() => {
processViewer.value = true
collectionProcessViewer.value = true
})
})
}
const downloadDetailFile = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
const getDemandSummaryInfo = async () => {
if (!route.query.id) return
// await getCompanyOption()
getInfo(route.query.id).then(res => {
let data = res.data
summaryData.value = data;
processStore.setDesign(data)
processStore.runningList.value = data.runningList;
processStore.endList.value = data.endList;
processStore.noTakeList.value = data.noTakeList;
processStore.refuseList.value = data.refuseList;
processStore.passList.value = data.passList;
nextTick(() => {
summaryProcessViewer.value = true
})
})
}
const handleClick = (tab, event) => {
console.log(tab, event)
if (tab.index.value === 0) {
if (tab.props.name === 'first') {
getDemandCollectionInfo()
} else if (tab.props.name === 'second') {
getDemandSummaryInfo()
}
}
getDemandCollectionInfo()