123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <template>
- <n-button type="primary" @click="showImportModal">导入数据</n-button>
- <n-modal
- v-model:show="showModal"
- :show-icon="false"
- preset="dialog"
- title="导入"
- >
- <n-form :model="formValue" label-width="auto" show-require-mark>
- <n-form-item label="数据">
- <n-upload :default-upload="false" :max="1" @change="handleChange">
- <div style="display: flex;align-items: center;">
- <n-button>上传文件</n-button>
- <div style="margin-left: 20px;color: #2d8cf0;">进度:{{ sum }}/{{ dataList.length }}</div>
- </div>
- </n-upload>
- </n-form-item>
- </n-form>
- <div style="float: right;">
- <n-button @click="showModal=false">
- 取消
- </n-button>
- <n-button type="primary" @click="submitCallback" :disabled="disableds" style="margin-left: 20px;">
- 确认
- </n-button>
- </div>
- </n-modal>
- </template>
- <script setup>
- import { addTaskDatas } from '@/api';
- import { read, utils } from 'xlsx';
- import { useDateFormat } from '@vueuse/core';
- import { ref, watch } from 'vue';
- const props = defineProps({
- task: {
- required: true,
- default: {},
- },
- });
- const disableds = ref(false)
- const message = useMessage();
- const sum = ref(0)
- // 是否展示 Modal
- const showModal = ref(false);
- //
- const dataList = ref([]);
- /* 读取文件 */
- const readFile = (file) => {
- return new Promise((resolve) => {
- const reader = new FileReader();
- reader.readAsBinaryString(file);
- reader.onload = (ev) => {
- resolve(ev.target.result);
- };
- });
- };
- // 组件状态变化的回调
- const handleChange = async ({ file }) => {
- const dataBinary = await readFile(file.file);
- const workBook = read(dataBinary, {
- type: 'binary',
- cellDates: true,
- });
- const workSheet = workBook.Sheets[workBook.SheetNames[0]];
- dataList.value = utils.sheet_to_json(workSheet);
- dataList.value.forEach((item) => {
- item['记录时间'] = useDateFormat(
- item['记录时间'],
- 'YYYY-MM-DD HH:mm:ss'
- ).value;
- });
- };
- // 表单数据
- const formValue = reactive({
- Time_start: null,
- Time_end: null,
- T_sn: '',
- T_id: '',
- page: 1,
- page_z: 9999,
- });
- // 显示导入
- const showImportModal = () => {
- sum.value = 0
- showModal.value = true;
- disableds.value = false
- };
- watch(showModal,(newVal)=>{
- if(!newVal){
- sum.value = 0
- dataList.value=[]
- }
- })
- //
- const submitCallback = async () => {
- sum.value = 0
- if(dataList.value.length==0){
- message.error('没有可导入数据哦,检查文件是否为空数据')
- return
- }else{
- disableds.value = true
- let chunk = 100;
- for (let i = 0; i < dataList.value.length; i += chunk) {
- let dataIt = await dataFun(dataList.value.slice(i, i + chunk))
- const resIt = await addTask(dataIt)
- sum.value += Number(resIt.data.Data)
- if(sum.value==dataList.value.length){
- message.success('数据导入完成')
- // disableds.value = false
- }
- }
- }
- };
- const dataFun = (arr)=>{
- return new Promise(resolve=>{
- const arr1 = arr.map(item => item['SN'] + '|' + item['编号'] + '|' + item['温度℃'] + '|' + item['湿度%'] + '|' + item['记录时间'])
- setTimeout(()=>{
- resolve(arr1.join('?'))
- },100)
- })
- }
- //
- const addTask = async (item) => {
- return new Promise(resolve=>{
- setTimeout(() => {
- const res = addTaskDatas({
- T_task_id: props.task.T_task_id,
- T_Data:item
- });
- resolve(res)
- },100)
-
- })
- };
- </script>
- <style lang="scss" scoped></style>
|