web/src/views/social/directory.vue

504 lines
13 KiB
Vue

<template>
<div class="container-wrapper">
<div class="top">
<el-tabs v-model="current_tab" @tab-click="change_tab">
<el-tab-pane style="font-size: 30px"
v-for="(tab, index) in tabs"
:key="index"
:label="tab.label"
:name="tab.name"
>
</el-tab-pane>
</el-tabs>
</div>
<div class="tip">
<div class="search_input">
<el-input v-model="search_keyword" placeholder="名称/编号" :suffix-icon="Search" size="large" clearable
@change="change_search"/>
</div>
<div class="search_btn">
<div class="default-btn" @click="change_search">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>
<div class="middel">
</div>
<div class="op_btn">
<el-dropdown placement="bottom">
<div class="default-btn">目录更新</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="start_type">基础更新</el-dropdown-item>
<el-dropdown-item @click="openUpdateBox(1312)">有效期更新</el-dropdown-item>
<el-dropdown-item @click="openUpdateBox(1318)">限价信息更新</el-dropdown-item>
<el-dropdown-item @click="openUpdateBox(1319)">自付比例更新</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
<div class="content" ref="content">
<el-table :data="tableData" v-loading="isDownLoading" style="width: 100%" height="100%">
<el-table-column v-for="(column, index) in column_list" show-overflow-tooltip :fixed="index < 2 ? 'left' : null"
:prop="column['en']" :label="column['zh']" :width="column['column_width']"/>
</el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination background layout="prev, pager, next" :page-count="total_page"
v-model:current-page="current_page" @current-change="change_page"/>
</div>
</div>
<Mask :is-show="UpdateDirectoryLoading" :width="540" :height="160+24+24+60" title="更新版本" @close="close">
<div style="height:100%;padding: 24px">
<div class="updateDirectory">
<div class="updateDirectory-message">{{ tip_message }}</div>
<div class="demo-progress">
<el-progress :percentage="100" :stroke-width="30" striped
striped-flow :show-text="false"/>
</div>
</div>
</div>
</Mask>
<Mask :is-show="isUpdate1312" :width="540" :height="347" title="有效期更新" @close="close">
<div class="content-new">
<div class="update_box">
<el-date-picker
v-model="updt_time"
type="date"
placeholder="选择一个起始日期"
size="default"
style="flex: 1;height: 100%"
/>
<div class="default-btn startBtn" @click="update1312(1)"
:style="{background: showBtn ? '#EDEFF6' : '', color: showBtn ? '#333333' : ''}">
开始更新
</div>
</div>
<div class="tip-body">
<div class="tip">
<div class="tip-title">
{{ tip }}
</div>
<div class="demo-progress">
<el-progress v-if="tip" :stroke-width="30" :percentage="percent"
/>
</div>
</div>
</div>
</div>
</Mask>
<Mask :is-show="isUpdate1318" :width="540" :height="347" title="限价信息更新" @close="close">
<div class="content-new">
<div class="update_box">
<el-date-picker
v-model="updt_time"
type="date"
placeholder="选择一个起始日期"
size="default"
style="flex: 1;height: 100%"
/>
<div class="default-btn startBtn" @click="update1318(1)"
:style="{background: showBtn ? '#EDEFF6' : '', color: showBtn ? '#333333' : ''}"
>
开始更新
</div>
</div>
<div class="tip-body">
<div class="tip">
<div class="tip-title">
{{ tip }}
</div>
<div class="demo-progress">
<el-progress v-if="tip" :text-inside="true" :stroke-width="30" :percentage="percent"/>
</div>
</div>
</div>
</div>
</Mask>
<Mask :is-show="isUpdate1319" :width="540" :height="347" title="自付比例更新" @close="close">
<div class="content-new">
<div class="update_box">
<el-date-picker
v-model="updt_time"
type="date"
placeholder="选择一个起始日期"
size="default"
style="flex: 1;height: 100%"
/>
<div class="default-btn startBtn" @click="update1319(1)"
:style="{background: showBtn ? '#EDEFF6' : '', color: showBtn ? '#333333' : ''}">
开始更新
</div>
</div>
<div class="tip-body">
<div class="tip">
<div class="tip-title">
{{ tip }}
</div>
<div class="demo-progress">
<el-progress v-if="tip" :text-inside="true" :stroke-width="30" :percentage="percent"/>
</div>
</div>
</div>
</div>
</Mask>
</div>
</template>
<script setup lang="ts">
import {ref, onMounted, watch, nextTick} from 'vue';
import {ElNotification, type TabsPaneContext} from 'element-plus'
import {post} from '@/utils/request.ts'
import {Search} from '@element-plus/icons-vue'
import Mask from "@/components/common/Mask.vue";
let isUpdate1312 = ref(false)
let isUpdate1318 = ref(false)
let isUpdate1319 = ref(false)
let updt_time = ref(new Date())
let current_page = ref(1);
let total_page = ref(0)
let current_tab = ref(1301);
let column_list = ref([]);
let search_keyword = ref("");
let isDownLoading = ref(false);
let tip = ref("")
const tabs = [
{label: '中西成药', name: 1301},
{label: '中药饮片', name: 1302},
{label: '医疗项目', name: 1305},
{label: '医疗耗材', name: 1306},
{label: '疾病诊断', name: 1307},
{label: '慢特病种', name: 1309},
{label: '中医疾病', name: 1314},
{label: '中医证候', name: 1315},
{label: '中药配方颗粒', name: 1320},
{label: 'ICPC诊断项目', name: 1361},
{label: 'ICPC服务项目', name: 1362},
];
let tableData: any = ref([])
let content: any = ref(null);
const showBtn = ref(false)
const percent = ref(0)
const percentage = ref<any>(0)
let update1312 = (current_page: number) => {
showBtn.value = true
if (current_page == 1) {
tip.value = "开始更新第1页"
}
post("social/directory_upinfo/get_page", {
updt_time: updt_time.value,
page: current_page
}, {catch_error: true}).then((res: any) => {
let pages = res.pages;
let number = res.number;
if (current_page < pages && isUpdate1312.value) {
current_page++
percent.value = Math.floor((current_page / pages) * 10000)
tip.value = "开始更新第:" + current_page + "/" + pages;
update1312(current_page);
} else {
tip.value = "所有更新已完成"
close()
}
}).catch((err: any) => {
close()
})
}
const openUpdateBox = (type: number) => {
//获取30天前时间
let start_time = new Date();
start_time.setDate(start_time.getDate() - 30);
updt_time.value = start_time;
if (type == 1312) {
isUpdate1312.value = true
}
if (type == 1318) {
isUpdate1318.value = true
}
if (type == 1319) {
isUpdate1319.value = true
}
}
onMounted(() => {
init()
});
let change_search = () => {
init()
}
function init() {
current_page.value = 1;
set_tab()
}
function set_tab() {
post("social/directory/column_list", {type: current_tab.value})
.then((res: any) => {
column_list.value = res;
get_data_list();
})
}
function get_data_list() {
isDownLoading.value = true;
let content_height = content.value.clientHeight;
let rows = Math.floor(content_height / 40);
post("social/directory/get_doc_list", {
type: current_tab.value,
page: current_page.value,
size: 30,
search_keyword: search_keyword.value
}).then((res: any) => {
isDownLoading.value = false;
total_page.value = res.total_page;
tableData.value = res.list
tableData.value.forEach((item: any) => {
if (item.enddate == null) {
item.enddate = "长期有效"
}
if (item.json?.rx_flag) {
item.json.rx_flag = item.json.rx_flag == 1 ? "是" : "否"
}
})
})
}
let change_page = (val: number) => {
get_data_list()
}
let change_tab = (tab: TabsPaneContext, event: Event) => {
search_keyword.value = "";
nextTick(() => {
init()
})
}
let UpdateDirectoryLoading = ref(false)
const tip_message = ref("正在更新目录,请稍后...")
const start_type = () => {
UpdateDirectoryLoading.value = true
post("social/directory_version/get_current", {type: current_tab.value}, {catch_error: true}).then((res: any) => {
tip_message.value = "正在更新目录,上一个版本:" + res.currentVersionName + ",请不要强制关闭程序,否则数据不完整";
download(res.currentVersionName, current_tab.value);
}).catch((err: any) => {
UpdateDirectoryLoading.value = false;
ElNotification({
title: '提示',
message: "当前是最新版本",
type: 'success',
})
})
}
let download = (ver: any, type: any) => {
post("social/directory/download", {ver: ver, type: type}).then((res: any) => {
if (res == null || res == "") {
UpdateDirectoryLoading.value = false;
ElNotification({
title: '提示',
message: "当前是最新版本",
type: 'success',
})
return
}
get_data_list()
start_type()
}).catch((err: any) => {
UpdateDirectoryLoading.value = false;
ElNotification({
title: '提示',
message: "当前是最新版本",
type: 'success',
})
})
}
const close = () => {
showBtn.value = false
UpdateDirectoryLoading.value = false;
isUpdate1312.value = false
isUpdate1318.value = false
isUpdate1319.value = false
tip.value = ""
percent.value = 100
}
const update1318 = (current_page: number) => {
showBtn.value = true
if (current_page == 1) {
tip.value = "开始更新第1页"
}
post('social/directory_limit/get_page', {
updt_time: updt_time.value,
page: current_page
}).then((res: any) => {
let pages = res.pages;
let number = res.number;
if (current_page < pages && isUpdate1318.value) {
current_page++
percent.value = Math.floor((current_page / pages) * 10000)
tip.value = "开始更新第:" + current_page + "/" + pages;
update1318(current_page);
} else {
tip.value = "所有更新已完成"
close()
}
})
}
const update1319 = (current_page: number) => {
showBtn.value = true
if (current_page == 1) {
tip.value = "开始更新第1页"
}
post('social/directory_self/get_page', {
updt_time: updt_time.value,
page: current_page
}).then((res: any) => {
let pages = res.pages;
let number = res.number;
if (current_page < pages && isUpdate1319.value) {
current_page++
percent.value = Math.floor((current_page / pages) * 10000)
tip.value = "开始更新第:" + current_page + "/" + pages;
update1318(current_page);
} else {
tip.value = "所有更新已完成"
close()
}
})
}
</script>
<style scoped lang="scss">
.container-wrapper {
box-sizing: border-box;
padding: 20px;
overflow: hidden;
display: flex;
flex-direction: column;
height: 100%;
.top {
width: 100%;
height: 50px;
:deep(.el-tabs__item) {
font-size: 16px;
}
}
.tip {
display: flex;
.search_input {
flex: 1;
}
.search_btn {
width: 140px;
padding-left: 10px;
padding-right: 10px;
}
.middel {
width: 200px;
}
.op_btn {
width: 120px;
}
}
.content {
width: 100%;
flex: 1;
overflow: hidden;
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
border-top: 1px solid #EEE;
display: flex;
justify-content: flex-end;
align-items: center;
.download_btn {
position: absolute;
right: 0;
top: 10px;
}
}
}
.content-new {
height: 100%;
display: flex;
flex-direction: column;
.update_box {
width: 100%;
height: 90px;
padding: 24px;
display: flex;
justify-content: space-between;
.startBtn {
height: 100%;
margin-left: 24px;
display: flex;
justify-content: center;
align-items: center;
}
}
.tip-body {
flex: 1;
padding: 0 24px 24px;
min-height: 0;
.tip {
width: 100%;
height: 100%;
background: #F9FAFC;
border-radius: 8px;
font-weight: 500;
font-size: 16px;
color: #999999;
font-style: normal;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 24px;
}
}
}
.updateDirectory {
height: 100%;
padding: 24px;
background: #F9FAFC;
font-weight: 500;
font-size: 16px;
color: #999999;
font-style: normal;
display: flex;
flex-direction: column;
justify-content: space-between;
&-message {
margin-bottom: 24px;
}
}
</style>