importExcel.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <a-button type="primary" @click="importShow" :functioncode="functioncode">{{ options.title }}</a-button>
  3. <a-modal v-model:visible="visible" :title="options.title" @ok="handleOk" :ok-text="'确认导入'"
  4. :ok-button-props="okButtonProps" :z-index="998">
  5. <ImportExcel :date-format="'YYYY-MM-DD'" @select="selectFile" @success="addData" ref="importExcelRef"></ImportExcel>
  6. <div style="text-align: right;cursor: pointer;margin-top:10px;" v-if="options.template" @click="downTemp">
  7. {{ downTempLoad ? "正在下载..." : "下载模板" }}
  8. </div>
  9. </a-modal>
  10. <a-modal v-model:visible="errorVisible" :title="'错误列表'" @ok="importError" :ok-text="'导出错误信息'"
  11. :z-index="999" :width="errorModalWidth">
  12. <a-table :columns="errorColumns" :data-source="errorDataList" :scroll="{ x:'100%', y: 500 }"
  13. bordered>
  14. </a-table>
  15. </a-modal>
  16. </template>
  17. <script lang="ts">
  18. import {defineComponent, ref} from "vue";
  19. import ImportExcel from '../src/ImportExcel.vue';
  20. import type {PropType} from "vue";
  21. import type {ButtonProps} from "ant-design-vue";
  22. import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps";
  23. import {downloadTempFile, exportExcel, exportExcelByPost} from "@/utils/downloadFile";
  24. import {post} from "@/api/common";
  25. import type {TableColumnsType} from "ant-design-vue";
  26. export default defineComponent({
  27. name: 'b-import-excel',
  28. components: {ImportExcel},
  29. props: {
  30. options: {type: Object as PropType<ImportProps>, default: null},
  31. functioncode:{type: String,default:''}
  32. },
  33. emits: ["success"],
  34. setup(props,{emit}) {
  35. const visible = ref<boolean>(false);
  36. const errorVisible = ref<boolean>(false);
  37. const okButtonProps = ref<ButtonProps>({disabled: true});
  38. const excelData = ref([]);
  39. const importExcelRef = ref();
  40. const downTempLoad = ref(false);
  41. const errorDataList = ref([]);
  42. const errorColumns = ref<TableColumnsType>([]);
  43. const errorModalWidth = ref(0);
  44. const importShow = function () {
  45. visible.value = true;
  46. okButtonProps.value.disabled = true;
  47. excelData.value = [];
  48. importExcelRef.value?.clearData();
  49. errorDataList.value = [];
  50. errorColumns.value = [];
  51. setErrorColumns();
  52. }
  53. const setErrorColumns = () => {
  54. errorModalWidth.value = 500;
  55. errorColumns.value.push({
  56. title: "序号", dataIndex: "index", key: "index", width: 80, align: "center", fixed: 'left',
  57. customRender: item => `${item.index + 1}`
  58. });
  59. props.options?.columns.forEach(c => {
  60. errorModalWidth.value += c.width;
  61. errorColumns.value.push({
  62. title: c.cnName,
  63. dataIndex: c.enName,
  64. key: c.enName,
  65. width: c.width,
  66. align: "center",
  67. ellipsis: true
  68. });
  69. });
  70. errorColumns.value.push({
  71. title: "错误信息",
  72. dataIndex: "errorMessage",
  73. key: "errorMessage",
  74. width: 300,
  75. align: "center",
  76. fixed: 'right'
  77. });
  78. errorModalWidth.value = errorModalWidth.value > 1500 ? 1500 : errorModalWidth.value;
  79. }
  80. const handleOk = () => {
  81. post(props.options.url, excelData.value, "导入").then(() => {
  82. visible.value = false;
  83. emit("success");
  84. }, (error) => {
  85. errorVisible.value = true;
  86. errorDataList.value = error.data;
  87. okButtonProps.value.disabled = true;
  88. excelData.value = [];
  89. importExcelRef.value?.clearData();
  90. });
  91. };
  92. const selectFile = () => {
  93. okButtonProps.value.disabled = true;
  94. excelData.value = [];
  95. };
  96. const addData = (result: any) => {
  97. okButtonProps.value.disabled = false;
  98. console.log(result);
  99. if (result) {
  100. result.forEach(sheet => {
  101. sheet.results.forEach(item => {
  102. const row = {};
  103. props.options?.columns.forEach(column => {
  104. row[column.enName] = item[column.cnName] || "";
  105. });
  106. excelData.value.push(row as never);
  107. });
  108. });
  109. console.log(excelData.value);
  110. }
  111. }
  112. const downTemp = () => {
  113. if (!downTempLoad.value) {
  114. if (props.options?.template?.url) {
  115. downTempLoad.value = true;
  116. exportExcel(props.options?.template?.url, props.options?.template?.params, props.options?.template?.tempFileName).then(() => {
  117. downTempLoad.value = false;
  118. }, () => {
  119. downTempLoad.value = false;
  120. });
  121. } else {
  122. downloadTempFile(props.options?.template?.tempFileName).then(() => {
  123. downTempLoad.value = false;
  124. }, () => {
  125. downTempLoad.value = false;
  126. });
  127. }
  128. }
  129. };
  130. const importError = () => {
  131. const exportColumns = props.options?.columns;
  132. exportColumns?.push({
  133. enName: "errorMessage",
  134. cnName: "错误信息",
  135. width: 100
  136. })
  137. exportExcelByPost("common/exportErrorExcel", {
  138. columnList: exportColumns, dataList: errorDataList.value
  139. }, "错误信息导出").then(() => {
  140. }, () => {
  141. });
  142. }
  143. return {
  144. visible,
  145. okButtonProps,
  146. importShow,
  147. handleOk,
  148. selectFile,
  149. addData,
  150. importExcelRef,
  151. downTemp,
  152. downTempLoad,
  153. errorVisible,
  154. errorDataList,
  155. importError,
  156. errorColumns,
  157. errorModalWidth
  158. };
  159. },
  160. })
  161. </script>