lrf402788946 3 年之前
父節點
當前提交
9bded0ecec

+ 5 - 0
src/router/index.js

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

+ 66 - 0
src/views/jg/patent/account.vue

@@ -0,0 +1,66 @@
+<template>
+  <div id="account">
+    <el-table border stripe :data="list" size="mini">
+      <el-table-column align="center" label="姓名" prop="name"></el-table-column>
+      <el-table-column align="center" label="电话" prop="phone"></el-table-column>
+      <el-table-column align="center" label="邮箱" prop="email"></el-table-column>
+      <el-table-column align="center" label="账户类型">
+        <template v-slot="account">
+          {{ checkType(account) }}
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="选择">
+        <template v-slot="{ $index }">
+          <el-link type="primary" :underline="false" @click="accountSelect($index)" v-if="!checkSelect($index)">选择</el-link>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'account',
+  props: {
+    list: { type: Array },
+  },
+  model: {
+    prop: 'list',
+    event: 'change',
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    checkType({ row }) {
+      const keys = Object.keys(row);
+      const str = keys.find((f) => f === 'is_expert');
+      if (str) return '个人用户';
+      else return '企业用户';
+    },
+    checkSelect(index) {
+      const is_select = this.list[index].is_select;
+      if (is_select === true) return true;
+      else return false;
+    },
+    accountSelect(index) {
+      this.$emit('select', index);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 83 - 0
src/views/jg/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('/jg/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, user: this.user._id });
+      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']),
+    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/jg/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>

+ 174 - 16
src/views/jg/patent/index.vue

@@ -1,35 +1,193 @@
 <template>
 <template>
   <div id="index">
   <div id="index">
-    <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @check="toCheck"> </data-table>
+    <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>
+          </template>
+          <el-upload
+            class="upload-demo"
+            drag
+            action="/files/platform/patent_cms_import/upload"
+            multiple
+            :on-success="uSuccess"
+            :on-error="uError"
+            :before-upload="uBefore"
+            :show-file-list="false"
+          >
+            <i class="el-icon-upload"></i>
+            <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">
+      <el-table border stripe :data="errorList" v-if="errcode === '1'">
+        <el-table-column align="center" label="错误记录">
+          <template v-slot="{ row }">{{ row }}</template>
+        </el-table-column>
+      </el-table>
+      <el-table border stripe :data="errorList" v-if="errcode === '2'">
+        <el-table-column align="center" label="发明名称" prop="name"></el-table-column>
+        <el-table-column align="center" label="发明人" prop="inventor"></el-table-column>
+        <el-table-column align="center" label="选择状态">
+          <template v-slot="{ row }">
+            {{ checkSelect(row) }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="选择">
+          <template v-slot="{ row, $index }">
+            <el-link type="primary" :underline="false" @click="toSelectUser(row, $index)">选择用户</el-link>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="margin: 16px; width: 100%; text-align: center">
+        <el-button type="primary" style="width: 60%" @click="toContinue">继续导入</el-button>
+      </div>
+      <el-dialog title="选择用户" :visible.sync="innerDialog" append-to-body :destroy-on-close="true">
+        <account v-model="nameList" @select="selectUser"></account>
+      </el-dialog>
+    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+import filterBar from './filter_bar.vue';
+import account from './account.vue';
+const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: disclosure } = createNamespacedHelpers('disclosure');
+const { mapActions: patent } = createNamespacedHelpers('patent');
 export default {
 export default {
   name: 'index',
   name: 'index',
   props: {},
   props: {},
-  components: {},
+  components: { account, filterBar },
   data: function () {
   data: function () {
     return {
     return {
-      list: [
-        { name: '专利1', apply_name: '申请人', type: '申请类型', contact: '联系人', phone: '11111111111', email: 'test@qq.com' },
-        { name: '专利2', apply_name: '申请人2', type: '申请类型2', contact: '联系人2', phone: '11111111112', email: 'test2@qq.com' },
-      ],
-      total: 2,
+      filter: {},
+      list: [],
+      total: 0,
       fields: [
       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: 'check' }],
+      opera: [{ label: '查看', method: 'view' }],
+      dialog: false,
+      //错误
+      errcode: undefined,
+      temp_id: undefined,
+      errorList: [],
+      //选人
+      innerDialog: false,
+      nameList: [],
+      listIndex: undefined,
     };
     };
   },
   },
-  created() {},
-  methods: {},
+  created() {
+    this.search();
+  },
+  methods: {
+    ...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, code: this.user.code });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    toView({ data }) {
+      // TODO查看
+    },
+    // 导入
+    async toImport(uri) {
+      const res = await this.import({ uri });
+      const { data } = res;
+      if (data) {
+        this.$message.error('导入失败');
+        const { data: errorList, errcode, temp_id } = data;
+        this.$set(this, 'errorList', errorList);
+        this.$set(this, 'errcode', errcode);
+        this.$set(this, 'temp_id', temp_id);
+        this.dialog = true;
+      } else {
+        this.$set(this, 'errorList', []);
+        this.$set(this, 'errcode', undefined);
+        this.$set(this, 'temp_id', undefined);
+        this.$message.success('导入成功');
+      }
+    },
+    // 上传成功
+    uSuccess(response, file, fileList) {
+      const { uri } = response;
+      this.$checkRes(response, '上传成功!正在导入,请稍后...');
+      this.toImport(uri);
+    },
+    // 上传失败
+    uError(err, file, fileList) {
+      this.$message.error('上传失败');
+    },
+    // 正在上传
+    uBefore() {
+      this.$message('正在上传');
+    },
+    // 去选择用户
+    toSelectUser(data, index) {
+      this.$set(this, `nameList`, data.nameList);
+      this.$set(this, `listIndex`, index);
+      this.innerDialog = true;
+    },
+    // 选择用户
+    selectUser(index) {
+      let list = _.cloneDeep(this.nameList);
+      list = list.map((i) => {
+        i.is_select = false;
+        return i;
+      });
+      list[index].is_select = true;
+      this.$set(this.errorList[this.listIndex], 'nameList', list);
+      this.innerDialog = false;
+    },
+    // 检查是否选择用户
+    checkSelect(row) {
+      const r = row.nameList.find((f) => f.is_select);
+      return r ? '已选择' : '未选择';
+    },
+    // 继续导入
+    async toContinue() {
+      const r = this.errorList.find((f) => !f.nameList.find((f) => f.is_select));
+      if (r) {
+        this.$message.error('有未选择用户的数据,请重新检查');
+        return;
+      }
+      const obj = { data: _.cloneDeep(this.errorList), temp_id: this.temp_id };
+      const res = await this.cacheImport(obj);
+      if (this.$checkRes(res, '操作成功', res.errmsg || '操作失败')) {
+        this.dialog = false;
+      }
+    },
+    async exportView() {
+      const res = await this.toExport({ ...this.filter, code: this.user.code, id: this.user._id });
+      if (this.$checkRes(res, '正在导出,请稍后')) {
+      }
+    },
+    // 查看导出结果
+    async toResult() {
+      this.$router.push({ path: '/jg/patent/result' });
+    },
+  },
   computed: {
   computed: {
     ...mapState(['user']),
     ...mapState(['user']),
     pageTitle() {
     pageTitle() {