index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <a-tooltip v-if="props.type == 'icon'">
  3. <template #title>导入</template>
  4. <upload-outlined @click="openModal"/>
  5. </a-tooltip>
  6. <a-button :disabled="props.disabled" @click="openModal" type="primary" v-else>
  7. 导入
  8. </a-button>
  9. <a-modal v-model:open="open" title="数据导入" @ok="handleOk" @cancel="onCancel">
  10. <a-upload-dragger
  11. class="mt-10"
  12. name="file"
  13. :multiple="true"
  14. accept=".xls,.xlsx"
  15. :showUploadList="false"
  16. :customRequest="onUpload"
  17. :beforeUpload="beforeUpload">
  18. <p class="ant-upload-drag-icon">
  19. <inbox-outlined></inbox-outlined>
  20. </p>
  21. <p class="ant-upload-text">将文件拖到此处,或<em>点击点击导入</em></p>
  22. </a-upload-dragger>
  23. <ul style="padding-left:15px">
  24. <li class="mt-10"><span>为保证数据导入顺利,推荐您下载并使用<a :href="excelMode">《Excel标准模板》</a></span></li>
  25. <li>文件中数据不能超过5000行</li>
  26. </ul>
  27. <div v-for="item in filelist" :key="item.index" >
  28. <div class="flex-between">
  29. <span>{{item.name}}</span>
  30. <a-badge color="green" :text="item.percent == 100?'上传成功':'上传中...'" />
  31. </div>
  32. <a-progress :percent="Number(item.percent)" />
  33. </div>
  34. <a v-if="props.failedData" :href="props.failedData">下载导入失败的数据</a>
  35. </a-modal>
  36. </template>
  37. <script setup>
  38. import { UploadOutlined } from '@ant-design/icons-vue';
  39. import Api from '@/api/api'
  40. import { ref,defineProps,defineEmits, onMounted,watch } from 'vue'
  41. import Up from '@/api/upload'
  42. import { InboxOutlined } from '@ant-design/icons-vue';
  43. import { message } from 'ant-design-vue';
  44. /**
  45. * @bindData {ownerid:router.currentRoute.value.query.id,ownertable:'sa_order',usetype:'default'}
  46. */
  47. const props = defineProps({
  48. modeParam:Object,
  49. id:String,
  50. bindData:Object,
  51. accept:String,
  52. disabled:Boolean,
  53. failedData:String,
  54. type:String
  55. })
  56. const emit = defineEmits(['uploadSuccess'])
  57. const open = ref(false)
  58. const handleOk = () => {
  59. open.value = false
  60. filelist.value = []
  61. }
  62. const onCancel = () => {
  63. props.failedData = null
  64. open.value = false
  65. filelist.value = []
  66. }
  67. const openModal = () => {
  68. open.value = true
  69. querySite_Parameter()
  70. getExcelMode()
  71. }
  72. const onUpload = ()=>{
  73. }
  74. let filelist = ref([])
  75. const beforeUpload = file=>{
  76. filelist.value.push({
  77. uid:file.uid,
  78. name:file.name,
  79. percent:0
  80. })
  81. let index = file.name.lastIndexOf(".");
  82. let type = file.name.substr(index + 1);
  83. props.beforeFunction ? props.beforeFunction():''
  84. getUploadUrl(file.name, type,file)
  85. }
  86. const getUploadUrl = async (filename,type,file)=>{
  87. const res = await Api.requested({
  88. "classname": "system.attachment.huawei.OBS",
  89. "method": "getFileName",
  90. "content": {
  91. "filename": filename,
  92. "filetype": type,
  93. "parentid": appfolderid.value//归属文件夹ID
  94. }
  95. })
  96. let url = res.data.uploadurl
  97. let obsfilename = res.data.serialfilename
  98. upoladFileToServer(url, file, type, obsfilename)
  99. }
  100. const setProgress = (percent)=>{
  101. return {
  102. strokeColor: {
  103. '0%': '#108ee9',
  104. '100%': '#87d068',
  105. },
  106. strokeWidth: 3,
  107. format: percent => `${parseFloat(percent.toFixed(2))}%`,
  108. class: 'test',
  109. };
  110. }
  111. const upoladFileToServer = async (url, file, ext, obsfilename)=> {
  112. let config = {
  113. headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : ext === 'svg'?{ 'Content-Type': 'image/svg+xml' } : { 'Content-Type': 'application/octet-stream' },
  114. onUploadProgress: function (progressEvent) {
  115. let percent = progressEvent.loaded / progressEvent.total * 100
  116. filelist.value = filelist.value.map((e,index) => {
  117. if (e.uid === file.uid) {
  118. e = { ...e, percent: percent.toFixed(0) }
  119. }
  120. return e
  121. })
  122. },
  123. }
  124. await Up.upload(url, file, config)
  125. createFileRecord(obsfilename)
  126. }
  127. // 上传成功以后生成附件记录
  128. const createFileRecord = async (obsfilename)=> {
  129. let obj = {
  130. "serialfilename": obsfilename
  131. }
  132. obj = Object.assign({},obj,props.bindData)
  133. let param = {
  134. "classname": "system.attachment.huawei.OBS",
  135. "method": "uploadSuccess",
  136. "content":obj
  137. }
  138. const res = await Api.requested(param)
  139. console.log(res.data)
  140. if (res.code === 1) {
  141. emit('uploadSuccess',res)
  142. }
  143. }
  144. const appfolderid = ref('')
  145. const salematerialfolderid = ref('')
  146. const querySite_Parameter = async ()=> {
  147. const res = await Api.requested({
  148. "classname": "webmanage.site.site",
  149. "method": "querySite_Parameter",
  150. "content": {}
  151. })
  152. appfolderid.value = res.data.appfolderid, // 应用附件文件夹ID
  153. salematerialfolderid.value = res.data.salematerialfolderid // 营销物文件夹ID
  154. }
  155. /**
  156. * 获取excel模式
  157. */
  158. const excelMode = ref('')
  159. const getExcelMode = async () => {
  160. const res = await Api.requested(props.modeParam)
  161. excelMode.value = res.data
  162. }
  163. watch(() => props.failedData, value => {
  164. value ? message.error({content:'部分数据未导入成功,请下载导入失败的数据查看!',key:1}) :""
  165. })
  166. onMounted(() => {
  167. })
  168. </script>
  169. <style scoped>
  170. .flex-between{
  171. display: flex;
  172. justify-content: space-between;
  173. padding: 20px 15px 0 0;
  174. }
  175. </style>