lrf402788946 4 lat temu
rodzic
commit
0abd90d6f6

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

@@ -87,6 +87,7 @@ export default {
         this.$set(this, `items`, _.uniqBy(list, 'index'));
       } else if (user.role == '2') {
         let data = [
+          { icon: 'el-icon-eleme', index: '/adminApplyExpert', title: '专家管理' },
           { icon: 'el-icon-eleme', index: '/adminExamine', title: '初审申请书' },
           { icon: 'el-icon-thumb', index: '/adminScore', title: '专家评分' },
           { icon: 'el-icon-orange', index: '/adminMeet', title: '专家会审' },

+ 5 - 0
src/router/index.js

@@ -197,6 +197,11 @@ export default new Router({
           component: () => import('../views/userCenter/userCert/alreadyCert.vue'),
           meta: { title: '已发证书' },
         },
+        {
+          path: '/adminApplyExpert',
+          component: () => import('../views/adminCenter/adminApplyExpert/index.vue'),
+          meta: { title: '已发证书' },
+        },
       ],
     },
     {

+ 3 - 0
src/store/index.js

@@ -18,6 +18,8 @@ import achieveApply from '@common/src/store/achieve/achieve_apply.js';
 import verifyRecord from '@common/src/store/achieve/achieve_verify_record.js';
 // 专家临时
 import achieveExpert from '@common/src/store/achieve/achieve_expert.js';
+// 临时专家分配的任务
+import achieveApplyExpert from '@common/src/store/achieve/achieve_apply_expert.js';
 
 Vue.use(Vuex);
 
@@ -34,5 +36,6 @@ export default new Vuex.Store({
     achieveApply,
     verifyRecord,
     achieveExpert,
+    achieveApplyExpert,
   },
 });

+ 171 - 0
src/views/adminCenter/adminApplyExpert/index.vue

@@ -0,0 +1,171 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-button type="primary" size="mini" @click="add">创建账号</el-button>
+        </el-col>
+        <el-col :span="24" class="down">
+          <data-table
+            :fields="fields"
+            :opera="opera"
+            :data="list"
+            :total="total"
+            @query="search"
+            @edit="toEdit"
+            @delete="toDelete"
+            @restore="toRestore"
+          ></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="专家信息管理" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
+      <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>
+          </template>
+        </template>
+      </data-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+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',
+  props: {},
+  components: { dataTable, dataForm },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '编辑',
+          method: 'edit',
+          display: i => i.status === '0',
+        },
+        {
+          label: '冻结',
+          method: 'delete',
+          display: i => i.status === '0',
+        },
+        {
+          label: '解冻',
+          method: 'restore',
+          display: i => i.status === '1',
+        },
+      ],
+      fields: [
+        { label: '专家姓名', prop: 'expert_name', filter: 'input', showTip: true },
+        { label: '联系电话', prop: 'phone', showTip: true },
+        { label: '账号状态', prop: 'status', format: i => (i === '0' ? '使用中' : '已冻结') },
+      ],
+      list: [],
+      total: 0,
+      // 创建专家账号
+      dialog: false,
+      form: {},
+      rules: {},
+      formfields: [
+        { label: '专家', model: 'expert_user_id', type: 'select', filterReturn: true },
+        { label: '联系电话', model: 'phone' },
+        { label: '登录密码', model: 'password', type: 'password' },
+      ],
+      // 评分详情
+      info: {},
+      expertList: [],
+    };
+  },
+  created() {
+    this.search();
+    this.toGetExpert();
+  },
+  methods: {
+    ...achieveExpert(['query', 'create', 'update', 'delete', 'restore']),
+    ...expert({ getExpert: 'query' }),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加专家
+    add() {
+      this.dialog = true;
+    },
+    // 提交
+    async toSave({ data }) {
+      const duplicate = _.cloneDeep(data);
+      let method = _.get(duplicate, '_id') ? 'update' : 'create';
+      let res = await this[method](duplicate);
+      if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) this.handleClose();
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$set(this, 'form', _.cloneDeep(data));
+      this.dialog = true;
+    },
+    // 冻结
+    async toDelete({ data }) {
+      const res = await this.delete(data._id);
+      if (this.$checkRes(res, '冻结成功', res.errmsg || '冻结失败')) {
+        this.search();
+      }
+    },
+    // 解冻
+    async toRestore({ data }) {
+      const res = await this.restore(data._id);
+      if (this.$checkRes(res, '解冻成功', res.errmsg || '解冻失败')) {
+        this.search();
+      }
+    },
+    // 取消
+    handleClose() {
+      this.form = {};
+      this.dialog = false;
+      this.search();
+    },
+    // 选择专家,返回电话
+    expertSelect({ data, model }) {
+      if (model === 'expert_user_id') {
+        const res = this.expertList.find(f => f.user_id === data);
+        if (res) {
+          const { phone, name } = res;
+          this.$set(this.form, 'phone', phone);
+          this.$set(this.form, 'expert_name', name);
+        }
+      }
+    },
+    // 获取专家列表
+    async toGetExpert() {
+      const res = await this.getExpert();
+      if (this.$checkRes(res)) this.$set(this, 'expertList', res.data);
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    margin: 0 0 10px 0;
+    text-align: right;
+  }
+}
+</style>

+ 58 - 29
src/views/adminCenter/adminMeet/expert.vue

@@ -7,50 +7,72 @@
           <el-button type="primary" size="mini" @click="add">添加专家</el-button>
         </el-col>
         <el-col :span="24" class="down">
-          <data-table :fields="fields" :opera="opera" :data="list" :usePage="false" @delete="toDelete"> </data-table>
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @delete="toDelete" @view="toView"> </data-table>
         </el-col>
       </el-col>
     </el-row>
-    <el-dialog title="添加专家" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
+    <el-dialog title="添加专家" width="40%" :visible.sync="dialog" @close="handleClose" :destroy-on-close="true">
       <data-form :data="form" :fields="formfields" :rules="{}" @save="toSave">
         <template #options="{item}">
           <template v-if="item.model === 'expert_id'">
-            <el-option v-for="(i, index) in expertList" :key="`expert${index}`" :label="i.name" :value="i._id"></el-option>
+            <el-option v-for="(i, index) in expertList" :key="`expert${index}`" :label="i.expert_name" :value="i._id"></el-option>
           </template>
         </template>
       </data-form>
     </el-dialog>
+    <el-dialog title="评分详情" width="40%" :visible.sync="scoreDialog" @close="handleClose" :destroy-on-close="true">
+      <scoreInfo :form="info"></scoreInfo>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 const _ = require('lodash');
+import scoreInfo from './parts/scoreInfo.vue';
 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: achieveApply } = createNamespacedHelpers('achieveApply');
-const { mapActions: expert } = createNamespacedHelpers('expert');
+const { mapActions: achieveExpert } = createNamespacedHelpers('achieveExpert');
+const { mapActions: achieveApplyExpert } = createNamespacedHelpers('achieveApplyExpert');
 export default {
   name: 'expert',
   props: {},
-  components: { dataTable, dataForm },
+  components: { dataTable, dataForm, scoreInfo },
   data: function() {
     return {
+      // 工作类型:1=>评分;2=>会审
+      type: '2',
       opera: [
+        {
+          label: '编辑',
+          method: 'edit',
+          display: i => !_.isObject(i.verify),
+        },
         {
           label: '删除',
           method: 'delete',
+          display: i => !_.isObject(i.verify),
+        },
+        {
+          label: '评分详情',
+          method: 'view',
+          display: i => _.isObject(i.verify),
         },
       ],
       fields: [
-        { label: '专家姓名', prop: 'name', showTip: true },
-        { label: '联系电话', prop: 'phone', showTip: true },
+        { label: '专家姓名', prop: 'expert_id.expert_name', showTip: true },
+        { label: '联系电话', prop: 'expert_id.phone', showTip: true },
+        { label: '评分', prop: 'verify.score', showTip: true },
+        { label: '状态', prop: 'verify', format: i => (_.isObject(i) ? '已评分' : '未评分') },
       ],
       list: [],
+      total: 0,
       expertList: [],
       dialog: false,
       form: {},
       formfields: [{ label: '专家', model: 'expert_id', type: 'select' }],
+      scoreDialog: false,
+      info: {},
     };
   },
   created() {
@@ -58,36 +80,44 @@ export default {
     this.toGetExpert();
   },
   methods: {
-    ...achieveApply(['fetch', 'update']),
-    ...expert({ getExpert: 'query' }),
-    async search() {
-      const res = await this.fetch(this.id);
+    ...achieveApplyExpert(['query', 'create', 'update', 'delete']),
+    ...achieveExpert({ getExpert: 'query' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, apply_id: this.id, expert: true, type: this.type });
       if (this.$checkRes(res)) {
-        this.$set(this, 'list', _.get(res.data, 'experts', []));
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
       }
     },
+    // 专家评分查看
+    toView({ data }) {
+      const { expert_id, verify } = data;
+      const d = { name: expert_id.expert_name, phone: expert_id.phone, score: verify.score, content: verify.content };
+      this.$set(this, `info`, d);
+      this.scoreDialog = true;
+    },
     // 提交
     async toSave({ data }) {
-      const expert = this.expertList.find(f => f._id === data.expert_id);
-      if (!expert) {
-        this.$message.error('未找到专家信息');
-        return;
+      const duplicate = _.cloneDeep(data);
+      duplicate.apply_id = this.id;
+      duplicate.type = this.type;
+      let method = _.get(duplicate, '_id') ? 'update' : 'create';
+      let res = await this[method](duplicate);
+      if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) {
+        this.handleClose();
+        this.search();
       }
-      const duplicate = _.cloneDeep(this.list);
-      duplicate.push(expert);
-      const res = await this.update({ id: this.id, experts: duplicate });
-      if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) this.handleClose();
     },
 
-    async toDelete({ index }) {
-      const duplicate = _.cloneDeep(this.list);
-      duplicate.splice(index, 1);
-      const res = await this.update({ id: this.id, experts: duplicate });
-      if (this.$checkRes(res, '删除成功', res.errmsg || '删除失败')) this.handleClose();
+    async toDelete({ data }) {
+      const res = await this.delete(data._id);
+      if (this.$checkRes(res, '删除成功', res.errmsg || '删除失败')) {
+        this.search();
+      }
     },
     // 获取专家列表
     async toGetExpert() {
-      const res = await this.getExpert();
+      const res = await this.getExpert({ status: '0' });
       if (this.$checkRes(res)) this.$set(this, 'expertList', res.data);
     },
     // 添加专家
@@ -96,9 +126,8 @@ export default {
     },
     // 取消
     handleClose() {
-      this.form = {};
       this.dialog = false;
-      this.search();
+      this.form = {};
     },
     // 返回列表
     back() {

+ 3 - 0
src/views/adminCenter/adminMeet/parts/scoreInfo.vue

@@ -10,6 +10,9 @@
             <el-form-item label="联系电话">
               <el-input v-model="form.phone" readonly></el-input>
             </el-form-item>
+            <el-form-item label="评分">
+              <el-input v-model="form.score" readonly></el-input>
+            </el-form-item>
             <el-form-item label="会审意见">
               <el-input type="textarea" readonly v-model="form.content" :autosize="{ minRows: 4, maxRows: 6 }"> </el-input>
             </el-form-item>

+ 24 - 32
src/views/adminCenter/adminScore/detail.vue

@@ -11,16 +11,16 @@
         </el-col>
       </el-col>
     </el-row>
-    <el-dialog title="专家信息管理" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
-      <data-form :data="form" :fields="formfields" :rules="rules" @save="toSave" @filterReturn="expertSelect">
+    <el-dialog title="专家信息管理" width="40%" :visible.sync="dialog" @close="handleClose" :destroy-on-close="true">
+      <data-form :data="form" :fields="formfields" :rules="rules" @save="toSave">
         <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>
+          <template v-if="item.model === 'expert_id'">
+            <el-option v-for="(i, index) in expertList" :key="`expert${index}`" :label="i.expert_name" :value="i._id"></el-option>
           </template>
         </template>
       </data-form>
     </el-dialog>
-    <el-dialog title="评分详情" width="40%" :visible.sync="scoreDialog" @closed="handleClose" :destroy-on-close="true">
+    <el-dialog title="评分详情" width="40%" :visible.sync="scoreDialog" @close="handleClose" :destroy-on-close="true">
       <scoreInfo :form="info"></scoreInfo>
     </el-dialog>
   </div>
@@ -32,8 +32,8 @@ import scoreInfo from './parts/scoreInfo.vue';
 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');
+const { mapActions: achieveApplyExpert } = createNamespacedHelpers('achieveApplyExpert');
 export default {
   metaInfo() {
     return { title: this.$route.meta.title };
@@ -47,6 +47,8 @@ export default {
   },
   data: function() {
     return {
+      // 工作类型:1=>评分;2=>会审
+      type: '1',
       opera: [
         {
           label: '编辑',
@@ -65,8 +67,8 @@ export default {
         },
       ],
       fields: [
-        { label: '专家姓名', prop: 'expert_name', filter: 'input', showTip: true },
-        { label: '联系电话', prop: 'phone', showTip: true },
+        { label: '专家姓名', prop: 'expert_id.expert_name', showTip: true },
+        { label: '联系电话', prop: 'expert_id.phone', showTip: true },
         { label: '评分', prop: 'verify.score', showTip: true },
         { label: '状态', prop: 'verify', format: i => (_.isObject(i) ? '已评分' : '未评分') },
       ],
@@ -76,11 +78,7 @@ export default {
       dialog: false,
       form: {},
       rules: {},
-      formfields: [
-        { label: '专家', model: 'expert_user_id', type: 'select', filterReturn: true },
-        { label: '联系电话', model: 'phone' },
-        { label: '登录密码', model: 'password', type: 'password' },
-      ],
+      formfields: [{ label: '专家', model: 'expert_id', type: 'select' }],
       // 评分详情
       scoreDialog: false,
       info: {},
@@ -92,11 +90,11 @@ export default {
     this.toGetExpert();
   },
   methods: {
-    ...achieveExpert(['query', 'create', 'update', 'delete']),
-    ...expert({ getExpert: 'query' }),
+    ...achieveApplyExpert(['query', 'create', 'update', 'delete']),
+    ...achieveExpert({ getExpert: 'query' }),
     // 查询列表
     async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, apply_id: this.id });
+      const res = await this.query({ skip, limit, ...info, apply_id: this.id, expert: true, type: this.type });
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
@@ -104,7 +102,9 @@ export default {
     },
     // 专家评分查看
     toView({ data }) {
-      this.$set(this, `info`, data);
+      const { expert_id, verify } = data;
+      const d = { name: expert_id.expert_name, phone: expert_id.phone, score: verify.score, content: verify.content };
+      this.$set(this, `info`, d);
       this.scoreDialog = true;
     },
     // 添加专家
@@ -115,9 +115,13 @@ export default {
     async toSave({ data }) {
       const duplicate = _.cloneDeep(data);
       duplicate.apply_id = this.id;
+      duplicate.type = this.type;
       let method = _.get(duplicate, '_id') ? 'update' : 'create';
       let res = await this[method](duplicate);
-      if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) this.handleClose();
+      if (this.$checkRes(res, '专家保存成功', res.errmsg || '专家保存失败')) {
+        this.handleClose();
+        this.search();
+      }
     },
     // 修改
     toEdit({ data }) {
@@ -133,28 +137,16 @@ export default {
     },
     // 取消
     handleClose() {
-      this.form = {};
       this.dialog = false;
-      this.search();
+      this.form = {};
     },
     // 返回列表
     back() {
       this.$router.push({ path: '/adminScore' });
     },
-    // 选择专家,返回电话
-    expertSelect({ data, model }) {
-      if (model === 'expert_user_id') {
-        const res = this.expertList.find(f => f.user_id === data);
-        if (res) {
-          const { phone, name } = res;
-          this.$set(this.form, 'phone', phone);
-          this.$set(this.form, 'expert_name', name);
-        }
-      }
-    },
     // 获取专家列表
     async toGetExpert() {
-      const res = await this.getExpert();
+      const res = await this.getExpert({ status: '0' });
       if (this.$checkRes(res)) this.$set(this, 'expertList', res.data);
     },
   },

+ 2 - 1
src/views/adminCenter/adminScore/index.vue

@@ -11,7 +11,8 @@
       <data-form :data="sumForm" :fields="sumfields" :rules="{}" @save="sumSave">
         <template #radios="{item}">
           <template v-if="item.model === 'status'">
-            <el-radio label="2">通过</el-radio>
+            <!-- 因为不需要申请人线上证明缴费,所以跳过缴费等待步骤,直接进入会审步骤 -->
+            <el-radio label="3">通过</el-radio>
             <el-radio label="-2">不通过</el-radio>
           </template>
         </template>

+ 3 - 3
src/views/adminCenter/adminScore/parts/scoreInfo.vue

@@ -5,16 +5,16 @@
         <el-col :span="24" class="name">
           <el-form ref="form" :model="form" label-width="80px">
             <el-form-item label="专家姓名">
-              <el-input v-model="form.expert_name" readonly></el-input>
+              <el-input v-model="form.name" readonly></el-input>
             </el-form-item>
             <el-form-item label="联系电话">
               <el-input v-model="form.phone" readonly></el-input>
             </el-form-item>
             <el-form-item label="评分">
-              <el-input v-model="form.verify.score" readonly></el-input>
+              <el-input v-model="form.score" readonly></el-input>
             </el-form-item>
             <el-form-item label="评分详情">
-              <el-input type="textarea" v-model="form.verify.content" :autosize="{ minRows: 4, maxRows: 6 }" readonly> </el-input>
+              <el-input type="textarea" v-model="form.content" :autosize="{ minRows: 4, maxRows: 6 }" readonly> </el-input>
             </el-form-item>
           </el-form>
         </el-col>

+ 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,
       },