feat: 优化需求开发

This commit is contained in:
huxuejian 2026-10-21 10:55:45 +08:00
parent e4c8891823
commit 6981046518
7 changed files with 81 additions and 18 deletions

View File

@ -24,6 +24,7 @@ export const drugFieldDict = [
{ name: '抗生素级别', field: 'antibiotic_level', verify: (val, label) => verifyListItem(val, [0, 1, 2, 3], false, label, 0) },
{ name: '肿瘤使用', field: 'tumor_use', verify: (val, label) => verifyListItem(val, [0, 1, 2, 3], false, label, 0) },
{ name: '风险等级', field: 'riskLevel', verify: (val, label) => verifyListItem(val, ['低风险', '高风险'], false, label) },
{ name: '默认医保自费', field: 'forceSelfPay', verify: (val, label) => verifyListItem(val, ['Y', 'N'], false, label) },
// 仅在线药品库使用:管理分类(处方药 / OTC)与剂型
{ name: '管理分类', field: 'manage_category', verify: (val, label) => verifyString(val, label) },
{ name: '剂型', field: 'dosage_form', required: true, verify: (val, label) => verifyString(val, label, 1) },

View File

@ -46,6 +46,15 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="默认医保自费" prop="forceSelfPay">
<el-radio-group :model-value="form.forceSelfPay || 'N'"
@update:model-value="changeValue($event, 'forceSelfPay')">
<el-radio label="Y">是</el-radio>
<el-radio label="N">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="适应诊断" prop="applicableDiagnosisCodes">
<div class="w-full">
@ -68,6 +77,7 @@
</el-popover>
<div v-if="selectedDiagnosisOptions.length" class="selected-diagnoses">
<el-tag v-for="item in selectedDiagnosisOptions" :key="item.code" closable
:type="item.invalid ? 'info' : 'primary'"
@close="toggleDiagnosis(item)">
{{ diagnosisLabel(item) }}
</el-tag>
@ -230,8 +240,14 @@ const selectedDiagnosisOptions = computed(() => {
const optionMap = new Map(diagnosisOptions.value.map(item => [String(item.code), item]));
const defaultOptionMap = new Map(diagnosisDefaultOptions.value.map(item => [String(item.code), item]));
return (form.value.applicableDiagnosisCodes || [])
.map(code => optionMap.get(String(code)) || defaultOptionMap.get(String(code)))
.filter(Boolean);
.map(code => {
const normalizedCode = String(code);
return optionMap.get(normalizedCode)
|| defaultOptionMap.get(normalizedCode)
// Historical diagnosis codes may no longer exist in the diagnosis library.
// Keep them visible so the user can remove them and pass server validation.
|| { code: normalizedCode, name: '已失效诊断', invalid: true };
});
})
function isDiagnosisSelected(code) {
@ -371,7 +387,7 @@ async function getRepeatTags() {
watch(() => props.visible, async (val) => {
if (val) {
// reset local editForm when opening drawer
editForm.value = props.data._id ? {} : { antibiotic_level: 0, tumor_use: 0 }
editForm.value = props.data._id ? {} : { antibiotic_level: 0, tumor_use: 0, forceSelfPay: 'N' }
diagnosisKeyword.value = ''
await Promise.all([attachMedicineConfig(), initializeDiagnoses()])
if (props.libType === 'online') {

View File

@ -6,10 +6,10 @@
<div class="px-15px py-12px bg-[#ecf4ff] bg-opacity-30">
<div class="pb-10px">
<span class="text-16px font-semibold">{{ consultInfo.name }}</span>
<span class="text-14px ml-5px">{{ consultInfo.sex }} {{ consultInfo.age ? consultInfo.age + '岁' : ''
}}</span>
<img v-if="consultInfo.signature" :src="consultInfo.signature" class="w-80px h-40px inline-block"
alt="客户签名" @click="previewImage(consultInfo.signature)">
<span class="text-14px ml-5px">
{{ consultInfo.sex }} {{ consultInfo.age ? consultInfo.age + '岁' : '' }}
</span>
</div>
<el-form class="mt-5px" label-suffix=":">
<el-row>
@ -143,12 +143,12 @@
<el-table-column label="序号" prop="index" :width="60">
<template #default="{ $index }">{{ $index + 1 }}</template>
</el-table-column>
<!-- <el-table-column align="center" label="强制自费" prop="index" :width="80">
<el-table-column align="center" label="强制自费" prop="index" :width="80">
<template #default="{ row, $index }">
<el-checkbox :class="readonly ? 'pointer-events-none' : ''" :model-value="row.forceSelfPay === 'Y'"
@update:model-value="changeForcePay($index)" />
</template>
</el-table-column> -->
</el-table-column>
<el-table-column label="药品" prop="drugName" :min-width="220">
<template #default="{ row: item, $index }">
<el-select v-model="item.insurance_code" filterable remote reserve-keyword class="w-full"
@ -582,6 +582,7 @@ function changeDrug(val, idx) {
item.suitableChild = d.suitableChild;
item.suitableGender = d.suitableGender;
item.repeatTag = d.repeatTag;
item.forceSelfPay = d.forceSelfPay === 'Y' ? 'Y' : 'N'
}
function changeUsage(val, idx) {
@ -662,10 +663,10 @@ async function verify(ignoreRepeat = false) {
ElMessage.info(`${i.drugName}: 给药方式无效`);
return;
}
if (!useTimeList.value.some(item => item.name === i.dose_time_name)) {
ElMessage.info(`${i.drugName}: 用药时机无效`);
return;
}
// if (!useTimeList.value.some(item => item.name === i.dose_time_name)) {
// ElMessage.info(`${i.drugName}: 用药时机无效`);
// return;
// }
}
if (inappropriateDrugs.value.length) {
return showUnsuitDrug()
@ -912,6 +913,7 @@ async function initWithOrder() {
row.suitableChild = drug.suitableChild
row.suitableGender = drug.suitableGender
row.repeatTag = drug.repeatTag
row.forceSelfPay = drug.forceSelfPay === 'Y' ? 'Y' : 'N'
acc.push(row)
} else {
errorDrugs.push(`患者申请的${cur.name}药品信息不存在或者已下架`);

View File

@ -397,10 +397,15 @@ function handleGlobalVideoMessageListUpdated(list) {
async function getConsultOrderList(orderId) {
const doctorCode = sessionStorage.getItem("doctorNo");
if (!doctorCode) {
orderList.value = [];
return;
}
const res = await getConsultOrder({
page: 1,
pageSize: 1000,
doctorCode: sessionStorage.getItem("doctorNo"),
doctorCode,
mergeStatus: mergeStatus.value,
});
orderList.value = res.data.data.map((item) => {

View File

@ -52,12 +52,19 @@ const total = ref(0);
const fetchUserList = async (currentPage = 1, append = false) => {
if (loading.value) return;
const doctorCode = sessionStorage.getItem("doctorNo");
if (!doctorCode) {
userList.value = [];
total.value = 0;
noMoreData.value = true;
return;
}
loading.value = true;
try {
const res = await getConsultOrder({
page: currentPage,
pageSize: pageSize.value,
doctorCode: sessionStorage.getItem("doctorNo"),
doctorCode,
mergeStatus: "已处理",
});
// 获取接口返回的总数
@ -328,4 +335,4 @@ watch(
color: white;
font-size: 12px;
}
</style>
</style>

View File

@ -161,6 +161,7 @@ const { close: closeBuildModal, show: showBuildModal, visible: buildVisible, wid
const { memberInfo } = storeToRefs(memberStore());
const tab = ref('reg')
const recordTableRef = ref(null);
const cardReaderDownloadUrl = "https://hlwyy.hnkhhospital.com/hlwyy/readcard";
async function scan() {
scanCodeApi()
@ -220,15 +221,25 @@ async function readCard() {
const objMsg = readRes && typeof readRes.Message ? readRes.Message : '';
close()
if (!IDNum) {
ElMessage.info(objMsg || msg || '读取卡信息失败')
showCardReaderDownload(objMsg || msg || '读取卡信息失败');
return false
}
return readRes
} catch (e) {
ElMessage.info(e)
showCardReaderDownload('读卡器服务异常,请确认本地读卡器服务是否已开启');
}
}
function showCardReaderDownload(message) {
ElMessageBox.confirm(`${message},是否下载海宁读卡助手?`, '读卡失败', {
confirmButtonText: '下载读卡助手',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
window.open(cardReaderDownloadUrl, '_blank', 'noopener,noreferrer');
}).catch(() => {});
}
/**
* 根据证件号 查询建档信息
* @param IDNum

View File

@ -7,6 +7,11 @@
</div>
</div>
<div class="flex-shrink-0 flex items-center">
<a class="card-reader-download" href="https://hlwyy.hnkhhospital.com/hlwyy/readcard" target="_blank"
rel="noopener noreferrer">
<el-icon><Download /></el-icon>
<span>下载读卡助手</span>
</a>
<div flex items-center class="pr-30px">
<el-dropdown v-if="needLogin">
<user-avatar flex-shrink-0 useDefault class="rounded-full mr-15px pointer" size="40"
@ -100,6 +105,7 @@ import { useImStore } from "@/store/im";
import { doctorHasPendingOrder } from "@/api/hlw";
import { caStore } from "@/components/ca-sign/store";
import ModifyPasswordDialog from "@/components/modify-password-dialog/modify-password-dialog.vue";
import { Download } from "@element-plus/icons-vue";
const logoPic = new URL("@/assets/logo.png", import.meta.url).href; // 默认logo
const qrCodeText = ref("");
@ -286,4 +292,19 @@ async function handleOpenAutoSign() {
}
}
}
.card-reader-download {
display: inline-flex;
align-items: center;
gap: 5px;
margin-right: 20px;
color: var(--el-color-primary);
font-size: 14px;
text-decoration: none;
white-space: nowrap;
}
.card-reader-download:hover {
text-decoration: underline;
}
</style>