web/src/views/social/update.vue

306 lines
7.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="container-wrapper">
<div class="top">
<div class="download_btn">
<el-space>
<el-form-item label="起始日期">
<el-date-picker
v-model="updt_time"
type="date"
placeholder="选择一个起始日期"
size="default"
unlink-panels
/>
</el-form-item>
<el-form-item label="">
<el-button type="primary" v-if="canDownload && !isDownLoading" @click="start">更新目录</el-button>
<el-button @click="stop_download" type="primary" v-else-if="!canDownload && isDownLoading">暂停下载
</el-button>
<el-button type="primary" v-else-if="canDownload && isDownLoading" disabled>正在暂停</el-button>
</el-form-item>
<el-form-item label="" class="tip">提示:因医保规定有效期更新早6点至19点期间仅可更新30天内数据</el-form-item>
</el-space>
</div>
<div>
<el-button type="primary" >有效期更新</el-button>
<el-button type="primary" >自付比例更新</el-button>
<el-button type="primary" >医保限额更新</el-button>
</div>
</div>
<div class="content">
<el-card v-for="(item,index) in op_list" style="margin: 10px 0">
<div class="text">
<el-icon v-if="current_index==index+1" class="is-loading" color="#F60">
<Loading/>
</el-icon>
<el-icon v-if="current_index>index" color="#090">
<SuccessFilled/>
</el-icon>
{{ item.content }}
<div class="tip_message" v-if="current_index==index+1">{{ tip_message }}</div>
</div>
<el-progress :percentage="100" v-if="current_index==index+1 &&current_index!=7" :format="format"
:indeterminate="true"/>
<el-progress :percentage="up_percent" v-if="current_index==index+1 && current_index==7" :format="format"/>
</el-card>
</div>
</div>
</template>
<script setup lang="ts">
import {ref, reactive, onMounted} from 'vue';
import {ElNotification, type TabsPaneContext} from 'element-plus'
import {post} from '@/utils/request.ts'
import { Loading, SuccessFilled } from '@element-plus/icons-vue';
import {API} from "@/assets/config/API.ts";
const format = (percentage: number) => ('正在更新')
let updt_time = ref(getDate30DaysAgo())
let current_page = ref(1);
let total_page = ref(0);
function getDate30DaysAgo() {
const currentDate = new Date();
currentDate.setDate(currentDate.getDate() - 29);
const year = currentDate.getFullYear();
const month = String(currentDate.getMonth() + 1).padStart(2, '0');
const day = String(currentDate.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
let up_percent = ref(0)
let op_list = reactive([
// {
// content: "中西成药目录更新",
// op: function () {
// start_download(1301)
// }
// },
// {
// content: "中药饮片目录更新",
// op: function () {
// start_download(1302)
// }
// },
// {
// content: "医疗项目目录更新",
// op: function () {
// start_download(1305)
// }
// },
// {
// content: "医疗耗材目录更新",
// op: function () {
// start_download(1306)
// }
// },
// {
// content: "疾病诊断目录更新",
// op: function () {
// start_download(1307)
// }
// },
// {
// content: "曼特病目录更新",
// op: function () {
// start_download(1309)
// }
// },
{
content: "有效期更新",
op: function () {
start_updatetime()
}
}
])
let current_index = ref(-1);
let start = () => {
current_index.value = 0
next()
}
let next = () => {
tip_message.value = "";
if (current_index.value < op_list.length) {
op_list[current_index.value].op()
current_index.value++
} else {
canDownload.value = true;
current_index.value = 99
up_percent.value = 0
ElNotification({
title: '提示',
message: "更新全部完成",
type: 'success',
})
}
}
let current_up_page = ref(1);
let start_updatetime = () => {
current_up_page.value = 1;
update_time()
}
let update_time = () => {
post(API.Social.Directory_upinfo.Get_page, {
updt_time: updt_time.value,
page: current_up_page.value
}, {catch_error: true}).then((res: any) => {
let pages = res.pages;
let number = res.number;
if (current_up_page.value < pages) {
current_up_page.value++
update_time();
tip_message.value = "正在更新有效期,当前进度:" + current_up_page.value + "/" + pages + "本页有效数据:" + number + "条";
up_percent.value = Math.floor((current_up_page.value / pages) * 100)
} else {
up_percent.value = 0
next();
}
}).catch((err: any) => {
isDownLoading.value = false;
canDownload.value = true;
current_index.value = -1
})
}
let canDownload = ref(true);
let isDownLoading = ref(false);
let tip_message = ref('提示:如果更新目录,请不要强制关闭本程序,否则有可能数据不完整');
let tableData: any = ref([])
let content: any = ref(null);
onMounted(() => {
});
let start_download = (type: number) => {
if (isDownLoading.value) {
ElNotification({
title: '存在未完成的下载',
message: "存在未完成的下载任务,请不要关闭程序,并稍后重试",
type: 'error',
})
return;
}
canDownload.value = false;
tip_message.value = "正在获取版本信息" + ",请不要强制关闭程序,否则数据不完整";
post(API.Social.Directory_version.Get_current, {type: type}, {catch_error: true}).then((res: any) => {
tip_message.value = "正在更新目录,上一个版本:" + res.currentVersionName + ",请不要强制关闭程序,否则数据不完整";
download(res.currentVersionName, type);
}).catch((err: any) => {
isDownLoading.value = false;
canDownload.value = true;
current_index.value = -1
})
}
let stop_download = () => {
canDownload.value = true;
ElNotification({
title: '提示',
message: "暂停下载成功,请不要强制关闭程序,否则数据不完整,请等待自动停止",
type: 'success',
})
}
function download(ver: String, type: any) {
isDownLoading.value = true;
post(API.Social.Directory.Download, {ver: ver, type: type}, {catch_error: true})
.then((res: any) => {
isDownLoading.value = false;
if (res == null) {
next();
return;
}
if (!canDownload.value) {
start_download(type);
} else {
tip_message.value = "";
ElNotification({
title: '提示',
message: "更新全部完成",
type: 'success',
})
}
})
.catch((err: any) => {
isDownLoading.value = false;
canDownload.value = true;
current_index.value = -1
})
.finally(() => {
current_page.value = 1;
})
}
</script>
<style scoped lang="scss">
.container {
box-sizing: border-box;
padding: 20px;
overflow: hidden;
display: flex;
flex-direction: column;
height: 100%;
.top {
.tip {
color: #999;
}
width: 100%;
height: 50px;
:deep(.el-tabs__item) {
font-size: 16px;
}
}
.content {
width: 100%;
flex: 1;
overflow: hidden;
.tip_message {
color: #999;
font-size: 12px;
}
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
.page_btn_list {
position: absolute;
left: 0;
top: 10px;
}
.download_btn {
position: absolute;
right: 0;
top: 10px;
}
}
.tip_bottom {
width: 100%;
height: 40px;
background-color: #FFF;
line-height: 40px;
color: #999;
}
}
</style>