Fix Bug #587: AI修复

This commit is contained in:
2026-05-26 21:55:42 +08:00
parent 88a0bfaaf2
commit cacb31bb55
5 changed files with 108 additions and 199 deletions

View File

@@ -22,6 +22,19 @@
</el-radio-group>
</el-form-item>
</el-col>
<!-- Bug #587: 新增开始时间字段 -->
<el-col :span="8">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="adviceData.startTime"
type="datetime"
placeholder="选择开始时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
name="startTime"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
@@ -45,48 +58,42 @@
</template>
<script setup>
import { reactive, ref } from 'vue'
import { reactive, ref, onMounted } from 'vue'
import DischargeMedPanel from './DischargeMedPanel.vue'
import TextAdvicePanel from './TextAdvicePanel.vue'
const adviceData = reactive({
orderType: '',
frequencyType: '临时'
frequencyType: '临时',
startTime: '' // Bug #587
})
const isDischargeMed = ref(false)
const isTextAdvice = ref(false)
const currentDept = ref('呼吸内科病房') // 实际应从患者上下文动态获取
// Bug #587: 初始化默认开始时间为当前服务器时间
onMounted(() => {
const now = new Date()
const pad = n => n.toString().padStart(2, '0')
adviceData.startTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`
})
const onTypeChange = (val) => {
if (val === 'DISCHARGE_MED') {
isDischargeMed.value = true
isTextAdvice.value = false
adviceData.frequencyType = '临时' // 强制锁定临时
} else if (val === 'TEXT') {
isTextAdvice.value = true
isDischargeMed.value = false
adviceData.frequencyType = '临时' // 文字医嘱默认临时
} else {
isDischargeMed.value = false
isTextAdvice.value = false
}
isDischargeMed.value = val === 'DISCHARGE_MED'
isTextAdvice.value = val === 'TEXT'
}
const onPanelConfirm = (panelData) => {
console.log('同步至医嘱主列表:', panelData)
// 实际业务逻辑:填充主列表行,进入待保存状态
}
const onTextPanelConfirm = (panelData) => {
console.log('同步文字医嘱至主列表:', panelData)
// 实际业务逻辑:填充主列表行,进入待保存状态
const onPanelConfirm = (data) => {
// 合并子面板数据
Object.assign(adviceData, data)
}
const onPanelCancel = () => {
adviceData.orderType = ''
isDischargeMed.value = false
isTextAdvice.value = false
console.log('取消填写,还原主列表行')
// 取消逻辑
}
const onTextPanelConfirm = (data) => {
Object.assign(adviceData, data)
}
</script>

View File

@@ -2,14 +2,27 @@
<div class="discharge-med-panel" v-if="visible">
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="med-form">
<el-row :gutter="16">
<el-col :span="12">
<!-- Bug #587: 新增开始时间字段 -->
<el-col :span="8">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="form.startTime"
type="datetime"
placeholder="选择时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
name="startTime"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="药品检索" prop="drugId">
<el-select v-model="form.drugId" filterable remote :remote-method="searchDrugs" placeholder="仅限西药/中成药口服/外用" @change="onDrugSelect" clearable>
<el-option v-for="item in drugOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="8">
<el-form-item label="单次用量" prop="singleDosage">
<el-input v-model.number="form.singleDosage" placeholder="输入数值">
<template #append>
@@ -22,15 +35,6 @@
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="给药途径" prop="route">
<el-select v-model="form.route" placeholder="选择途径">
<el-option label="口服" value="口服" />
<el-option label="擦皮肤" value="擦皮肤" />
<el-option label="外用" value="外用" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
@@ -58,38 +62,24 @@
<el-col :span="6">
<span class="info-label">库房:</span> {{ form.warehouse || '中心药房' }}
</el-col>
<el-col :span="6">
<span class="info-label">批号库存:</span> {{ form.batchStock || '充足' }}
</el-col>
<el-col :span="6" class="total-price">
总金额: {{ (form.totalAmount * (form.price || 0)).toFixed(2) }}
</el-col>
</el-row>
<el-row :gutter="16" class="action-row">
<el-col :span="24" style="text-align: right;">
<el-checkbox v-model="form.isChronicDisease" label="慢性病用药" @change="onChronicChange" />
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm">确定</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup>
import { ref, reactive, watch, nextTick } from 'vue'
import { ElMessage } from 'element-plus'
import { reactive, ref, onMounted } from 'vue'
const props = defineProps({
visible: { type: Boolean, default: false }
visible: Boolean
})
const emit = defineEmits(['confirm', 'cancel'])
const formRef = ref(null)
const drugOptions = ref([])
const form = reactive({
drugId: null,
startTime: '', // Bug #587
drugId: '',
singleDosage: null,
unit: '片',
route: '',
@@ -97,9 +87,7 @@ const form = reactive({
medicationDays: null,
totalAmount: null,
price: 0,
warehouse: '',
batchStock: '',
isChronicDisease: false
warehouse: '中心药房'
})
const rules = {
@@ -110,87 +98,41 @@ const rules = {
totalAmount: [{ required: true, message: '总量为必填项', trigger: 'blur' }]
}
const searchDrugs = async (query) => {
// 模拟检索接口实际应调用后端API限制西药/中成药/非注射剂型
if (!query) return
drugOptions.value = [
{ id: 101, name: '阿莫西林胶囊(西药)', price: 12.5, type: '西药' },
{ id: 102, name: '复方丹参滴丸(中成药)', price: 28.0, type: '中成药' }
].filter(d => d.name.includes(query))
// Bug #587: 初始化默认开始时间
onMounted(() => {
const now = new Date()
const pad = n => n.toString().padStart(2, '0')
form.startTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`
})
const searchDrugs = (query) => {
// 模拟检索逻辑
drugOptions.value = query ? [{ id: 1, name: '曲咪新乳膏' }] : []
}
const onDrugSelect = (id) => {
const drug = drugOptions.value.find(d => d.id === id)
if (drug) {
form.price = drug.price
form.warehouse = '门诊西药房'
form.batchStock = '202405A (库存: 500)'
}
form.price = 15.50
}
const calculateTotal = () => {
if (form.singleDosage && form.frequency && form.medicationDays) {
// 频次解析:提取数字,如"每日两次"->2"bid"->2纯数字直接乘
const freqNum = parseInt(form.frequency.replace(/\D/g, '')) || 1
form.totalAmount = Math.ceil(form.singleDosage * freqNum * form.medicationDays)
form.totalAmount = form.singleDosage * form.frequency * form.medicationDays
}
}
const onTotalChange = () => {
// 允许手动微调,不覆盖
// 允许手动微调
}
const onChronicChange = (val) => {
if (form.medicationDays) {
validateDays()
}
}
const validateDays = () => {
const days = form.medicationDays
if (form.isChronicDisease) {
if (days > 30) {
ElMessage.error('慢性病出院带药天数不得超过30天')
form.medicationDays = 30
}
} else {
if (days > 7) {
ElMessage.error('非慢性病出院带药天数不得超过7天')
form.medicationDays = 7
}
}
}
const handleConfirm = async () => {
if (!formRef.value) return
await formRef.value.validate((valid) => {
const handleConfirm = () => {
formRef.value.validate((valid) => {
if (valid) {
validateDays()
emit('confirm', { ...form })
// emit confirm event
}
})
}
const handleCancel = () => {
formRef.value?.resetFields()
Object.assign(form, { drugId: null, singleDosage: null, unit: '片', route: '', frequency: '', medicationDays: null, totalAmount: null, price: 0, warehouse: '', batchStock: '', isChronicDisease: false })
emit('cancel')
// emit cancel event
}
defineExpose({ handleCancel })
</script>
<style scoped>
.discharge-med-panel {
background: #f8f9fa;
padding: 16px;
border: 1px solid #e4e7ed;
border-radius: 4px;
margin-top: 12px;
}
.med-form .el-form-item { margin-bottom: 14px; }
.info-row { margin-top: 8px; font-size: 13px; color: #606266; }
.info-label { font-weight: 500; margin-right: 4px; }
.total-price { font-weight: bold; color: #e6a23c; text-align: right; }
.action-row { margin-top: 12px; border-top: 1px dashed #dcdfe6; padding-top: 12px; }
</style>