库位导入显示进度条
							parent
							
								
									9480a8f874
								
							
						
					
					
						commit
						2c1e96580c
					
				| 
						 | 
					@ -65,4 +65,11 @@ export const locationApi = {
 | 
				
			||||||
    multipleInsert: (param: object) => {
 | 
					    multipleInsert: (param: object) => {
 | 
				
			||||||
        return postRequest('/location/multipleInsert', param);
 | 
					        return postRequest('/location/multipleInsert', param);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 导入  @author  hj
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    importLocations: (file: object, config = {}) => {
 | 
				
			||||||
 | 
					        return postRequest('/location/importLocations', file, config);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -146,11 +146,12 @@ export const request = (config) => {
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * post请求
 | 
					 * post请求
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const postRequest = (url, data) => {
 | 
					export const postRequest = (url, data,configs = {}) => {
 | 
				
			||||||
  return request({
 | 
					  return request({
 | 
				
			||||||
    data,
 | 
					    data,
 | 
				
			||||||
    url,
 | 
					    url,
 | 
				
			||||||
    method: 'post',
 | 
					    method: 'post',
 | 
				
			||||||
 | 
					    ...configs,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,11 +69,18 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <a-button @click="showMultipleInsertForm" type="primary" v-privilege="'location:multipleInsert'">
 | 
					        <a-button @click="showMultipleInsertForm" type="primary" v-privilege="'location:multipleInsert'">
 | 
				
			||||||
          <template #icon>
 | 
					          <template #icon>
 | 
				
			||||||
            <EditOutlined/>
 | 
					            <PlusOutlined/>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
          批量新建
 | 
					          批量新建
 | 
				
			||||||
        </a-button>
 | 
					        </a-button>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <a-button @click="showImportModal" type="primary" v-privilege="'location:importLocations'">
 | 
				
			||||||
 | 
					          <template #icon>
 | 
				
			||||||
 | 
					            <ImportOutlined/>
 | 
				
			||||||
 | 
					          </template>
 | 
				
			||||||
 | 
					          导入
 | 
				
			||||||
 | 
					        </a-button>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div class="smart-table-setting-block">
 | 
					      <div class="smart-table-setting-block">
 | 
				
			||||||
        <TableOperator v-model="columns" :tableId="TABLE_ID_CONST.BUSINESS.BASE.LOCATION" :refresh="queryData"/>
 | 
					        <TableOperator v-model="columns" :tableId="TABLE_ID_CONST.BUSINESS.BASE.LOCATION" :refresh="queryData"/>
 | 
				
			||||||
| 
						 | 
					@ -166,6 +173,39 @@
 | 
				
			||||||
    <!--    批量新建-->
 | 
					    <!--    批量新建-->
 | 
				
			||||||
    <MultipleInsert ref="multipleInsertFormRef" @reloadList="queryData"/>
 | 
					    <MultipleInsert ref="multipleInsertFormRef" @reloadList="queryData"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <a-modal v-model:open="importModalShowFlag" title="导入" @onCancel="hideImportModal" @ok="hideImportModal">
 | 
				
			||||||
 | 
					      <div style="text-align: center; width: 400px; margin: 0 auto">
 | 
				
			||||||
 | 
					        <a-button @click="downloadExcel">
 | 
				
			||||||
 | 
					          <download-outlined/>
 | 
				
			||||||
 | 
					          第一步:下载模板
 | 
				
			||||||
 | 
					        </a-button>
 | 
				
			||||||
 | 
					        <br/>
 | 
				
			||||||
 | 
					        <br/>
 | 
				
			||||||
 | 
					        <a-upload
 | 
				
			||||||
 | 
					            v-model:fileList="fileList"
 | 
				
			||||||
 | 
					            name="file"
 | 
				
			||||||
 | 
					            :multiple="false"
 | 
				
			||||||
 | 
					            action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
 | 
				
			||||||
 | 
					            accept=".xls,.xlsx"
 | 
				
			||||||
 | 
					            :before-upload="beforeUpload"
 | 
				
			||||||
 | 
					            @remove="handleRemove"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          <a-button>
 | 
				
			||||||
 | 
					            <upload-outlined/>
 | 
				
			||||||
 | 
					            第二步:选择文件
 | 
				
			||||||
 | 
					          </a-button>
 | 
				
			||||||
 | 
					        </a-upload>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <br/>
 | 
				
			||||||
 | 
					        <a-button @click="onImportLocations">
 | 
				
			||||||
 | 
					          <ImportOutlined/>
 | 
				
			||||||
 | 
					          第三步:开始导入
 | 
				
			||||||
 | 
					        </a-button>
 | 
				
			||||||
 | 
					        <!-- 新增进度条 -->
 | 
				
			||||||
 | 
					        <a-progress v-if="uploadProgress > 0" :percent="uploadProgress" status="active" />
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </a-modal>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  </a-card>
 | 
					  </a-card>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
| 
						 | 
					@ -185,6 +225,7 @@ import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue
 | 
				
			||||||
import DictPreview from '/@/components/dict-preview/index.vue';
 | 
					import DictPreview from '/@/components/dict-preview/index.vue';
 | 
				
			||||||
import {useDict} from '/@/utils/dict';
 | 
					import {useDict} from '/@/utils/dict';
 | 
				
			||||||
import MultipleInsert from "/@/views/business/base/location/multiple-insert.vue";
 | 
					import MultipleInsert from "/@/views/business/base/location/multiple-insert.vue";
 | 
				
			||||||
 | 
					import { UploadFile } from 'ant-design-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const locType = useDict('LOC_TYPE');
 | 
					const locType = useDict('LOC_TYPE');
 | 
				
			||||||
| 
						 | 
					@ -407,4 +448,82 @@ const multipleInsertFormRef = ref();
 | 
				
			||||||
function showMultipleInsertForm() {
 | 
					function showMultipleInsertForm() {
 | 
				
			||||||
  multipleInsertFormRef.value.showMultipleInsert();
 | 
					  multipleInsertFormRef.value.showMultipleInsert();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ------------------------------- 导出和导入 ---------------------------------
 | 
				
			||||||
 | 
					// 导入弹窗
 | 
				
			||||||
 | 
					const importModalShowFlag = ref(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const fileList = ref<UploadFile[]>([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 新增上传进度
 | 
				
			||||||
 | 
					const uploadProgress = ref(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 显示导入
 | 
				
			||||||
 | 
					function showImportModal() {
 | 
				
			||||||
 | 
					  fileList.value = [];
 | 
				
			||||||
 | 
					  uploadProgress.value = 0;
 | 
				
			||||||
 | 
					  importModalShowFlag.value = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 关闭 导入
 | 
				
			||||||
 | 
					function hideImportModal() {
 | 
				
			||||||
 | 
					  importModalShowFlag.value = false;
 | 
				
			||||||
 | 
					  uploadProgress.value = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//下载模板
 | 
				
			||||||
 | 
					function downloadExcel() {
 | 
				
			||||||
 | 
					  window.open('https://smartadmin.vip/cdn/%E5%95%86%E5%93%81%E6%A8%A1%E6%9D%BF.xls');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 移除文件
 | 
				
			||||||
 | 
					function handleRemove(file: UploadFile) {
 | 
				
			||||||
 | 
					  const index = fileList.value.indexOf(file);
 | 
				
			||||||
 | 
					  const newFileList = fileList.value.slice();
 | 
				
			||||||
 | 
					  newFileList.splice(index, 1);
 | 
				
			||||||
 | 
					  fileList.value = newFileList;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 上传文件
 | 
				
			||||||
 | 
					function beforeUpload(file:UploadFile) {
 | 
				
			||||||
 | 
					  fileList.value = [...(fileList.value || []), file];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//导入
 | 
				
			||||||
 | 
					async function onImportLocations() {
 | 
				
			||||||
 | 
					  console.log(fileList.value.length);
 | 
				
			||||||
 | 
					  if (fileList.value.length === 0) {
 | 
				
			||||||
 | 
					    return message.error('请选择文件');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const formData = new FormData();
 | 
				
			||||||
 | 
					  fileList.value.forEach((file: UploadFile) => {
 | 
				
			||||||
 | 
					    formData.append('file', file.originFileObj!);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SmartLoading.show();
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    // 补全进度条的显示代码
 | 
				
			||||||
 | 
					    const config = {
 | 
				
			||||||
 | 
					      onUploadProgress: (progressEvent) => {
 | 
				
			||||||
 | 
					        const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
 | 
				
			||||||
 | 
					        // 更新进度条状态
 | 
				
			||||||
 | 
					        console.log(`上传进度: ${percentCompleted}%`);
 | 
				
			||||||
 | 
					        uploadProgress.value = percentCompleted;
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    let res = await locationApi.importLocations(formData, config);
 | 
				
			||||||
 | 
					    message.success(res.msg);
 | 
				
			||||||
 | 
					    await queryData();
 | 
				
			||||||
 | 
					  } catch (e) {
 | 
				
			||||||
 | 
					    smartSentry.captureError(e);
 | 
				
			||||||
 | 
					    message.error('导入失败');
 | 
				
			||||||
 | 
					  } finally {
 | 
				
			||||||
 | 
					    SmartLoading.hide();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue