294 lines
9.3 KiB
Vue
294 lines
9.3 KiB
Vue
|
|
<template>
|
|||
|
|
<full-page pageStyle="background:#f5f5f5" @reachBottom="getMore()">
|
|||
|
|
<!-- <template #header>
|
|||
|
|
<view class="header-tabs" :style="elderVarStyle">
|
|||
|
|
<view v-for="tab in tabs" :key="tab.value" :class="['tab', { active: activeTab === tab.value }]"
|
|||
|
|
@click="switchTab(tab.value)">
|
|||
|
|
{{ tab.label }}
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template> -->
|
|||
|
|
|
|||
|
|
<view class="px-15" :style="elderVarStyle">
|
|||
|
|
<template v-if="activeTab === 'history-prescription' && list.length">
|
|||
|
|
<view v-for="i in list" :key="i._id" class="history-item shadow-lg rounded" @click="select(i)">
|
|||
|
|
<view class="history-item-time">{{ i.time }}</view>
|
|||
|
|
<view class="history-item-body">
|
|||
|
|
<view class="history-item-content">
|
|||
|
|
<view class="history-disease">【诊断】{{ i.disease }}</view>
|
|||
|
|
<view class="history-drugs">【药品】{{ i.drugNames }}</view>
|
|||
|
|
</view>
|
|||
|
|
<image class="checked-icon" :class="elderClass"
|
|||
|
|
:src="`/static/icons/${selection && selection._id === i._id ? 'checked' : 'unchecked'}.svg`">
|
|||
|
|
</image>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
<template v-else-if="activeTab === 'purchase-record' && ninetyDaysDrugRecord && ninetyDaysDrugRecord.length">
|
|||
|
|
<view v-for="i in ninetyDaysDrugRecord" :key="i.mdtrtId" class="history-item shadow-lg rounded"
|
|||
|
|
@click="select(i)">
|
|||
|
|
<view class="history-item-time">{{ i.date }}</view>
|
|||
|
|
<view class="history-item-body">
|
|||
|
|
<view class="history-item-content">
|
|||
|
|
<view class="history-disease">【就诊机构】{{ i.medinsName }}</view>
|
|||
|
|
<view class="history-drugs">【药品】{{ i.drugsStr }}</view>
|
|||
|
|
</view>
|
|||
|
|
<image class="checked-icon" :class="elderClass"
|
|||
|
|
:src="`/static/icons/${selection && selection.mdtrtId === i.mdtrtId ? 'checked' : 'unchecked'}.svg`">
|
|||
|
|
</image>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
<empty-component v-else height="60vh" text="暂无数据" />
|
|||
|
|
</view>
|
|||
|
|
<template #footer>
|
|||
|
|
<footer-buttons @cancel="cancel" @confirm="confirm" />
|
|||
|
|
</template>
|
|||
|
|
</full-page>
|
|||
|
|
<confirm-popup :consultType="order.consultType" :drugs="displayDrugs" :visible="visible" @close="visible = false"
|
|||
|
|
@confirm="changeDrugs($event)" />
|
|||
|
|
</template>
|
|||
|
|
<script setup>
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { storeToRefs } from "pinia";
|
|||
|
|
import { onLoad } from '@dcloudio/uni-app';
|
|||
|
|
import dayjs from 'dayjs';
|
|||
|
|
import useElder from '@/hooks/useElder';
|
|||
|
|
import orderStore from '@/store/order';
|
|||
|
|
import usePageList from '@/hooks/usePageList';
|
|||
|
|
|
|||
|
|
import { getAccountHistoryDrugs, getRecent90daysDrugRecord, getOnlineSimilarDrugInfo, getStoreSimilarDrugInfo } from '@/utils/api';
|
|||
|
|
import { confirm as uniConfirm, toast, loading as showLoading, hideLoading } from '@/utils/widget';
|
|||
|
|
|
|||
|
|
import FooterButtons from '@/components/footer-buttons.vue';
|
|||
|
|
import fullPage from '@/components/full-page.vue';
|
|||
|
|
import ConfirmPopup from './confirm-popup.vue';
|
|||
|
|
import EmptyComponent from '@/components/empty.vue';
|
|||
|
|
|
|||
|
|
const { order } = storeToRefs(orderStore());
|
|||
|
|
const { elderClass, elderVarStyle } = useElder();
|
|||
|
|
const tabs = [{ label: '本院历史处方', value: 'history-prescription' }, { label: '医保购药记录', value: 'purchase-record' }];
|
|||
|
|
const activeTab = ref('history-prescription');
|
|||
|
|
const { page, pageSize, list, pages, changePage, loading, hasMore } = usePageList(getList);
|
|||
|
|
const ninetyDaysDrugRecord = ref(null);
|
|||
|
|
const selection = ref(null)
|
|||
|
|
const displayDrugs = ref([])
|
|||
|
|
const visible = ref(false)
|
|||
|
|
|
|||
|
|
function cancel() {
|
|||
|
|
uni.navigateBack()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function changeDrugs(list) {
|
|||
|
|
visible.value = false;
|
|||
|
|
list.forEach(i => {
|
|||
|
|
const index = order.value.drugs.findIndex(j => j.insurance_code === i.insurance_code);
|
|||
|
|
if (index >= 0) {
|
|||
|
|
order.value.drugs.splice(index, 1, i);
|
|||
|
|
} else {
|
|||
|
|
order.value.drugs.push(i);
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
uni.navigateBack()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function confirm() {
|
|||
|
|
if (!selection.value) {
|
|||
|
|
return toast('请选择药品')
|
|||
|
|
}
|
|||
|
|
let drugs = [];
|
|||
|
|
// 选择的是历史处方记录
|
|||
|
|
if (selection.value._id) {
|
|||
|
|
drugs = selection.value.drugs.map(i => ({ ...i, usePreUsage: true }));
|
|||
|
|
}
|
|||
|
|
// 选择的是90天的购药记录
|
|||
|
|
else if (selection.value.mdtrtId) {
|
|||
|
|
drugs = selection.value.drugList.map(i => ({
|
|||
|
|
drugName: i.hiListName,
|
|||
|
|
insurance_code: i.insuranceCode
|
|||
|
|
}))
|
|||
|
|
}
|
|||
|
|
const totalDrugs = [...drugs, ...order.value.drugs];
|
|||
|
|
const drugTypeCount = new Set(totalDrugs.map(i => i.insurance_code)).size;
|
|||
|
|
if (drugTypeCount > 5) {
|
|||
|
|
return uniConfirm('单次问诊药品种类不能超过5种,请重新调整再导入!', { showCancel: false, confirmText: '知道了' })
|
|||
|
|
}
|
|||
|
|
getDrugsInfo(drugs);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getMore() {
|
|||
|
|
if ((loading.value || !hasMore.value) && activeTab.value !== 'history-prescription') return;
|
|||
|
|
changePage(page.value + 1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function select(item) {
|
|||
|
|
selection.value = item;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function switchTab(value) {
|
|||
|
|
if (activeTab.value === value) return;
|
|||
|
|
activeTab.value = value;
|
|||
|
|
if (value === 'purchase-record' && !ninetyDaysDrugRecord.value) {
|
|||
|
|
getNinetyDaysDrugRecord()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getDrugsInfo(drugs) {
|
|||
|
|
showLoading()
|
|||
|
|
const payload = {
|
|||
|
|
accountId: order.value.accountId,
|
|||
|
|
patientId: order.value.patientId,
|
|||
|
|
patientName: order.value.name,
|
|||
|
|
phone: order.value.mobile,
|
|||
|
|
drugs: drugs.map(i => ({
|
|||
|
|
drugName: i.drugName,
|
|||
|
|
spec: i.specification,
|
|||
|
|
manufacturer: i.manufacturer,
|
|||
|
|
insurance_code: i.insurance_code
|
|||
|
|
}))
|
|||
|
|
}
|
|||
|
|
const apiName = order.value.consultType === 'onlineMedicinePurchase' ? getOnlineSimilarDrugInfo : getStoreSimilarDrugInfo;
|
|||
|
|
const res = await apiName(payload);
|
|||
|
|
hideLoading();
|
|||
|
|
if (!res || !res.success) {
|
|||
|
|
return toast(res?.message || '查询失败')
|
|||
|
|
}
|
|||
|
|
const matchDrugs = Array.isArray(res.drugs) ? res.drugs : [];
|
|||
|
|
const similarDrugs = Array.isArray(res.similarDrugs) ? res.similarDrugs : [];
|
|||
|
|
displayDrugs.value = drugs.map(i => {
|
|||
|
|
const matchDrug = matchDrugs.find(drug => drug.insurance_code === i.insurance_code);
|
|||
|
|
if (matchDrug) {
|
|||
|
|
return { ...i, matchDrug }
|
|||
|
|
}
|
|||
|
|
const key = i.insurance_code.slice(0, -5);
|
|||
|
|
const replaceDrugs = similarDrugs.filter(i => i.insurance_code.startsWith(key)).slice(0, 2);
|
|||
|
|
return { ...i, usePreUsage: false, replaceDrugs }
|
|||
|
|
})
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getList(changeTabWhenEmpty = false) {
|
|||
|
|
if (loading.value) return;
|
|||
|
|
loading.value = true;
|
|||
|
|
showLoading()
|
|||
|
|
const { success, data, message, pages: totalPages } = await getAccountHistoryDrugs({
|
|||
|
|
accountId: order.value.accountId,
|
|||
|
|
patientId: order.value.patientId,
|
|||
|
|
page: page.value,
|
|||
|
|
pageSize: pageSize.value
|
|||
|
|
});
|
|||
|
|
hideLoading();
|
|||
|
|
pages.value = typeof totalPages === 'number' ? totalPages : 0;
|
|||
|
|
const arr = Array.isArray(data) ? data.map(i => ({
|
|||
|
|
...i,
|
|||
|
|
time: dayjs(i.createTime).format('YYYY-MM-DD HH:mm'),
|
|||
|
|
disease: Array.isArray(i.diagnosisList) ? i.diagnosisList.map(i => i.name || '').join(',') : '',
|
|||
|
|
drugNames: Array.isArray(i.drugs) ? i.drugs.map(i => i.drugName || '').join(',') : '',
|
|||
|
|
})) : []
|
|||
|
|
list.value = page.value === 1 ? arr : [...list.value, ...arr];
|
|||
|
|
if (!success) {
|
|||
|
|
toast(message || '未查询到历史处方')
|
|||
|
|
}
|
|||
|
|
loading.value = false;
|
|||
|
|
if (changeTabWhenEmpty && list.value.length === 0) {
|
|||
|
|
switchTab('purchase-record')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
async function getNinetyDaysDrugRecord() {
|
|||
|
|
showLoading()
|
|||
|
|
const res = await getRecent90daysDrugRecord(order.value.patientId);
|
|||
|
|
const recordList = res && Array.isArray(res.recordList) ? res.recordList : [];
|
|||
|
|
// x,z开头的药品判定为草药 过滤掉
|
|||
|
|
const drugList = res && Array.isArray(res.drugList) ? res.drugList.filter(i => typeof i.insuranceCode === 'string' && ['x', 'z', 'X', 'Z'].includes(i.insuranceCode[0])) : [];
|
|||
|
|
const arr = recordList.map(item => {
|
|||
|
|
return {
|
|||
|
|
...item,
|
|||
|
|
drugsStr: drugList.filter(drug => drug.mdtrtId === item.mdtrtId).map(drug => drug.hiListName).join('、'),
|
|||
|
|
drugList: drugList.filter(drug => drug.mdtrtId === item.mdtrtId)
|
|||
|
|
}
|
|||
|
|
}).filter(i => Boolean(i.drugsStr))
|
|||
|
|
hideLoading();
|
|||
|
|
if (res && res.success) {
|
|||
|
|
ninetyDaysDrugRecord.value = arr;
|
|||
|
|
} else {
|
|||
|
|
toast(message || '未查询到购药记录')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onLoad(() => {
|
|||
|
|
getList(true)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
</script>
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.header-tabs {
|
|||
|
|
display: flex;
|
|||
|
|
background: #fff;
|
|||
|
|
text-align: center;
|
|||
|
|
margin-bottom: 24rpx;
|
|||
|
|
|
|||
|
|
.tab {
|
|||
|
|
position: relative;
|
|||
|
|
flex-grow: 1;
|
|||
|
|
padding: 24rpx 30rpx;
|
|||
|
|
font-size: var(--text-base);
|
|||
|
|
color: #333;
|
|||
|
|
|
|||
|
|
&.active {
|
|||
|
|
color: $theme-brown-primary;
|
|||
|
|
font-weight: bold;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
&.active::after {
|
|||
|
|
position: absolute;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translateX(-50%);
|
|||
|
|
bottom: 0;
|
|||
|
|
content: "";
|
|||
|
|
width: 120rpx;
|
|||
|
|
height: 8rpx;
|
|||
|
|
border-radius: 4rpx;
|
|||
|
|
background: $theme-brown-primary;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.history-item {
|
|||
|
|
margin-bottom: 30rpx;
|
|||
|
|
background: #fff;
|
|||
|
|
|
|||
|
|
.history-item-time {
|
|||
|
|
padding: 24rpx 30rpx;
|
|||
|
|
font-size: var(--text-sm);
|
|||
|
|
color: #333;
|
|||
|
|
border-bottom: 1px solid #eee;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.history-item-body {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
padding: 24rpx 30rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.history-item-content {
|
|||
|
|
width: 0;
|
|||
|
|
flex-grow: 1;
|
|||
|
|
word-break: break-all;
|
|||
|
|
line-height: 1.5;
|
|||
|
|
font-size: var(--text-base);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.checked-icon {
|
|||
|
|
margin-left: 16rpx;
|
|||
|
|
width: 40rpx;
|
|||
|
|
height: 40rpx;
|
|||
|
|
|
|||
|
|
@at-root &.caring-mode-active {
|
|||
|
|
width: 60rpx;
|
|||
|
|
height: 60rpx;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|