index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" style="text-align: right">
  5. <el-popover placement="bottom" width="370" trigger="click" style="margin-right: 10px">
  6. <template #reference>
  7. <el-button type="primary" size="mini">导入</el-button>
  8. </template>
  9. <el-upload
  10. class="upload-demo"
  11. drag
  12. action="/files/platform/patent_cms_import/upload"
  13. multiple
  14. :on-success="uSuccess"
  15. :on-error="uError"
  16. :before-upload="uBefore"
  17. :show-file-list="false"
  18. >
  19. <i class="el-icon-upload"></i>
  20. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  21. </el-upload>
  22. </el-popover>
  23. <el-button type="primary" size="mini" @click="getTemplate">下载导入模板</el-button>
  24. <el-button type="primary" size="mini" @click="exportView">导出</el-button>
  25. <el-button type="primary" size="mini" @click="toResult">查看导出结果</el-button>
  26. </el-col>
  27. </el-row>
  28. <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView">
  29. <template #filter>
  30. <filter-bar v-model="filter" @search="search"></filter-bar>
  31. </template>
  32. </data-table>
  33. <el-dialog title="错误记录" center :visible.sync="dialog" :destroy-on-close="true">
  34. <el-table border stripe :data="errorList" v-if="errcode === '1'">
  35. <el-table-column align="center" label="错误记录">
  36. <template v-slot="{ row }">{{ row }}</template>
  37. </el-table-column>
  38. </el-table>
  39. <el-table border stripe :data="errorList" v-if="errcode === '2'">
  40. <el-table-column align="center" label="发明名称" prop="name"></el-table-column>
  41. <el-table-column align="center" label="发明人" prop="inventor"></el-table-column>
  42. <el-table-column align="center" label="选择状态">
  43. <template v-slot="{ row }">
  44. {{ checkSelect(row) }}
  45. </template>
  46. </el-table-column>
  47. <el-table-column align="center" label="选择">
  48. <template v-slot="{ row, $index }">
  49. <el-link type="primary" :underline="false" @click="toSelectUser(row, $index)">选择用户</el-link>
  50. </template>
  51. </el-table-column>
  52. </el-table>
  53. <div style="margin: 16px; width: 100%; text-align: center">
  54. <el-button type="primary" style="width: 60%" @click="toContinue">继续导入</el-button>
  55. </div>
  56. <el-dialog title="选择用户" :visible.sync="innerDialog" append-to-body :destroy-on-close="true">
  57. <account v-model="nameList" @select="selectUser"></account>
  58. </el-dialog>
  59. </el-dialog>
  60. </div>
  61. </template>
  62. <script>
  63. import filterBar from './filter_bar.vue';
  64. import account from './account.vue';
  65. const _ = require('lodash');
  66. import { mapState, createNamespacedHelpers } from 'vuex';
  67. const { mapActions: disclosure } = createNamespacedHelpers('disclosure');
  68. const { mapActions: patent } = createNamespacedHelpers('patent');
  69. export default {
  70. name: 'index',
  71. props: {},
  72. components: { account, filterBar },
  73. data: function () {
  74. return {
  75. filter: {},
  76. list: [],
  77. total: 0,
  78. fields: [
  79. { label: '申请号', model: 'create_number' },
  80. { label: '申请日', model: 'create_date' },
  81. { label: '标题', model: 'name' },
  82. { label: '发明人', model: 'inventor' },
  83. { label: '专利类型', model: 'type' },
  84. ],
  85. opera: [{ label: '查看', method: 'view' }],
  86. dialog: false,
  87. //错误
  88. errcode: undefined,
  89. temp_id: undefined,
  90. errorList: [],
  91. //选人
  92. innerDialog: false,
  93. nameList: [],
  94. listIndex: undefined,
  95. };
  96. },
  97. created() {
  98. this.search();
  99. },
  100. methods: {
  101. ...disclosure(['import', 'cacheImport', 'toExport']),
  102. ...patent(['query']),
  103. async search({ skip = 0, limit = 10 } = {}) {
  104. const info = _.cloneDeep(this.filter);
  105. const res = await this.query({ skip, limit, ...info, code: this.user.code });
  106. if (this.$checkRes(res)) {
  107. this.$set(this, `list`, res.data);
  108. this.$set(this, `total`, res.total);
  109. }
  110. },
  111. toView({ data }) {
  112. // TODO查看
  113. },
  114. // 导入
  115. async toImport(uri) {
  116. const res = await this.import({ uri });
  117. const { data } = res;
  118. if (data) {
  119. this.$message.error('导入失败');
  120. const { data: errorList, errcode, temp_id } = data;
  121. this.$set(this, 'errorList', errorList);
  122. this.$set(this, 'errcode', errcode);
  123. this.$set(this, 'temp_id', temp_id);
  124. this.dialog = true;
  125. } else {
  126. this.$set(this, 'errorList', []);
  127. this.$set(this, 'errcode', undefined);
  128. this.$set(this, 'temp_id', undefined);
  129. this.$message.success('导入成功');
  130. }
  131. },
  132. // 上传成功
  133. uSuccess(response, file, fileList) {
  134. const { uri } = response;
  135. this.$checkRes(response, '上传成功!正在导入,请稍后...');
  136. this.toImport(uri);
  137. },
  138. // 上传失败
  139. uError(err, file, fileList) {
  140. this.$message.error('上传失败');
  141. },
  142. // 正在上传
  143. uBefore() {
  144. this.$message('正在上传');
  145. },
  146. // 去选择用户
  147. toSelectUser(data, index) {
  148. this.$set(this, `nameList`, data.nameList);
  149. this.$set(this, `listIndex`, index);
  150. this.innerDialog = true;
  151. },
  152. // 选择用户
  153. selectUser(index) {
  154. let list = _.cloneDeep(this.nameList);
  155. list = list.map((i) => {
  156. i.is_select = false;
  157. return i;
  158. });
  159. list[index].is_select = true;
  160. this.$set(this.errorList[this.listIndex], 'nameList', list);
  161. this.innerDialog = false;
  162. },
  163. // 检查是否选择用户
  164. checkSelect(row) {
  165. const r = row.nameList.find((f) => f.is_select);
  166. return r ? '已选择' : '未选择';
  167. },
  168. // 继续导入
  169. async toContinue() {
  170. const r = this.errorList.find((f) => !f.nameList.find((f) => f.is_select));
  171. if (r) {
  172. this.$message.error('有未选择用户的数据,请重新检查');
  173. return;
  174. }
  175. const obj = { data: _.cloneDeep(this.errorList), temp_id: this.temp_id };
  176. const res = await this.cacheImport(obj);
  177. if (this.$checkRes(res, '操作成功', res.errmsg || '操作失败')) {
  178. this.dialog = false;
  179. }
  180. },
  181. async exportView() {
  182. const res = await this.toExport({ ...this.filter, code: this.user.code, id: this.user._id });
  183. if (this.$checkRes(res, '正在导出,请稍后')) {
  184. }
  185. },
  186. // 查看导出结果
  187. async toResult() {
  188. this.$router.push({ path: '/jg/patent/result' });
  189. },
  190. // 下载模板
  191. getTemplate() {
  192. window.open('../../数据模板.xlsx');
  193. },
  194. },
  195. computed: {
  196. ...mapState(['user']),
  197. pageTitle() {
  198. return `${this.$route.meta.title}`;
  199. },
  200. },
  201. metaInfo() {
  202. return { title: this.$route.meta.title };
  203. },
  204. };
  205. </script>
  206. <style lang="less" scoped></style>