lrf402788946 3 years ago
parent
commit
667011d5f1

+ 5 - 0
src/router/index.js

@@ -81,6 +81,11 @@ const web = [
         meta: { title: '专利管理' },
         component: () => import('../views/adminCenter/patent/index.vue'),
       },
+      {
+        path: '/adminCenter/patent/result',
+        meta: { title: '专利-导出查看' },
+        component: () => import('../views/adminCenter/patent/export_result.vue'),
+      },
     ],
   },
   {

+ 14 - 1
src/store/index.js

@@ -15,11 +15,24 @@ import inviteCode from '@common/src/store/inviteCode';
 import organization from '@common/src/store/organization';
 // 专家
 import expert from '@common/src/store/expert';
+import mission from '@common/src/store/mission';
+import patent from '@common/src/store/patent';
 Vue.use(Vuex);
 
 export default new Vuex.Store({
   state: { ...ustate },
   mutations: { ...umutations },
   actions: {},
-  modules: { disclosure, adminLogin, personal, inviteCode, organization, expert, report, notice },
+  modules: {
+    disclosure,
+    adminLogin,
+    personal,
+    inviteCode,
+    organization,
+    expert,
+    report,
+    notice,
+    mission,
+    patent,
+  },
 });

+ 83 - 0
src/views/adminCenter/patent/export_result.vue

@@ -0,0 +1,83 @@
+<template>
+  <div id="result">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-button type="primary" size="mini" @click="$router.push('/adminCenter/patent/index')">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="down">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @download="toDownload"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: mission } = createNamespacedHelpers('mission');
+
+export default {
+  name: 'result',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      list: [],
+      total: 0,
+      opera: [
+        {
+          label: '下载',
+          method: 'download',
+          display: (i) => i.status === '2',
+        },
+      ],
+      fields: [
+        { label: '标题', model: 'title' },
+        { label: '导出数据时间', model: 'create_time' },
+        {
+          label: '状态',
+          model: 'status',
+          format: (i) => (i == '0' ? '未开始' : i == '1' ? '进行中' : i == '2' ? '导出完成' : i == '3' ? '导出失败' : '未知状态'),
+        },
+        { label: '进度', model: 'progress' },
+        { label: '备注', model: 'remark' },
+      ],
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...mission(['query']),
+    async search({ skip = 0, limit = 10 } = {}) {
+      const res = await this.query({ skip, limit });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, 'total', res.total);
+      }
+    },
+    toDownload({ data }) {
+      window.open(`http://broadcast.waityou24.cn/${data.uri}`);
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 84 - 0
src/views/adminCenter/patent/filter_bar.vue

@@ -0,0 +1,84 @@
+<template>
+  <div id="filter_bar" style="margin: 10px">
+    <el-row v-for="(l, rowIndex) in fields" :key="`row-${rowIndex}`">
+      <el-col :span="24">
+        <span>{{ l.label }}</span>
+        <span>:</span>
+        <template v-if="l.type === 'radio'">
+          <el-radio-group v-model="form[l.model]">
+            <el-radio :label="undefined">全部</el-radio>
+            <el-radio v-for="(i, index) in getList(rowIndex)" :key="`radio-${l.model}-${index}`" :label="i.value ? i.value : i.label">{{ i.label }}</el-radio>
+          </el-radio-group>
+        </template>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="24">
+        <el-button type="primary" size="small" @click="search()">查询</el-button>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+/**
+ * fields:
+ * label:字段中文
+ * type:选择方式
+ * model:字段
+ * list:选择的选项,可以写死,可以请求:请求是以 ${model}List 形式命名传入组件,无需prop接收,直接使用$attrs即可;
+ */
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'filter_bar',
+  props: {
+    form: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  model: {
+    prop: 'form',
+    event: 'change',
+  },
+  components: {},
+  data: function () {
+    return {
+      fields: [{ label: '申请类型', type: 'radio', model: 'type', list: [{ label: '发明' }, { label: '实用新型' }, { label: '其他', value: 'else' }] }],
+    };
+  },
+  created() {},
+  methods: {
+    getList(index) {
+      const field = this.fields[index];
+      let list = _.get(field, 'list');
+      if (list) return list;
+      const { model } = field;
+      list = _.get(this.$attrs, `${model}List`, []);
+      return list;
+    },
+    search() {
+      let data = _.cloneDeep(this.form);
+      let obj = {};
+      for (const key in data) {
+        if (data[key]) obj[key] = data[key];
+      }
+      this.$emit('search', obj);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 41 - 13
src/views/adminCenter/patent/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div id="index">
-    <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView">
-      <template #btn>
+    <el-row>
+      <el-col :span="24" style="text-align: right">
         <el-popover placement="bottom" width="370" trigger="click" style="margin-right: 10px">
           <template #reference>
             <el-button type="primary" size="mini">导入</el-button>
@@ -20,6 +20,13 @@
             <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
           </el-upload>
         </el-popover>
+        <el-button type="primary" size="mini" @click="exportView">导出</el-button>
+        <el-button type="primary" size="mini" @click="toResult">查看导出结果</el-button>
+      </el-col>
+    </el-row>
+    <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView">
+      <template #filter>
+        <filter-bar v-model="filter" @search="search"></filter-bar>
       </template>
     </data-table>
     <el-dialog title="错误记录" center :visible.sync="dialog" :destroy-on-close="true">
@@ -53,41 +60,53 @@
 </template>
 
 <script>
+import filterBar from './filter_bar.vue';
 import account from './account.vue';
 const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: disclosure } = createNamespacedHelpers('disclosure');
+const { mapActions: patent } = createNamespacedHelpers('patent');
 export default {
   name: 'index',
   props: {},
-  components: { account },
+  components: { account, filterBar },
   data: function () {
     return {
+      filter: {},
       list: [],
       total: 0,
       fields: [
-        { label: '专利名称', model: 'name', filter: true },
-        { label: '申请人', model: 'apply_name' },
-        { label: '申请类型', model: 'type' },
-        { label: '技术联系人', model: 'contact' },
-        { label: '联系人电话', model: 'phone' },
-        { label: '联系人邮箱', model: 'email' },
+        { label: '申请号', model: 'create_number' },
+        { label: '申请日', model: 'create_date' },
+        { label: '标题', model: 'name' },
+        { label: '发明人', model: 'inventor' },
+        { label: '专利类型', model: 'type' },
       ],
       opera: [{ label: '查看', method: 'view' }],
       dialog: false,
+      //错误
       errcode: undefined,
       temp_id: undefined,
       errorList: [],
+      //选人
       innerDialog: false,
       nameList: [],
       listIndex: undefined,
     };
   },
-  created() {},
+  created() {
+    this.search();
+  },
   methods: {
-    ...disclosure(['import', 'cacheImport']),
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      console.log('in function:');
+    ...disclosure(['import', 'cacheImport', 'toExport']),
+    ...patent(['query']),
+    async search({ skip = 0, limit = 10 } = {}) {
+      const info = _.cloneDeep(this.filter);
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
     },
     toView({ data }) {
       // TODO查看
@@ -159,6 +178,15 @@ export default {
         this.dialog = false;
       }
     },
+    async exportView() {
+      const res = await this.toExport({ ...this.filter });
+      if (this.$checkRes(res, '正在导出,请稍后')) {
+      }
+    },
+    // 查看导出结果
+    async toResult() {
+      this.$router.push({ path: '/adminCenter/patent/result' });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 5 - 0
vue.config.js

@@ -24,6 +24,11 @@ module.exports = {
       '/files': {
         target: 'http://broadcast.waityou24.cn',
       },
+      '/api/mission': {
+        target: 'http://127.0.0.1:4001',
+        changeOrigin: true,
+        ws: false,
+      },
       '/api': {
         target: 'http://127.0.0.1:9101',
         changeOrigin: true,