294 lines
9.3 KiB
Vue
Raw Normal View History

2026-07-27 11:26:39 +08:00
<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>