lrf402788946 4 år sedan
förälder
incheckning
ccde111d23

+ 7 - 0
src/router/index.js

@@ -207,6 +207,13 @@ const live = [
         meta: { title: '完成问卷调查' },
         meta: { title: '完成问卷调查' },
         component: () => import('../views/questionnaire/detail.vue'),
         component: () => import('../views/questionnaire/detail.vue'),
       },
       },
+      // 科技创新能力评价
+      {
+        path: '/newteck/index',
+        name: 'newteck',
+        meta: { title: '科技创新能力评价' },
+        component: () => import('../views/newTeck/index.vue'),
+      },
     ],
     ],
   },
   },
 ];
 ];

+ 162 - 0
src/views/newTeck/fields.js

@@ -0,0 +1,162 @@
+const fields = [
+  { label: '企业名称', model: 'company' },
+  {
+    label: '企业类型',
+    model: 'company_type',
+    list: 'companyType',
+    type: 'select',
+  },
+  { label: '所属行业', model: 'profession' },
+  { label: '成立时间', model: 'create_date', list: 'time', type: 'select' },
+  { label: '企业人数', model: 'number', list: 'number', type: 'select' },
+  { label: '企业所处发展阶段', model: 'parts', list: 'parts', type: 'select' },
+  { label: '行业内排名', model: 'order', list: 'order', type: 'select' },
+
+  {
+    label: '企业知识产权情况',
+    model: 'zscq',
+    type: 'object',
+    children: [
+      { label: 'PCT申请数', model: 'pctNum', list: 'zscqNum', type: 'select' },
+      { label: '授权知识产权', model: 'zscqNum', list: 'zscqNum', type: 'select' },
+      { label: '已实施知识产权数', model: 'useZscq', list: 'zscqNum', type: 'select' },
+      { label: '上年度专利许可与转让收入', model: 'in', list: 'zlIn', type: 'select', labelWidth: '180px' },
+      { label: '上年度新产品销售额', model: 'sell', list: 'productIn', type: 'select', labelWidth: '170px' },
+    ],
+  },
+  {
+    label: '企业负责人',
+    model: 'responder',
+    type: 'object',
+    children: [
+      { label: '与公司关系', model: 'relation', list: 'chargeRelation', type: 'select' },
+      { label: '年龄', model: 'age', list: 'age', type: 'select' },
+      { label: '学历', model: 'edu', list: 'edu', type: 'select' },
+      { label: '技术职称', model: 'teckRank', list: 'teckRank', type: 'select' },
+      { label: '专业', model: 'major', list: 'major', type: 'select' },
+      { label: '专业与公司契合度', model: 'agreePer', list: 'agreePer', type: 'select' },
+    ],
+  },
+  {
+    label: '企业研发团队',
+    model: 'group',
+    type: 'array',
+    children: [
+      { label: '技术团队负责人', model: 'charge', list: 'gCharge', type: 'select' },
+      { label: '年龄', model: 'age', list: 'age', type: 'select' },
+      { label: '学历', model: 'edu', list: 'edu', type: 'select' },
+      { label: '技术职称', model: 'teckRank', list: 'teckRank', type: 'select' },
+      { label: '专业', model: 'major', list: 'major', type: 'select' },
+      { label: '专业与公司契合度', model: 'agreePer', list: 'agreePer', type: 'select' },
+    ],
+  },
+  {
+    label: '企业技术顾问团队',
+    model: 'gw_group',
+    type: 'object',
+    children: [
+      { label: '技术顾问团', model: 'gnum', list: 'gwNum', type: 'select' },
+      { label: '平均年龄', model: 'age', list: 'age', type: 'select' },
+      { label: '最高学历', model: 'edu', list: 'edu', type: 'select' },
+      { label: '最高技术职称', model: 'teckRank', list: 'teckRank', type: 'select' },
+      { label: '专业', model: 'major', list: 'major', type: 'select' },
+      { label: '专业与公司契合度', model: 'agreePer', list: 'agreePer', type: 'select' },
+    ],
+  },
+  {
+    label: '近三年研发投入',
+    model: 'put_in',
+    type: 'object',
+    children: [
+      { label: '年均技改投人', model: 'yearCost', list: 'cost1', type: 'select' },
+      { label: '年均外部研发支出', model: 'yearOutCost', list: 'cost1', type: 'select' },
+      { label: '年均政府支持经费(研发补贴)', model: 'yearZfCost', list: 'cost1', type: 'select' },
+      { label: '年均研发加计扣除额', model: 'yearMinCost', list: 'cost2', type: 'select', labelWidth: '160px' },
+      { label: '年均研发人员培训费', model: 'yearTrainCost', list: 'cost3', type: 'select', labelWidth: '160px' },
+      { label: '年均研发人员占比', model: 'costPer', list: 'costPer', type: 'select' },
+    ],
+  },
+  {
+    label: '近三年研发成效',
+    model: 'effect',
+    type: 'object',
+    children: [
+      { label: '自主申报知识产权数', model: 'selfZscq', list: 'effect', type: 'select', labelWidth: '160px' },
+      { label: '企业自立科技项目数', model: 'comProject', list: 'effect', type: 'select', labelWidth: '160px' },
+      { label: '获得市级以上科技项目数', model: 'SjProject', list: 'effect', type: 'select', labelWidth: '170px' },
+      { label: '获得市级以上科技奖励数', model: 'SjAward', list: 'effect', type: 'select', labelWidth: '170px' },
+      { label: '自主开发新产品数', model: 'selfProject', list: 'effect', type: 'select', labelWidth: '160px' },
+      { label: '与高校院所技术合作', model: 'SchoolProject', list: 'effect', type: 'select', labelWidth: '160px' },
+      { label: '与产业链关联企业技术合作', model: 'chainProject', list: 'effect', type: 'select', labelWidth: '180px' },
+      { label: '购买(获得许可)知识产权', model: 'buyZscq', list: 'effect', type: 'select', labelWidth: '180px' },
+    ],
+  },
+  {
+    label: '新产品开发来源',
+    model: 'dev_source',
+    type: 'checkbox',
+    list: 'source',
+  },
+  {
+    label: '科技新品发展战略',
+    model: 'dev_route',
+    type: 'checkbox',
+    list: 'route',
+  },
+  {
+    label: '新品研发效率',
+    model: 'dev_efficiency',
+    type: 'object',
+    children: [
+      { label: '新品研发速度', model: 'eSpeed', list: 'eSpeed', type: 'select', labelWidth: '160px' },
+      { label: '新品的创新质量', model: 'eQuality', list: 'eQuality', type: 'select', labelWidth: '160px' },
+      { label: '新品的市场可替代性', model: 'eReplaceable', list: 'eReplaceable', type: 'select', labelWidth: '160px' },
+      { label: '产品开发周期', model: 'ePeriod', list: 'ePeriod', type: 'select', labelWidth: '160px' },
+      { label: '新产品开发成功率', model: 'rate', list: 'rate', type: 'select', labelWidth: '160px' },
+      { label: '新产品利润/新产品销售额', model: 'ePer', list: 'ePer', type: 'select', labelWidth: '180px' },
+    ],
+  },
+  {
+    label: '对外技术合作方式',
+    model: 'out_way',
+    type: 'checkbox',
+    list: 'way',
+  },
+  {
+    label: '对外技术合作缘由',
+    model: 'out_reason',
+    type: 'checkbox',
+    list: 'reason',
+  },
+  {
+    label: '对外技术合作内容',
+    model: 'out_content',
+    type: 'checkbox',
+    list: 'content',
+  },
+  {
+    label: '对外技术需求',
+    model: 'out_require',
+    type: 'checkbox',
+    list: 'require',
+  },
+  {
+    label: '对外技术使用方式',
+    model: 'out_use',
+    type: 'checkbox',
+    list: 'use',
+  },
+  {
+    label: '外来技术实用度',
+    model: 'out_applied',
+    type: 'object',
+    children: [
+      { label: '直接应用占比', model: 'aDirect', list: 'aDirect', type: 'select', labelWidth: '160px' },
+      { label: '需进一步开发才能应用占比', model: 'aNext', list: 'aNext', type: 'select', labelWidth: '180px' },
+      { label: '纯基础理论研究范畴', model: 'aBase', list: 'aBase', type: 'select', labelWidth: '160px' },
+      { label: '技术不能应用', model: 'aCant', list: 'aCant', type: 'select', labelWidth: '160px' },
+    ],
+  },
+];
+
+export default fields;

+ 84 - 0
src/views/newTeck/index.vue

@@ -0,0 +1,84 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <div class="w_1200">
+          <el-form label-position="left" label-width="130px">
+            <template v-for="(f, fi) in fields">
+              <template v-if="!f.type || f.type === 'input'">
+                <inputs :key="`inputs-${fi}`" :label="f.label" v-model="form[f.model]"></inputs>
+              </template>
+              <template v-if="f.type === 'select'">
+                <selects :key="`selects-${fi}`" :label="f.label" v-model="form[f.model]" :list="f.list"></selects>
+              </template>
+              <template v-if="f.type === 'object'">
+                <obj :key="`obj-${fi}`" :label="f.label" v-model="form[f.model]" :model="f.model" :children="f.children"></obj>
+              </template>
+              <template v-if="f.type === 'array'">
+                <arr :key="`arr-${fi}`" :label="f.label" v-model="form[f.model]" :model="f.model" :children="f.children"></arr>
+              </template>
+              <template v-if="f.type === 'checkbox'">
+                <checks :key="`checks-${fi}`" :label="f.label" v-model="form[f.model]" :list="f.list"></checks>
+              </template>
+            </template>
+          </el-form>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import fields from './fields.js';
+import arr from './input/arr.vue';
+import obj from './input/obj.vue';
+import inputs from './input/inputs.vue';
+import selects from './input/selects.vue';
+import checks from './input/checks.vue';
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'index',
+  props: {},
+  components: { inputs, selects, checks, obj, arr },
+  data: function() {
+    return {
+      form: {
+        zscq: {},
+        responder: {},
+        group: [],
+        gw_group: {},
+        put_in: {},
+        effect: {},
+        dev_source: [],
+        dev_route: [],
+        dev_efficiency: {},
+        out_way: [],
+        out_reason: [],
+        out_content: [],
+        out_require: [],
+        out_use: [],
+        out_applied: {},
+      },
+      fields: fields,
+    };
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 15px 0;
+}
+</style>

+ 101 - 0
src/views/newTeck/input/arr.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="arr">
+    <el-row>
+      <el-col :span="24">
+        <el-form-item :label="label" v-bind="$attrs">
+          <el-button size="mini" type="primary" icon="el-icon-plus" @click="toAdd">添加</el-button>
+        </el-form-item>
+      </el-col>
+      <el-col :span="22" :offset="2">
+        <el-table :data="value" border>
+          <el-table-column align="center" v-for="(i, index) in children" :key="`${model}-column-${index}`" :label="i.label" :prop="i.model"></el-table-column>
+          <el-table-column align="center" label="操作">
+            <template v-slot="{ row, $index }">
+              <el-link type="danger" :underline="false" size="mini" @click="toDelete($index)">删除</el-link>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+    <el-dialog :visible.sync="dialog" center width="40%" title="信息" destroy-on-close @close="handleClose">
+      <el-form label-position="left" label-width="130px">
+        <template v-for="(f, fi) in children">
+          <template v-if="!f.type || f.type === 'input'">
+            <inputs :key="`${model}-inputs-${fi}`" :label="f.label" v-model="form[f.model]" :label-width="f.labelWidth"></inputs>
+          </template>
+          <template v-if="f.type === 'select'">
+            <selects
+              :key="`${model}-selects-${fi}`"
+              :label="f.label"
+              v-model="form[f.model]"
+              :list="f.list"
+              v-bind="$attrs"
+              :label-width="f.labelWidth"
+            ></selects>
+          </template>
+        </template>
+        <el-row type="flex" justify="center">
+          <el-col :span="4">
+            <el-button type="primary" size="mini" @click="toSave">保存</el-button>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import inputs from './inputs.vue';
+import selects from './selects.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'arr',
+  props: {
+    label: String,
+    model: String,
+    children: Array,
+    value: { type: Array },
+  },
+  model: {
+    prop: 'value',
+    event: 'change',
+  },
+  components: { inputs, selects },
+  data: function() {
+    return {
+      dialog: false,
+      form: {},
+    };
+  },
+  created() {},
+  methods: {
+    toAdd() {
+      this.dialog = true;
+    },
+    toSave() {
+      const dup = _.cloneDeep(this.form);
+      this.value.push(dup);
+      this.handleClose();
+    },
+    toDelete(index) {
+      this.value.splice(index, 1);
+    },
+    handleClose() {
+      this.dialog = false;
+      this.form = {};
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 62 - 0
src/views/newTeck/input/checks.vue

@@ -0,0 +1,62 @@
+<template>
+  <div id="checks">
+    <el-form-item :label="label" v-bind="$attrs">
+      <el-select
+        :value="value"
+        multiple
+        collapse-tags
+        @change="$emit('change', $event)"
+        v-bind="$attrs"
+        v-on="$listeners"
+        :placeholder="`请选择${label}`"
+        style="width:50%"
+      >
+        <el-option v-for="(i, index) in options" :key="`${list}-${index}`" :lable="i" :value="i"></el-option>
+      </el-select>
+      <!-- <el-checkbox-group :value="value" @change="toChange">
+        <el-checkbox v-for="(i, index) in options" :key="`${list}-${index}`" :label="i">{{ i }}</el-checkbox>
+      </el-checkbox-group> -->
+    </el-form-item>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import * as dirs from '../select';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'checks',
+  props: {
+    label: String,
+    value: { type: Array },
+    list: String,
+  },
+  model: {
+    prop: 'value',
+    event: 'change',
+  },
+  components: {},
+  data: function() {
+    return {
+      options: _.get(dirs, this.list),
+    };
+  },
+  created() {},
+  methods: {
+    toChange(data) {
+      this.$emit('change', data);
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 40 - 0
src/views/newTeck/input/inputs.vue

@@ -0,0 +1,40 @@
+<template>
+  <div id="inputs">
+    <el-form-item :label="label" v-bind="$attrs">
+      <el-input v-bind="$attrs" v-on="$listeners" :value="value" @input="$emit('input', $event)" :placeholder="`请填写${label}`"></el-input>
+    </el-form-item>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'inputs',
+  props: {
+    label: String,
+    value: { type: String },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    toInput(data) {
+      console.log(data);
+      this.$emit('input', data);
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 60 - 0
src/views/newTeck/input/obj.vue

@@ -0,0 +1,60 @@
+<template>
+  <div id="obj">
+    <el-row>
+      <el-col :span="24">
+        <el-form-item :label="label" v-bind="$attrs"> </el-form-item>
+      </el-col>
+      <el-col :span="23" :offset="1" v-for="(f, fi) in children" :key="`${model}-child-${fi}`">
+        <template v-if="!f.type || f.type === 'input'">
+          <inputs :key="`${model}-inputs-${fi}`" :label="f.label" v-model="value[f.model]" :label-width="f.labelWidth"></inputs>
+        </template>
+        <template v-if="f.type === 'select'">
+          <selects
+            :key="`${model}-selects-${fi}`"
+            :label="f.label"
+            v-model="value[f.model]"
+            :list="f.list"
+            v-bind="$attrs"
+            :label-width="f.labelWidth"
+          ></selects>
+        </template>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import inputs from './inputs.vue';
+import selects from './selects.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'obj',
+  props: {
+    label: String,
+    model: String,
+    children: Array,
+    value: { type: Object },
+  },
+  model: {
+    prop: 'value',
+    event: 'change',
+  },
+  components: { inputs, selects },
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 46 - 0
src/views/newTeck/input/selects.vue

@@ -0,0 +1,46 @@
+<template>
+  <div id="selects">
+    <el-form-item :label="label" v-bind="$attrs">
+      <el-select :value="value" @change="$emit('change', $event)" v-bind="$attrs" v-on="$listeners" :placeholder="`请选择${label}`">
+        <el-option v-for="(i, index) in options" :key="`${list}-${index}`" :lable="i" :value="i"></el-option>
+      </el-select>
+    </el-form-item>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import * as dirs from '../select';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'selects',
+  props: {
+    label: String,
+    value: { type: String },
+    list: String,
+  },
+  model: {
+    prop: 'value',
+    event: 'change',
+  },
+  components: {},
+  data: function() {
+    return {
+      options: _.get(dirs, this.list),
+    };
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 78 - 0
src/views/newTeck/select.js

@@ -0,0 +1,78 @@
+const companyType = ['国有/国有控股企业', '民营/私人控股企业', '外商独资/合资企业', '上市公司', '家族企业', '高新技术企业'];
+const time = ['3年以内', '3—5年', '5—10年', '10年以上'];
+const number = ['50人以内', '50—200人', '200—1000人', '1000人以上'];
+const parts = ['投入阶段', '成长阶段', '稳定发展阶段', '举步维艰阶段', '入不敷出阶段'];
+const order = ['前10%', '前30%', '50%左右', '后30%', '后10%', '独占/特许经营'];
+const zscqNum = ['0件', '1-3件', '3—5件', '5—10件', '10件以上'];
+const zlIn = ['300万以内', '300万—2000万', '2000万—5000万', '5000万—2亿', '2亿以上'];
+const productIn = ['1000万以内', '1000万—5000万', '5000万—2亿', '2亿以上'];
+const chargeRelation = ['合伙人', '创始人', '职业经理人', '家族企业'];
+const age = ['30岁以下', '31—35', '36—40', '41—45', '46—50', '51—55', '56—60', '60以上'];
+const edu = ['大专以下', '大专', '本科', '硕士', '博士'];
+const teckRank = ['中级以下', '中级', '副高级', '正高级', '杰青/长江学者/院士'];
+const major = ['理学', '工学', '医学', '农学'];
+const agreePer = ['90%以上', '80—90%', '60—79%', '30—59%', '30%以下'];
+const gCharge = ['有研发副总', '无研发副总,有技术总监', '无研发副总、无技术总监,有技术负责人', '无技术团队'];
+const gwNum = ['无顾问团队', '3人以下', '3—7人', '7人以上'];
+const cost1 = ['50万以下', '50—300万', '300—1000万', '1000万以上'];
+const cost2 = ['50万以下', '50—200万', '200—500万', '500万以上'];
+const cost3 = ['50万以下', '50—200万', '200万以上'];
+const costPer = ['5%以内', '5—10%', '11—30%', '31—50%', '50%以上'];
+const effect = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '10个以上'];
+const source = ['企业领导人的创造力', '产品用户市场的需求反馈', '同类产品的竞争所致', '技术合作方的技术突破', '一直引领行业发展'];
+const route = ['重视产品核心技术开发', '设计企业科技项目(技改)', '自主申报知识产权', '紧随产品市场技术需求', '购置(租用)技术研发设备'];
+const eSpeed = ['开发时间远远早于预定时间', '开发速度远远高于行业标准', '开发速度远远快于预期', '开发时间远远低于标准的产品开发时间'];
+const eQuality = ['在行业内非常具有新颖性', '为行业内新品开发提供了新创意', '开发的新产品具有创造性', '有能力来为其他的产品生成创意'];
+const eReplaceable = ['完全替代', '基本替代', '市场共存', '还需进一步研制', '市场预研'];
+const ePeriod = ['一个月内', '一个季度内', '半年内', '一年内', '二年', '三年', '三年以上'];
+const rate = ['100%', '90%', '80%', '70%', '60%', '50%', '50%以下'];
+const ePer = ['10%以内', '11—20%', '21—30%', '31—50%', '50%以上'];
+const way = ['技术开发', '委托开发', '技术合作', '技术咨询', '技术培训', '技术服务'];
+const reason = ['熟人接洽', '长期合作', '技术征集揭榜', '师生情怀', '政府对接', '线上对接', '中介机构对接', '专场对接'];
+const content = ['共同申报知识产权', '共同承担科技项目', '共建实验室', '共建技术中心', '互为教育实践基地', '共享科研设备'];
+const require = ['紧跟市场,赶超同类产品', '产品性能提高', '产品产能提高', '节能降耗', '满足特殊条件要求,实际不需要', '生产企业,无技术开发能力'];
+const use = ['专利(技术)授权独占', '专利(技术)许可', '专利(技术)购买', '合作建立专利池(长期合作)'];
+const aDirect = ['10%以下', '11—30%', '31—50%', '51—80%', '80%以上'];
+const aNext = ['10%以下', '11—30%', '31—50%', '51—80%', '80%以上'];
+const aBase = ['理论研究', '技术预研', '技术储备', '工业性实验前成果'];
+const aCant = ['缺乏资金支持', '缺乏技术配套', '缺乏生产条件', '缺乏技术团队'];
+export {
+  companyType,
+  time,
+  number,
+  parts,
+  order,
+  zscqNum,
+  zlIn,
+  productIn,
+  chargeRelation,
+  age,
+  edu,
+  teckRank,
+  major,
+  agreePer,
+  gCharge,
+  gwNum,
+  cost1,
+  cost2,
+  cost3,
+  costPer,
+  effect,
+  source,
+  route,
+  eSpeed,
+  eQuality,
+  eReplaceable,
+  ePeriod,
+  rate,
+  ePer,
+  way,
+  reason,
+  content,
+  require,
+  use,
+  aDirect,
+  aNext,
+  aBase,
+  aCant,
+};