Commit 72364ed3 authored by wangxl's avatar wangxl

5555

parent 489aaf03
...@@ -102,7 +102,7 @@ export const routes = [ ...@@ -102,7 +102,7 @@ export const routes = [
meta: { title: '个人中心', icon: 'el-icon-user' }, meta: { title: '个人中心', icon: 'el-icon-user' },
hidden: false, hidden: false,
children: [ children: [
{ path: '/report/project', name: '项目申报', component: () => import('@/views/report/project/Index.vue'), meta: { title: '项目申报', icon: '', noCache: true } }, { path: '/report/project', name: '项目申报', component: () => import('@/views/report/project/index1.vue'), meta: { title: '项目申报', icon: '', noCache: true } },
{ path: '/report/task', name: '任务书填报', component: () => import('@/views/report/task/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/projectTask', name: '任务书填报', component: () => import('@/views/report/task/projectTask.vue'), meta: { title: '项目任务书', icon: '', noCache: true } }, { path: '/report/projectTask', name: '任务书填报', component: () => import('@/views/report/task/projectTask.vue'), meta: { title: '项目任务书', icon: '', noCache: true } },
{ path: '/report/check', name: '中期考核填报', component: () => import('@/views/report/check/Index.vue'), meta: { title: '中期考核填报', icon: '', noCache: true } }, { path: '/report/check', name: '中期考核填报', component: () => import('@/views/report/check/Index.vue'), meta: { title: '中期考核填报', icon: '', noCache: true } },
......
<template>
<div>
<a-row>
<a-col :span="24">
<div class="tb-title">
<span>项目主要参与单位及分工</span>
</div>
</a-col>
</a-row>
<a-row type="flex" class="item_inner">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">单位名称</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">单位国别</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">单位国别</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">组织机构代码/统社会信用代码</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">分 工</div>
</div>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div>操作</div>
</div>
</a-col>
</a-row>
<a-row v-for="(item, index) in cooperativeUnits" :key="'cooperativeUnits'+index" type="flex" class="item_inner">
<a-col :span="4">
<div class="special-middle">
<div>
<a-form-model-item :prop="'cooperativeUnits.' + index + '.unitName'" :rules="{ required: true,message: '*',trigger: 'blur',}">
<a-input v-model="item.unitName" :maxLength="20" placeholder="单位名称" style="width: 80%" />
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="4">
<div class="special-middle">
<div>
<a-form-model-item :prop="'cooperativeUnits.' + index + '.unitCountry'" :rules="{ required: true,message: '*',trigger: 'blur',}">
<a-input v-model="item.unitCountry" :maxLength="20" placeholder="单位名称" style="width: 80%" />
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="4">
<div class="special-middle">
<div>
<a-form-model-item :prop="'cooperativeUnits.' + index + '.unitAddress'" :rules="{ required: true,message: '*',trigger: 'blur',}">
<a-input v-model="item.unitAddress" :maxLength="100" placeholder="单位国别" style="width: 80%" />
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="4">
<div class="special-middle">
<div>
<a-form-model-item :prop="'cooperativeUnits.' + index + '.organizationCode'" :rules="{ required: true,message: '*',trigger: 'blur',}">
<a-input v-model="item.organizationCode" :maxLength="50" placeholder="组织机构代码/统社会信用代码" style="width: 80%" />
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="4">
<div class="special-middle">
<div>
<a-form-model-item :prop="'cooperativeUnits.' + index + '.projectWork'" :rules="{ required: true,message: '*',trigger: 'blur',}">
<a-input v-model="item.projectWork" :maxLength="50" placeholder="分 工" style="width: 80%" />
</a-form-model-item>
</div>
</div>
</a-col>
<a-col :span="4">
<div class="special-middle">
<a-button icon="arrow-up" type="primary" shape="circle" size="small" :disabled="index == 0" @click="moveUp(index)"></a-button>
<a-button icon="arrow-down" type="primary" shape="circle" size="small" style="margin-left:3px" :disabled="cooperativeUnits.length == index + 1" @click="moveDown(index)"></a-button>
<a-popconfirm title="确定要删除吗?" ok-text="确定" cancel-text="取消" @confirm="removeArray(item)">
<a-button type="link" size="small">[删除]</a-button>
</a-popconfirm>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="24" style="text-align: center;">
<div class="special-middle">
<a-button type="dashed" style="width: 50%" @click="addArray">
<a-icon type="plus" /> 添加
</a-button>
</div>
</a-col>
</a-row>
</div>
</template>
<script>
//用法 <cooperative-units :cooperativeUnits.sync="formData.cooperativeUnits" />
const Model = { id: null, unitName: null, unitCountry: null, unitAddress: null, organizationCode: null, projectWork: null }
export default {
name: 'cooperativeUnits',
data () {
return {
}
},
props: {
cooperativeUnits: {
type: Array,
default: () => {
return []
}
},
},
components: {
},
created () {
},
methods: {
moveToTop (item) {//成员置顶
let index = this.cooperativeUnits.indexOf(item)
if (index !== -1) {
this.cooperativeUnits.splice(index, 1)
this.cooperativeUnits.unshift({ ...item })
}
},
moveUp (index) {
let arr = this.cooperativeUnits
arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]))
},
moveDown (index) {
let arr = this.cooperativeUnits
arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]))
},
addArray () {//添加成员
this.cooperativeUnits.push({ ...Model })
},
removeArray (item) {//移除成员
let index = this.cooperativeUnits.indexOf(item)
if (index !== -1) {
this.cooperativeUnits.splice(index, 1)
}
},
},
}
</script>
<template>
<div>
<a-row>
<a-col :span="24">
<div class="tb-title">
<span>附件上传</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="24" class="bg-gray">
<div class="special-middle" style="font-weight: bold;">
1.科研诚信承诺书(必须提供)<span class="required"></span><br />
2.承诺书(必须提供)<span class="required"></span><br />
3.医学研究伦理审查证明<br />
4.多家单位联合申报的必须提供牵头单位与所有参与单位签署的联合申报协议(协议中应包含项目名称、课题设置、专项经费分配、知识产权归属、项目经费筹集与使等内容,协议经单位盖章、项目及所有课题负责人签字有效)<br />
5.相关查新报告、前期科研成果、专利等佐证材料(选择提供)<br />
6.与项目相关的其它证明材料或文件等(选择提供)<br />
</div>
</a-col>
</a-row>
<a-row type="flex" class="item_inner">
<a-col :span="2">
<div class="special-middle">
<div>序号</div>
</div>
</a-col>
<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="4" class="bg-gray">
<div class="special-middle">
<div>操作</div>
</div>
</a-col>
</a-row>
<a-row v-for="(item, index) in fileList" :key="'fileList' + index" type="flex">
<a-col :span="2" style="text-align: center;">
{{ index + 1 }}
</a-col>
<a-col :span="8">
<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" />
<!-- <span v-if="mustAttachment.includes(index)" class="required"></span> -->
</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>
</div>
<a-icon type="delete" class="hover-pointer d-icon" @click="deletefile(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="4">
<div class="special-middle">
<div v-if="!item.required">
<a-popconfirm title="确定要删除吗?" ok-text="确定" cancel-text="取消" @confirm="removefileList(item)">
<a-button type="link" size="small">删除</a-button>
</a-popconfirm>
</div>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="24" style="text-align: center">
<div class="special-middle">
<div>
<a-button type="dashed" style="width: 50%" @click="addfileList()">
<a-icon type="plus" /> 添加
</a-button>
</div>
</div>
</a-col>
</a-row>
</div>
</template>
<script>
const File = { fileName: "", downloadUrl: "", fileExplain: "", downloadId: "" };
export default {
name: "fileEdit",
props: {
fileList: {
type: Array,
default: () => {
return [{ ...File }];
},
},
},
created() {},
data() {
return {
mustAttachment: [ 0, 1 ],
};
},
methods: {
downloadfile() {
},
deletefile (item, index) {
this.$api.base.deletefile({ id: item.downloadId }).then(({ data = {} }) => {
if (data) {
item.fileName = ''
item.downloadUrl = ''
item.downloadId = ''
}
}).catch(() => {
this.$message.error('删除失败')
})
},
uploadHandle (file, fileName) {
let formData = new FormData()
formData.append('file', file)
formData.append('fileName', fileName)
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.base.asyncUpload(this.uploadHandle(files[0], files[0].name)).then(({ data = {} }) => {
if (data) {
item.fileName = files[0].name
item.downloadUrl = '/' + files[0].name
item.downloadId = data.id
} 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 * 15;
if (!isLtSize) {
this.$message.error('文件大小不能超过15M!');
return false
}
return true
},
// 添加附件
addfileList () {
this.fileList.push(Object.assign({ ...File }, { fileExplain: '' }))
},
// 删除附件
removefileList (item) {
let index = this.fileList.indexOf(item)
if (index !== -1) {
this.fileList.splice(index, 1)
}
},
},
};
</script>
\ No newline at end of file
<template>
<div>
<a-form-model ref="form" :model="formData" :rules="rules" style="border-top: 0px" class="from-table font-line-space">
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>基本情况</span>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>单位基本情况</span>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item>
<div>{{ formData.appUnitName }}</div>
</a-form-model-item>
</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>
<a-form-model-item>
<div>{{ formData.unitTypeName }}</div>
</a-form-model-item>
</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>
<a-form-model-item prop="organizationCode">
<a-input placeholder="组织机构代码/统一社会信用代码" v-model="formData.organizationCode" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item prop="address">
<a-input placeholder="通讯地址" v-model="formData.address" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="registeredAddress">
<a-input placeholder="注册所在地" v-model="formData.registeredAddress" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="postCode">
<a-input placeholder="邮编" v-model="formData.postCode" :maxLength="10" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="legalPerson">
<a-input placeholder="法定代表人" v-model="formData.legalPerson" :maxLength="50" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="workforce">
<a-input-number v-model="formData.workforce" :min="0" :step="1" style="width: 100px" />
</a-form-model-item>
</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>
<a-form-model-item prop="specializedPersonnel">
<a-input-number v-model="formData.specializedPersonnel" :min="0" :step="1" style="width: 100px" />
</a-form-model-item>
</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>
<a-form-model-item prop="researchPersonnel">
<a-input-number v-model="formData.researchPersonnel" :min="0" :step="1" style="width: 100px" />
</a-form-model-item>
</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>
<a-form-model-item prop="depositBank">
<a-input placeholder="开户银行" v-model="formData.depositBank" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="bankAccount">
<a-input placeholder="银行账号" v-model="formData.bankAccount" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="depositBankAddress">
<a-input placeholder="开户银行地址" v-model="formData.depositBankAddress" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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>
<a-form-model-item prop="interbankNumber">
<a-input placeholder="开户银行地址" v-model="formData.interbankNumber" :maxLength="100" style="width:80%" />
</a-form-model-item>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item prop="researchTotal">
<a-input-number v-model="formData.researchTotal" :min="0" :step="0.01" style="width: 100px" />
</a-form-model-item>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item ref="isResearchActive" label="" prop="unitType">
<base-select v-model="formData.isResearchActive" :type="12" :isAll="true" />
</a-form-model-item>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item prop="researchCount">
<a-input-number v-model="formData.researchCount" :min="0" :step="0.01" style="width: 100px" />
</a-form-model-item>
</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="20">
<div class="special-middle">
<div>
<a-form-model-item prop="researchPersonCount">
<a-input-number v-model="formData.researchPersonCount" :min="0" :step="1" style="width: 100px" />
</a-form-model-item>
</div>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目基本情况</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目名称</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="projName">
<a-input placeholder="项目名称" v-model="formData.projName" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目所属二级学院/部门名称(牵头单位)</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="leadUnit">
<a-input placeholder="项目所属二级学院/部门名称(牵头单位)" v-model="formData.leadUnit" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">推荐部门</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="recommendUnit">
<a-input placeholder="推荐部门" v-model="formData.recommendUnit" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项日开始时间</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="startDate" style="width:200px;display: inline-block;">
<a-date-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="formData.startDate" style="width: 180px" />
</a-form-model-item>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目结束时间</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="endDate" style="width:200px;display: inline-block;">
<a-date-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="formData.endDate" style="width: 180px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目依托的科技创新基地</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="technologyInnovationBase">
<a-input placeholder="项目依托的科技创新基地" v-model="formData.technologyInnovationBase" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目所属学科类别</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="knowledgeId">
<para-multi-select v-model="formData.knowledgeId" :typeId="57" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目总经费(万元)</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="totalFunding">
<a-input-number v-model="formData.totalFunding" :min="0" :step="0.01" style="width: 100px" />
<span> 单位:万元</span>
</a-form-model-item>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">申请科技经费(万元)</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="govFunding">
<a-input-number v-model="formData.govFunding" :min="0" :step="0.01" style="width: 100px" />
<span> 单位:万元</span>
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目联系人姓名</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="linkName">
<a-input placeholder="项目联系人姓名" v-model="formData.linkName" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">联系人手机</div>
</div>
</a-col>
<a-col :span="8">
<a-form-model-item prop="linkMobile">
<a-input placeholder="联系人手机" v-model="formData.linkMobile" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">电子邮箱</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="linkEmail">
<a-input placeholder="电子邮箱" v-model="formData.linkEmail" :maxLength="100" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目摘要(400字以内)</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="projAbstract">
<a-textarea placeholder="项目摘要" v-model="formData.projAbstract" :maxLength="400" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">关键词</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="projKeywords">
<a-input placeholder="关键词" v-model="formData.projKeywords" :maxLength="200" style="width: 80%" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目人员情况</span>
</div>
</a-col>
</a-row>
<!-- 项目合作单位 -->
<cooperative-units :cooperativeUnits.sync="formData.cooperativeUnits" />
<!-- 项目组成员 -->
<proj-group-member :members.sync="formData.members" />
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目可行性研究情况</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">1、项目的意义、必要性</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchContent">
<a-textarea placeholder="项目的意义、必要性" v-model="formData.researchContent" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">2、项目现有工作基础和支撑条件</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="memResume">
<a-textarea placeholder="项目现有工作基础和支撑条件" v-model="formData.memResume" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">3、与项目相关的国内外技术发展现状(包括知识产权情况)以及本项目主要研究开发内容技术关键(创新点)、可行性评价及项目风险分析与对策</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchProgress">
<a-textarea placeholder="与项目相关的国内外技术发展现状" v-model="formData.researchProgress" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目主要实施内容和目标</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目实施目标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchContent">
<a-textarea placeholder="与项目相关的国内外技术发展现状" v-model="formData.researchContent" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目考核指标</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">主要技术指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="technologyTarget">
<a-textarea placeholder="主要技术指标" v-model="formData.technologyTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">主要经济指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="economyTarget">
<a-textarea placeholder="主要经济指标" v-model="formData.economyTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目实施中形成的示范基地、中试线、生产线及其规模等</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="achievementTarget">
<a-textarea placeholder="项目实施中形成的示范基地、中试线、生产线及其规模等" v-model="formData.achievementTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">其他应考核的指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="otherTarget">
<a-textarea placeholder="其他应考核的指标" v-model="formData.otherTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<!-- 经费预算 -->
<budget-edit :budget.sync="formData.budget" />
<!-- 附件 -->
<file-edit :fileList.sync="formData.fileList" />
</a-form-model>
</div>
</template>
<script>
import { getType } from '@/views/utils/auth'
import paraMultiSelect from '@/views/components/common/paraMultiSelect'
import paraSelect from '@/views/components/common/paraSelect'
import baseSelect from '@/views/components/common/baseSelect'
import ProjGroupMember from '@/views/report/project/components/projGroupMember'
import cooperativeUnits from '@/views/report/project/components/cooperativeUnits'
import budgetEdit from '@/views/report/project/components/keyProject/budgetEdit'
import fileEdit from '@/views/report/project/components/keyProject/fileEdit'
import { isEmptyParams } from "@/views/utils/common"
import moment from 'moment'
const Cooperative = { id: null, unitName: null, unitCountry: null, unitAddress: null, organizationCode: null, projectWork: null }
const Members = { showIndex: 1, name: null, certId: null, sex: null, birthday: null, age: null, degree: null, title: null, duty: null, spec: null, workUnit: null, projWork: null }
const Equipments = { name: null, specificationType: null, quantity: null, totalBudget: null, useFrom: null }
const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' }
export default {
name: 'projectEdit',
components: {
paraMultiSelect, paraSelect, baseSelect, ProjGroupMember, cooperativeUnits,budgetEdit,fileEdit
},
props: {
value: {
type: String,
default: () => {
return null
}
},
isModifyNo: {
type: Boolean,
default: () => {
return false
}
},
},
created () {
this.getProject()
},
data () {
return {
overseasShow: false,
formData: {
id: null,
// 项目名称
projName: '',
// 项目名称
englishName: '',
// 项目状态
projState: -10,
isAchieve: null,
// 申报学科
isAccept: null,
// 申报学科
isOverseas: null,
// 申报学科
knowledgeId: '',
// 拟完成的成果形式
anticipatedForms: '',
// 申请金额
applyMoney: null,
// 申报年度
reportYear: null,
// 实施年限 起止日期
startDate: null,
endDate: null,
// 主题词
projKeywords: '',
// 主题词(英文)
keywordsEnglish: '',
// 依托单位
appUnitName: '',
// 申报人
personName: '',
// 性别
sex: '',
// 出生年月
birthday: '',
// 证件号
certId: '',
// 民族
nationName: '',
// 职 称
titleName: '',
// 学历
educationName: '',
// 专业
specName: '',
// 电话
mobile: '',
// 邮箱
email: '',
// 成员
cooperativeUnits: [],
// 成员
members: [],
// 投资总额
totalFunding: null,
// 卫生健康委资助
govFunding: null,
// 单位配套
unitFunding: null,
// 自筹
selfFunding: null,
// 其他
otherFunding: null,
budget: [],
equipments: [{ ...Equipments }],
// 研究内容和意义
projContent: '',
//参考文献
projReference: '',
// 立项依据
projBasis: '',
// 研究内容和研究目标,拟解决的关键问题
researchContent: '',
// 研究思路、方法、技术路线、实验方案及可行性分析
researchPlan: '',
// 项目的特色和创新之处
mainFeatures: '',
// 研究进度计划
studyPlan: '',
// 预期研究成果
expectedResults: '',
// 研究工作积累和已取得的研究工作成绩
workFoundation: '',
// 实验条件和资料
workingConditions: '',
// 申请者和项目组主要成员研究工作简历
memResume: '',
// 申请者正在承担的其它研究项目
researchProjects: '',
projDoc: '',
fileList: [{ ...File }],
//项目类型(1.科研项目、2.重点项目)
projType: getType()
},
rules: {
projName: [
{ required: true, message: '请填写项目名称', trigger: 'blur' },
{ max: 50, message: '项目名称不能大于50', trigger: 'blur' }
],
englishName: [{ max: 200, message: '项目名称(英文)不能大于50', trigger: 'blur' }],
proj_no: { required: true, message: '请填写项目编号', trigger: 'blur' },
isAchieve: { required: true, message: '是否可实现成果转化或临床应用', trigger: 'change' },
isAccept: { required: true, message: '请选择是否选择接受立项不资助', trigger: 'change' },
isOverseas: { required: true, message: '请选择是否存在境外机构或人员参与', trigger: 'change' },
knowledgeId: { required: true, message: '请选择申报学科', trigger: 'change' },
anticipatedForms: { required: true, message: '请选择成果形式', trigger: 'change' },
projKeywords: [{ required: true, message: '请填写主题词', trigger: 'blur' },],
keywordsEnglish: [{ max: 200, message: '主题词不能大于50', trigger: 'blur' },],
startDate: { required: true, message: '请选择起始日期', trigger: 'change' },
endDate: { required: true, message: '请选择结束日期', trigger: 'change' },
dept: { required: true, message: '请填写系、所、科室', trigger: 'blur' },
nature: { required: true, message: '请填单位性质', trigger: 'change' },
telephone: { required: true, message: '请填写申请人电话', trigger: 'blur' },
address: { required: true, message: '请填写详细地址', trigger: 'blur' },
email: { required: true, message: '请填写邮箱', trigger: 'blur' },
applyMoney: { required: true, message: '请填写申请金额', trigger: 'blur' },
// 研究内容和意义
projContent: [{ required: true, message: '请填写研究内容和意义', trigger: 'blur' }],
//参考文献
projReference: [{ required: false, message: '请填写参考文献', trigger: 'blur' }],
// 立项依据
projBasis: [{ required: true, message: '请填写立项依据', trigger: 'blur' }],
// 研究内容和研究目标,拟解决的关键问题
researchContent: [{ required: true, message: '请填写研究内容和研究目标', trigger: 'blur' }],
// 研究思路、方法、技术路线、实验方案及可行性分析
researchPlan: [{ required: true, message: '请填写研究思路、方法、技术路线', trigger: 'blur' }],
// 项目的特色和创新之处
mainFeatures: [{ required: true, message: '请填写项目的特色和创新之处', trigger: 'blur' }],
// 研究进度计划
studyPlan: [{ required: true, message: '请填写研究进度计划', trigger: 'blur' }],
// 预期研究成果
expectedResults: [{ required: true, message: '请填写预期研究成果', trigger: 'blur' }],
// 研究工作积累和已取得的研究工作成绩
workFoundation: [{ required: true, message: '请填写研究工作积累和已取得的研究工作成绩', trigger: 'blur' }],
// 实验条件和资料
workingConditions: [{ required: true, message: '请填写实验条件和资料', trigger: 'blur' }],
// 申请者和项目组主要成员研究工作简历
memResume: [{ required: true, message: '请填写研究工作简历', trigger: 'blur' }],
// 申请者正在承担的其它研究项目
researchProjects: [{ required: true, message: '请填写研究项目', trigger: 'blur' }],
govFunding: { required: true, message: '*', trigger: 'blur' },
unitFunding: { required: true, message: '*', trigger: 'blur' },
selfFunding: { required: true, message: '*', trigger: 'blur' },
otherFunding: { required: true, message: '*', trigger: 'blur' },
},
// 富文本字数
tinymceLimit: 15000,
tinymceWordCount: 0,
flag: false,
}
},
computed: {
},
mounted () {
},
methods: {
moment,
getProject () {
this.$emit('load', true)
if (!!this.value) {
this.$api.project.getProjectInfoById({ id: this.value }).then(({ data = {} }) => {
if (data) {
this.formData = data
this.loadList()
} else
this.$emit('close', 'error')
this.$emit('load', false)
}).catch(() => {
this.$emit('close', 'error')
this.$emit('load', false)
})
} else {
this.$api.project.getNewProject({ projType: getType() }).then(({ data = {} }) => {
if (data) {
this.formData = data
this.loadList()
// tinyMCE.activeEditor.setContent(data.projDoc)
} else
this.$emit('close', 'error')
this.$emit('load', false)
}).catch(() => {
this.$emit('close', 'error')
this.$emit('load', false)
})
}
},
loadList () {
if (!!!this.formData.cooperativeUnits || this.formData.cooperativeUnits.length == 0)
this.formData.cooperativeUnits = [{ ...Cooperative }]
if (!!!this.formData.members || this.formData.members.length == 0)
this.formData.members = [{ ...Members }]
if (!!!this.formData.equipments || this.formData.equipments.length == 0)
this.formData.equipments = [{ ...Equipments }]
if (!!!!this.formData.fileList || !this.formData.fileList.length || this.formData.fileList.length == 0) {
this.formData.fileList = []
}
},
addEquipments () {
this.formData.equipments.push({ ...Equipments })
},
removeEquipments (item) {
let index = this.formData.equipments.indexOf(item)
if (index !== -1) {
this.formData.equipments.splice(index, 1)
}
},
save () {
if (this.checkProjName()) {
this.$emit('load', true)
let pars = isEmptyParams(this.formData)
let par = { ...pars }
this.$api.project.save(par).then(({ data = {} }) => {
if (data) {
this.formData.id = data
this.$message.success('保存成功!')
this.$emit('onSave', 'save')
}
this.$emit('load', false)
}).catch(() => {
this.$emit('load', false)
})
}
},
submit () {
if (this.formData.members.length == 0) {
this.$message.error('至少添加一位项目组成员!')
return
}
if (this.formData.isOverseas && this.formData.isOverseas == '是') {
if (this.formData.overseasRemark == null || this.formData.overseasRemark == '') {
this.$message.error('请填写存在境外机构或人员具体情况说明!')
return
}
}
this.$refs.form.validate(valid => {
if (valid) {
if (!this.checkApplyMoney()) {
return false
}
this.$emit('load', true)
let state = this.formData.projState
if (state != 30)
this.formData.projState = 10
// this.formData.projDoc = this.projDoc
let pars = isEmptyParams(this.formData)
let par = { ...pars }
this.$api.project.save(par).then(({ data = {} }) => {
if (data) {
this.formData.id = data
this.$message.success('成功!')
this.$emit('onSave', 'submit')
}
this.$emit('load', false)
}).catch(() => {
this.$emit('load', false)
})
} else {
this.$message.warn('项目信息未填写完全!')
return false
}
})
},
tinymceSet () {
tinymce.remove('#tinymce_dom')
tinymce.init({
selector: '#tinymce_dom',
language: 'zh_CN',
content_style: "img {max-width:100%;}",
// menubar: false,
// 隐藏底部状态栏
statusbar: false,
height: 800,
plugins: 'code advlist autolink link image lists preview table wordcount',
toolbar: `undo redo | styleselect | fontsizeselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist | link image
| table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow
| tableinsertcolbefore tableinsertcolafter tabledeletecol | wordcount`,
// 初始化完成回调
init_instance_callback: (editor) => {
let wordcount = editor.plugins.wordcount
this.tinymceWordCount = wordcount.body.getWordCount()
},
// 图片上传路径
// images_upload_url: 'http://192.168.1.185:8888/profile',
// 图片上传操作
images_upload_handler: (blobInfo, succFun, failFun) => {
this.$api.base.asyncUpload(this.uploadHandle(blobInfo.blob(), blobInfo.filename())).then(({ data = {} }) => {
if (data) {
succFun(data.downloadUrl)
}
}).catch((err) => {
failFun(err)
})
}
})
// 设置富文本内容
// tinymce.activeEditor.setContent(htmlText)
// 监听输入计算字数
let mark = 1
tinymce.activeEditor.on('keyup', (e) => {
if (mark === 1) {
let wordcount = tinymce.activeEditor.plugins.wordcount
this.tinymceWordCount = wordcount.body.getWordCount()
mark = 0
setTimeout(() => {
mark = 1
}, 500)
}
})
},
// 添加附件
addfileList () {
this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '' }))
},
// 删除附件
removefileList (item) {
let index = this.formData.fileList.indexOf(item)
if (index !== -1) {
this.formData.fileList.splice(index, 1)
}
},
downfileList (item) {
},
fileSelect (item, index) {
let fileElem = this.$refs['fileElem' + index][0]
if (fileElem) {
fileElem.click()
}
},
fileCheck (file) {
//判断是否小于1M
let isLtSize = file.size < 1024 * 1024 * 15;
if (!isLtSize) {
this.$message.error('文件大小不能超过15M!');
return false
}
// var fileNames = file.name.split('.')
// var fileType = fileNames[fileNames.length - 1].toLocaleLowerCase()
// var extList = ['doc', 'docx', 'pdf']
// if (!extList.find((item) => item == fileType)) {
// this.$message.error('文件格式错误!')
// return false
// }
return true
},
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.base.asyncUpload(this.uploadHandle(files[0], files[0].name)).then(({ data = {} }) => {
if (data) {
item.fileName = files[0].name
item.downloadUrl = '/' + files[0].name
item.downloadId = data.id
} else
this.$message.error('上传失败')
}).catch(() => {
this.$message.error('上传失败')
})
},
inCount () {
let govFunding = 0
let unitFunding = 0
let selfFunding = 0
let otherFunding = 0
if (this.formData.govFunding)
govFunding = this.formData.govFunding
if (this.formData.unitFunding)
unitFunding = this.formData.unitFunding
if (this.formData.selfFunding)
selfFunding = this.formData.selfFunding
if (this.formData.otherFunding)
otherFunding = this.formData.otherFunding
this.formData.totalFunding = (govFunding + unitFunding + selfFunding + otherFunding).toFixed(2)
return this.formData.totalFunding
},
outNumberChange () {
let vartotalBudget = 0
this.formData.budget.forEach(e => {
if (e.totalBudget != null)
vartotalBudget += parseFloat(e.totalBudget)
})
this.formData.totalFunding = vartotalBudget.toFixed(2)
},
deletefile (item, index) {
this.$api.base.deletefile({ id: item.downloadId }).then(({ data = {} }) => {
if (data) {
item.fileName = ''
item.downloadUrl = ''
item.downloadId = ''
if (item.fileExplain != '学术委员会审查意见' && item.fileExplain != '项目组的人员签字') {
item.fileExplain = ''
}
}
}).catch(() => {
this.$message.error('删除失败')
})
},
uploadHandle (file, fileName) {
let formData = new FormData()
formData.append('file', file)
formData.append('fileName', fileName)
return formData
},
// 起止日期选择处理
dateChange (value) {
let statr = this.formData.startDate
let end = this.formData.endDate
if (!statr || !end) {
return
}
if (statr > end) {
this.formData.startDate = end
this.formData.endDate = statr
}
},
checkApplyMoney () {
var m = parseFloat(this.formData.applyMoney)
if (m != this.formData.govFunding) {
alert('项目经费与申请金额不一致!')
return false
}
return true
},
checkProjName () {
if (this.formData.projName == "" || this.formData.projName == null) {
alert('项目名称不能为空')
return false
} else {
return true
}
},
},
watch: {
'formData.isOverseas': {
handler (value) {
if (value && value == '是')
this.overseasShow = true
else
this.overseasShow = false
},
},
}
}
</script>
<style scoped lang="less">
.d-icon {
margin-right: 10px;
}
</style>
...@@ -446,7 +446,7 @@ ...@@ -446,7 +446,7 @@
</a-col> </a-col>
<a-col :span="20"> <a-col :span="20">
<a-form-model-item prop="projAbstract"> <a-form-model-item prop="projAbstract">
<a-textarea placeholder="项目摘要" v-model="formData.projAbstract" :maxLength="400" style="width: 60%; height: 160px; margin-top: 12px" /> <a-textarea placeholder="项目摘要" v-model="formData.projAbstract" :maxLength="400" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
</a-row> </a-row>
...@@ -462,8 +462,144 @@ ...@@ -462,8 +462,144 @@
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
</a-row> </a-row>
</a-form-model>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目人员情况</span>
</div>
</a-col>
</a-row>
<!-- 项目合作单位 -->
<cooperative-units :cooperativeUnits.sync="formData.cooperativeUnits" />
<!-- 项目组成员 -->
<proj-group-member :members.sync="formData.members" />
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目可行性研究情况</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">1、项目的意义、必要性</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchContent">
<a-textarea placeholder="项目的意义、必要性" v-model="formData.researchContent" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">2、项目现有工作基础和支撑条件</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="memResume">
<a-textarea placeholder="项目现有工作基础和支撑条件" v-model="formData.memResume" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">3、与项目相关的国内外技术发展现状(包括知识产权情况)以及本项目主要研究开发内容技术关键(创新点)、可行性评价及项目风险分析与对策</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchProgress">
<a-textarea placeholder="与项目相关的国内外技术发展现状" v-model="formData.researchProgress" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目主要实施内容和目标</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目实施目标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="researchContent">
<a-textarea placeholder="与项目相关的国内外技术发展现状" v-model="formData.researchContent" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="border-top: 0px">
<div class="tb-title">
<span>项目考核指标</span>
</div>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">主要技术指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="technologyTarget">
<a-textarea placeholder="主要技术指标" v-model="formData.technologyTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">主要经济指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="economyTarget">
<a-textarea placeholder="主要经济指标" v-model="formData.economyTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">项目实施中形成的示范基地、中试线、生产线及其规模等</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="achievementTarget">
<a-textarea placeholder="项目实施中形成的示范基地、中试线、生产线及其规模等" v-model="formData.achievementTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row type="flex">
<a-col :span="4" class="bg-gray">
<div class="special-middle">
<div class="required">其他应考核的指标</div>
</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="otherTarget">
<a-textarea placeholder="其他应考核的指标" v-model="formData.otherTarget" :maxLength="5000" style="width: 80%; height: 160px; margin-top: 12px" />
</a-form-model-item>
</a-col>
</a-row>
<!-- 经费预算 -->
<budget-edit :budget.sync="formData.budget" />
<!-- 附件 -->
<file-edit :fileList.sync="formData.fileList" />
</a-form-model>
</div> </div>
</template> </template>
...@@ -473,9 +609,13 @@ import paraMultiSelect from '@/views/components/common/paraMultiSelect' ...@@ -473,9 +609,13 @@ import paraMultiSelect from '@/views/components/common/paraMultiSelect'
import paraSelect from '@/views/components/common/paraSelect' import paraSelect from '@/views/components/common/paraSelect'
import baseSelect from '@/views/components/common/baseSelect' import baseSelect from '@/views/components/common/baseSelect'
import ProjGroupMember from '@/views/report/project/components/projGroupMember' import ProjGroupMember from '@/views/report/project/components/projGroupMember'
import cooperativeUnits from '@/views/report/project/components/cooperativeUnits'
import budgetEdit from '@/views/report/project/components/budgetEdit'
import fileEdit from '@/views/report/project/components/fileEdit'
import { isEmptyParams } from "@/views/utils/common" import { isEmptyParams } from "@/views/utils/common"
import moment from 'moment' import moment from 'moment'
const Cooperative = { id: null, unitName: null, unitCountry: null, unitAddress: null, organizationCode: null, projectWork: null }
const Members = { showIndex: 1, name: null, certId: null, sex: null, birthday: null, age: null, degree: null, title: null, duty: null, spec: null, workUnit: null, projWork: null } const Members = { showIndex: 1, name: null, certId: null, sex: null, birthday: null, age: null, degree: null, title: null, duty: null, spec: null, workUnit: null, projWork: null }
const Equipments = { name: null, specificationType: null, quantity: null, totalBudget: null, useFrom: null } const Equipments = { name: null, specificationType: null, quantity: null, totalBudget: null, useFrom: null }
const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' } const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' }
...@@ -483,7 +623,7 @@ const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' } ...@@ -483,7 +623,7 @@ const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' }
export default { export default {
name: 'projectEdit', name: 'projectEdit',
components: { components: {
paraMultiSelect, paraSelect, baseSelect, ProjGroupMember paraMultiSelect, paraSelect, baseSelect, ProjGroupMember, cooperativeUnits,budgetEdit,fileEdit
}, },
props: { props: {
value: { value: {
...@@ -556,7 +696,9 @@ export default { ...@@ -556,7 +696,9 @@ export default {
// 邮箱 // 邮箱
email: '', email: '',
// 成员 // 成员
members: [{ ...Members }], cooperativeUnits: [],
// 成员
members: [],
// 投资总额 // 投资总额
totalFunding: null, totalFunding: null,
// 卫生健康委资助 // 卫生健康委资助
...@@ -692,18 +834,14 @@ export default { ...@@ -692,18 +834,14 @@ export default {
} }
}, },
loadList () { loadList () {
if (!this.formData.members || this.formData.members.length == 0) if (!!!this.formData.cooperativeUnits || this.formData.cooperativeUnits.length == 0)
this.formData.cooperativeUnits = [{ ...Cooperative }]
if (!!!this.formData.members || this.formData.members.length == 0)
this.formData.members = [{ ...Members }] this.formData.members = [{ ...Members }]
if (!this.formData.equipments || this.formData.equipments.length == 0) if (!!!this.formData.equipments || this.formData.equipments.length == 0)
this.formData.equipments = [{ ...Equipments }] this.formData.equipments = [{ ...Equipments }]
if (!this.formData.fileList || !this.formData.fileList.length || this.formData.fileList.length == 0) { if (!!!!this.formData.fileList || !this.formData.fileList.length || this.formData.fileList.length == 0) {
this.formData.fileList = [] this.formData.fileList = []
//this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '学术委员会审查意见' }))
// this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '项目申报简要信息首页(签字页)', isDelete: false, must: true }))
// this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '伦理审批件', isDelete: false, must: true }))
// this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '科研诚信承诺书', isDelete: false, must: true }))
// this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '查新报告', isDelete: false, must: true }))
// this.formData.fileList.push(Object.assign({ ...File }, { fileExplain: '技术路线', isDelete: false, must: false }))
} }
}, },
addEquipments () { addEquipments () {
......
<template>
<div class="app-content">
<div v-if="loadState && !isComplete" style="margin-top:12px">
<a-form-model ref="ruleForm" :model="formData" :rules="rules" class="from-table">
<a-row>
<a-col :span="24">
<div class="tb-title">
<span>补充人员基本信息</span>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="4" class="bg-gray">
<div class="required">民族</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="nation">
<para-select v-model="formData.nation" :width="150" :typeId="11" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="4" class="bg-gray">
<div class="required">学历</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="education">
<para-select v-model="formData.education" :width="150" :typeId="8" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="4" class="bg-gray">
<div class="required">职称</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="title">
<para-multi-select :width="150" v-model="formData.title" :typeId="7" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="4" class="bg-gray">
<div class="required">专业</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="spec">
<para-multi-select :width="150" v-model="formData.spec" :typeId="42" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="4" class="bg-gray">
<div class="required">邮箱</div>
</a-col>
<a-col :span="20">
<a-form-model-item prop="email">
<a-input v-model="formData.email" :maxLength="30" style="width:250px;" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24" style="text-align: center;">
<a-button type="primary" @click="submit">提交</a-button>
</a-col>
</a-row>
</a-form-model>
</div>
<div v-if="loadState && isComplete">
<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-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;">
<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="(display && 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" :scroll="{ x: 'max-content' }" rowKey="id" :pagination="false" :loading="loading">
<!-- size="small" bordered -->
<template slot="projName" slot-scope="record">
<a @click="recordClick(record, 'view')">{{record.projName}}</a>
</template>
<template slot="state" slot-scope="record">
<span>
{{ record.projStateName }}
</span>
</template>
<template slot="option" slot-scope="record">
<a-button type="link" size="small" @click="recordClick(record, 'view')">查看</a-button>
<a-button type="link" size="small" v-if="((record.projState == -10 || record.projState == 10 || record.projState == 30))" @click="recordClick(record, 'edit')">修改</a-button>
<a-popconfirm title="确定要上报吗?" v-if="((record.projState == 10 || record.projState == 30))" ok-text="确定" cancel-text="取消" @confirm="recordClick(record,'report')">
<a-button type="link" size="small">上报</a-button>
</a-popconfirm>
<a-button type="link" size="small" v-if="record.projState <= 10" @click="recordClick(record,'delete')">删除</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} 条`" />
</div>
<a-modal v-model="visibleEdit" v-if="visibleEdit" title="项目创建/修改" width="80%" :footer="null" :dialog-style="{ top: '8%' }" destroyOnClose>
<project-create v-model="id" @closeWindow="closeWindow"></project-create>
</a-modal>
<a-modal v-model="visibleView" v-if="visibleView" title="项目详情" width="80%" :dialog-style="{ top: '8%' }" :footer="null" destroyOnClose>
<project-view v-model="id" @close="() => this.visibleView = false"></project-view>
</a-modal>
<a-modal v-model="visibleFileView" title="查看" width="1000px" :dialog-style="{ top: '10%' }" :footer="null" destroyOnClose>
<preview-file v-model="realurl.downloadUrl" :fileName="realurl.fileName"></preview-file>
</a-modal>
</div>
</template>
<script>
import { getType } from '@/views/utils/auth'
import moment from 'moment'
import { isEmptyParams, filterExportExcelData, tableColumnsName, checkEmail, personGender, personBirthday, checkImageFileType, checkDocumentFileType } from "@/views/utils/common"
import paraMultiSelect from '@/views/components/common/paraMultiSelect'
import paraSelect from '@/views/components/common/paraSelect'
import projectCreate from '@/views/report/project/components/projectCreate'
import projectView from '@/views/report/project/components/projectView'
import previewFile from '@/views/components/common/previewFile'
import axios from 'axios'
export default {
name: 'reportProject',
components: {
projectView, projectCreate, paraMultiSelect, paraSelect, previewFile
},
data () {
return {
projType: getType() == "1",
loadState: false, //判断是否查询信息完整状态
isComplete: false,
formData: { id: null, nation: null, title: null, education: null, spec: null, email: null, sex: null, birthday: null },
rules: {
nation: [{ required: true, message: '请选择民族', trigger: 'change' }],
title: [{ required: true, message: '请选择职称', trigger: 'change' }],
education: [{ required: true, message: '请选择学历', trigger: 'change' }],
spec: [{ required: true, message: '请选择专业', trigger: 'change' }],
// mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ required: true, validator: checkEmail, trigger: 'blur' }
],
},
size: 'small',
form: this.$form.createForm(this, { name: 'advanced_search' }),
activekey: '1',
tabDate: [
{ key: "1", tab: "未上报" },
{ key: "2", tab: "返回修改" },
{ key: "3", tab: "已上报" },
{ key: "4", tab: "所有" },
],
itemCount: [0, 0, 0, 0, 0],
// 表单
searchForm: { projName: null, projNo: null, projState: 1, reportYear: null, projType: getType() },
tableData: [],
columns: [
{ title: "项目名称", scopedSlots: { customRender: 'projName' } },
{ title: '项目编号', dataIndex: 'projNo', align: 'center' },
// { title: '版本号', dataIndex: 'versionNo', align: 'center' },
// { title: '项目类别', dataIndex: 'projClassName', align: 'center' },
{ title: '开始时间', dataIndex: 'startDate', align: 'center' },
{ title: '结束时间', dataIndex: 'endDate', align: 'center' },
{ title: '申报年度', dataIndex: 'reportYear', align: 'center' },
{ title: '状态', scopedSlots: { customRender: 'state' }, align: 'center' },
{ title: '操作', scopedSlots: { customRender: 'option' }, align: 'center', fixed: 'right', width: 180, },
],
pagination: { pageIndex: 1, pageSize: this.$defaultPageSize, total: 0, pageSizeOptions: this.$defaultPageSizeOptions, },
loading: false,
// 弹窗标志
visibleView: false,
visibleEdit: false,
id: null,
isButten: false,
display: true,
description: '',
// downloadUrl: '/downloadFile/202306151700.docx',
// fileName: '项目申报流程.docx',
// downloadUrl: '/downloadFile/ExpertInfo.xlsx',
// fileName: '专家导入模板.xlsx',
// downloadUrl: '/downloadFile/202406261130.pdf',
// fileName: '系统用户手册.pdf',
// downloadUrl: '/downloadFile/1637631492.jpg',
// fileName: '1637631492.jpg',
url1: {
downloadUrl: '/downloadFile/202406261120.doc',
fileName: '项目合同书模板.doc',
},
url2: {
downloadUrl: '/downloadFile/202407050900.doc',
fileName: '项目合同书模板.doc',
},
realurl: null,
visibleFileView: false,
projectKPIView: false,
}
},
created () {
this.getUserState()
if (getType() == 1)
this.realurl = this.url1
else
this.realurl = this.url2
},
methods: {
getUserState () {
this.isComplete = this.$store.state.app.isComplete
if (this.isComplete) {
this.loadState = true
this.getYear()
}
else {
this.getAppPersonInfo()
}
},
getAppPersonInfo () {
this.$api.person.getAppPersonInfo().then(({ data = {} }) => {
if (data) {
this.formData = data.person
this.loadState = true
this.isComplete = data.isComplete
this.$store.commit('app/setComplete', data.isComplete)
this.getYear()
}
}).catch(() => { })
},
getYear () {
this.$api.batch.getCurrentYearBatch({ type: 1, projType: getType() }).then(({ data = {} }) => {
if (data) {
this.isButten = data.disabled
this.description = data.description
this.searchForm.reportYear = data.year
this.getListByPage()
}
}).catch(() => { })
},
getListByPage () {
this.getCount()
this.loading = true
let pars = isEmptyParams(this.searchForm)
let par = { ...pars, pageIndex: this.pagination.pageIndex, pageSize: this.pagination.pageSize }
this.$api.project.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.startDate) {
e.startDate = moment(e.startDate).format('YYYY-MM-DD')
e.endDate = moment(e.endDate).format('YYYY-MM-DD')
}
})
} this.loading = false
}).catch(() => { this.loading = false })
},
getCount () {
this.$api.project.getCount({ reportYear: this.searchForm.reportYear, projType: getType() }).then(({ data = {} }) => {
if (data) {
this.itemCount = [data.count1, data.count2, data.count3, data.count4, data.count5]
}
}).catch(() => { })
},
search () {
this.pagination.pageIndex = 1
this.getListByPage()
},
reset () {
this.searchForm.projName = null
this.searchForm.projNo = null
this.pagination.pageIndex = 1
this.getListByPage()
},
change () {
this.getListByPage()
},
showSizeChange (current, pageSize) {
this.pagination.pageIndex = current
this.pagination.pageSize = pageSize
this.getListByPage()
},
submit () {
this.$refs.ruleForm.validate(valid => {
if (valid) {
let pars = isEmptyParams(this.formData)
let par = { ...pars }
this.$api.person.updatePerson(par).then(({ data = {} }) => {
if (data) {
this.$message.success('提交成功!')
this.$store.commit('app/setComplete', true)
this.isComplete = true
}
}).catch(() => { })
} else {
return false
}
});
},
createProject () {
this.visibleEdit = true
//this.$store.commit('app/addCard', { title: '项目创建', key: '1299', code: 'projectCreate', keepAlive: 1, router: '/project/create', closable: true })
},
closeWindow (value) {
if (value === 'submit') {
this.visibleEdit = false
this.getListByPage()
} else if (value === 'save') {
this.getListByPage()
}
else if (value === 'error') {
this.visibleEdit = false
}
},
onLoad (value) {
this.loading = value
},
recordClick (record, type) {
if (type === 'view') {
this.id = record.id
this.visibleView = true
} else if (type === 'edit') {
this.id = record.id
this.visibleEdit = true
} else if (type === 'delete') {
let self = this
this.$confirm({
title: '',
content: '确定要删除该项目?',
okText: '确定',
okType: 'danger',
cancelText: '取消',
onOk () {
self.loading = true
let par = { id: record.id }
self.$api.project.delete(par).then(({ code, data }) => {
if (data) {
self.$message.success('删除成功!')
self.getListByPage()
}
self.loading = false
}).catch(() => { self.loading = false })
},
onCancel () {
},
})
} else if (type === 'report') {
this.loading = true
this.$api.project.report({ auditObjectId: record.id, auditType: 1 }).then(({ data = {} }) => {
if (data) {
this.$message.success('上报成功!')
this.getListByPage()
}
this.loading = false
}).catch(() => { this.loading = false })
}
},
callback (key) {
if (key == '1')
this.display = true
else
this.display = false
this.searchForm.projState = key
this.getListByPage()
},
exportData () {
let pars = isEmptyParams(this.searchForm)
let par = { ...pars, pageIndex: -1, pageSize: -1 }
this.$api.project.getListByPage(par).then(({ data = {} }) => {
if (data) {
const { dataList = [], total = 0 } = data
this.$ToDoExcel(`项目列表`, tableColumnsName(this.columns), filterExportExcelData(this.columns, dataList))
}
}).catch(() => { })
},
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()
})
},
FileView () {
if (checkImageFileType(this.realurl.fileName)) {//文件为图片
this.$viewerApi({ images: [this.realurl.downloadUrl] })
} else {
if (checkDocumentFileType(this.realurl.fileName))
this.visibleFileView = true
}
},
projectKPI() {
this.projectKPIView = true
}
}
}
</script>
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