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: '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: '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: 'riskLevel', verify: (val, label) => verifyListItem(val, ['低风险', '高风险'], false, label) },
{ name: '默认医保自费', field: 'forceSelfPay', verify: (val, label) => verifyListItem(val, ['Y', 'N'], false, label) },
// 仅在线药品库使用:管理分类(处方药 / OTC)与剂型 // 仅在线药品库使用:管理分类(处方药 / OTC)与剂型
{ name: '管理分类', field: 'manage_category', verify: (val, label) => verifyString(val, label) }, { name: '管理分类', field: 'manage_category', verify: (val, label) => verifyString(val, label) },
{ name: '剂型', field: 'dosage_form', required: true, verify: (val, label) => verifyString(val, label, 1) }, { name: '剂型', field: 'dosage_form', required: true, verify: (val, label) => verifyString(val, label, 1) },

View File

@ -46,6 +46,15 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </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-col :span="24">
<el-form-item label="适应诊断" prop="applicableDiagnosisCodes"> <el-form-item label="适应诊断" prop="applicableDiagnosisCodes">
<div class="w-full"> <div class="w-full">
@ -68,6 +77,7 @@
</el-popover> </el-popover>
<div v-if="selectedDiagnosisOptions.length" class="selected-diagnoses"> <div v-if="selectedDiagnosisOptions.length" class="selected-diagnoses">
<el-tag v-for="item in selectedDiagnosisOptions" :key="item.code" closable <el-tag v-for="item in selectedDiagnosisOptions" :key="item.code" closable
:type="item.invalid ? 'info' : 'primary'"
@close="toggleDiagnosis(item)"> @close="toggleDiagnosis(item)">
{{ diagnosisLabel(item) }} {{ diagnosisLabel(item) }}
</el-tag> </el-tag>
@ -230,8 +240,14 @@ const selectedDiagnosisOptions = computed(() => {
const optionMap = new Map(diagnosisOptions.value.map(item => [String(item.code), item])); const optionMap = new Map(diagnosisOptions.value.map(item => [String(item.code), item]));
const defaultOptionMap = new Map(diagnosisDefaultOptions.value.map(item => [String(item.code), item])); const defaultOptionMap = new Map(diagnosisDefaultOptions.value.map(item => [String(item.code), item]));
return (form.value.applicableDiagnosisCodes || []) return (form.value.applicableDiagnosisCodes || [])
.map(code => optionMap.get(String(code)) || defaultOptionMap.get(String(code))) .map(code => {
.filter(Boolean); 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) { function isDiagnosisSelected(code) {
@ -371,7 +387,7 @@ async function getRepeatTags() {
watch(() => props.visible, async (val) => { watch(() => props.visible, async (val) => {
if (val) { if (val) {
// reset local editForm when opening drawer // 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 = '' diagnosisKeyword.value = ''
await Promise.all([attachMedicineConfig(), initializeDiagnoses()]) await Promise.all([attachMedicineConfig(), initializeDiagnoses()])
if (props.libType === 'online') { if (props.libType === 'online') {

View File

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

View File

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

View File

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

View File

@ -161,6 +161,7 @@ const { close: closeBuildModal, show: showBuildModal, visible: buildVisible, wid
const { memberInfo } = storeToRefs(memberStore()); const { memberInfo } = storeToRefs(memberStore());
const tab = ref('reg') const tab = ref('reg')
const recordTableRef = ref(null); const recordTableRef = ref(null);
const cardReaderDownloadUrl = "https://hlwyy.hnkhhospital.com/hlwyy/readcard";
async function scan() { async function scan() {
scanCodeApi() scanCodeApi()
@ -220,15 +221,25 @@ async function readCard() {
const objMsg = readRes && typeof readRes.Message ? readRes.Message : ''; const objMsg = readRes && typeof readRes.Message ? readRes.Message : '';
close() close()
if (!IDNum) { if (!IDNum) {
ElMessage.info(objMsg || msg || '读取卡信息失败') showCardReaderDownload(objMsg || msg || '读取卡信息失败');
return false return false
} }
return readRes return readRes
} catch (e) { } 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 * @param IDNum

View File

@ -7,6 +7,11 @@
</div> </div>
</div> </div>
<div class="flex-shrink-0 flex items-center"> <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"> <div flex items-center class="pr-30px">
<el-dropdown v-if="needLogin"> <el-dropdown v-if="needLogin">
<user-avatar flex-shrink-0 useDefault class="rounded-full mr-15px pointer" size="40" <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 { doctorHasPendingOrder } from "@/api/hlw";
import { caStore } from "@/components/ca-sign/store"; import { caStore } from "@/components/ca-sign/store";
import ModifyPasswordDialog from "@/components/modify-password-dialog/modify-password-dialog.vue"; 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 logoPic = new URL("@/assets/logo.png", import.meta.url).href; // 默认logo
const qrCodeText = ref(""); 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> </style>