Commit e87de6fa authored by wangxl's avatar wangxl

33333

parent f18fefd0
......@@ -113,13 +113,12 @@ export const routes = [
hidden: false,
children: [
{ path: '/report/project', name: '项目申报', component: () => import('@/views/report/project/Index.vue'), meta: { title: '项目申报', icon: '', noCache: true } },
{ path: '/report/task', name: '任务书填报1', component: () => import('@/views/report/task/Index.vue'), meta: { title: '任务书填报1', icon: '', noCache: true } },
{ path: '/report/projectTask', name: '任务书填报2', component: () => import('@/views/report/task/projectTask.vue'), meta: { title: '任务书填报2', icon: '', noCache: true } },
{ path: '/report/check', name: '中期考核填报', component: () => import('@/views/report/check/Index.vue'), meta: { title: '中期考核填报', icon: '', noCache: true } },
{ path: '/report/task', name: '合同书上报', component: () => import('@/views/report/task/Index.vue'), meta: { title: '合同书上报', icon: '', noCache: true } },
{ path: '/report/check', name: '中期考核上报', component: () => import('@/views/report/check/Index.vue'), meta: { title: '中期考核上报', icon: '', noCache: true } },
{ path: '/report/conclusion', name: '项目结题', component: () => import('@/views/conclusion/index.vue'), meta: { title: '项目结题', icon: '', noCache: true } },
{ path: '/project/create', name: '项目创建', component: () => import('@/views/report/project/components/projectCreate'), meta: { title: '项目创建', icon: '', noCache: true } },
{ path: '/query/project', name: '项目申报查询1', component: () => import('@/views/query/project/Index.vue'), meta: { title: '项目申报查询', icon: '', noCache: true } },
{ path: '/query/task', name: '任务书上报查询1', component: () => import('@/views/query/task/Index.vue'), meta: { title: '任务书上报查询', icon: '', noCache: true } },
{ path: '/query/task', name: '合同书查询1', component: () => import('@/views/query/task/Index.vue'), meta: { title: '合同书查询', icon: '', noCache: true } },
{ path: '/query/check', name: '中期考核上报查询1', component: () => import('@/views/query/check/Index.vue'), meta: { title: '中期考核上报查询', icon: '', noCache: true } },
]
},
......@@ -133,7 +132,7 @@ export const routes = [
{ path: '/audit/project', name: '项目审核', component: () => import('@/views/audit/project/Index.vue'), meta: { title: '项目审核', icon: '', noCache: true } },
{ path: '/audit/preliminary', name: '项目预审', component: () => import('@/views/audit/project/Index.vue'), meta: { title: '项目预审', icon: '', noCache: true } },
{ path: '/audit/final', name: '项目终审', component: () => import('@/views/audit/project/final.vue'), meta: { title: '项目审核', icon: '', noCache: true } },
{ path: '/audit/taskAudit', name: '任务书审核', component: () => import('@/views/audit/task/Index.vue'), meta: { title: '任务书审核', icon: '', noCache: true } },
{ path: '/audit/taskAudit', name: '合同书审核', component: () => import('@/views/audit/task/Index.vue'), meta: { title: '合同书审核', icon: '', noCache: true } },
{ path: '/audit/checkAudit', name: '中期考核表审核', component: () => import('@/views/audit/check/Index.vue'), meta: { title: '中期考核表审核', icon: '', noCache: true } },
// { path: '/peAssign', name: '项目组分配', component: () => import('@/views/peAssign/index.vue'), meta: { title: '项目分配', icon: '', noCache: true } },
{ path: '/peAssign', name: '项目组分配1', component: () => import('@/views/peAssign/projAssign.vue'), meta: { title: '项目分配', icon: '', noCache: true } },
......@@ -217,7 +216,7 @@ export const routes = [
hidden: false,
children: [
{ path: '/statistic/project', name: '项目申报查询', component: () => import('@/views/statistic/project/Index.vue'), meta: { title: '项目申报查询', icon: '', noCache: true } },
{ path: '/statistic/task', name: '任务书上报查询', component: () => import('@/views/statistic/task/Index.vue'), meta: { title: '任务书上报查询', icon: '', noCache: true } },
{ path: '/statistic/task', name: '合同书上报查询', component: () => import('@/views/statistic/task/Index.vue'), meta: { title: '合同书上报查询', icon: '', noCache: true } },
{ path: '/statistic/check', name: '中期考核上报查询', component: () => import('@/views/statistic/check/Index.vue'), meta: { title: '中期考核上报查询', icon: '', noCache: true } },
{ path: '/expert/evaluationQuery', name: '评分项目查询', component: () => import('@/views/evaluation/query.vue'), meta: { title: '评分项目查询', icon: '', noCache: true } },
]
......@@ -245,7 +244,7 @@ export const routes = [
hidden: false,
children: [
{ path: '/timeSet/projectTimeSet', name: '申报时间设置', component: () => import('@/views/timeSet/projectTimeSet/Index.vue'), meta: { title: '申报时间设置', icon: '', noCache: true } },
{ path: '/timeSet/taskTimeSet', name: '任务书时间设置', component: () => import('@/views/timeSet/taskTimeSet/Index.vue'), meta: { title: '任务书时间设置', icon: '', noCache: true } },
{ path: '/timeSet/taskTimeSet', name: '合同书时间设置', component: () => import('@/views/timeSet/taskTimeSet/Index.vue'), meta: { title: '合同书时间设置', icon: '', noCache: true } },
{ path: '/timeSet/checkTimeSet', name: '中期考核时间设置', component: () => import('@/views/timeSet/checkTimeSet/Index.vue'), meta: { title: '中期考核时间设置', icon: '', noCache: true } },
{ path: '/setting/batch', name: '申报批次设置', component: () => import('@/views/timeSet/batch/Index.vue'), meta: { title: '申报批次设置', icon: '', noCache: true } },
{ path: '/setting/count', name: '申报名额配比', component: () => import('@/views/projAcountSet/projAcountSet.vue'), meta: { title: '申报名额配比管理', icon: '', noCache: true } },
......
......@@ -57,9 +57,6 @@
<a-modal v-model="visibleView" v-if="visibleView" title="项目详情" width="94%" :footer="null" :dialog-style="{ top: '8%' }" destroyOnClose :maskClosable="false">
<project-view v-model="objectId" @close="closeWindow"></project-view>
</a-modal>
<a-modal v-model="taskFileInfoView" title="项目任务书" :width="'60%'" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal">
<task-file-info v-model="selectProjId" @close="closeTaskFileInfoWindow" />
</a-modal>
</div>
</template>
......@@ -70,7 +67,6 @@ import { isEmptyParams, filterExportExcelData, tableColumnsName } from "@/views/
import audit from '@/views/audit/project/audit'
import batchAudit from '@/views/audit/project/batchAudit'
import projectView from '@/views/report/project/components/projectView'
import taskFileInfo from '@/views/report/task/components/taskFileInfo'
export default {
name: "projectAudit",
......
......@@ -79,9 +79,6 @@
<a-modal v-model="visibleView" v-if="visibleView" title="项目详情" width="94%" :footer="null" :dialog-style="{ top: '8%' }" destroyOnClose :maskClosable="false">
<project-view v-model="objectId" @close="closeWindow"></project-view>
</a-modal>
<a-modal v-model="taskFileInfoView" title="查看项目任务书" :width="'60%'" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal">
<task-file-info v-model="ProjId" @close="() => this.taskFileInfoView = false" />
</a-modal>
<a-modal v-model="visibleEvaluationView" title="专家评分" width="90%" :dialog-style="{ top: '8%' }" :footer="null" destroyOnClose>
<score-view v-model="assignId" @close="() => this.visibleEvaluationView = false" />
</a-modal>
......@@ -101,7 +98,6 @@ import audit from '@/views/audit/project/audit'
import batchAudit from '@/views/audit/project/batchAudit'
import projectView from '@/views/report/project/components/projectView'
import unitTreeSelect from '@/views/components/common/unitTreeSelect'
import taskFileInfo from '@/views/report/task/components/taskFileInfo'
import scoreView from '@/views/evaluation/components/scoreView'
export default {
......
......@@ -10,8 +10,6 @@
<a-form-item>
<a-button type="primary" icon="search" @click="search">搜索</a-button>
<a-button icon="reload" style="margin-left: 10px" @click="reset" class="bt-normal">重置</a-button>
<!-- <a-button type="primary" style="margin-left: 10px" @click="FileDownload" icon="download">项目合同书模板下载</a-button> -->
<!-- <a-button icon="primary" style="margin-left: 10px" @click="FileView">查看</a-button> -->
</a-form-item>
</a-form>
<div style="width:100%;margin-bottom: 8px;">
......@@ -19,8 +17,6 @@
<btn-group :data="tabDate" :itemCount="itemCount" v-model="activekey" @change="callback" />
</div>
<div style="display: inline-block;;width:50%;text-align: right;">
<!-- <a-button type="primary" @click="projectKPI" icon="download">绩效指标表</a-button> -->
<!-- <a-button type="primary" @click="createMember">新建项目组成员</a-button> -->
<a-button type="primary" style="margin-right:8px;" v-if="(display && isButten)" @click="createProject">新建项目</a-button>
<a-button type="primary" @click="exportData" icon="download">Excel</a-button>
</div>
......@@ -56,9 +52,6 @@
<a-modal v-model="visibleFileView" title="查看" width="1000px" :dialog-style="{ top: '10%' }" :footer="null" destroyOnClose :maskClosable="false">
<preview-file v-model="realurl.downloadUrl" :fileName="realurl.fileName"></preview-file>
</a-modal>
<a-modal v-model="projectKPIView" title="查看项目KPI" width="80%" :dialog-style="{ top: '10%' }" :footer="null" destroyOnClose :maskClosable="false">
<project-kpi></project-kpi>
</a-modal>
<a-modal v-model="visiblePersonEdit" v-if="visiblePersonEdit" title="请先完善个人信息!" width="700px" :dialog-style="{ top: '12%' }" :footer="null" destroyOnClose :maskClosable="false">
<person-info-edit @sub="personSave" />
</a-modal>
......
<template>
<div class="app-content">
<a-tabs :tab-position="'top'" v-model="activeTab" @change="callback">
<a-tab-pane key="1" :tab="'未上报任务书('+panes.count1+')'">
</a-tab-pane>
<a-tab-pane key="2" :tab="'返回修改任务书('+panes.count2+')'">
</a-tab-pane>
<a-tab-pane key="3" :tab="'已上报任务书('+panes.count3+')'">
</a-tab-pane>
<a-tab-pane key="4" :tab="'所有任务书('+panes.count4+')'">
</a-tab-pane>
</a-tabs>
<a-form layout="horizontal" :form="form" :model="searchForm">
<a-row :gutter="30">
<a-col :span="8">
<a-form-item label="项目名称">
<a-input placeholder="项目名称" v-model="searchForm.projName" :maxLength="100" style="width: 272px" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="项目编号">
<a-input placeholder="项目编号" v-model="searchForm.projNo" :maxLength="100" style="width: 272px" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item>
<a-button type="primary" icon="search" @click="searchList">搜索</a-button>
<a-button icon="reload" style="margin-left: 10px" @click="searchFormReset" class="bt-normal">重置</a-button>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="30">
<a-form-item>
<a-button type="primary" style="margin-right:8px;" v-if="(display&&isButten)" @click="createTaskBook">填写任务书</a-button>
<a-button type="primary" @click="exportData">导出Excel</a-button>
<span :style="{color:'#DC143C'}"> 填报时间:{{description}}</span>
</a-form-item>
</a-col>
</a-row>
<a-form :form="form" :model="searchForm" layout="inline" class="search_form">
<a-form-item>
<a-input placeholder="项目名称" v-model="searchForm.projName" :maxLength="100" style="width: 180px" />
</a-form-item>
<a-form-item>
<a-input placeholder="项目编号" v-model="searchForm.projNo" :maxLength="100" style="width: 180px" />
</a-form-item>
<a-form-item>
<a-button type="primary" icon="search" @click="search">搜索</a-button>
<a-button icon="reload" style="margin-left: 10px" @click="reset" class="bt-normal">重置</a-button>
</a-form-item>
</a-form>
<div style="width:100%;margin-bottom: 8px;">
<div style="display: inline-block;;width:50%">
<btn-group :data="tabDate" :itemCount="itemCount" v-model="activekey" @change="callback" />
</div>
<div style="display: inline-block;;width:50%;text-align: right;">
<a-button type="primary" style="margin-right:8px;" v-if="isButten" @click="createProject">新建项目</a-button>
<a-button type="primary" @click="exportData" icon="download">Excel</a-button>
</div>
</div>
<a-divider style="height: 1px; background-color: #e8e8e8;" />
<span class="form-description"> ※填报时间:{{ description }}</span>
<a-table :dataSource="tableData" :columns="columns" rowKey="projId" :pagination="false" :loading="loading" :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type: 'radio' }">
<template slot="testStateName" slot-scope="record">
<span v-if="record">
......@@ -55,10 +39,10 @@
</template>
</a-table>
<a-pagination v-if="pagination.total > 0" :total="pagination.total" show-size-changer show-quick-jumper v-model="pagination.pageIndex" :page-size="pagination.pageSize" :page-size-options="pagination.pageSizeOptions" @showSizeChange="showSizeChange" @change="change" :showTotal="() => `共 ${pagination.total} 条`" />
<a-modal v-model="visibleEdit" :title="modalTitle" :width="'80%'" :dialog-style="{ top: '5%' }" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal" :centered="true">
<a-modal v-model="visibleEdit" :title="'创建/修改'" :width="'80%'" :dialog-style="{ top: '5%' }" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal" :centered="true">
<test-edit v-model="selectProjId" @close="closeWindow" />
</a-modal>
<a-modal v-model="visibleView" title="查看任务书" :width="'80%'" :dialog-style="{ top: '5%' }" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal">
<a-modal v-model="visibleView" title="查看合同书" :width="'80%'" :dialog-style="{ top: '5%' }" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal">
<test-view v-model="selectProjId" @close="closeWindow" />
</a-modal>
</div>
......@@ -89,30 +73,30 @@ export default {
data () {
return {
// 选项卡
activeTab: '1',
panes: { count1: 0, count2: 0, count3: 0, count4: 0, count5: 0, },
activekey: '1',
tabDate: [
{ key: "1", tab: "未上报" },
{ key: "2", tab: "返回修改" },
{ key: "3", tab: "已上报" },
{ key: "4", tab: "所有" },
],
itemCount: [0, 0, 0, 0, 0],
form: this.$form.createForm(this, { name: 'advanced_search' }),
searchForm: { projName: '', projNo: '', testState: '1', reportYear: null },
tableData: [],
columns: [],
pagination: {
pageIndex: 1,
pageSize: this.$defaultPageSize,
total: 0,
pageSizeOptions: this.$defaultPageSizeOptions,
},
pagination: { pageIndex: 1, pageSize: this.$defaultPageSize, total: 0, pageSizeOptions: this.$defaultPageSizeOptions, },
loading: false,
// 弹窗
visibleEdit: false,
visibleView: false,
modalTitle: '',
selectProjId: null,
selectTaskId: null,
selectedRowKeys: [],
selectTestState: null,
id: null,
isButten: false,
display: false,
description: ''
description: '',
}
},
components: {
......@@ -140,12 +124,7 @@ export default {
this.getCount()
this.loading = true
let pars = isEmptyParams(this.searchForm)
let par = {
...pars,
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize
}
let par = { ...pars, pageIndex: this.pagination.pageIndex, pageSize: this.pagination.pageSize }
this.$api.taskReport.getListByPage(par).then(({ data = {} }) => {
if (data) {
const { dataList = [], total = 0 } = data
......@@ -163,27 +142,17 @@ export default {
if (data) {
this.panes = data
}
}).catch(() => {
})
},
searchFormReset () {
this.searchForm = {
projName: '',
projNo: '',
}
}).catch(() => { })
},
searchList () {
search () {
this.pagination.pageIndex = 1
this.getListByPage()
},
onSelectChange (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectProjId = selectedRows[0].projId
this.selectTaskId = selectedRows[0].id
this.selectTestState = selectedRows[0].testState
},
submitForm () {
reset () {
this.searchForm.projName = null
this.searchForm.projNo = null
this.pagination.pageIndex = 1
this.getListByPage()
},
change () {
this.getListByPage()
......@@ -193,6 +162,12 @@ export default {
this.pagination.pageSize = pageSize
this.getListByPage()
},
onSelectChange (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectProjId = selectedRows[0].projId
this.selectTaskId = selectedRows[0].id
this.selectTestState = selectedRows[0].testState
},
createTaskBook () {
if (this.selectProjId == null) {
this.$message.error('请选择项目')
......@@ -202,8 +177,6 @@ export default {
this.$message.error('任务书已创建')
return
}
this.modalTitle = '创建任务书'
this.selectTaskId = ''
this.visibleEdit = true
},
......@@ -213,7 +186,6 @@ export default {
this.selectTaskId = record.id
this.visibleView = true
} else if (type === 'edit') {
this.modalTitle = '修改任务书'
this.selectProjId = record.projId
this.visibleEdit = true
} else {
......@@ -245,36 +217,6 @@ export default {
}
},
watch: {
activeTab: {
handler (value) {
if (value === '1') {
this.display = true;
this.columns = columns.filter(e => e.tabKey !== '1')
return
}
this.display = false;
this.columns = columns.filter(e => e.tabKey !== '2')
},
immediate: true
}
}
}
</script>
<style scoped lang="less">
.app-content {
border: 1px solid #e8e8e8;
padding: 0px 10px 10px 10px;
}
.ant-form-item {
display: flex !important;
}
.ant-form-item-control-wrapper {
flex: 1 !important;
width: 100% !important;
}
.ant-pagination {
float: inherit !important;
margin-top: 15px;
}
</style>
\ No newline at end of file
<template>
<div class="app-content" style="height: 76vh;overflow: auto;">
<a-spin :spinning="loading" style="width: 100%;height: 100%;">
<div class="page-steps">
<a-steps size="small" :current="current" @change="onChange">
<a-step :status="item.status" v-for="(item,index) in stepsArray" :key="index+'stepsArray'" :title="item.title" />
</a-steps>
</div>
<div class="page-content">
<project-edit v-model="value" @close="closeWindow" @load="onLoad" @onStepChange="onStepChange" :completeStatus.sync=completeStatus :stepsArray.sync="stepsArray" ref="projCreate"></project-edit>
</div>
<div class="page-footer">
<a-button v-if="currSteps > 0" style="margin-left: 40px" type="primary" @click="prev">上一步</a-button>
<a-button style="margin-left: 40px" type="primary" @click="save">保 存</a-button>
<a-button v-if="currSteps < stepsArray.length - 1" style="margin-left: 40px" type="primary" @click="next">下一步</a-button>
<a-button v-if="currSteps == stepsArray.length - 1" style="margin-left: 40px" type="primary" @click="submit">完成填写</a-button>
</div>
</a-spin>
</div>
</template>
<script>
import { getType } from '@/views/utils/auth'
import projectEdit from "@/views/report/project/components/edit/projectEdit"
import projectEditKey from "@/views/report/project/components/keyProject/projectEdit"
export default {
name: "projectCreate",
components: {
projectEdit, projectEditKey,
},
data () {
return {
loading: false,
projType: getType() == "1",
current: 10,
currSteps: 0,
stepsArray: [
{ status: "process", title: '基本信息', showStatus: true },
{ status: "wait", title: '项目组成员及单位', showStatus: false },
{ status: "wait", title: '经费预算及设备明细', showStatus: false },
{ status: "wait", title: '阶段目标及课题设置', showStatus: false },
{ status: "wait", title: '绩效指标', showStatus: false },
{ status: "wait", title: '附件', showStatus: false }
],
completeStatus: "0,0,0,0,0,0"
}
},
props: {
value: {
type: String,
default: () => {
return null
}
},
},
created () {
},
methods: {
stepsChange (e) {
debugger
this.currSteps = e
this.changeSteps(this.currSteps)
},
next () {
this.$refs.projCreate.submit(this.currSteps, true)
},
prev () {
this.currSteps--;
this.changeSteps(this.currSteps)
},
onChange (e) {
if (e != this.currSteps) {
var arr = this.completeStatus.split(',')
if (arr[e] == "1") {
this.loading = true
this.changeSteps(e)
this.loading = false
} else {
this.$message.error('所选步骤没填写完成,请填写当前步骤后点【下一步】跳转!')
}
}
},
onStepChange (e) {
this.completeStatus = e.state
this.changeSteps(e.step)
},
changeSteps (e) {
this.currSteps = e
var clone = [].concat(this.stepsArray)
clone.forEach(e => {
e.showStatus = false
})
clone[e].showStatus = true;
this.stepsArray = clone
this.getCompleteStatus(e, this.completeStatus)
},
getCompleteStatus (step, completeStatus) {
var arr = completeStatus.split(',')
if (!!arr && arr.length > 0) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == "1") {
this.stepsArray[i].status = "finish"
} else {
this.stepsArray[i].status = "wait"
}
}
this.stepsArray[step].status = "process"
}
},
save () {
this.$refs.projCreate.save(this.currSteps)
},
submit () {
this.$refs.projCreate.submit(this.currSteps, false)
},
closeWindow (value) {
this.$emit('close', value)
},
onLoad (value) {
this.loading = value
},
},
}
</script>
<style scoped lang="less">
::v-deep .ant-spin-container {
width: 100%;
height: 100%;
}
::-webkit-scrollbar {
width: 8px;
height: 6px;
}
.page-steps {
width: 100%;
height: 40px;
padding: 8px 20px 5px 20px;
background: rgb(248, 248, 248);
border: 1px 1px 0px 1px solid #e8e8e8;
}
.page-content {
width: 100%;
height: calc(100% - 80px);
overflow: auto;
}
.page-footer {
width: 100%;
height: 40px;
line-height: 40px;
background: rgb(248, 248, 248);
text-align: center;
}
</style>
<template>
<div class="from-table font-line-space">
<a-spin :spinning="loading" style="width: 100%;height: 100%;">
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目编号</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.projNo}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目名称</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.projName}}</div>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报人</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.personName}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报单位</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.appUnitName}}</div>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报年度</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.reportYear}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目开始结束时间</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{moment(projectInfo.startDate).format('YYYY-MM-DD')}}{{moment(projectInfo.endDate).format('YYYY-MM-DD')}}</div>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<div class="tb-title">
附件上传
</div>
</a-col>
</a-row>
<a-row type="flex" class="row_center">
<a-col :span="8" class="bg-gray">
<div class="special-middle">
<div>附件名称</div>
</div>
</a-col>
<a-col :span="10" class="bg-gray">
<div class="special-middle">
<div>附件上传</div>
</div>
</a-col>
<a-col :span="6" class="bg-gray">
<div class="special-middle">
<div>说明</div>
</div>
</a-col>
</a-row>
<a-row v-for="(item, index) in projectInfo.fileList" :key="'fileList' + index" type="flex">
<a-col :span="8" style="text-align: center; margin-top: 10px;">
<span class="required"></span>{{ item.fileExplain }}
<!-- <a-form-model-item :prop="'fileList.' + index + '.fileExplain'" :rules="{required: true, message: '*',trigger: 'blur',}">
<a-input v-model="item.fileExplain" :maxLength="100" style="width: 80%" :disabled="item.required" />
</a-form-model-item> -->
</a-col>
<a-col :span="10">
<div class="special-middle">
<div v-if="item.downloadUrl" class="file-box">
<div>
<!-- <a-icon type="file" style="margin-right: 8px" />
<span class="hover-pointer" @click="downloadfile(item)">{{item.fileName}}</span> -->
<document-view :fileUrl="item.downloadUrl" :fileName="item.fileName" :imageArray="[item.downloadUrl]"></document-view>
</div>
<a-icon type="delete" class="hover-pointer d-icon" @click="deleteTaskFile(item, index)" />
</div>
<div v-else>
<a-form-model-item :prop="'fileList.' + index + '.downloadUrl'" :rules="{required: true, message: '请上传附件',trigger: 'blur',}">
<input type="file" :ref="'fileElem' + index" class="visually-hidden" @change="handleFiles(item, index)" />
<a-button @click="fileSelect(item, index)"><a-icon type="upload" />选择文件</a-button>
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="6">
<div class="special-middle">
<span style="margin-left: 10px; font-size: 10pt; color:red; font-weight: bold;">请上传项目任务书附件(文件类型必须为:pdf),文件大小不能超过{{fileSize}}M!</span>
</div>
</a-col>
</a-row>
</a-spin>
</div>
</template>
<script>
import moment from 'moment'
import documentView from '@/views/components/common/documentView'
const File = { fileName: "", downloadUrl: "", fileExplain: "项目任务书", downloadId: "" };
export default {
name: "taskFileEdit",
props: {
value: {
type: String,
default: () => {
return null
}
},
},
components: { documentView },
data() {
return {
projectInfo: {
projNo: '',
projName: '',
startDate: '',
endDate: '',
appPersonName: '',
appUnitName: '',
mobile: '',
address: '',
fileList: [{ ...File }],
},
fileSize: 15,
};
},
created () {
this.getProjectBasicInfoById()
},
methods: {
moment,
getProjectBasicInfoById () {
if (this.value != null) {
this.loading = true
this.$api.project.getProjectBasicInfoById({ id: this.value }).then(({ data = {} }) => {
if (data) {
this.projectInfo = data
if (this.projectInfo.fileList == null || this.projectInfo.fileList.length <= 0)
this.projectInfo.fileList = [{ ...File }]
this.loading = false
}
}).catch(() => { this.$emit('close', 'close') })
}
},
downloadfile() {
},
deleteTaskFile (item, index) {
this.$api.taskReport.deleteTaskFile({ id: item.downloadId }).then(({ data = {} }) => {
if (data) {
item.fileName = ''
item.downloadUrl = ''
item.downloadId = ''
}
}).catch(() => {
this.$message.error('删除失败')
})
},
uploadHandle (file, fileName, projId) {
let formData = new FormData()
formData.append('file', file)
formData.append('fileName', fileName)
formData.append('projId', projId)
return formData
},
handleFiles(item, index) {
let fileElem = this.$refs['fileElem' + index][0]
let files = fileElem.files
if (files.length <= 0) {
this.$message.error('未选中文件,请尝试重新选择')
return
}
if (!this.fileCheck(files[0]))
return
this.$api.taskReport.asyncUploadTaskFile(this.uploadHandle(files[0], files[0].name, this.value)).then(({ data = {} }) => {
if (data) {
item.fileName = data.fileName
item.downloadUrl = data.downloadUrl
item.downloadId = data.id
item.fileExplain = data.fileExplain
} else
this.$message.error('上传失败')
}).catch(() => {
this.$message.error('上传失败')
})
},
fileSelect (item, index) {
let fileElem = this.$refs['fileElem' + index][0]
if (fileElem) {
fileElem.click()
}
},
fileCheck (file) {
//判断是否小于1M
let isLtSize = file.size < 1024 * 1024 * this.fileSize;
if (!isLtSize) {
this.$message.error('文件大小不能超过' + this.fileSize + 'M!');
return false
}
if (file.type !== "application/pdf") {
this.$message.error('项目任务书附件必须为pdf文件类型!');
return false
}
return true
},
}
};
</script>
\ No newline at end of file
<template>
<div class="from-table font-line-space">
<a-spin :spinning="loading" style="width: 100%;height: 100%;">
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目编号</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.projNo}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目名称</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.projName}}</div>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报人</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.personName}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报单位</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.appUnitName}}</div>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>申报年度</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{projectInfo.reportYear}}</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>项目开始结束时间</div>
</div>
</a-col>
<a-col :span="8">
<div class="special-middle">
<div>{{moment(projectInfo.startDate).format('YYYY-MM-DD')}}{{moment(projectInfo.endDate).format('YYYY-MM-DD')}}</div>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<div class="tb-title">
附件
</div>
</a-col>
</a-row>
<a-row type="flex" class="row_center">
<a-col :span="8" class="bg-gray">
<div class="special-middle">
<div>附件名称</div>
</div>
</a-col>
<a-col :span="16" class="bg-gray">
<div class="special-middle">
<div>附件文件</div>
</div>
</a-col>
</a-row>
<a-row v-for="(item, index) in projectInfo.fileList" :key="'fileList' + index" type="flex">
<a-col :span="8" style="text-align: center; margin-top: 10px;">
<span>{{ item.fileExplain }}</span>
</a-col>
<a-col :span="16">
<div class="special-middle">
<div v-if="item.downloadUrl" class="file-box">
<div>
<document-view :fileUrl="item.downloadUrl" :fileName="item.fileName" :imageArray="[item.downloadUrl]"></document-view>
</div>
</div>
<div v-else style="text-align: center;"></div>
</div>
</a-col>
</a-row>
</a-spin>
</div>
</template>
<script>
import moment from 'moment'
import documentView from '@/views/components/common/documentView'
const File = { fileName: "", downloadUrl: "", fileExplain: "项目任务书", downloadId: "" };
export default {
name: "taskFileEdit",
props: {
value: {
type: String,
default: () => {
return null
}
},
},
components: { documentView },
data() {
return {
projectInfo: {
projNo: '',
projName: '',
startDate: '',
endDate: '',
appPersonName: '',
appUnitName: '',
mobile: '',
address: '',
fileList: [{ ...File }],
},
fileSize: 15,
};
},
created () {
this.getProjectBasicInfoById()
},
methods: {
moment,
getProjectBasicInfoById () {
if (this.value != null) {
this.loading = true
this.$api.project.getProjectBasicInfoById({ id: this.value }).then(({ data = {} }) => {
if (data) {
this.projectInfo = data
if (this.projectInfo.fileList == null || this.projectInfo.fileList.length <= 0)
this.projectInfo.fileList = [{ ...File }]
this.loading = false
}
}).catch(() => {this.loading = false})//() => { this.$emit('close', 'close') }
}
},
}
};
</script>
\ No newline at end of file
<template>
<div class="report-detail">
<!-- <a-button type="primary">导出任务书</a-button> -->
<div style="margin-top: 16px;">
<test-info v-model="testInfo" />
</div>
<div class="app-content layoutEmbedded" style="height: 76vh;overflow: auto;">
<a-spin :spinning="loading" style="width: 100%;height: 100%;">
<div class="page-content">
<a-tabs type="card" hideAdd size="small" @change="callback">
<a-tab-pane :key="item.key" :tab="item.title" v-for="(item) in tabsData">
</a-tab-pane>
</a-tabs>
</div>
<div class="page-footer">
<!-- 申报项目详情 -->
<!-- <a-button type="primary" @click="onExport">导出</a-button> -->
<project-info v-model="formData" :tabsData.sync="tabsData" v-if="projType=='1'" />
<project-info-Key v-model="formData" :tabsData.sync="tabsData" v-if="projType=='2'" />
</div>
</a-spin>
</div>
</template>
<script>
import { isEmptyParams } from "@/views/utils/common"
import TestInfo from '@/views/report/task/components/taskInfo'
import AuditList from '@/views/audit/components/auditInfo'
const cont1 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'd37abeb6-14e0-4486-924d-e1e4baf67098', showIndex: 1 } }
const cont2 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'b1fe4003-16ed-482f-8fd5-e34b1482c3d4', showIndex: 1 } }
const cont3 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'b19cf66b-c1bb-4974-a524-114c1895dbd8', showIndex: 1 } }
const cont4 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'cf3abeff-9f1a-420e-b375-6aad33f12080', showIndex: 1 } }
const cont5 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'f1cea24c-d13d-48af-8abb-58eed9367c27', showIndex: 1 } }
const cont6 = () => { return { id: null, testId: null, contentInfo: '', startTime: null, endTime: null, contentType: 'ebcdf2b0-011c-4d40-a064-f22d6f7ec646', showIndex: 1 } }
const projectKPI = {
reportYear: "",
projName: "",
appUnitName: "",
managerDept: "",
projAttribute: "",
projDeadline: "",
startDate: "",
endData: "",
yearTarget: "",
year1Goal: "",
year2Goal: "",
year3Goal: "",
totalBudget: 0.00,
applyFunds: 0.00,
selfFunds: 0.00,
yearTotal: 0.00,
yearApply: 0.00,
yearSelf: 0.00,
totalRowSpan: 0, //总合并行数
outTarget: 0, //一级指标(产出指标)
benefitTarget: 0, //一级指标(效益指标)
satisfactionDegree: 0, //一级指标(满意度指标)
quantityTarget: 0, //二级指标(数量指标)
qualityTarget: 0, //二级指标(质量指标)
validityTarget: 0, //二级指标(时效指标)
costTarget: 0, //二级指标(成本指标)
economicTarget: 0, //二级指标(经济效益指标)
socialTarget: 0, //二级指标(社会效益指标)
ecologicalTarget: 0, //二级指标(生态效益指标)
sustainableTarget: 0, //二级指标(可持续影响指标)
serviceTarget: 0, //二级指标(服务对象满意度指标)
threeLevel: [],
kpiList: [],
};
import { budgetList } from '@/views/report/project/config'
import { getType } from '@/views/utils/auth'
import projectInfo from '@/views/report/project/components/projectInfo'
import projectInfoKey from "@/views/report/project/components/keyProject/projectInfo"
export default {
name: "TestView",
name: "projectView",
components: {
TestInfo, AuditList
projectInfo, projectInfoKey
},
data () {
return {
testInfo: {
id: '',
projId: '',
projName: '',
startDate: null,
endDate: null,
appUnitName: '',
linkTel: '',
linkAddress: '',
linkEmail: '',
// 实施目标和主要内容
testContent: '',
// 总经费
budgetCount: 0,
// 市卫计委资助
budgetGovCount: 0,
// 起止日期
startDate: null,
endDate: null,
// 申报人
tabsData: [
{ title: '全部', key: '0', isShow: true },
{ title: '项目基本信息', key: '1', isShow: true },
{ title: '项目组主要成员', key: '2', isShow: true },
{ title: '项目主要实施内容和目标', key: '3', isShow: true },
{ title: '申请书正文', key: '4', isShow: true },
{ title: '经费预算及设备明细', key: '5', isShow: true },
{ title: '项目实施阶段及任务', key: '6', isShow: true },
{ title: '项目课题设置', key: '7', isShow: true },
{ title: '绩效目标表', key: '8', isShow: true },
{ title: '附件信息', key: '9', isShow: true },
{ title: '项目审核记录', key: '10', isShow: true },
],
formData: {
id: null,
appPersonName: null,
sex: null,
birthYear: null,
mobile: null,
birthday: null,
nationName: null,
degreeName: null,
titleName: null,
// 依托单位
mobile: null,
email: null,
jobTime: null,
address: null,
appUnitName: null,
linkEmail: null,
linkTel: null,
linkAddress: null,
postcode: null,
authority: null,
// 项目内容
cont1: [cont1()],
cont2: [cont2()],
cont3: [cont3()],
cont4: [cont4()],
cont5: [cont5()],
cont6: [cont6()],
// 成员
mainResearchAreas: null,
unitLinkName: null,
unitLinkMobile: null,
unitLinkEmail: null,
unitLinkFax: null,
projName: null,
knowledgeId: null,
subjectScope: null,
projClass: null,
remark: null,
startDate: null,
endDate: null,
totalFunding: null,
govFunding: null,
projAbstract: null,
projKeywords: null,
yearTarget: null,
year1Goal: null,
year2Goal: null,
year3Goal: null,
projectKPI: projectKPI,
cooperativeUnits: [],
members: [],
// 预期成果形式
target: [],
// 经费
budget: [],
//审核记录
auditList: [{ result: '', unit: '', time: '' }],
}
}
fundPlan: [],
fileList: [],
auditList: [],
managerDept: "",
},
loading: false,
projType: getType()
};
},
props: {
value: {
......@@ -85,26 +133,69 @@ export default {
},
},
created () {
this.getTestInfoByProjId()
this.getProjectInfoById()
},
methods: {
getTestInfoByProjId () {
let pars = { projId: this.value }
this.$api.taskReport.getTestInfoByProjId(pars).then(({ data = {} }) => {
if (data) {
this.testInfo = data
}
}).catch(() => {
getProjectInfoById () {
if (this.value != null) {
this.loading = true
this.$api.project.getProjectInfoById({ id: this.value }).then(({ data = {} }) => {
if (data) {
this.formData = data
this.loading = false
} else
this.$emit('close', 'error')
}).catch(() => { this.$emit('close', 'error') })
}
},
onExport () {
this.$api.project.export({ id: this.value }).then((res) => {
let blob = new Blob([res], {
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8",
});
const fileName = this.formData.projName + '.doc';
let downloadElement = document.createElement('a')
let href = window.URL.createObjectURL(blob); //创建下载的链接
downloadElement.href = href;
downloadElement.download = fileName; //下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放blob
})
},
callback (key) {
var index = parseInt(key)
this.tabsData.forEach(e => {
if (key == '0')
e.isShow = true
else
e.isShow = false
})
}
}
this.tabsData[0].isShow = true;
this.tabsData[index].isShow = true;
},
},
}
</script>
<style lang="less" scoped>
.report-detail {
height: 70vh;
<style scoped lang="less">
::v-deep .ant-spin-container {
width: 100%;
height: 100%;
}
::-webkit-scrollbar {
width: 8px;
height: 6px;
}
.page-content {
width: 100%;
height: 50px;
}
.page-footer {
width: 100%;
height: calc(100% - 50px);
overflow: auto;
border-left: 1px solid #f0f0f0;
border-top: 1px solid #f0f0f0;
}
</style>
\ No newline at end of file
</style>
<template>
<div class="app-content">
<a-form layout="inline" :form="form" :model="searchForm">
<a-form-item>
<a-input placeholder="项目名称" v-model="searchForm.projName" :maxLength="100" style="width: 160px" />
</a-form-item>
<a-form-item>
<a-input placeholder="项目编号" v-model="searchForm.projNo" :maxLength="100" style="width: 160px" />
</a-form-item>
<a-form-item>
<base-select v-model="searchForm.reportYear" :title="'年度'" :type="7" :isAll="true" :width="160" />
</a-form-item>
<a-form-item>
<a-button type="primary" icon="search" @click="searchList">搜索</a-button>
<a-button icon="reload" style="margin-left: 10px" @click="searchFormReset" class="bt-normal">重置</a-button>
<a-button type="primary" style="margin-left: 10px" @click="FileDownload" icon="download">项目任务书模板下载</a-button>
</a-form-item>
<div style="width:100%;margin-bottom: 8px;">
<a-button type="primary" @click="exportData">导出Excel</a-button>
</div>
</a-form>
<a-table :dataSource="tableData" :columns="columns" rowKey="projId" :pagination="false" :loading="loading"> <!-- :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type: 'radio' }" -->
<template slot="projName" slot-scope="record">
<a @click="recordClick(record, 'viewProject')">{{record.projName}}</a>
</template>
<template slot="testStateName" slot-scope="record">
<span v-if="record">{{record}}</span>
<span v-else>未填写</span>
</template>
<template slot="option" slot-scope="record">
<a-button type="primary" size="small" v-if="((!record.testState||record.testState==1))" @click="recordClick(record,'UploadProjTask')">上传项目任务书</a-button>
</template>
</a-table>
<a-pagination v-if="pagination.total > 0" :total="pagination.total" show-size-changer show-quick-jumper v-model="pagination.pageIndex" :page-size="pagination.pageSize" :page-size-options="pagination.pageSizeOptions" @showSizeChange="showSizeChange" @change="change" :showTotal="() => `共 ${pagination.total} 条`" />
<a-modal v-model="taskFileEditView" title="上传项目任务书" :width="'60%'" :maskClosable="false" :footer="null" destroyOnClose class="sc_modal">
<task-file-edit v-model="selectProjId" @close="closeTaskFileEditWindow" />
</a-modal>
<a-modal v-model="visibleView" v-if="visibleView" title="项目详情" width="94%" :footer="null" :dialog-style="{ top: '8%' }" destroyOnClose :maskClosable="false">
<project-view v-model="selectProjId" @close="() => this.visibleView = false" />
</a-modal>
</div>
</template>
<script>
import { isEmptyParams, filterExportExcelData, tableColumnsName, } from "@/views/utils/common";
import { getType } from '@/views/utils/auth'
import baseSelect from '@/views/components/common/baseSelect'
import taskFileEdit from '@/views/report/task/components/taskFileEdit'
import projectView from '@/views/report/project/components/projectView'
import moment from 'moment'
import axios from 'axios'
const columns = [
{ title: "项目名称", scopedSlots: { customRender: 'projName' } },
{ title: "项目编号", dataIndex: "projNo" },
{ title: "项目开始时间", dataIndex: "projStart", tabKey: "2" },
{ title: "项目结束时间", dataIndex: "projEnd", tabKey: "2" },
{ title: "申报年度", dataIndex: "reportYear" },
//{ title: "状态", dataIndex: "testStateName", scopedSlots: { customRender: "testStateName" }, },
{ title: "操作", fixed: "right", width: "200px", scopedSlots: { customRender: "option" }, align: 'center' },
];
export default {
name: "projectTask",
components: { baseSelect, taskFileEdit, projectView, },
data() {
return {
form: this.$form.createForm(this, { name: 'advanced_search' }),
searchForm: { projName: '', projNo: '', testState: '5', reportYear: null },
tableData: [],
columns: columns,
pagination: {
pageIndex: 1,
pageSize: this.$defaultPageSize,
total: 0,
pageSizeOptions: this.$defaultPageSizeOptions,
},
selectedRowKeys: [],
loading: false,
taskFileEditView: false,
selectProjId: null,
//selectTaskId: null,
//selectTestState: null,
visibleView: false,
id: null,
url1: {
downloadUrl: '/downloadFile/202408091430.doc',
fileName: '项目任务书模板.doc',
},
url2: {
downloadUrl: '/downloadFile/202408091430.doc',
fileName: '公立医院高水平临床专科发展科技项目任务书.doc',
},
realurl: null,
};
},
created () {
this.getYear()
if (getType() == 1)
this.realurl = this.url1
else
this.realurl = this.url2
},
methods: {
getYear () {
this.$api.batch.getCurrentYearBatch({ type: 1, projType: getType() }).then(({ data = {} }) => {
if (data) {
this.searchForm.reportYear = data.year
this.getListByPage()
}
}).catch(() => { })
},
getListByPage () {
this.loading = true
let pars = isEmptyParams(this.searchForm)
let par = {
...pars,
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize
}
this.$api.taskReport.getListByPage(par).then(({ data = {} }) => {
if (data) {
const { dataList = [], total = 0 } = data
this.tableData = dataList
this.pagination.total = total
this.loading = false
this.tableData.forEach(e => {
if (e.projStart) {
e.projStart = moment(e.projStart).format('YYYY-MM-DD')
e.projEnd = moment(e.projEnd).format('YYYY-MM-DD')
}
})
}
}).catch(() => {
this.loading = false
})
},
searchList () {
this.getListByPage()
},
change () {
this.getListByPage()
},
showSizeChange (current, pageSize) {
this.pagination.pageIndex = current
this.pagination.pageSize = pageSize
this.getListByPage()
},
onSelectChange (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectProjId = selectedRows[0].projId
// this.selectTaskId = selectedRows[0].id
// this.selectTestState = selectedRows[0].testState
},
searchFormReset () {
this.searchForm = {
projName: '',
projNo: '',
testState: '5',
reportYear: moment().year(),
}
},
recordClick (record, type) {
if (type === 'UploadProjTask') {
this.selectProjId = record.projId
this.taskFileEditView = true
}
if (type === 'viewProject') {
this.selectProjId = record.projId
this.visibleView = true
}
},
closeTaskFileEditWindow() {
this.taskFileEditView = false
},
exportData () {
this.$ToDoExcel(`任务书列表`, tableColumnsName(this.columns), filterExportExcelData(this.columns, this.tableData))
},
FileDownload () {
axios({
url: this.realurl.downloadUrl, // 替换为实际文件的URL
method: 'GET',
responseType: 'blob' // 告诉axios返回的数据类型为Blob
}).then(response => {
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.href = url
link.setAttribute('download', this.realurl.fileName) // 下载文件的名称
document.body.appendChild(link)
link.click()
})
},
}
};
</script>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment