Commit 0aa96dcb authored by songrui's avatar songrui

医生端 工作台

parent f5af8181
......@@ -79,7 +79,7 @@
<!-- built files will be auto injected -->
</body>
<script>
var vConsole =new VConsole();
console.log('Hello world');
// var vConsole =new VConsole();
// console.log('Hello world');
</script>
</html>
import {fetchBase} from '@/api/doctor/doctorFetch'
// 查询最近工作记录
export function getWorkByPage(params, loading) {
return fetchBase({ url: `/chronic-admin/v1/chronic-workbench/lately-service`, body: params, loading })
}
// 查询待随访列表
export function getVisitByPage(params, loading) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-task/page`, body: params, loading })
}
// 待随访列表忽略
export function delVisit(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-task/delete`, body: params, loading: true })
}
\ No newline at end of file
<svg width="18" height="16" viewBox="0 0 18 16" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H18V2H0V0ZM0 7H18V9H0V7ZM0 14H18V16H0V14Z"/>
</svg>
<template>
<van-config-provider :theme-vars='themeVars' class="h-full">
<van-config-provider :theme-vars='themeVars' style="height: 100vh">
<div class='h-full resident-home'>
<router-view v-slot='{ Component }'>
<Transition name='route' mode='out-in'>
......@@ -52,7 +52,7 @@ export default {
if (!token) {
token = sessionStorage.getItem('token')
if (process.env.NODE_ENV !== 'production') {
token = 'c44236d5-f78e-4b8c-a30b-d70018ce3c74'
token = '28015f4f-ce3f-4dee-934b-0a72a7804bc2'
}
}
if (token) {
......@@ -72,6 +72,87 @@ export default {
}
</script>
<style lang='less' scoped>
<style lang='less'>
// 按钮样式
.doc-btn {
border: 0;
padding: 4px 12px;
height: 26px;
}
.doc-btn-primary {
.doc-btn();
color: var(--van-primary-color);
background: #F0F3FF;
}
.doc-btn-red {
.doc-btn();
color: #FF4D4F;
background: #FFF3F0;
}
// tab 样式
.doc-tab-round {
.van-tabs__nav--card {
column-gap: 10px;
border: 0;
margin: 0;
background: transparent;
}
.van-tab--card {
border: 0;
border-radius: 40px;
background: #fff;
color: #262626;
font-size: 14px;
line-height: 28px;
padding: 0 10px;
transition: all .2s;
}
.van-tab--card.van-tab--active {
color: #fff;
background: var(--van-primary-color);
font-weight: 500;
}
}
.doc-tab-round[line] {
.van-tab--card {
border: 1px solid #fff;
}
.van-tab--card.van-tab--active {
color: var(--van-primary-color);
border: 1px solid var(--van-primary-color);
background: #E6F0FF;
font-weight: 500;
}
}
// list列表中的card
.doc-list-card {
border-radius: 12px;
background-color: #fff;
.name {
font-size: 16px;
font-weight: 600;
}
.tag {
background: #F0F3FF;
padding: 4px 8px;
border-radius: 8px;
font-size: 12px;
line-height: 1;
}
.label {
display: inline-block;
color: #8C8C8C;
min-width: 104px;
}
.divider {
border-bottom: 1px solid #c0ccdf;
}
.bt-group {
display: flex;
justify-content: flex-end;
}
}
</style>
<template>
<div class="px-3 py-3 flex items-center doc-nav-bar">
<div class="shrink-0 left">
<slot name="left">
<span class="back-btn" @click="goBack">
<doc-icon type="doc-left-1" style="color: #262626"/>
</span>
</slot>
</div>
<div class="grow text-center title">
<slot>
{{title}}
</slot>
</div>
<div class="shrink-0 right">
<slot name="right"></slot>
</div>
</div>
</template>
<script>
export default {
name: 'DocNavBar',
props: {
title: String
},
methods: {
goBack() {
this.$router.back()
}
}
}
</script>
<style lang="less" scoped>
.doc-nav-bar {
background: transparent;
border-bottom: 1px solid #c0ccdf;
.left {
min-width: 24px;
}
.title {
font-size: 16px;
}
}
</style>
<template>
<div class="workbench"></div>
<div class="h-full flex flex-col workbench">
<DocNavBar title="慢病管理" class="shrink-0">
<template #right>
<doc-icon type="doc-search" style="color: #262626"
@click="toSearch"/>
</template>
</DocNavBar>
<div class="grow flex flex-col" style="min-height: 0">
<div class="shrink-0 workbench-tab">
<div class="back"></div>
<div class="flex workbench-tab-inner" ref="tab-inner">
<div v-for="(item, index) in configTab" :key="item.key" @click="tabSelect(item, index)"
:class="['item', { 'item-active': item.key == tabActive.key }]">{{item.name}}</div>
</div>
</div>
<div class="grow" style="background: #F8FAFC;min-height: 0;">
<component :is="tabActive.component"
:ref="tabActive.key"/>
</div>
</div>
</div>
</template>
<script>
import DocNavBar from '@/doctor/components/docNavBar/DocNavBar.vue'
import TableWork from './tables/Work.vue'
import TableVisit from './tables/Visit.vue'
export default {
components: {
DocNavBar,
TableWork,
TableVisit
},
data() {
return {
configTab: [
{ key: 'work', component: 'TableWork', name: '工作记录' },
{ key: 'visit', component: 'TableVisit', name: '慢病待随访' },
{ key: 'screenRecord', component: 'TableScreenRecord', name: '当年待筛查记录' },
{ key: 'firstScreen', component: 'TableFirstScreen', name: '初筛高危待筛查' },
{ key: 'receive', component: 'TableReceive', name: '待接诊居民' },
{ key: 'highRisk', component: 'TableHighRisk', name: '高危诊断' }
],
tabActive:{}
}
},
created() {
this.tabActive = this.configTab[0]
},
methods: {
toSearch() {
},
tabSelect(item, index) {
this.tabActive = item
const dom = this.$refs['tab-inner']
if (!dom) return
// console.log(dom.children[index].offsetLeft, dom.scrollLeft, dom.clientWidth, dom.scrollWidth, scrollNum)
// dom.children[index].scrollIntoView({ behavior: 'smooth', inline: 'start' })
const scrollNum = dom.children[index].offsetLeft - (dom.clientWidth - dom.children[index].clientWidth) / 2
dom.scrollTo({ left: scrollNum > 0 ? scrollNum : 0, behavior: 'smooth' })
}
}
}
</script>
<style lang="less" scoped>
.workbench {
background: linear-gradient(to bottom, #C6DBF9, #EFF2F7);
}
.workbench-tab {
background: #C6DBF9;
padding-top: 10px;
position: relative;
.workbench-tab-inner {
align-items: flex-end;
position: relative;
overflow-x: auto;
overflow-y: hidden;
&::-webkit-scrollbar {
display: none;
}
}
.back {
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 42px;
background-color: #E7F1FF;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
}
.item {
flex: 1 0 auto;
position: relative;
padding: 0 16px;
height: 42px;
line-height: 42px;
text-align: center;
&:first-child {
border-top-left-radius: 12px;
}
&:last-child {
border-top-right-radius: 12px;
}
}
.item-active:first-child {
border-top-left-radius: 12px;
&::before {
display: none;
}
}
.item-active:last-child {
border-top-right-radius: 12px;
&::after {
display: none;
}
}
.item-active {
background-color: #F8FAFC;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
font-size: 16px;
height: 46px;
line-height: 46px;
&::after {
content: '';
display: inline-block;
position: absolute;
right: -26px;
bottom: 0;
background: url('@/assets/image/doctor/tab-bg.png') no-repeat;
background-size: auto 100%;
background-position-x: -20px;
height: 100%;
width: 34px;
z-index: 1;
}
&::before {
content: '';
display: inline-block;
position: absolute;
left: -26px;
bottom: 0;
background: url('@/assets/image/doctor/tab-bg.png') no-repeat;
background-size: auto 100%;
background-position-x: -20px;
height: 100%;
width: 34px;
z-index: 1;
transform: rotateY(180deg);
}
}
}
</style>
<template>
<div class="h-full flex flex-col px-2 py-3 work">
<div class="shrink-0 flex pb-2 items-center">
<van-tabs shrink type="card" class="grow doc-tab-round" line
v-model:active="activeTab"
@change="tabChange">
<van-tab v-for="item in tabList" :key="item.value"
:title="item.name"></van-tab>
</van-tabs>
<div class="shrink-0 pl-3" style="border-left: 1px solid #A5AEBE;">
<doc-icon type="doc-menu" style="font-size:.2rem;color:#03053D"/>
</div>
</div>
<div class='grow pt-1 overflow-y-auto' ref='list'>
<van-pull-refresh v-model='loadingRefresh' @refresh='onRefresh'
:disabled='isRefreshDisable' style="min-height: 100%">
<van-list
v-model:loading='loading'
:finished='finished'
:finished-text="list.length ? '没有更多了' : ''"
:immediate-check='false'
@load='onMore'
>
<div class="flex flex-col gap-y-2.5">
<div class="py-3 px-4 doc-list-card" v-for='item in list' :key="item.id">
<div class="mb-4">
<span class="name mr-2">{{ item.residentName }}</span>
<span class="tag mr-2">{{ item.age }}</span>
<span class="tag mr-2">{{ item.genderName || '-' }}</span>
</div>
<div class="flex flex-col gap-y-2.5">
<div>
<span class="label">身份证号</span>
<span>{{ $idCardHide(item.idCard) }}</span>
</div>
<div>
<span class="label">是否逾期</span>
<span>{{ item.isOverdue == 1 ? '是' : '否' }}</span>
</div>
<div>
<span class="label">逾期天数</span>
<span>{{ item.overdueDay }}</span>
</div>
<div class="flex">
<span class="label">慢病标签</span>
<span>
<ChronicTag :list='item.chronicTagsArray' />
</span>
</div>
<div>
<span class="label">数据来源</span>
<span>{{ item.sourceName || '-' }}</span>
</div>
</div>
<div class="divider my-3"></div>
<div class="bt-group">
<van-button round size="small" class="doc-btn-primary">详情</van-button>
<span class="mr-3"></span>
<van-button round size="small" class="doc-btn-primary">通用随访</van-button>
<span class="mr-3"></span>
<van-button round size="small" class="doc-btn-primary" @click="onIgnore(item)">忽略</van-button>
</div>
</div>
</div>
</van-list>
<div class='text-center shrink-0 empty' v-if='!list.length'>
<img src='@/assets/image/doctor/empty.png' alt='' style='width: 1.2rem;'>
<p>暂无数据</p>
</div>
</van-pull-refresh>
</div>
</div>
</template>
<script>
import { getVisitByPage, delVisit } from '@/api/doctor/workbench.js'
import ChronicTag from '@/doctor/components/chronicTag/ChronicTag.vue'
import { showToast } from 'vant'
export default {
name: 'TableVisit',
components: {
ChronicTag
},
data() {
return {
list: [],
pagination: {
total: 0,
pageIndex: 1,
pageSize: 8
},
loading: false,
finished: false,
loadingRefresh: false,
isRefreshDisable: false,
// 慢病tab列表
tabList: [
{ name: '高血压', value: 1 },
{ name: '糖尿病', value: 2 },
{ name: '冠心病', value: 3 },
{ name: '脑卒中', value: 4 },
{ name: '慢阻肺', value: 5 },
{ name: '慢性肾病', value: 6 },
{ name: '血脂异常', value: 7 }
],
activeTab: 0
}
},
computed: {
activeTabItem() {
return this.tabList[this.activeTab] || {}
}
},
created() {
this.load()
},
mounted() {
const list = this.$refs.list
list.addEventListener('scroll', () => {
if (list.scrollTop > 0) {
this.isRefreshDisable = true
} else {
this.isRefreshDisable = false
}
})
},
methods: {
load(loading = true) {
const query = {
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize,
searchType: 1,
diseaseType: this.activeTabItem.value
}
getVisitByPage(query, loading).then(res => {
if (this.pagination.pageIndex === 1) {
this.list = []
}
this.list = this.list.concat(res.data.dataList || [])
this.pagination.total = res.data.total || 0
this.finished = this.list.length >= this.pagination.total
}).finally(() => {
this.loading = false
this.loadingRefresh = false
})
},
onMore() {
this.pagination.pageIndex++
this.load(false)
},
onRefresh() {
this.pagination.pageIndex = 1
this.load()
},
tabChange() {
this.pagination.pageIndex = 1
this.load()
},
toDetail(record) {
if (!record) return
// let path = `/residentWX/screening/firstDetail/${record.id}`
// if (this.activeTab == '2') {
// path = `/residentWX/screening/SecondDetail/${record.id}`
// }
// this.$router.push({ path })
},
onIgnore(record) {
delVisit({ id: record.id }).then(() => {
this.list = this.list.filter(e => e.id !== record.id)
setTimeout(() => {
showToast('操作成功')
}, 800);
})
}
}
}
</script>
<style lang="less" scoped>
</style>
<template>
<div class="h-full flex flex-col px-2 py-3 work">
<div class="shrink-0 flex pb-2 items-center">
<van-tabs shrink type="card" class="grow doc-tab-round" line>
<van-tab title="全部" title-style="padding: 0 .2rem"></van-tab>
</van-tabs>
<doc-icon type="doc-menu" style="font-size:.2rem;color:#03053D"/>
</div>
<div class='grow pt-1 overflow-y-auto' ref='list'>
<van-pull-refresh v-model='loadingRefresh' @refresh='onRefresh'
:disabled='isRefreshDisable' style="min-height: 100%">
<van-list
v-model:loading='loading'
:finished='finished'
:finished-text="list.length ? '没有更多了' : ''"
:immediate-check='false'
@load='onMore'
>
<div class="flex flex-col gap-y-2.5">
<div class="py-3 px-4 doc-list-card" v-for='item in list' :key="item.id">
<div class="mb-4">
<span class="name mr-2">{{ item.residentName }}</span>
<span class="tag mr-2">{{ item.currentAge }}</span>
<span class="tag mr-2">{{ item.genderName }}</span>
</div>
<div class="flex flex-col gap-y-2.5">
<div>
<span class="label">身份证号</span>
<span>{{ item.idCard }}</span>
</div>
<div>
<span class="label">服务类型</span>
<span>{{ item.serviceTypeName }}</span>
</div>
<div>
<span class="label">服务日期</span>
<span>{{ item.serviceDate }}</span>
</div>
<div>
<span class="label">服务医生</span>
<span>{{ item.serviceDoctorName }}</span>
</div>
</div>
<div class="divider my-3"></div>
<div class="bt-group">
<van-button round size="small" class="doc-btn-primary">详情</van-button>
</div>
</div>
</div>
</van-list>
<div class='text-center shrink-0 empty' v-if='!list.length'>
<img src='@/assets/image/doctor/empty.png' alt='' style='width: 1.2rem;'>
<p>暂无数据</p>
</div>
</van-pull-refresh>
</div>
</div>
</template>
<script>
import { getWorkByPage } from '@/api/doctor/workbench.js'
export default {
name: 'TableWork',
data() {
return {
list: [],
pagination: {
total: 0,
pageIndex: 1,
pageSize: 8
},
loading: false,
finished: false,
loadingRefresh: false,
isRefreshDisable: false
}
},
created() {
this.load()
},
mounted() {
const list = this.$refs.list
list.addEventListener('scroll', () => {
if (list.scrollTop > 0) {
this.isRefreshDisable = true
} else {
this.isRefreshDisable = false
}
})
},
methods: {
load(loading = true) {
const query = {
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize,
searchType: 1
}
getWorkByPage(query, loading).then(res => {
if (this.pagination.pageIndex === 1) {
this.list = []
}
this.list = this.list.concat(res.data.dataList || [])
this.pagination.total = res.data.total || 0
this.finished = this.list.length >= this.pagination.total
}).finally(() => {
this.loading = false
this.loadingRefresh = false
})
},
onMore() {
this.pagination.pageIndex++
this.load(false)
},
onRefresh() {
this.pagination.pageIndex = 1
this.load()
},
toDetail(record) {
if (!record) return
// let path = `/residentWX/screening/firstDetail/${record.id}`
// if (this.activeTab == '2') {
// path = `/residentWX/screening/SecondDetail/${record.id}`
// }
// this.$router.push({ path })
}
}
}
</script>
<style lang="less" scoped>
</style>
......@@ -40,6 +40,13 @@ const routes = [
name: 'doctor',
component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/Doctor'),
children: [
{
path: 'workbench',
name: 'doctor-workbench',
component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/workbench/Workbench.vue')
},
{
path: 'followUp/list',
name: 'followUp-list',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment