lrf402788946 4 years ago
parent
commit
4def9401bc

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

@@ -115,8 +115,9 @@ export default {
         this.$set(this, `items`, _.uniqBy(list, 'index'));
       } else if (user.role === '3') {
         let data = [
-          { icon: 'el-icon-thumb', index: '/expertScore', title: '专家评分' },
-          { icon: 'el-icon-thumb', index: '/expertMeet', title: '专家会审' },
+          // { icon: 'el-icon-thumb', index: '/expertScore', title: '专家评分' },
+          // { icon: 'el-icon-thumb', index: '/expertMeet', title: '专家会审' },
+          { icon: 'el-icon-thumb', index: '/expertCenter', title: '专家审核' },
         ];
         list.push(...data);
         this.$set(this, `items`, _.uniqBy(list, 'index'));

+ 6 - 0
src/router/index.js

@@ -292,6 +292,12 @@ export default new Router({
           component: () => import('../views/userCenter/common/certDetail.vue'),
           meta: { title: '证书查看' },
         },
+        //21-04-16,专家新改
+        {
+          path: '/expertCenter',
+          component: () => import('../views/expertCenter/index.vue'),
+          meta: { title: '专家审核' },
+        },
       ],
     },
     {

+ 1 - 1
src/views/Login.vue

@@ -152,7 +152,7 @@ export default {
       const res = await this.expertLogin(dup);
       if (this.$checkRes(res)) {
         this.$message.success('登录成功');
-        this.$router.push('/homeIndex');
+        this.$router.push('/expertCenter');
       }
     },
   },

+ 51 - 17
src/views/adminCenter/adminApplyExpert/index.vue

@@ -20,10 +20,22 @@
       </el-col>
     </el-row>
     <el-dialog title="专家信息管理" :close-on-click-modal="false" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
+      <el-form :inline="true">
+        <el-form-item label="专家领域">
+          <el-select v-model="filters.expertise" placeholder="请选择专家的领域以便找到专家" filterable style="width:250px ;">
+            <el-option v-for="(i, index) in fieldsList" :key="`expertise${index}`" :label="i" :value="i"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="专家工作单位">
+          <el-select v-model="filters.company" placeholder="请选择专家的单位以便找到专家" filterable style="width:250px ;">
+            <el-option v-for="(i, index) in companyList" :key="`company${index}`" :label="i" :value="i"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
       <data-form :data="form" :fields="formfields" :rules="rules" @save="toSave" @filterReturn="expertSelect">
         <template #options="{item}">
           <template v-if="item.model === 'expert_user_id'">
-            <el-option v-for="(i, index) in expertList" :key="`expert${index}`" :label="i.name" :value="i.user_id"></el-option>
+            <el-option v-for="(i, index) in getExpert()" :key="`expert${index}`" :label="`${i.name}`" :value="i.user_id"></el-option>
           </template>
         </template>
       </data-form>
@@ -35,7 +47,6 @@
 import dataTable from '@common/src/components/frame/filter-page-table.vue';
 import dataForm from '@common/src/components/frame/form.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: expert } = createNamespacedHelpers('expert');
 const { mapActions: achieveExpert } = createNamespacedHelpers('achieveExpert');
 export default {
   name: 'index',
@@ -49,16 +60,16 @@ export default {
           method: 'edit',
           display: i => i.status === '0',
         },
-        {
-          label: '冻结',
-          method: 'delete',
-          display: i => i.status === '0',
-        },
-        {
-          label: '解冻',
-          method: 'restore',
-          display: i => i.status === '1',
-        },
+        // {
+        //   label: '冻结',
+        //   method: 'delete',
+        //   display: i => i.status === '0',
+        // },
+        // {
+        //   label: '解冻',
+        //   method: 'restore',
+        //   display: i => i.status === '1',
+        // },
       ],
       fields: [
         { label: '评价专家组职务', prop: 'group_zw' },
@@ -91,6 +102,10 @@ export default {
       // 评分详情
       info: {},
       expertList: [],
+      // 专家条件查询
+      fieldsList: [],
+      companyList: [],
+      filters: {},
     };
   },
   created() {
@@ -98,11 +113,10 @@ export default {
     this.toGetExpert();
   },
   methods: {
-    ...achieveExpert(['query', 'create', 'update', 'delete', 'restore']),
-    ...expert({ getExpert: 'query' }),
+    ...achieveExpert(['query', 'create', 'update', 'delete', 'restore', 'getExpertList']),
     // 查询列表
     async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info });
+      const res = await this.query({ skip, limit, ...info, status: '0' });
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
@@ -118,6 +132,7 @@ export default {
       let method = _.get(duplicate, '_id') ? 'update' : 'create';
       let res = await this[method](duplicate);
       if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) this.handleClose();
+      this.toGetExpert();
     },
     // 修改
     toEdit({ data }) {
@@ -158,8 +173,27 @@ export default {
     },
     // 获取专家列表
     async toGetExpert() {
-      const res = await this.getExpert();
-      if (this.$checkRes(res)) this.$set(this, 'expertList', res.data);
+      const res = await this.getExpertList();
+      if (this.$checkRes(res)) {
+        this.$set(this, 'expertList', res.data);
+        // 将专业领域和工作单位过滤出来
+        const expertise = _.uniq(res.data.map(i => i.expertise));
+        const company = _.uniq(res.data.map(i => i.company));
+        this.$set(this, `fieldsList`, expertise);
+        this.$set(this, `companyList`, company);
+      }
+    },
+    getExpert() {
+      let arr = _.cloneDeep(this.expertList);
+      if (!this.form._id) {
+        arr = arr.filter(f => !f.cant_use);
+      } else {
+        arr = arr.filter(f => !f.cant_use || f.user_id === this.form.expert_user_id);
+      }
+      const keys = Object.keys(this.filters);
+      if (keys.length == 0) return arr;
+      arr = this.expertList.filter(f => keys.every(key => this.filters[key] === f[key]));
+      return arr;
     },
   },
   computed: {

+ 75 - 0
src/views/expertCenter/detail.vue

@@ -0,0 +1,75 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <el-tabs v-model="active" type="card">
+            <el-tab-pane label="(一)基本信息" name="first">
+              <basic :info="form.basic"></basic>
+            </el-tab-pane>
+            <el-tab-pane label="(二)内容简介" name="second">
+              <brief :info="form.brief"></brief>
+            </el-tab-pane>
+            <el-tab-pane label="(三)主研人员名单" name="third">
+              <research :list="form.research"></research>
+            </el-tab-pane>
+            <el-tab-pane label="(四)评价委托方提供资料清单" name="fourth">
+              <detailed :linkInfo="form.datalist"></detailed>
+            </el-tab-pane>
+            <el-tab-pane label="(五)专家评价" name="fifth">
+              <slot></slot>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import basic from '@/views/adminCenter/adminExamine/parts/basic.vue';
+import brief from '@/views/adminCenter/adminExamine/parts/brief.vue';
+import research from '@/views/adminCenter/adminExamine/parts/research.vue';
+import detailed from '@/views/adminCenter/adminExamine/parts/detailed.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'index',
+  props: { form: { type: Object, default: () => {} } },
+  components: { basic, brief, research, detailed },
+  data: function() {
+    return {
+      active: 'first',
+    };
+  },
+  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 {
+  .down {
+    .fiveth {
+      padding: 0 20%;
+      .btn {
+        text-align: center;
+      }
+    }
+  }
+}
+.el-tabs {
+  /deep/.el-tabs__content {
+    height: 60vh;
+    overflow-y: auto;
+  }
+}
+</style>

+ 89 - 0
src/views/expertCenter/index.vue

@@ -0,0 +1,89 @@
+<template>
+  <div id="index">
+    <detail v-if="!loading" :form="detail">
+      <el-form :model="verify" :rules="{}" ref="form" label-width="100px">
+        <el-form-item label="审核评分" prop="score">
+          <el-input-number v-model="verify.score" :min="50" :max="100" label="请打分"></el-input-number>
+        </el-form-item>
+        <el-form-item label="审核建议" prop="content">
+          <el-input
+            type="textarea"
+            placeholder="请输入审核建议"
+            v-model="verify.content"
+            maxlength="200"
+            :autosize="{ minRows: 4, maxRows: 6 }"
+            show-word-limit
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="">
+          <el-button type="primary" size="mini" @click="onSubmit()">提交审核</el-button>
+        </el-form-item>
+      </el-form>
+    </detail>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from './detail.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApplyExpert } = createNamespacedHelpers('achieveApplyExpert');
+export default {
+  name: 'index',
+  props: {},
+  components: { detail },
+  data: function() {
+    return {
+      detail: {},
+      loading: true,
+      verify: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...achieveApplyExpert(['getWork', 'update']),
+    async search() {
+      const res = await this.getWork(this.user._id);
+      if (this.$checkRes(res, null, res.errmsg)) {
+        const verify = _.get(res.data, 'verify', { score: 0 });
+        this.$set(this, `detail`, _.get(res.data, 'apply_id', {}));
+        this.$set(this, `verify`, { ...verify, id: res.data._id });
+        this.loading = false;
+      }
+    },
+    onSubmit() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.toVerify();
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    async toVerify() {
+      const dup = _.cloneDeep(this.verify);
+      const { id, ...verify } = dup;
+      const res = await this.update({ id, verify });
+      if (this.$checkRes(res, '您已完成本次审核,临时账号已注销', res.errmsg || '审核失败')) {
+        localStorage.removeItem('token');
+        this.$router.push('/login');
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 2 - 2
vue.config.js

@@ -25,12 +25,12 @@ module.exports = {
         target: 'http://broadcast.waityou24.cn',
       },
       '/api/live': {
-        target: 'http://broadcast.waityou24.cn',
+        target: 'http://192.168.1.19:9101',
         changeOrigin: true,
         ws: false,
       },
       '/api/achieve': {
-        target: 'http://broadcast.waityou24.cn',
+        target: 'http://192.168.1.19:9103',
         changeOrigin: true,
         ws: false,
       },