feat:优化需求开发

This commit is contained in:
huxuejian 2026-10-21 11:09:17 +08:00
parent 3decb6ab48
commit e7e0a9d422
8 changed files with 234 additions and 36 deletions

View File

@ -17,6 +17,12 @@ import useElder from "@/hooks/useElder";
const { elderVarStyle } = storeToRefs(useElder());
const ERROR_SOURCES = {
SYSTEM: "服务暂未响应",
HIS: "处方开具失败",
RATIONAL_DRUG: "合理用药审核不通过,请点击下方按钮修改信息",
};
const props = defineProps({
extension: {
type: [Object, String],
@ -49,7 +55,7 @@ const reason = computed(() => {
});
const errorSource = computed(() => {
return ext.value && ext.value.source === 'HIS' ? '处方开具失败' : '服务暂未响应';
return ext.value && ERROR_SOURCES[ext.value.source] ? ERROR_SOURCES[ext.value.source] : ERROR_SOURCES['SYSTEM'];
});
onMounted(() => {

View File

@ -23,7 +23,7 @@
"title": "【开发】支付宝",
"env": {
"UNI_PLATFORM": "mp-alipay",
"API_BASE_URL": "http://192.168.31.146:8080",
"API_BASE_URL": "http://192.168.31.160:8080",
"CORP_ID": "4G7H8J2K9L0M1N3P5Q6R7S8T9U",
"APP_ID": "2021004129669493",
"ORDER_SOURCE": "ALIPAY_MINI",

View File

@ -0,0 +1,149 @@
<template>
<uni-popup ref="popup" type="center" :mask-click="false">
<view class="recommended-disease-popup" :class="{ 'recommended-disease-popup--elder': elderMode }"
:style="elderVarStyle">
<view class="popup-header">
<text class="popup-title">选择诊断</text>
<uni-icons type="closeempty" color="#999" :size="elderMode ? 30 : 22" @click="close" />
</view>
<view class="popup-tip">根据所选药品为您推荐以下诊断,请选择后确认</view>
<scroll-view scroll-y class="disease-options">
<view v-for="disease in diseases" :key="disease" class="disease-option"
:class="{ 'disease-option--selected': selections.includes(disease) }" @click="toggle(disease)">
<uni-icons :type="selections.includes(disease) ? 'checkbox-filled' : 'circle'"
:color="selections.includes(disease) ? themeColor : '#999'" :size="elderMode ? 28 : 20" />
<text>{{ disease }}</text>
</view>
</scroll-view>
<view class="popup-footer">
<view class="popup-button popup-button--cancel" @click="close">取消</view>
<view class="popup-button popup-button--confirm" @click="confirm">确定</view>
</view>
</view>
</uni-popup>
</template>
<script setup>
import { ref, watch } from 'vue';
import { themeColor } from '@/utils/theme-config';
const emits = defineEmits(['close', 'confirm']);
const props = defineProps({
visible: { type: Boolean, default: false },
diseases: { type: Array, default: () => [] },
elderMode: { type: Boolean, default: false },
elderVarStyle: { type: String, default: '' },
});
const popup = ref();
const selections = ref([]);
function toggle(disease) {
selections.value = selections.value.includes(disease)
? selections.value.filter(item => item !== disease)
: [...selections.value, disease];
}
function close() {
emits('close');
}
function confirm() {
if (!selections.value.length) {
uni.showToast({ title: '请选择诊断', icon: 'none' });
return;
}
emits('confirm', selections.value);
}
watch(() => props.visible, visible => {
if (visible) {
selections.value = [];
popup.value && popup.value.open();
} else {
popup.value && popup.value.close();
}
});
</script>
<style lang="scss" scoped>
.recommended-disease-popup {
width: 650rpx;
max-height: 75vh;
padding: 32rpx 30rpx 28rpx;
box-sizing: border-box;
background: #fff;
border-radius: 20rpx;
}
.recommended-disease-popup--elder {
width: 690rpx;
padding: 42rpx 36rpx 36rpx;
}
.popup-header,
.popup-footer,
.disease-option {
display: flex;
align-items: center;
}
.popup-header {
justify-content: space-between;
}
.popup-title {
font-size: var(--text-base, 32rpx);
font-weight: bold;
color: #333;
}
.popup-tip {
margin: 18rpx 0;
font-size: var(--text-sm, 26rpx);
line-height: 1.5;
color: #999;
}
.disease-options {
max-height: 55vh;
border-top: 1rpx solid #eee;
}
.disease-option {
gap: 16rpx;
min-height: 84rpx;
padding: 0 8rpx;
border-bottom: 1rpx solid #eee;
font-size: var(--text-base, 30rpx);
color: #333;
}
.disease-option--selected {
color: $theme-brown-primary;
}
.popup-footer {
gap: 20rpx;
margin-top: 28rpx;
}
.popup-button {
flex: 1;
height: 76rpx;
border-radius: 12rpx;
text-align: center;
line-height: 76rpx;
font-size: var(--text-base, 30rpx);
}
.popup-button--cancel {
border: 1rpx solid $theme-brown-border;
color: $theme-brown-secondary;
}
.popup-button--confirm {
color: #fff;
background: $theme-brown-primary;
}
</style>

View File

@ -80,7 +80,7 @@ function cancel() {
uni.navigateBack()
}
function changeDrugs(list) {
async function changeDrugs(list) {
visible.value = false;
const preDrugIds = order.value.drugs.map(i => i._id);
const drugIds = list.map(i => i._id);
@ -93,7 +93,11 @@ function changeDrugs(list) {
order.value.drugs.push(i);
}
})
autoFillDisease(newDrugIds);
try {
await autoFillDisease(newDrugIds);
} catch (error) {
console.error('获取药品推荐诊断失败:', error);
}
uni.navigateBack()
}
@ -293,4 +297,4 @@ onLoad(() => {
}
}
}
</style>
</style>

View File

@ -148,20 +148,24 @@ async function scanInsuranceCode() {
try {
const scanResult = await scanCode();
const content = scanResult && typeof scanResult.result === 'string' ? scanResult.result : '';
const [Name, IDNum, CardNum, CardIDCode] = content.split('|');
if (!Name || !IDNum || !CardNum || !CardIDCode) {
const [source, encodedName, IDNum, value1, value2] = content.split('|');
if (!['SC', 'EC'].includes(source) || !encodedName || !IDNum || !value1 || (source === 'SC' && !value2)) {
scanning.value = false;
toast("医保信息不完整,请重新读卡");
return;
}
if (userInfo.value.certNo === IDNum) {
scanning.value = false;
toast("当前操作仅支持非本人医保码");
return;
}
set("current-scanned-card", {
Name: decodeURIComponent(Name),
Source: source,
Name: decodeURIComponent(encodedName),
IDNum,
CardNum,
CardIDCode
...(source === 'SC'
? { CardNum: value1, CardIDCode: value2 }
: { ECToken: value1 }),
}, 300);
uni.navigateTo({
url: `/pages/member/detail?type=ybQrcode&feeType=${feeType.value}`,

View File

@ -134,10 +134,13 @@
@cancel="customConfirmData.onCancel" @close="customConfirmVisible = false" />
<confirm-import-popup :consultType="order.consultType" :drugs="displayDrugs" :visible="visible"
@close="visible = false" @confirm="changeDrugs($event)" />
<recommended-disease-popup :visible="showRecommendedDiseasePopup" :diseases="recommondDiseases"
:elderMode="elderMode" :elderVarStyle="elderVarStyle" @close="closeRecommendedDiseasePopup"
@confirm="confirmRecommendedDiseases" />
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue'
import { onLoad, onUnload } from '@dcloudio/uni-app';
import { onLoad, onShow, onUnload } from '@dcloudio/uni-app';
import { storeToRefs } from "pinia";
import BigNumber from "bignumber.js";
import useElder from '@/hooks/useElder';
@ -159,6 +162,7 @@ import UnsuitDrugPopup from './components/unsuit-drug-popup.vue';
import RepeatDrugPopup from './components/repeat-drug-popup.vue';
import confirmPopup from '@/components/confirm-popup.vue';
import confirmImportPopup from './history-drugs/confirm-popup.vue'
import recommendedDiseasePopup from './components/recommended-disease-popup.vue'
const editDrug = ref({})
@ -169,8 +173,9 @@ const showUnsuitDrugPopup = ref(false);
const showRepeatDrugPopup = ref(false);
const displayDrugs = ref([])
const visible = ref(false);
const showRecommendedDiseasePopup = ref(false);
const { order, repeatDrugs, ybVisitRecord, inappropriateDrugs, formatDrugs } = storeToRefs(orderStore());
const { order, repeatDrugs, ybVisitRecord, inappropriateDrugs, formatDrugs, recommondDiseases } = storeToRefs(orderStore());
const { autoFillDisease } = orderStore();
const { storeId } = useUser();
const waiting = ref(false);
@ -232,10 +237,10 @@ function validateDrugs() {
toast(`${drugName}:请选择用药频率`);
return false;
}
if (!isInOptionList(drug.dose_time_name, medicine.timeList)) {
toast(`${drugName}:请选择用药时机`);
return false;
}
// if (!isInOptionList(drug.dose_time_name, medicine.timeList)) {
// toast(`${drugName}:请选择用药时机`);
// return false;
// }
if (!isPositiveInteger(drug.days)) {
toast(`${drugName}:用药天数必须为正整数`);
return false;
@ -245,15 +250,24 @@ function validateDrugs() {
return true;
}
function changeDrug(drug) {
async function changeDrug(drug) {
let newDrugId = '';
const index = order.value.drugs.findIndex(item => item._id === drug._id)
if (index >= 0) {
order.value.drugs.splice(index, 1, drug)
} else if (drug && drug._id) {
order.value.drugs.push(drug);
autoFillDisease([drug._id]);
newDrugId = drug._id;
}
showEditPopup.value = false
if (newDrugId) {
try {
await autoFillDisease([newDrugId]);
openRecommendedDiseasePopup();
} catch (error) {
console.error('获取药品推荐诊断失败:', error);
}
}
}
function confirmDrug(drugs) {
@ -348,6 +362,28 @@ function removeDisease(index) {
order.value.diseases.splice(index, 1);
}
function closeRecommendedDiseasePopup() {
showRecommendedDiseasePopup.value = false;
recommondDiseases.value = [];
}
function openRecommendedDiseasePopup() {
if (Array.isArray(recommondDiseases.value) && recommondDiseases.value.length) {
showRecommendedDiseasePopup.value = true;
}
}
function confirmRecommendedDiseases(diseases) {
if (!Array.isArray(order.value.diseases)) order.value.diseases = [];
const selectedDiseases = Array.isArray(diseases) ? diseases : [];
selectedDiseases.forEach(disease => {
if (typeof disease === 'string' && disease.trim() && !order.value.diseases.includes(disease)) {
order.value.diseases.push(disease);
}
});
closeRecommendedDiseasePopup();
}
async function checkStock() {
loading('获取药品信息...')
const { success, message, data } = await checkOnlineDrugInfoStock({
@ -562,6 +598,10 @@ onLoad(() => {
uni.$on('on-disease-selected', onDiseaseSelected)
});
onShow(() => {
openRecommendedDiseasePopup();
});
onUnload(() => {
uni.$off('on-disease-selected', onDiseaseSelected)
})

View File

@ -218,13 +218,17 @@ function clear() {
}
const confirm = useDebounce(_confirm, 1000);
function _confirm() {
async function _confirm() {
if (drugs.value.length) {
const preDrugIds = order.value.drugs.map(i => i._id);
const drugIds = drugs.value.map(i => i._id);
const newDrugIds = drugIds.filter(i => !preDrugIds.includes(i));
order.value.drugs = drugs.value.map(i => ({ ...i }))
autoFillDisease(newDrugIds);
try {
await autoFillDisease(newDrugIds);
} catch (error) {
console.error('获取药品推荐诊断失败:', error);
}
uni.navigateBack()
} else {
toast('请添加药品')

View File

@ -153,7 +153,10 @@ export default defineStore("orderStore", () => {
});
});
const recommondDiseases = ref([]);
function init({ feeType, socialno, hisArchive }) {
recommondDiseases.value = [];
if (!FeeType.includes(feeType)) {
toast('不支持的费用类型');
uni.navigateBack();
@ -165,20 +168,6 @@ export default defineStore("orderStore", () => {
return;
}
const tmbxx = Array.isArray(hisArchive.tmbxx) ? hisArchive.tmbxx : [];
// const tmbxx = [
// {
// "med_type": "140201",
// "diseType": "特病",
// "dise_codg": "M01600",
// "dise_name": "糖尿病"
// },
// {
// "med_type": "140104",
// "diseType": "慢病",
// "dise_codg": "M03900",
// "dise_name": "高血压"
// }
// ]
medTypeList.value = [outpatientMedType, ...tmbxx];
const profile = patientList.value.find((i) => i.socialno === socialno);
regFee.value = 0;
@ -293,7 +282,8 @@ export default defineStore("orderStore", () => {
const res = await getDrugMatchedDisease({ drugIds });
const diseases = res && Array.isArray(res.list) ? res.list.filter(i => typeof i === "string" && i.trim()) : [];
const newDiseases = diseases.filter(i => !order.value.diseases.includes(i));
order.value.diseases = [...order.value.diseases, ...newDiseases];
recommondDiseases.value = newDiseases;
// order.value.diseases = [...order.value.diseases, ...newDiseases];
}
watch(
@ -326,6 +316,7 @@ export default defineStore("orderStore", () => {
reuse,
inappropriateDrugs,
repeatDrugs,
autoFillDisease
autoFillDisease,
recommondDiseases
};
});