浏览代码

证书资料上传

guhongwei 3 年之前
父节点
当前提交
1b198a48d7

+ 3 - 0
src/components/common/Sidebar.vue

@@ -100,6 +100,7 @@ export default {
           { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
           { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
           { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
           { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
           { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
           { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
+          { icon: 'el-icon-postcard', index: '/adminCertFile', title: '证书资料管理' },
         ];
         ];
         list.push(...data);
         list.push(...data);
         this.$set(this, `items`, _.uniqBy(list, 'index'));
         this.$set(this, `items`, _.uniqBy(list, 'index'));
@@ -112,6 +113,7 @@ export default {
           { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
           { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
           { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
           { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
           { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
           { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
+          { icon: 'el-icon-postcard', index: '/adminCertFile', title: '证书资料管理' },
         ];
         ];
         list.push(...data);
         list.push(...data);
         this.$set(this, `items`, _.uniqBy(list, 'index'));
         this.$set(this, `items`, _.uniqBy(list, 'index'));
@@ -142,6 +144,7 @@ export default {
           { num: 'pf', icon: 'el-icon-postcard', index: '/userExpertScore', title: '专家评分' },
           { num: 'pf', icon: 'el-icon-postcard', index: '/userExpertScore', title: '专家评分' },
           { num: 'hs', icon: 'el-icon-postcard', index: '/userExpertMeet', title: '专家会审' },
           { num: 'hs', icon: 'el-icon-postcard', index: '/userExpertMeet', title: '专家会审' },
           { num: 'zs', icon: 'el-icon-medal', index: '/userCert', title: '证书管理' },
           { num: 'zs', icon: 'el-icon-medal', index: '/userCert', title: '证书管理' },
+          { num: 'zsfl', icon: 'el-icon-medal', index: '/userCertFile', title: '证书资料管理' },
         ];
         ];
         list.push(...data);
         list.push(...data);
         this.$set(this, `items`, _.uniqBy(list, 'index'));
         this.$set(this, `items`, _.uniqBy(list, 'index'));

+ 10 - 0
src/router/index.js

@@ -109,6 +109,11 @@ export default new Router({
           component: () => import('../views/adminCenter/adminHaveCert/index.vue'),
           component: () => import('../views/adminCenter/adminHaveCert/index.vue'),
           meta: { title: '已证书发放' },
           meta: { title: '已证书发放' },
         },
         },
+        {
+          path: '/adminCertFile',
+          component: () => import('../views/adminCenter/adminCertFile/index.vue'),
+          meta: { title: '证书资料管理' },
+        },
         {
         {
           path: '/adminApplyExpert',
           path: '/adminApplyExpert',
           component: () => import('../views/adminCenter/adminApplyExpert/index.vue'),
           component: () => import('../views/adminCenter/adminApplyExpert/index.vue'),
@@ -261,6 +266,11 @@ export default new Router({
           component: () => import('../views/userCenter/userCert/index.vue'),
           component: () => import('../views/userCenter/userCert/index.vue'),
           meta: { title: '证书管理' },
           meta: { title: '证书管理' },
         },
         },
+        {
+          path: '/userCertFile',
+          component: () => import('../views/userCenter/userCertFile/index.vue'),
+          meta: { title: '证书资料管理' },
+        },
         // 个人中心-公共组件
         // 个人中心-公共组件
         // 资料信息
         // 资料信息
         {
         {

+ 3 - 0
src/store/index.js

@@ -20,6 +20,8 @@ import verifyRecord from '@common/src/store/achieve/achieve_verify_record.js';
 import achieveExpert from '@common/src/store/achieve/achieve_expert.js';
 import achieveExpert from '@common/src/store/achieve/achieve_expert.js';
 // 临时专家分配的任务
 // 临时专家分配的任务
 import achieveApplyExpert from '@common/src/store/achieve/achieve_apply_expert.js';
 import achieveApplyExpert from '@common/src/store/achieve/achieve_apply_expert.js';
+// 证书资料
+import achieve_cert from '@common/src/store/achieve/achieve_cert.js';
 
 
 Vue.use(Vuex);
 Vue.use(Vuex);
 
 
@@ -37,5 +39,6 @@ export default new Vuex.Store({
     verifyRecord,
     verifyRecord,
     achieveExpert,
     achieveExpert,
     achieveApplyExpert,
     achieveApplyExpert,
+    achieve_cert,
   },
   },
 });
 });

+ 64 - 1
src/views/adminCenter/adminCate/index.vue

@@ -14,7 +14,17 @@
               </data-table>
               </data-table>
             </el-tab-pane>
             </el-tab-pane>
             <el-tab-pane label="证书发放" name="second">
             <el-tab-pane label="证书发放" name="second">
-              <data-table :fields="fields" :opera="opera" :data="certList" :total="certTotal" @query="search" @file="toFile" @load="toLoad" @cert="toCert">
+              <data-table
+                :fields="fields"
+                :opera="opera"
+                :data="certList"
+                :total="certTotal"
+                @query="search"
+                @file="toFile"
+                @load="toLoad"
+                @cert="toCert"
+                @upfile="toUpfile"
+              >
                 <template #custom="{item,row}">
                 <template #custom="{item,row}">
                   <template v-if="item.prop === 'basic.achieve_num'">
                   <template v-if="item.prop === 'basic.achieve_num'">
                     <el-link size="mini" type="primary" @click="toApply(row)">{{ getProps(row, item.prop) }}</el-link>
                     <el-link size="mini" type="primary" @click="toApply(row)">{{ getProps(row, item.prop) }}</el-link>
@@ -60,16 +70,23 @@
     <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
     <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
       <detail :form="apply"></detail>
       <detail :form="apply"></detail>
     </el-dialog>
     </el-dialog>
+    <el-dialog title="证书资料" center width="30%" :close-on-click-modal="false" :visible.sync="certShow" destroy-on-close @closed="certClose">
+      <certform-1 :form="certForm" @onSubmit="certSubmit"></certform-1>
+    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 const _ = require('lodash');
 const _ = require('lodash');
 import detail from '../parts/detail.vue';
 import detail from '../parts/detail.vue';
+import certform1 from '../parts/certform-1.vue';
 import dataTable from '@common/src/components/frame/filter-page-table.vue';
 import dataTable from '@common/src/components/frame/filter-page-table.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
 const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
 const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
 const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: achieve_cert } = createNamespacedHelpers('achieve_cert');
+
 export default {
 export default {
   metaInfo() {
   metaInfo() {
     return { title: this.$route.meta.title };
     return { title: this.$route.meta.title };
@@ -79,6 +96,7 @@ export default {
   components: {
   components: {
     dataTable,
     dataTable,
     detail,
     detail,
+    certform1,
   },
   },
   data: function() {
   data: function() {
     return {
     return {
@@ -98,6 +116,11 @@ export default {
           method: 'cert',
           method: 'cert',
           display: i => i.status === '6',
           display: i => i.status === '6',
         },
         },
+        {
+          label: '上传证书资料',
+          method: 'upfile',
+          display: i => i.status === '6',
+        },
       ],
       ],
       fields: [
       fields: [
         { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
         { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
@@ -116,6 +139,9 @@ export default {
       // 证书发放
       // 证书发放
       certList: [],
       certList: [],
       certTotal: 0,
       certTotal: 0,
+      // 证书资料
+      certShow: false,
+      certForm: {},
     };
     };
   },
   },
   async created() {
   async created() {
@@ -124,6 +150,8 @@ export default {
   methods: {
   methods: {
     ...achieveApply(['query']),
     ...achieveApply(['query']),
     ...verifyRecord({ create: 'create', getRecord: 'query' }),
     ...verifyRecord({ create: 'create', getRecord: 'query' }),
+    ...personal({ personalFetch: 'fetch' }),
+    ...achieve_cert({ certQuery: 'query', certCreate: 'create', certUpdate: 'update' }),
     // 查询列表
     // 查询列表
     async search({ skip = 0, limit = 10, ...info } = {}) {
     async search({ skip = 0, limit = 10, ...info } = {}) {
       let res = await this.query({ skip, limit, ...info, status: '5' });
       let res = await this.query({ skip, limit, ...info, status: '5' });
@@ -200,6 +228,41 @@ export default {
       this.applyDialog = false;
       this.applyDialog = false;
       this.apply = {};
       this.apply = {};
     },
     },
+    // 上传证书资料
+    async toUpfile({ data }) {
+      let arr = {};
+      let res = await this.certQuery({ apply_id: data._id, user_id: data.user_id });
+      if (this.$checkRes(res)) {
+        if (res.total > 0) {
+          arr = res.data[0];
+        } else {
+          let wer = await this.personalFetch(data.user_id);
+          if (this.$checkRes(wer)) {
+            arr = {
+              user_id: wer.data._id,
+              user_name: wer.data.name,
+              apply_id: data._id,
+              apply_name: data.basic.achieve_name,
+            };
+          }
+        }
+      }
+      this.$set(this, `certForm`, arr);
+      this.certShow = true;
+    },
+    // 提交上传证书资料
+    async certSubmit({ data }) {
+      let res;
+      if (data.id) await this.certUpdate(data);
+      else await this.certCreate(data);
+      if (this.$checkRes(res, '保存成功', '保存失败')) this.certClose();
+    },
+    // 关闭
+    certClose() {
+      this.certForm = {};
+      this.certShow = false;
+      this.search();
+    },
   },
   },
   computed: {
   computed: {
     ...mapState(['user']),
     ...mapState(['user']),

+ 139 - 0
src/views/adminCenter/adminCertFile/index.vue

@@ -0,0 +1,139 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-button type="primary" size="mini" @click="toAdd()">添加</el-button>
+        </el-col>
+        <el-col :span="24">
+          <data-table @query="search" :fields="fields" :opera="opera" :data="list" :total="total" @download="toDownload" @edit="toEdit" @del="toDel">
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="证书资料" center width="30%" :close-on-click-modal="false" :visible.sync="certShow" destroy-on-close @closed="certClose">
+      <form-1 :form="form" @onSubmit="onSubmit" :userList="userList" :applyList="applyList"></form-1>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import form1 from './parts/form-1.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('achieve_cert');
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: personal } = createNamespacedHelpers('personal');
+export default {
+  name: 'index',
+  props: {},
+  components: { dataTable, form1 },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      opera: [
+        { label: '下载资料', method: 'download' },
+        { label: '修改', method: 'edit' },
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+      ],
+      fields: [
+        { label: '成果名称', prop: 'apply_name', filter: true },
+        { label: '申请人', prop: 'user_name', filter: true },
+        { label: '证书资料', prop: 'file.name' },
+        { label: '创建时间', prop: 'create_time' },
+      ],
+      // 成果
+      applyList: [],
+      // 用戶
+      userList: [],
+      // 证书资料
+      certShow: false,
+      form: {},
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    ...personal({ personalQuery: 'query' }),
+    ...achieveApply({ applyQuery: 'query' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 下载资料
+    toDownload({ data }) {
+      window.open(data.file.url);
+    },
+    // 添加
+    toAdd() {
+      this.certShow = true;
+    },
+    // 修改
+    async toEdit({ data }) {
+      let res = await this.fetch(data.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+        this.certShow = true;
+      }
+    },
+    // 删除
+    async toDel({ data }) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) if (this.$checkRes(res, '保存成功', '保存失败')) this.search();
+    },
+    // 提交
+    async onSubmit({ data }) {
+      let res;
+      if (data.id) await this.update(data);
+      else await this.create(data);
+      if (this.$checkRes(res, '保存成功', '保存失败')) this.certClose();
+    },
+    // 关闭
+    certClose() {
+      this.form = {};
+      this.certShow = false;
+      this.search();
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res = await this.applyQuery();
+      if (this.$checkRes(res)) {
+        this.$set(this, `applyList`, res.data);
+      }
+      // 用户
+      res = await this.personalQuery({ code: this.user.code });
+      if (this.$checkRes(res)) {
+        this.$set(this, `userList`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    text-align: right;
+  }
+}
+</style>

+ 111 - 0
src/views/adminCenter/adminCertFile/parts/form-1.vue

@@ -0,0 +1,111 @@
+<template>
+  <div id="certform">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+          <el-form-item label="申请人" prop="user_id">
+            <el-select v-model="form.user_id" clearable filterable placeholder="请选择" style="width:100%" @change="changeU">
+              <el-option v-for="item in userList" :key="item._id" :label="item.name" :value="item._id"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="申请成果" prop="apply_id">
+            <el-select v-model="form.apply_id" clearable filterable placeholder="请选择" style="width:100%" @change="changea">
+              <el-option v-for="item in list" :key="item._id" :label="item.basic.achieve_name" :value="item._id">
+                <span style="float: left">{{ item.basic.achieve_name }}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{ getData(item.status) }}</span>
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="证书文件" prop="file">
+            <upload :limit="1" :data="form.file" type="file" listType="" :url="'/files/live/cert/upload'" @upload="toUpload" @delete="toDelup"></upload>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onSubmit('form')">提交保存</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@common/src/components/frame/upload.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'certform',
+  props: { form: { type: Object }, userList: { type: Array }, applyList: { type: Array } },
+  components: { upload },
+  data: function() {
+    return {
+      rules: {
+        file: [{ required: true, message: '请上传文件', trigger: 'change' }],
+        user_id: [{ required: true, message: '请选择用户', trigger: 'change' }],
+      },
+      list: [],
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          this.$emit('onSubmit', { data: this.form });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 选择成果
+    changea(value) {
+      let data = this.list.find(i => i.id == value);
+      this.$set(this.form, `apply_name`, data.basic.achieve_name);
+    },
+    // 选择用户
+    changeU(value) {
+      let data = this.userList.find(i => i.id == value);
+      this.$set(this.form, `user_name`, data.name);
+      let list = this.applyList.filter(i => i.user_id == value);
+      this.$set(this, `list`, list);
+    },
+    // 图片上传
+    toUpload({ type, data }) {
+      this.$set(this.form, `${type}`, { url: data.uri, name: data.name });
+    },
+    // 删除图片
+    toDelup(data) {
+      this.$set(this.form, `${data.type}`, {});
+    },
+    // 整理数据
+    getData(type) {
+      if (type == '10') return '草稿';
+      else if (type == '0') return '待审中';
+      else if (type == '-1') return '形式审查未通过';
+      else if (type == '1') return '形式审查通过,专家初审';
+      else if (type == '-2') return '专家初审未通过';
+      else if (type == '3') return '专家初审通过,待会审';
+      else if (type == '-5') return '会审未通过';
+      else if (type == '4') return '资料完善';
+      else if (type == '5') return '资料归档';
+      else if (type == '6') return '发放证书';
+      else if (type == '7') return '已发证书';
+      else '未识别';
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 75 - 0
src/views/adminCenter/parts/certform-1.vue

@@ -0,0 +1,75 @@
+<template>
+  <div id="certform">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-form :model="form" :rules="rules" ref="form" label-width="auto">
+          <el-form-item label="申请成果" prop="apply_name">
+            <el-input v-model="form.apply_name" readonly></el-input>
+          </el-form-item>
+          <el-form-item label="申请人" prop="user_name">
+            <el-input v-model="form.user_name" readonly></el-input>
+          </el-form-item>
+          <el-form-item label="证书文件" prop="file">
+            <upload :limit="1" :data="form.file" type="file" listType="" :url="'/files/live/cert/upload'" @upload="toUpload" @delete="toDelup"></upload>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onSubmit('form')">提交保存</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@common/src/components/frame/upload.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'certform',
+  props: { form: { type: Object } },
+  components: { upload },
+  data: function() {
+    return {
+      rules: {
+        file: [{ required: true, message: '请上传文件', trigger: 'change' }],
+      },
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          this.$emit('onSubmit', { data: this.form });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 图片上传
+    toUpload({ type, data }) {
+      this.$set(this.form, `${type}`, { url: data.uri, name: data.name });
+    },
+    // 删除图片
+    toDelup(data) {
+      this.$set(this.form, `${data.type}`, {});
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 4 - 4
src/views/userCenter/common/updateParts/basic.vue

@@ -102,7 +102,7 @@ export default {
       rules: {
       rules: {
         achieve_name: [{ required: true, message: '请输入成果名称', trigger: 'blur' }],
         achieve_name: [{ required: true, message: '请输入成果名称', trigger: 'blur' }],
         achieve_type: [{ required: true, message: '请选择成果类别', trigger: 'change' }],
         achieve_type: [{ required: true, message: '请选择成果类别', trigger: 'change' }],
-        achieve_num: [{ required: false, message: '请输入成果编号', trigger: 'blur' }],
+        achieve_num: [{ required: true, message: '请输入成果编号', trigger: 'blur' }],
         achieve_date: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         achieve_date: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         achieve_form: [{ required: true, message: '请输入成果形式', trigger: 'change' }],
         achieve_form: [{ required: true, message: '请输入成果形式', trigger: 'change' }],
         apply_personal: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
         apply_personal: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
@@ -116,9 +116,9 @@ export default {
         fax: [{ required: false, message: '请输入传真', trigger: 'blur' }],
         fax: [{ required: false, message: '请输入传真', trigger: 'blur' }],
         objective: [{ required: true, message: '请输入评价目的', trigger: 'change' }],
         objective: [{ required: true, message: '请输入评价目的', trigger: 'change' }],
         stage: [{ required: true, message: '请输入成果所处阶段', trigger: 'blur' }],
         stage: [{ required: true, message: '请输入成果所处阶段', trigger: 'blur' }],
-        output: [{ required: true, message: '请输入经济效益产值', trigger: 'blur' }],
-        profit: [{ required: true, message: '请输入经济效益利润', trigger: 'blur' }],
-        revenue: [{ required: true, message: '请输入经济效益税收', trigger: 'blur' }],
+        output: [{ required: false, message: '请输入经济效益产值', trigger: 'blur' }],
+        profit: [{ required: false, message: '请输入经济效益利润', trigger: 'blur' }],
+        revenue: [{ required: false, message: '请输入经济效益税收', trigger: 'blur' }],
       },
       },
       // 成果类别
       // 成果类别
       achievetypeList: achievetype,
       achievetypeList: achievetype,

+ 81 - 0
src/views/userCenter/userCertFile/index.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <data-table @query="search" :fields="fields" :opera="opera" :data="list" :total="total" @download="toDownload"> </data-table>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('achieve_cert');
+export default {
+  name: 'index',
+  props: {},
+  components: { dataTable },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      opera: [
+        { label: '下载资料', method: 'download' },
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+      ],
+      fields: [
+        { label: '成果名称', prop: 'apply_name', filter: true },
+        { label: '申请人', prop: 'user_name' },
+        { label: '证书资料', prop: 'file.name' },
+        { label: '创建时间', prop: 'create_time' },
+      ],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      info.user_id = this.user.id;
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 下载资料
+    toDownload({ data }) {
+      window.open(data.file.url);
+    },
+
+    // 删除
+    async toDel({ data }) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) if (this.$checkRes(res, '保存成功', '保存失败')) this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    text-align: right;
+  }
+}
+</style>

+ 4 - 4
src/views/userDeclare/parts/basic.vue

@@ -102,7 +102,7 @@ export default {
       rules: {
       rules: {
         achieve_name: [{ required: true, message: '请输入成果名称', trigger: 'blur' }],
         achieve_name: [{ required: true, message: '请输入成果名称', trigger: 'blur' }],
         achieve_type: [{ required: true, message: '请选择成果类别', trigger: 'change' }],
         achieve_type: [{ required: true, message: '请选择成果类别', trigger: 'change' }],
-        achieve_num: [{ required: false, message: '请输入成果编号', trigger: 'blur' }],
+        achieve_num: [{ required: true, message: '请输入成果编号', trigger: 'blur' }],
         achieve_date: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         achieve_date: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         achieve_form: [{ required: true, message: '请输入成果形式', trigger: 'change' }],
         achieve_form: [{ required: true, message: '请输入成果形式', trigger: 'change' }],
         apply_personal: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
         apply_personal: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
@@ -116,9 +116,9 @@ export default {
         fax: [{ required: false, message: '请输入传真', trigger: 'blur' }],
         fax: [{ required: false, message: '请输入传真', trigger: 'blur' }],
         objective: [{ required: true, message: '请输入评价目的', trigger: 'change' }],
         objective: [{ required: true, message: '请输入评价目的', trigger: 'change' }],
         stage: [{ required: true, message: '请输入成果所处阶段', trigger: 'blur' }],
         stage: [{ required: true, message: '请输入成果所处阶段', trigger: 'blur' }],
-        output: [{ required: true, message: '请输入经济效益产值', trigger: 'blur' }],
-        profit: [{ required: true, message: '请输入经济效益利润', trigger: 'blur' }],
-        revenue: [{ required: true, message: '请输入经济效益税收', trigger: 'blur' }],
+        output: [{ required: false, message: '请输入经济效益产值', trigger: 'blur' }],
+        profit: [{ required: false, message: '请输入经济效益利润', trigger: 'blur' }],
+        revenue: [{ required: false, message: '请输入经济效益税收', trigger: 'blur' }],
       },
       },
       // 成果类别
       // 成果类别
       achievetypeList: achievetype,
       achievetypeList: achievetype,