index.vue 6.8 KB

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