检查项目设置->套餐设置->套餐管理
This commit is contained in:
@@ -2,11 +2,11 @@
|
||||
<div class="package-settings">
|
||||
<!-- 顶部操作按钮区 -->
|
||||
<div class="header-actions">
|
||||
<el-button type="primary" @click="handlePackageManagement">套餐管理</el-button>
|
||||
<el-button @click="handleRefresh" :loading="loading">
|
||||
刷新 ({{ diagnosisTreatmentList.length }})
|
||||
<el-button type="primary" @click="handlePackageManagement">套餐设置</el-button>
|
||||
<el-button v-if="!isReadOnly" @click="handleRefresh" :loading="loading">
|
||||
刷新
|
||||
</el-button>
|
||||
<el-button type="success" @click="handleSave">保存</el-button>
|
||||
<el-button v-if="!isReadOnly" type="success" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 基本信息表单区 -->
|
||||
@@ -22,7 +22,7 @@
|
||||
<el-row :gutter="20">
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<el-form-item label="套餐类别" prop="packageType">
|
||||
<el-select v-model="formData.packageType" placeholder="请选择套餐类别" style="width: 100%">
|
||||
<el-select v-model="formData.packageType" placeholder="请选择套餐类别" style="width: 100%" :disabled="isReadOnly">
|
||||
<el-option label="检查套餐" value="检查套餐" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -35,6 +35,7 @@
|
||||
placeholder="请选择套餐级别"
|
||||
style="width: 100%"
|
||||
@change="handlePackageLevelChange"
|
||||
:disabled="isReadOnly"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in packageLevelOptions"
|
||||
@@ -61,7 +62,7 @@
|
||||
|
||||
<el-col v-if="formData.packageLevel === '3'" :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<el-form-item label="用户选择" prop="user">
|
||||
<el-select v-model="formData.user" placeholder="请选择用户" style="width: 100%">
|
||||
<el-select v-model="formData.user" placeholder="请选择用户" style="width: 100%" :disabled="isReadOnly">
|
||||
<el-option label="当前用户" value="当前用户" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -69,13 +70,13 @@
|
||||
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<el-form-item label="套餐名称" prop="packageName">
|
||||
<el-input v-model="formData.packageName" placeholder="请输入套餐名称" />
|
||||
<el-input v-model="formData.packageName" placeholder="请输入套餐名称" :disabled="isReadOnly" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<el-form-item label="卫生机构">
|
||||
<el-select v-model="formData.organization" placeholder="请选择卫生机构" style="width: 100%">
|
||||
<el-select v-model="formData.organization" placeholder="请选择卫生机构" style="width: 100%" :disabled="isReadOnly">
|
||||
<el-option label="演示医院" value="演示医院" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -95,6 +96,7 @@
|
||||
v-model="formData.discount"
|
||||
placeholder="请输入折扣"
|
||||
@input="validateNumberInput($event, 'discount')"
|
||||
:disabled="isReadOnly"
|
||||
>
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
@@ -375,15 +377,51 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { ref, reactive, computed, onMounted, watch } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ArrowLeft } from '@element-plus/icons-vue'
|
||||
import { getDicts } from '@/api/system/dict/data'
|
||||
import { listDept } from '@/api/system/dept'
|
||||
import { addCheckPackage, updateCheckPackage } from '@/api/system/checkType'
|
||||
import { getDiagnosisTreatmentList } from '@/views/catalog/diagnosistreatment/components/diagnosistreatment'
|
||||
import useUserStore from '@/store/modules/user'
|
||||
import request from '@/utils/request' // 导入request工具用于调用Organization API
|
||||
|
||||
// 接收props
|
||||
const props = defineProps({
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'add', // add-新增, edit-编辑, view-查看
|
||||
validator: (value) => ['add', 'edit', 'view'].includes(value)
|
||||
},
|
||||
packageData: {
|
||||
type: Object,
|
||||
default: null
|
||||
}
|
||||
})
|
||||
|
||||
// 定义emit
|
||||
const emit = defineEmits(['switch-to-management', 'save-success'])
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
// 页面标题
|
||||
const pageTitle = computed(() => {
|
||||
switch (props.mode) {
|
||||
case 'add':
|
||||
return '套餐设置'
|
||||
case 'edit':
|
||||
return '编辑套餐'
|
||||
case 'view':
|
||||
return '查看套餐'
|
||||
default:
|
||||
return '套餐设置'
|
||||
}
|
||||
})
|
||||
|
||||
// 是否只读模式
|
||||
const isReadOnly = computed(() => props.mode === 'view')
|
||||
|
||||
// 表单引用
|
||||
const basicFormRef = ref(null)
|
||||
|
||||
@@ -436,6 +474,51 @@ const loading = ref(false)
|
||||
const detailData = ref([])
|
||||
|
||||
// 初始化数据
|
||||
// 监听packageData变化,加载数据
|
||||
watch(() => props.packageData, (newData) => {
|
||||
if (newData) {
|
||||
console.log('加载套餐数据:', newData)
|
||||
loadPackageData(newData)
|
||||
}
|
||||
}, { immediate: true })
|
||||
|
||||
// 加载套餐数据到表单
|
||||
function loadPackageData(data) {
|
||||
if (!data) return
|
||||
|
||||
console.log('开始加载套餐数据到表单...')
|
||||
|
||||
// 填充基本信息
|
||||
Object.keys(formData).forEach(key => {
|
||||
if (data[key] !== undefined) {
|
||||
formData[key] = data[key]
|
||||
}
|
||||
})
|
||||
|
||||
// 填充明细数据
|
||||
if (data.details && Array.isArray(data.details)) {
|
||||
detailData.value = data.details.map(item => ({
|
||||
code: item.itemCode || '',
|
||||
itemId: item.checkItemId,
|
||||
itemName: item.itemName || '',
|
||||
dose: item.dose || '',
|
||||
method: item.method || '',
|
||||
frequency: item.frequency || '',
|
||||
days: item.days || '',
|
||||
quantity: item.quantity || 1,
|
||||
unitPrice: item.unitPrice || 0,
|
||||
amount: item.amount || 0,
|
||||
serviceCharge: item.serviceCharge || 0,
|
||||
total: item.total || 0,
|
||||
origin: item.origin || '',
|
||||
editing: false,
|
||||
filteredList: diagnosisTreatmentList.value
|
||||
}))
|
||||
}
|
||||
|
||||
console.log('套餐数据加载完成')
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
console.log('=== PackageSettings 组件开始初始化 ===')
|
||||
|
||||
@@ -451,15 +534,107 @@ onMounted(async () => {
|
||||
console.error('✗ 获取套餐级别字典失败:', error)
|
||||
}
|
||||
|
||||
// 获取科室字典
|
||||
// 获取科室列表 - 优先使用Organization API(包含编码和名称)
|
||||
try {
|
||||
const deptResponse = await getDicts('dept')
|
||||
if (deptResponse && deptResponse.data) {
|
||||
departments.value = deptResponse.data
|
||||
console.log('✓ 科室数据加载成功:', departments.value.length)
|
||||
// 尝试使用Organization API获取科室列表(包含编码)
|
||||
const orgResponse = await request({
|
||||
url: '/app-common/department-list',
|
||||
method: 'get'
|
||||
})
|
||||
console.log('科室Organization API响应:', orgResponse)
|
||||
|
||||
let orgList = []
|
||||
if (orgResponse) {
|
||||
if (Array.isArray(orgResponse)) {
|
||||
orgList = orgResponse
|
||||
} else if (orgResponse.data) {
|
||||
if (Array.isArray(orgResponse.data)) {
|
||||
orgList = orgResponse.data
|
||||
} else if (orgResponse.data.data && Array.isArray(orgResponse.data.data)) {
|
||||
orgList = orgResponse.data.data
|
||||
}
|
||||
} else if (orgResponse.code === 200 && orgResponse.data) {
|
||||
orgList = Array.isArray(orgResponse.data) ? orgResponse.data : []
|
||||
}
|
||||
}
|
||||
|
||||
if (orgList && orgList.length > 0) {
|
||||
// 使用Organization数据(包含编码和名称)
|
||||
departments.value = orgList.map(org => {
|
||||
const busNo = (org.busNo || org.code || '').trim()
|
||||
const name = (org.name || org.deptName || '').trim()
|
||||
// 如果busNo是层级编码(如 "A01.001"),同时存储前缀("A01")用于匹配
|
||||
const busNoPrefix = busNo ? busNo.split('.')[0] : ''
|
||||
return {
|
||||
dictValue: name,
|
||||
dictLabel: name,
|
||||
deptId: org.id || org.deptId,
|
||||
deptCode: busNo || name, // 优先使用busNo,如果没有则使用名称
|
||||
busNoPrefix: busNoPrefix, // 存储前缀用于匹配
|
||||
rawOrg: org // 保存原始数据用于调试
|
||||
}
|
||||
})
|
||||
console.log('✓ 科室数据加载成功(Organization):', departments.value.length)
|
||||
console.log('科室映射关系(前5个):', departments.value.slice(0, 5).map(d => ({
|
||||
deptCode: `"${d.deptCode}"`,
|
||||
busNoPrefix: `"${d.busNoPrefix}"`,
|
||||
name: d.dictLabel,
|
||||
rawBusNo: d.rawOrg?.busNo
|
||||
})))
|
||||
} else {
|
||||
console.warn('Organization API没有返回科室数据,尝试使用系统部门API')
|
||||
// 如果Organization API没有数据,使用系统部门API
|
||||
const deptResponse = await listDept()
|
||||
console.log('科室API响应:', deptResponse)
|
||||
|
||||
let deptList = []
|
||||
if (deptResponse) {
|
||||
if (Array.isArray(deptResponse)) {
|
||||
deptList = deptResponse
|
||||
} else if (deptResponse.data) {
|
||||
if (Array.isArray(deptResponse.data)) {
|
||||
deptList = deptResponse.data
|
||||
} else if (deptResponse.data.data && Array.isArray(deptResponse.data.data)) {
|
||||
deptList = deptResponse.data.data
|
||||
}
|
||||
} else if (deptResponse.code === 200 && deptResponse.data) {
|
||||
deptList = Array.isArray(deptResponse.data) ? deptResponse.data : []
|
||||
}
|
||||
}
|
||||
|
||||
if (deptList && deptList.length > 0) {
|
||||
departments.value = deptList.map(dept => ({
|
||||
dictValue: dept.deptName || dept.name,
|
||||
dictLabel: dept.deptName || dept.name,
|
||||
deptId: dept.deptId || dept.id,
|
||||
deptCode: dept.deptName || dept.name // 如果没有编码,使用名称
|
||||
}))
|
||||
console.log('✓ 科室数据加载成功(Dept):', departments.value.length)
|
||||
} else {
|
||||
console.warn('科室列表为空,尝试使用字典方式')
|
||||
// 如果获取失败,尝试使用字典方式
|
||||
try {
|
||||
const dictResponse = await getDicts('dept')
|
||||
if (dictResponse && dictResponse.data) {
|
||||
departments.value = dictResponse.data
|
||||
console.log('✓ 使用字典方式加载科室数据成功:', departments.value.length)
|
||||
}
|
||||
} catch (dictError) {
|
||||
console.error('✗ 获取科室字典也失败:', dictError)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('✗ 获取科室字典失败:', error)
|
||||
console.error('✗ 获取科室列表失败:', error)
|
||||
// Fallback to dicts if API fails
|
||||
try {
|
||||
const dictResponse = await getDicts('dept')
|
||||
if (dictResponse && dictResponse.data) {
|
||||
departments.value = dictResponse.data
|
||||
}
|
||||
} catch (dictError) {
|
||||
console.error('✗ 获取科室字典也失败:', dictError)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取诊疗项目列表 - 使用分批加载策略
|
||||
@@ -747,8 +922,9 @@ function calculatePackagePrice() {
|
||||
}
|
||||
|
||||
// 套餐管理
|
||||
// 套餐管理 - 切换到套餐管理界面
|
||||
function handlePackageManagement() {
|
||||
ElMessage.info('即将进入套餐管理界面')
|
||||
emit('switch-to-management')
|
||||
}
|
||||
|
||||
// 刷新 - 重新加载诊疗项目数据
|
||||
@@ -888,7 +1064,7 @@ async function handleSave() {
|
||||
description: formData.description || '',
|
||||
packageType: formData.packageType,
|
||||
packageLevel: formData.packageLevel,
|
||||
department: formData.department || '',
|
||||
department: formData.department ? String(formData.department).trim() : '',
|
||||
user: formData.user || '',
|
||||
organization: formData.organization,
|
||||
packagePrice: parseFloat(formData.packagePrice) || 0,
|
||||
@@ -967,12 +1143,8 @@ async function handleSave() {
|
||||
|
||||
.header-actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
gap: 12px;
|
||||
margin-bottom: 24px;
|
||||
padding: 12px;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
.basic-info-section,
|
||||
|
||||
Reference in New Issue
Block a user