You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
639 lines
19 KiB
639 lines
19 KiB
<template>
|
|
<div class="d-flex flex-wrap pb-3">
|
|
<!-- 添加 -->
|
|
<a-modal
|
|
:maskClosable="false"
|
|
@cancel="$emit('closeModal')"
|
|
destroyOnClose
|
|
footer
|
|
title="添加成果"
|
|
v-model="visible"
|
|
width="700px"
|
|
>
|
|
<a-form :form="form" @submit="handleSubmit">
|
|
<!-- 成果名称 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果名称"
|
|
>
|
|
<a-input
|
|
placeholder="请输入成果名称"
|
|
v-decorator="[
|
|
'name',
|
|
{
|
|
rules: [
|
|
{ required: true, message: '成果名称不能为空' },
|
|
{ whitespace: true, message: '成果名称不能为空' },
|
|
{ max: 140, massage: '成果名称最多140个字符' },
|
|
],
|
|
},
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 成果水平 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果水平"
|
|
>
|
|
<a-select
|
|
placeholder="请选择成果水平"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'level'
|
|
]"
|
|
>
|
|
<a-select-option :key="type.id" :value="type.id" v-for="type in levels">{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 成果范围 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果范围"
|
|
>
|
|
<a-select
|
|
placeholder="请选择成果范围"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'ranges'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in assignments"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 成果阶段 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果阶段"
|
|
>
|
|
<a-select
|
|
placeholder="请选择成果阶段"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'stage'
|
|
]"
|
|
>
|
|
<a-select-option :key="type.id" :value="type.id" v-for="type in stages">{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 成果表现形式 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果表现形式"
|
|
>
|
|
<a-select
|
|
placeholder="请选择成果表现形式"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'performance'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in performances"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 成果标准 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="成果标准"
|
|
>
|
|
<a-select
|
|
placeholder="请选择成果标准"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'standard'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in standards"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 申请人 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="申请人"
|
|
>
|
|
<a-input
|
|
placeholder="请输入申请人"
|
|
v-decorator="[
|
|
'applicant'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 已转让企业数 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="已转让企业数"
|
|
>
|
|
<a-input
|
|
placeholder="请输入已转让企业数"
|
|
v-decorator="[
|
|
'assignment'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 学科分类 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="学科分类"
|
|
>
|
|
<a-input
|
|
placeholder="请输入学科分类"
|
|
v-decorator="[
|
|
'classification'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 所属领域 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="所属领域"
|
|
>
|
|
<a-checkbox-group @change="onChange($event,'domains','domain')">
|
|
<a-checkbox
|
|
:disabled="item.disabled"
|
|
:key="item.id"
|
|
:value="item.id"
|
|
class="my-2"
|
|
v-for="item in domains"
|
|
>{{ item.value }}</a-checkbox>
|
|
</a-checkbox-group>
|
|
</a-form-item>
|
|
<!-- 知识产权 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="知识产权"
|
|
>
|
|
<a-select
|
|
placeholder="请选择知识产权"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'finance'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in finances"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 编号 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="编号"
|
|
>
|
|
<a-input
|
|
placeholder="请输入编号"
|
|
v-decorator="[
|
|
'identifier'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 转让收入 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="转让收入(万元)"
|
|
>
|
|
<a-input
|
|
placeholder="请输入转让收入(万元)"
|
|
v-decorator="[
|
|
'income'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 发明人 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="发明人"
|
|
>
|
|
<a-input
|
|
placeholder="请输入发明人"
|
|
v-decorator="[
|
|
'inventor'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 关键词 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="关键词"
|
|
>
|
|
<div class="d-flex flex-nowrap">
|
|
<a-input
|
|
class="mr-2"
|
|
placeholder="关键词1"
|
|
v-decorator="[
|
|
'keywordone'
|
|
]"
|
|
/>
|
|
<a-input
|
|
class="mr-2"
|
|
placeholder="关键词2"
|
|
v-decorator="[
|
|
'keywordtwo'
|
|
]"
|
|
/>
|
|
<a-input
|
|
placeholder="关键词3"
|
|
v-decorator="[
|
|
'keywordthree'
|
|
]"
|
|
/>
|
|
</div>
|
|
</a-form-item>
|
|
<!-- 转让形式 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="转让形式"
|
|
>
|
|
<a-select
|
|
placeholder="请选择转让形式"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'layout'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in layouts"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 类型 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="类型"
|
|
>
|
|
<a-checkbox-group
|
|
v-decorator="[
|
|
'modelIds',
|
|
{
|
|
rules: [
|
|
{ required: true, message: '类型不能为空' },
|
|
],
|
|
},
|
|
]"
|
|
>
|
|
<a-checkbox :key="item.id" :value="item.id" v-for="item in typeLists.list">{{ item.name }}</a-checkbox>
|
|
</a-checkbox-group>
|
|
</a-form-item>
|
|
<!-- 专利数 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="专利数"
|
|
>
|
|
<a-input
|
|
placeholder="请输入专利数"
|
|
v-decorator="[
|
|
'nums'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 专利情况 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="专利情况"
|
|
>
|
|
<a-select
|
|
placeholder="请选择专利情况"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'patent'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in patents"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 图片 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="图片"
|
|
>
|
|
<a-upload
|
|
:action="upload"
|
|
:before-upload="beforeUpload"
|
|
@change="handleChange"
|
|
list-type="picture"
|
|
name="files"
|
|
v-decorator="[
|
|
'pic',
|
|
{
|
|
rules: [
|
|
{ required: true, message: '图片不能为空' },
|
|
],
|
|
},
|
|
]"
|
|
>
|
|
<a-button v-show="fileList.length - 0 === 0">
|
|
<a-icon type="upload" />选择图片
|
|
</a-button>
|
|
</a-upload>
|
|
</a-form-item>
|
|
<!-- 未应用原因 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="未应用原因"
|
|
>
|
|
<a-checkbox-group @change="onChange($event,'reasons','reason')">
|
|
<a-checkbox
|
|
:disabled="item.disabled"
|
|
:key="item.id"
|
|
:value="item.id"
|
|
class="my-2"
|
|
v-for="item in reasons"
|
|
>{{ item.value }}</a-checkbox>
|
|
</a-checkbox-group>
|
|
</a-form-item>
|
|
<!-- 专利名称 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="专利名称"
|
|
>
|
|
<a-input
|
|
placeholder="请输入专利名称"
|
|
v-decorator="[
|
|
'registerName'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 专利号 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="专利号"
|
|
>
|
|
<a-input
|
|
placeholder="请输入专利号"
|
|
v-decorator="[
|
|
'registerNum'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 所属单位 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="所属单位"
|
|
>
|
|
<a-select
|
|
placeholder="请选择所属单位"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'research'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="index"
|
|
:value="type.id"
|
|
v-for="(type, index) in types.list"
|
|
>{{ type.name }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 研究形式 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="研究形式"
|
|
>
|
|
<a-select
|
|
placeholder="请选择研究形式"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'shape'
|
|
]"
|
|
>
|
|
<a-select-option :key="type.id" :value="type.id" v-for="type in shapes">{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 应用状态 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="应用状态"
|
|
>
|
|
<a-select
|
|
placeholder="请选择应用状态"
|
|
style="width:100%"
|
|
v-decorator="[
|
|
'situation'
|
|
]"
|
|
>
|
|
<a-select-option
|
|
:key="type.id"
|
|
:value="type.id"
|
|
v-for="type in situations"
|
|
>{{ type.value }}</a-select-option>
|
|
</a-select>
|
|
</a-form-item>
|
|
<!-- 专利类型 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="专利类型"
|
|
>
|
|
<a-input
|
|
placeholder="请输入专利类型"
|
|
v-decorator="[
|
|
'style'
|
|
]"
|
|
/>
|
|
</a-form-item>
|
|
<!-- 简介 -->
|
|
<a-form-item
|
|
:label-col="formItemLayout.labelCol"
|
|
:wrapper-col="formItemLayout.wrapperCol"
|
|
label="简介"
|
|
required
|
|
>
|
|
<quill-editor :max-size="maxSize" :placeholder="placeholder" @changeInput="changeInput" />
|
|
</a-form-item>
|
|
|
|
<a-form-item class="d-flex flex-row-reverse">
|
|
<a-button @click="$emit('closeModal')" class="mr-3">取消</a-button>
|
|
<a-button class="white--text" html-type="submit" type="primary">保存</a-button>
|
|
</a-form-item>
|
|
</a-form>
|
|
</a-modal>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { upload, selResAdd } from 'config/api';
|
|
import { mapActions } from 'vuex';
|
|
import QuillEditor from 'components/QuillEditor/QuillEditor.vue';
|
|
import addMixin from './mixins/addMixin.js';
|
|
|
|
const formItemLayout = {
|
|
labelCol: { span: 6 },
|
|
wrapperCol: { span: 16 },
|
|
};
|
|
const tailItemLayout = { wrapperCol: { span: 16, offset: 6 } };
|
|
|
|
export default {
|
|
name: 'DevelopmentAdd',
|
|
props: { visible: { type: Boolean, default: false }, typeLists: { type: Array, default: () => [] } },
|
|
components: { QuillEditor },
|
|
mixins: [addMixin],
|
|
data() {
|
|
return {
|
|
formItemLayout,
|
|
tailItemLayout,
|
|
form: this.$form.createForm(this, { name: 'development-add' }),
|
|
upload: upload,
|
|
fileList: [],
|
|
//限制文件上传的格式和大小
|
|
beforeUpload: file => {
|
|
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
|
|
if (!isJpgOrPng) {
|
|
this.$message.error('仅支持 JPG/PNG 格式的图片!');
|
|
}
|
|
return isJpgOrPng;
|
|
},
|
|
types: [],
|
|
maxSize: 2048,
|
|
content: '',
|
|
placeholder: '请输入...',
|
|
domain: [], // 所属领域
|
|
reason: [], // 未应用原因
|
|
};
|
|
},
|
|
|
|
async created() {
|
|
const params = {
|
|
param: {
|
|
pageNum: 1,
|
|
pageSize: 10,
|
|
model: 2,
|
|
},
|
|
};
|
|
this.types = await this.getSelModelSearch(params);
|
|
},
|
|
|
|
methods: {
|
|
...mapActions(['getSelModelSearch']),
|
|
|
|
// 多选最多两项(所属领域、未应用原因)
|
|
onChange(checkedValues, arr, type) {
|
|
this[type] = checkedValues;
|
|
this[arr][checkedValues[0]].disabled = false;
|
|
if (checkedValues.length < 2) {
|
|
for (let i = 0; i < this[arr].length; i++) {
|
|
const item = this[arr][i];
|
|
item.disabled = false;
|
|
}
|
|
}
|
|
if (checkedValues.length > 1) {
|
|
for (let i = 0; i < this[arr].length; i++) {
|
|
const item = this[arr][i];
|
|
item.disabled = true;
|
|
for (let j = 0; j < checkedValues.length; j++) {
|
|
const element = checkedValues[j];
|
|
if (item.id === element) {
|
|
item.disabled = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
// 上传图片
|
|
handleChange(info) {
|
|
if (info.file.status === 'done') {
|
|
this.fileList.push(info.file.response.data[0].id);
|
|
} else if (info.file.status === 'removed') {
|
|
this.fileList = info.fileList;
|
|
}
|
|
},
|
|
|
|
// 修改内容
|
|
changeInput(value) {
|
|
this.content = value;
|
|
},
|
|
|
|
// 简介必填验证
|
|
verificationContent() {
|
|
if (this.content === '') {
|
|
this.$message.error('请输入简介');
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
// 提交表单
|
|
handleSubmit(e) {
|
|
e.preventDefault();
|
|
this.form.validateFieldsAndScroll(async (err, values) => {
|
|
if (!err) {
|
|
try {
|
|
if (!this.verificationContent()) return;
|
|
const { fileList, domain, reason, content } = this;
|
|
const params = { param: values };
|
|
params.param.pic = fileList[0];
|
|
params.param.content = content;
|
|
if (domain && domain.length > 0) {
|
|
params.param.domainone = domain[0];
|
|
params.param.domaintwo = domain[1] ? domain[1] : '';
|
|
}
|
|
if (reason && reason.length > 0) {
|
|
params.param.reansonone = reason[0];
|
|
params.param.reansontwo = reason[1] ? reason[1] : '';
|
|
}
|
|
const res = await selResAdd(params);
|
|
const { data, msg, code } = res.data;
|
|
// 清除新建项目标志数据
|
|
if (code === 200) {
|
|
this.$message.success('添加成功');
|
|
this.$emit('handleTableChange');
|
|
} else {
|
|
throw msg;
|
|
}
|
|
this.$emit('closeModal');
|
|
} catch (error) {
|
|
this.$emit('closeModal');
|
|
this.$message.error(error || '添加成果失败');
|
|
}
|
|
}
|
|
});
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="stylus"></style>
|
|
|