检查项目设置->套餐设置->套餐管理
This commit is contained in:
@@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,12 +69,63 @@ public class CheckTypeController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取检查套餐列表
|
* 获取检查套餐列表(支持分页和筛选)
|
||||||
*/
|
*/
|
||||||
@GetMapping({"/package/list", "/check-package/list"})
|
@GetMapping({"/package/list", "/check-package/list"})
|
||||||
public AjaxResult packageList() {
|
public AjaxResult packageList(
|
||||||
List<CheckPackage> list = checkPackageService.list();
|
@RequestParam(required = false) Integer pageNo,
|
||||||
return AjaxResult.success(list);
|
@RequestParam(required = false) Integer pageSize,
|
||||||
|
@RequestParam(required = false) String organization,
|
||||||
|
@RequestParam(required = false) String packageName,
|
||||||
|
@RequestParam(required = false) String packageLevel,
|
||||||
|
@RequestParam(required = false) String packageType,
|
||||||
|
@RequestParam(required = false) String department,
|
||||||
|
@RequestParam(required = false) String user,
|
||||||
|
@RequestParam(required = false) String startDate,
|
||||||
|
@RequestParam(required = false) String endDate) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<CheckPackage> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
|
||||||
|
// 添加筛选条件
|
||||||
|
if (organization != null && !organization.isEmpty()) {
|
||||||
|
wrapper.eq(CheckPackage::getOrganization, organization);
|
||||||
|
}
|
||||||
|
if (packageName != null && !packageName.isEmpty()) {
|
||||||
|
wrapper.like(CheckPackage::getPackageName, packageName);
|
||||||
|
}
|
||||||
|
if (packageLevel != null && !packageLevel.isEmpty()) {
|
||||||
|
wrapper.eq(CheckPackage::getPackageLevel, packageLevel);
|
||||||
|
}
|
||||||
|
if (packageType != null && !packageType.isEmpty()) {
|
||||||
|
wrapper.eq(CheckPackage::getPackageType, packageType);
|
||||||
|
}
|
||||||
|
if (department != null && !department.isEmpty()) {
|
||||||
|
wrapper.like(CheckPackage::getDepartment, department);
|
||||||
|
}
|
||||||
|
if (user != null && !user.isEmpty()) {
|
||||||
|
wrapper.like(CheckPackage::getUser, user);
|
||||||
|
}
|
||||||
|
if (startDate != null && !startDate.isEmpty()) {
|
||||||
|
wrapper.ge(CheckPackage::getMaintainDate, LocalDate.parse(startDate));
|
||||||
|
}
|
||||||
|
if (endDate != null && !endDate.isEmpty()) {
|
||||||
|
wrapper.le(CheckPackage::getMaintainDate, LocalDate.parse(endDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按更新时间倒序排列
|
||||||
|
wrapper.orderByDesc(CheckPackage::getUpdateTime);
|
||||||
|
|
||||||
|
// 如果需要分页
|
||||||
|
if (pageNo != null && pageSize != null) {
|
||||||
|
com.baomidou.mybatisplus.extension.plugins.pagination.Page<CheckPackage> page =
|
||||||
|
new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNo, pageSize);
|
||||||
|
com.baomidou.mybatisplus.extension.plugins.pagination.Page<CheckPackage> result =
|
||||||
|
checkPackageService.page(page, wrapper);
|
||||||
|
return AjaxResult.success(result);
|
||||||
|
} else {
|
||||||
|
List<CheckPackage> list = checkPackageService.list(wrapper);
|
||||||
|
return AjaxResult.success(list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class CheckPackage {
|
|||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/** 套餐名称 */
|
/** 套餐名称 */
|
||||||
@TableField("name")
|
@TableField("package_name")
|
||||||
private String packageName;
|
private String packageName;
|
||||||
|
|
||||||
/** 套餐编码 */
|
/** 套餐编码 */
|
||||||
@@ -45,47 +45,47 @@ public class CheckPackage {
|
|||||||
private String packageLevel;
|
private String packageLevel;
|
||||||
|
|
||||||
/** 适用科室 (当套餐级别为科室套餐时必填) */
|
/** 适用科室 (当套餐级别为科室套餐时必填) */
|
||||||
@TableField(value = "department", exist = false)
|
@TableField("department")
|
||||||
private String department;
|
private String department;
|
||||||
|
|
||||||
/** 适用用户 (当套餐级别为个人套餐时必填) */
|
/** 适用用户 (当套餐级别为个人套餐时必填) */
|
||||||
@TableField(value = "user", exist = false)
|
@TableField("\"user\"")
|
||||||
private String user;
|
private String user;
|
||||||
|
|
||||||
/** 卫生机构 */
|
/** 卫生机构 */
|
||||||
@TableField(value = "organization", exist = false)
|
@TableField("organization")
|
||||||
private String organization;
|
private String organization;
|
||||||
|
|
||||||
/** 套餐金额 */
|
/** 套餐金额 */
|
||||||
@TableField("price")
|
@TableField("package_price")
|
||||||
private BigDecimal packagePrice;
|
private BigDecimal packagePrice;
|
||||||
|
|
||||||
/** 折扣 (百分比) */
|
/** 折扣 (百分比) */
|
||||||
@TableField(value = "discount", exist = false)
|
@TableField("discount")
|
||||||
private BigDecimal discount;
|
private BigDecimal discount;
|
||||||
|
|
||||||
/** 制单人 */
|
/** 制单人 */
|
||||||
@TableField(value = "creator", exist = false)
|
@TableField("creator")
|
||||||
private String creator;
|
private String creator;
|
||||||
|
|
||||||
/** 是否停用 (0:启用 1:停用) */
|
/** 是否停用 (0:启用 1:停用) */
|
||||||
@TableField(value = "is_disabled", exist = false)
|
@TableField("is_disabled")
|
||||||
private Integer isDisabled;
|
private Integer isDisabled;
|
||||||
|
|
||||||
/** 显示套餐名 (0:否 1:是) */
|
/** 显示套餐名 (0:否 1:是) */
|
||||||
@TableField(value = "show_package_name", exist = false)
|
@TableField("show_package_name")
|
||||||
private Integer showPackageName;
|
private Integer showPackageName;
|
||||||
|
|
||||||
/** 生成服务费 (0:否 1:是) */
|
/** 生成服务费 (0:否 1:是) */
|
||||||
@TableField(value = "generate_service_fee", exist = false)
|
@TableField("generate_service_fee")
|
||||||
private Integer generateServiceFee;
|
private Integer generateServiceFee;
|
||||||
|
|
||||||
/** 套餐价格启用状态 (0:不启用 1:启用) */
|
/** 套餐价格启用状态 (0:不启用 1:启用) */
|
||||||
@TableField(value = "package_price_enabled", exist = false)
|
@TableField("package_price_enabled")
|
||||||
private Integer packagePriceEnabled;
|
private Integer packagePriceEnabled;
|
||||||
|
|
||||||
/** 服务费 */
|
/** 服务费 */
|
||||||
@TableField(value = "service_fee", exist = false)
|
@TableField("service_fee")
|
||||||
private BigDecimal serviceFee;
|
private BigDecimal serviceFee;
|
||||||
|
|
||||||
/** 备注 */
|
/** 备注 */
|
||||||
@@ -98,7 +98,7 @@ public class CheckPackage {
|
|||||||
private Integer number;
|
private Integer number;
|
||||||
|
|
||||||
/** 套餐维护日期 (系统自动生成) */
|
/** 套餐维护日期 (系统自动生成) */
|
||||||
@TableField(value = "maintain_date", exist = false)
|
@TableField("maintain_date")
|
||||||
private LocalDate maintainDate;
|
private LocalDate maintainDate;
|
||||||
|
|
||||||
/** 创建时间 */
|
/** 创建时间 */
|
||||||
|
|||||||
@@ -0,0 +1,663 @@
|
|||||||
|
<template>
|
||||||
|
<div class="package-management">
|
||||||
|
<!-- 顶部筛选栏 -->
|
||||||
|
<div class="filter-section">
|
||||||
|
<el-form :model="queryParams" :inline="true" label-width="80px">
|
||||||
|
<el-form-item label="日期">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="dateRange"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
style="width: 240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="卫生机构">
|
||||||
|
<el-select v-model="queryParams.organization" placeholder="请选择机构" style="width: 150px" clearable>
|
||||||
|
<el-option label="演示医院" value="演示医院" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="套餐名称">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.packageName"
|
||||||
|
placeholder="请输入套餐名称"
|
||||||
|
style="width: 200px"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="套餐级别">
|
||||||
|
<el-select v-model="queryParams.packageLevel" placeholder="请选择套餐级别" style="width: 150px" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in packageLevelOptions"
|
||||||
|
:key="item.dictValue"
|
||||||
|
:label="item.dictLabel"
|
||||||
|
:value="item.dictValue"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="套餐类别">
|
||||||
|
<el-select v-model="queryParams.packageType" placeholder="请选择套餐类别" style="width: 150px" clearable>
|
||||||
|
<el-option label="检查套餐" value="检查套餐" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="科室">
|
||||||
|
<el-select v-model="queryParams.department" placeholder="请选择科室" style="width: 150px" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="dept in departments"
|
||||||
|
:key="dept.dictValue"
|
||||||
|
:label="dept.dictLabel"
|
||||||
|
:value="dept.dictLabel"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="用户">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.user"
|
||||||
|
placeholder="请输入用户名称"
|
||||||
|
style="width: 150px"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleQuery" icon="Search">查询</el-button>
|
||||||
|
<el-button @click="handleReset" icon="Refresh">重置</el-button>
|
||||||
|
<el-button type="success" @click="handleAdd" icon="Plus">新增</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 表格展示区 -->
|
||||||
|
<div class="table-section">
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
border
|
||||||
|
style="width: 100%"
|
||||||
|
v-loading="loading"
|
||||||
|
:max-height="600"
|
||||||
|
>
|
||||||
|
<el-table-column prop="id" label="ID" width="80" align="center" />
|
||||||
|
<el-table-column prop="organization" label="卫生机构" width="120" align="center" />
|
||||||
|
<el-table-column prop="maintainDate" label="日期" width="120" align="center" />
|
||||||
|
<el-table-column prop="packageName" label="套餐名称" min-width="150" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="packageType" label="套餐类别" width="100" align="center" />
|
||||||
|
<el-table-column prop="packageLevel" label="套餐级别" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ getLevelLabel(row.packageLevel) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="department" label="科室" width="120" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ getDeptName(row.department) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="user" label="用户" width="100" align="center" />
|
||||||
|
<el-table-column prop="packagePrice" label="金额" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ (row.packagePrice || 0).toFixed(2) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="serviceFee" label="服务费" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ (row.serviceFee || 0).toFixed(2) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="总金额" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ ((row.packagePrice || 0) + (row.serviceFee || 0)).toFixed(2) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="组合套餐" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="row.packagePriceEnabled === 1 ? 'success' : 'danger'">
|
||||||
|
{{ row.packagePriceEnabled === 1 ? '是' : '否' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="显示套餐名" width="110" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="row.showPackageName === 1 ? 'success' : 'info'">
|
||||||
|
{{ row.showPackageName === 1 ? '是' : '否' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="启用标志" width="100" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="row.isDisabled === 0 ? 'success' : 'danger'">
|
||||||
|
{{ row.isDisabled === 0 ? '是' : '否' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="creator" label="操作人" width="100" align="center" />
|
||||||
|
<el-table-column label="操作" width="180" align="center" fixed="right">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
icon="Edit"
|
||||||
|
circle
|
||||||
|
@click="handleEdit(row)"
|
||||||
|
title="编辑"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
type="info"
|
||||||
|
size="small"
|
||||||
|
icon="View"
|
||||||
|
circle
|
||||||
|
@click="handleView(row)"
|
||||||
|
title="查看"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
icon="Delete"
|
||||||
|
circle
|
||||||
|
@click="handleDelete(row)"
|
||||||
|
title="删除"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 底部分页 -->
|
||||||
|
<div class="pagination-section">
|
||||||
|
<el-pagination
|
||||||
|
v-model:current-page="queryParams.pageNo"
|
||||||
|
v-model:page-size="queryParams.pageSize"
|
||||||
|
:page-sizes="[10, 20, 50, 100]"
|
||||||
|
:total="total"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
@size-change="handleQuery"
|
||||||
|
@current-change="handleQuery"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import { getDicts } from '@/api/system/dict/data'
|
||||||
|
import { listDept } from '@/api/system/dept'
|
||||||
|
import { listCheckPackage, getCheckPackage, delCheckPackage } from '@/api/system/checkType'
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 定义emit事件
|
||||||
|
const emit = defineEmits(['switch-to-settings'])
|
||||||
|
|
||||||
|
// 查询参数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
organization: '',
|
||||||
|
packageName: '',
|
||||||
|
packageLevel: '',
|
||||||
|
packageType: '',
|
||||||
|
department: '',
|
||||||
|
user: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
// 日期范围
|
||||||
|
const dateRange = ref([])
|
||||||
|
|
||||||
|
// 表格数据
|
||||||
|
const tableData = ref([])
|
||||||
|
const total = ref(0)
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
// 套餐级别选项
|
||||||
|
const packageLevelOptions = ref([])
|
||||||
|
// 科室选项
|
||||||
|
const departments = ref([])
|
||||||
|
|
||||||
|
// 初始化数据
|
||||||
|
onMounted(async () => {
|
||||||
|
// 获取套餐级别字典
|
||||||
|
try {
|
||||||
|
const levelResponse = await getDicts('examination_item_package_level')
|
||||||
|
if (levelResponse && levelResponse.data) {
|
||||||
|
packageLevelOptions.value = levelResponse.data
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取套餐级别字典失败:', error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取科室列表 - 优先使用Organization API(包含编码和名称)
|
||||||
|
try {
|
||||||
|
// 尝试使用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}"`,
|
||||||
|
codeLength: d.deptCode ? d.deptCode.length : 0,
|
||||||
|
name: d.dictLabel,
|
||||||
|
rawBusNo: d.rawOrg?.busNo
|
||||||
|
})))
|
||||||
|
} else {
|
||||||
|
// 如果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, departments.value)
|
||||||
|
} else {
|
||||||
|
console.warn('科室列表为空,尝试使用字典方式')
|
||||||
|
// 如果获取失败,尝试使用字典方式
|
||||||
|
try {
|
||||||
|
const dictResponse = await getDicts('dept')
|
||||||
|
console.log('科室字典响应:', dictResponse)
|
||||||
|
if (dictResponse && dictResponse.data) {
|
||||||
|
departments.value = dictResponse.data
|
||||||
|
console.log('使用字典方式加载科室数据成功:', departments.value.length)
|
||||||
|
}
|
||||||
|
} catch (dictError) {
|
||||||
|
console.error('获取科室字典也失败:', dictError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取科室列表失败:', error)
|
||||||
|
// 如果获取失败,尝试使用字典方式
|
||||||
|
try {
|
||||||
|
const dictResponse = await getDicts('dept')
|
||||||
|
if (dictResponse && dictResponse.data) {
|
||||||
|
departments.value = dictResponse.data
|
||||||
|
}
|
||||||
|
} catch (dictError) {
|
||||||
|
console.error('获取科室字典也失败:', dictError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载列表数据
|
||||||
|
handleQuery()
|
||||||
|
})
|
||||||
|
|
||||||
|
// 获取级别标签
|
||||||
|
function getLevelLabel(value) {
|
||||||
|
const item = packageLevelOptions.value.find(i => i.dictValue === value)
|
||||||
|
return item ? item.dictLabel : value
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取科室名称(根据编码或名称查找)
|
||||||
|
function getDeptName(deptValue) {
|
||||||
|
if (!deptValue) return ''
|
||||||
|
|
||||||
|
// 去除前后空格
|
||||||
|
const trimmedValue = String(deptValue).trim()
|
||||||
|
if (!trimmedValue) return ''
|
||||||
|
|
||||||
|
// 如果科室列表为空,直接返回原值
|
||||||
|
if (!departments.value || departments.value.length === 0) {
|
||||||
|
return trimmedValue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先尝试精确匹配编码(去除所有空格,转大写)
|
||||||
|
let dept = departments.value.find(d => {
|
||||||
|
const code = String(d.deptCode || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const searchValue = trimmedValue.replace(/\s+/g, '').toUpperCase()
|
||||||
|
return code && code === searchValue
|
||||||
|
})
|
||||||
|
|
||||||
|
// 如果找不到,尝试通过busNo前缀匹配(优先使用存储的前缀)
|
||||||
|
if (!dept) {
|
||||||
|
dept = departments.value.find(d => {
|
||||||
|
const busNoPrefix = String(d.busNoPrefix || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const searchValue = trimmedValue.replace(/\s+/g, '').toUpperCase()
|
||||||
|
return busNoPrefix && busNoPrefix === searchValue
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找不到,尝试通过原始busNo精确匹配
|
||||||
|
if (!dept) {
|
||||||
|
dept = departments.value.find(d => {
|
||||||
|
const rawBusNo = String(d.rawOrg?.busNo || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const searchValue = trimmedValue.replace(/\s+/g, '').toUpperCase()
|
||||||
|
return rawBusNo && rawBusNo === searchValue
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找不到,尝试层级编码匹配(busNo可能是 "A01.001",搜索值是 "A01")
|
||||||
|
if (!dept) {
|
||||||
|
dept = departments.value.find(d => {
|
||||||
|
const rawBusNo = String(d.rawOrg?.busNo || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const searchValue = trimmedValue.replace(/\s+/g, '').toUpperCase()
|
||||||
|
if (!rawBusNo) return false
|
||||||
|
// 如果busNo包含点号,取点号前的部分进行匹配
|
||||||
|
const busNoPrefix = rawBusNo.split('.')[0]
|
||||||
|
// 匹配方式:前缀匹配、完全匹配、或者搜索值作为前缀
|
||||||
|
return busNoPrefix === searchValue ||
|
||||||
|
rawBusNo.startsWith(searchValue + '.') ||
|
||||||
|
rawBusNo === searchValue
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找不到,尝试匹配名称
|
||||||
|
if (!dept) {
|
||||||
|
dept = departments.value.find(d => {
|
||||||
|
const label = String(d.dictLabel || '').trim()
|
||||||
|
const value = String(d.dictValue || '').trim()
|
||||||
|
return label === trimmedValue || value === trimmedValue
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果还是找不到,尝试部分匹配(编码可能不完整,或者编码格式不同)
|
||||||
|
if (!dept) {
|
||||||
|
dept = departments.value.find(d => {
|
||||||
|
const code = String(d.deptCode || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const rawBusNo = String(d.rawOrg?.busNo || '').trim().replace(/\s+/g, '').toUpperCase()
|
||||||
|
const searchValue = trimmedValue.replace(/\s+/g, '').toUpperCase()
|
||||||
|
if (!code && !rawBusNo) return false
|
||||||
|
|
||||||
|
// 尝试多种匹配方式
|
||||||
|
return (code && code.includes(searchValue)) ||
|
||||||
|
(code && searchValue.includes(code)) ||
|
||||||
|
(rawBusNo && rawBusNo.includes(searchValue)) ||
|
||||||
|
(rawBusNo && searchValue.includes(rawBusNo)) ||
|
||||||
|
(rawBusNo && rawBusNo.startsWith(searchValue)) ||
|
||||||
|
(code && code.length >= 3 && searchValue.length >= 3 && code.substring(0, 3) === searchValue.substring(0, 3))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dept && dept.dictLabel) {
|
||||||
|
return dept.dictLabel
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找不到,输出详细信息用于调试
|
||||||
|
const deptCodes = departments.value.map(d => ({
|
||||||
|
deptCode: String(d.deptCode || '').trim(),
|
||||||
|
deptCodeUpper: String(d.deptCode || '').trim().toUpperCase(),
|
||||||
|
busNoPrefix: String(d.busNoPrefix || '').trim().toUpperCase(),
|
||||||
|
name: d.dictLabel,
|
||||||
|
rawBusNo: d.rawOrg?.busNo,
|
||||||
|
rawBusNoUpper: d.rawOrg?.busNo ? String(d.rawOrg.busNo).trim().toUpperCase() : '',
|
||||||
|
rawBusNoPrefix: d.rawOrg?.busNo ? String(d.rawOrg.busNo).trim().toUpperCase().split('.')[0] : ''
|
||||||
|
}))
|
||||||
|
|
||||||
|
// 输出详细的调试信息,包括所有科室的完整信息
|
||||||
|
console.group('🔍 科室匹配失败 - 详细信息')
|
||||||
|
console.log('搜索值:', trimmedValue)
|
||||||
|
console.log('搜索值(大写):', trimmedValue.toUpperCase())
|
||||||
|
console.log('搜索值长度:', trimmedValue.length)
|
||||||
|
console.log('可用科室总数:', deptCodes.length)
|
||||||
|
console.log('前5个科室详情:', deptCodes.slice(0, 5))
|
||||||
|
console.log('所有科室编码列表:', deptCodes.map(d => ({
|
||||||
|
deptCode: d.deptCode,
|
||||||
|
deptCodeUpper: d.deptCodeUpper,
|
||||||
|
busNoPrefix: d.busNoPrefix,
|
||||||
|
rawBusNo: d.rawBusNo,
|
||||||
|
rawBusNoUpper: d.rawBusNoUpper,
|
||||||
|
rawBusNoPrefix: d.rawBusNoPrefix,
|
||||||
|
name: d.name
|
||||||
|
})))
|
||||||
|
console.groupEnd()
|
||||||
|
|
||||||
|
return trimmedValue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询
|
||||||
|
async function handleQuery() {
|
||||||
|
try {
|
||||||
|
loading.value = true
|
||||||
|
|
||||||
|
// 构建查询参数
|
||||||
|
const params = {
|
||||||
|
...queryParams
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理日期范围
|
||||||
|
if (dateRange.value && dateRange.value.length === 2) {
|
||||||
|
params.startDate = dateRange.value[0]
|
||||||
|
params.endDate = dateRange.value[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await listCheckPackage(params)
|
||||||
|
|
||||||
|
if (response && response.data) {
|
||||||
|
// 处理不同的响应格式
|
||||||
|
if (Array.isArray(response.data)) {
|
||||||
|
tableData.value = response.data
|
||||||
|
total.value = response.data.length
|
||||||
|
} else if (response.data.records) {
|
||||||
|
tableData.value = response.data.records
|
||||||
|
total.value = response.data.total || 0
|
||||||
|
} else {
|
||||||
|
tableData.value = []
|
||||||
|
total.value = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('查询成功,共', total.value, '条数据')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('查询失败:', error)
|
||||||
|
ElMessage.error('查询失败: ' + (error.message || '未知错误'))
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置
|
||||||
|
function handleReset() {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
queryParams.pageSize = 10
|
||||||
|
queryParams.organization = ''
|
||||||
|
queryParams.packageName = ''
|
||||||
|
queryParams.packageLevel = ''
|
||||||
|
queryParams.packageType = ''
|
||||||
|
queryParams.department = ''
|
||||||
|
queryParams.user = ''
|
||||||
|
dateRange.value = []
|
||||||
|
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回套餐设置界面
|
||||||
|
function handleBackToSettings() {
|
||||||
|
emit('back-to-settings')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增
|
||||||
|
function handleAdd() {
|
||||||
|
console.log('新增套餐')
|
||||||
|
// 通知父组件切换到套餐设置界面,模式为新增
|
||||||
|
emit('switch-to-settings', { mode: 'add', data: null })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 编辑
|
||||||
|
async function handleEdit(row) {
|
||||||
|
try {
|
||||||
|
console.log('编辑套餐:', row.id)
|
||||||
|
|
||||||
|
// 获取完整的套餐数据(包含明细)
|
||||||
|
const response = await getCheckPackage(row.id)
|
||||||
|
|
||||||
|
if (response && (response.code === 200 || response.code === 0) && response.data) {
|
||||||
|
// 通知父组件切换到套餐设置界面,模式为编辑
|
||||||
|
emit('switch-to-settings', { mode: 'edit', data: response.data })
|
||||||
|
} else {
|
||||||
|
ElMessage.error('加载套餐数据失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('加载套餐数据失败:', error)
|
||||||
|
ElMessage.error('数据加载失败,请重试')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查看
|
||||||
|
async function handleView(row) {
|
||||||
|
try {
|
||||||
|
console.log('查看套餐:', row.id)
|
||||||
|
|
||||||
|
// 获取完整的套餐数据(包含明细)
|
||||||
|
const response = await getCheckPackage(row.id)
|
||||||
|
|
||||||
|
if (response && (response.code === 200 || response.code === 0) && response.data) {
|
||||||
|
// 通知父组件切换到套餐设置界面,模式为查看
|
||||||
|
emit('switch-to-settings', { mode: 'view', data: response.data })
|
||||||
|
} else {
|
||||||
|
ElMessage.error('加载套餐数据失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('加载套餐数据失败:', error)
|
||||||
|
ElMessage.error('数据加载失败,请重试')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除
|
||||||
|
function handleDelete(row) {
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`确认删除套餐ID:${row.id} - ${row.packageName}吗?删除后将无法恢复!`,
|
||||||
|
'删除确认',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定删除',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning',
|
||||||
|
buttonSize: 'default'
|
||||||
|
}
|
||||||
|
).then(async () => {
|
||||||
|
try {
|
||||||
|
const response = await delCheckPackage(row.id)
|
||||||
|
|
||||||
|
if (response && (response.code === 200 || response.code === 0)) {
|
||||||
|
ElMessage.success('删除成功')
|
||||||
|
// 刷新列表
|
||||||
|
handleQuery()
|
||||||
|
} else {
|
||||||
|
ElMessage.error(response?.msg || response?.message || '删除失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('删除失败:', error)
|
||||||
|
ElMessage.error('删除失败: ' + (error.message || '未知错误'))
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
console.log('用户取消删除')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.package-management {
|
||||||
|
padding: 24px;
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-section {
|
||||||
|
background: white;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-section :deep(.el-form-item) {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-section {
|
||||||
|
background: white;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination-section {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-top: 16px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 响应式设计 */
|
||||||
|
@media (max-width: 1200px) {
|
||||||
|
.filter-section :deep(.el-form) {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.package-management {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-section,
|
||||||
|
.table-section,
|
||||||
|
.pagination-section {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
@@ -2,11 +2,11 @@
|
|||||||
<div class="package-settings">
|
<div class="package-settings">
|
||||||
<!-- 顶部操作按钮区 -->
|
<!-- 顶部操作按钮区 -->
|
||||||
<div class="header-actions">
|
<div class="header-actions">
|
||||||
<el-button type="primary" @click="handlePackageManagement">套餐管理</el-button>
|
<el-button type="primary" @click="handlePackageManagement">套餐设置</el-button>
|
||||||
<el-button @click="handleRefresh" :loading="loading">
|
<el-button v-if="!isReadOnly" @click="handleRefresh" :loading="loading">
|
||||||
刷新 ({{ diagnosisTreatmentList.length }})
|
刷新
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="success" @click="handleSave">保存</el-button>
|
<el-button v-if="!isReadOnly" type="success" @click="handleSave">保存</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 基本信息表单区 -->
|
<!-- 基本信息表单区 -->
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="套餐类别" prop="packageType">
|
<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-option label="检查套餐" value="检查套餐" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -35,6 +35,7 @@
|
|||||||
placeholder="请选择套餐级别"
|
placeholder="请选择套餐级别"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@change="handlePackageLevelChange"
|
@change="handlePackageLevelChange"
|
||||||
|
:disabled="isReadOnly"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in packageLevelOptions"
|
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-col v-if="formData.packageLevel === '3'" :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="用户选择" prop="user">
|
<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-option label="当前用户" value="当前用户" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -69,13 +70,13 @@
|
|||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="套餐名称" prop="packageName">
|
<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-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="卫生机构">
|
<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-option label="演示医院" value="演示医院" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -95,6 +96,7 @@
|
|||||||
v-model="formData.discount"
|
v-model="formData.discount"
|
||||||
placeholder="请输入折扣"
|
placeholder="请输入折扣"
|
||||||
@input="validateNumberInput($event, 'discount')"
|
@input="validateNumberInput($event, 'discount')"
|
||||||
|
:disabled="isReadOnly"
|
||||||
>
|
>
|
||||||
<template #append>%</template>
|
<template #append>%</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
@@ -375,15 +377,51 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, computed, onMounted } from 'vue'
|
import { ref, reactive, computed, onMounted, watch } from 'vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import { ArrowLeft } from '@element-plus/icons-vue'
|
||||||
import { getDicts } from '@/api/system/dict/data'
|
import { getDicts } from '@/api/system/dict/data'
|
||||||
|
import { listDept } from '@/api/system/dept'
|
||||||
import { addCheckPackage, updateCheckPackage } from '@/api/system/checkType'
|
import { addCheckPackage, updateCheckPackage } from '@/api/system/checkType'
|
||||||
import { getDiagnosisTreatmentList } from '@/views/catalog/diagnosistreatment/components/diagnosistreatment'
|
import { getDiagnosisTreatmentList } from '@/views/catalog/diagnosistreatment/components/diagnosistreatment'
|
||||||
import useUserStore from '@/store/modules/user'
|
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 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)
|
const basicFormRef = ref(null)
|
||||||
|
|
||||||
@@ -436,6 +474,51 @@ const loading = ref(false)
|
|||||||
const detailData = ref([])
|
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 () => {
|
onMounted(async () => {
|
||||||
console.log('=== PackageSettings 组件开始初始化 ===')
|
console.log('=== PackageSettings 组件开始初始化 ===')
|
||||||
|
|
||||||
@@ -451,15 +534,107 @@ onMounted(async () => {
|
|||||||
console.error('✗ 获取套餐级别字典失败:', error)
|
console.error('✗ 获取套餐级别字典失败:', error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取科室字典
|
// 获取科室列表 - 优先使用Organization API(包含编码和名称)
|
||||||
try {
|
try {
|
||||||
const deptResponse = await getDicts('dept')
|
// 尝试使用Organization API获取科室列表(包含编码)
|
||||||
if (deptResponse && deptResponse.data) {
|
const orgResponse = await request({
|
||||||
departments.value = deptResponse.data
|
url: '/app-common/department-list',
|
||||||
console.log('✓ 科室数据加载成功:', departments.value.length)
|
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) {
|
} 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() {
|
function handlePackageManagement() {
|
||||||
ElMessage.info('即将进入套餐管理界面')
|
emit('switch-to-management')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 刷新 - 重新加载诊疗项目数据
|
// 刷新 - 重新加载诊疗项目数据
|
||||||
@@ -888,7 +1064,7 @@ async function handleSave() {
|
|||||||
description: formData.description || '',
|
description: formData.description || '',
|
||||||
packageType: formData.packageType,
|
packageType: formData.packageType,
|
||||||
packageLevel: formData.packageLevel,
|
packageLevel: formData.packageLevel,
|
||||||
department: formData.department || '',
|
department: formData.department ? String(formData.department).trim() : '',
|
||||||
user: formData.user || '',
|
user: formData.user || '',
|
||||||
organization: formData.organization,
|
organization: formData.organization,
|
||||||
packagePrice: parseFloat(formData.packagePrice) || 0,
|
packagePrice: parseFloat(formData.packagePrice) || 0,
|
||||||
@@ -967,12 +1143,8 @@ async function handleSave() {
|
|||||||
|
|
||||||
.header-actions {
|
.header-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 12px;
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
padding: 12px;
|
|
||||||
background: white;
|
|
||||||
border-radius: 8px;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.basic-info-section,
|
.basic-info-section,
|
||||||
|
|||||||
@@ -35,8 +35,23 @@
|
|||||||
|
|
||||||
<!-- 主内容区域 -->
|
<!-- 主内容区域 -->
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<!-- 套餐设置组件 -->
|
<!-- 套餐管理和套餐设置 -->
|
||||||
<PackageSettings v-if="activeMenu === '套餐设置'" />
|
<template v-if="activeMenu === '套餐设置'">
|
||||||
|
<!-- 套餐设置界面(默认显示) -->
|
||||||
|
<PackageSettings
|
||||||
|
v-if="packageView === 'settings'"
|
||||||
|
:mode="packageMode"
|
||||||
|
:package-data="currentPackageData"
|
||||||
|
@switch-to-management="handleSwitchToManagement"
|
||||||
|
@save-success="handleSaveSuccess"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- 套餐管理界面(列表) -->
|
||||||
|
<PackageManagement
|
||||||
|
v-else
|
||||||
|
@switch-to-settings="handleSwitchToSettings"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
<!-- 检查类型/方法/部位的表格视图 -->
|
<!-- 检查类型/方法/部位的表格视图 -->
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@@ -194,14 +209,23 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted } from 'vue';
|
||||||
|
import { ElMessage } from 'element-plus';
|
||||||
import { getDicts } from '@/api/system/dict/data';
|
import { getDicts } from '@/api/system/dict/data';
|
||||||
import { listCheckType, listCheckMethod, listCheckPart, listCheckPackage, addCheckType, updateCheckType, delCheckType } from '@/api/system/checkType';
|
import { listCheckType, listCheckMethod, listCheckPart, listCheckPackage, addCheckType, updateCheckType, delCheckType } from '@/api/system/checkType';
|
||||||
import PackageSettings from './components/PackageSettings.vue';
|
import PackageSettings from './components/PackageSettings.vue';
|
||||||
|
import PackageManagement from './components/PackageManagement.vue';
|
||||||
|
|
||||||
// 菜单数据
|
// 菜单数据
|
||||||
const menus = ['检查类型', '检查方法', '检查部位', '套餐设置'];
|
const menus = ['检查类型', '检查方法', '检查部位', '套餐设置'];
|
||||||
const activeMenu = ref('检查类型');
|
const activeMenu = ref('检查类型');
|
||||||
|
|
||||||
|
// 套餐视图状态: management-套餐管理列表, settings-套餐设置
|
||||||
|
const packageView = ref('management')
|
||||||
|
// 套餐设置模式: add-新增, edit-编辑, view-查看
|
||||||
|
const packageMode = ref('add')
|
||||||
|
// 当前编辑的套餐数据
|
||||||
|
const currentPackageData = ref(null)
|
||||||
|
|
||||||
// 检查类型和科室选项
|
// 检查类型和科室选项
|
||||||
const checkTypes = ref([]);
|
const checkTypes = ref([]);
|
||||||
const checkMethods = ref([]);
|
const checkMethods = ref([]);
|
||||||
@@ -291,14 +315,38 @@ function handleMenuClick(menu) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 如果不是套餐设置,才加载表格数据
|
// 如果点击套餐设置,默认显示套餐设置界面
|
||||||
if (menu !== '套餐设置') {
|
if (menu === '套餐设置') {
|
||||||
loadMenuData(menu);
|
packageView.value = 'settings'
|
||||||
|
packageMode.value = 'add'
|
||||||
|
currentPackageData.value = null
|
||||||
|
console.log('显示套餐设置界面')
|
||||||
} else {
|
} else {
|
||||||
console.log('显示套餐设置组件');
|
loadMenuData(menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从套餐设置切换到套餐管理界面
|
||||||
|
function handleSwitchToManagement() {
|
||||||
|
console.log('切换到套餐管理界面')
|
||||||
|
packageView.value = 'management'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从套餐管理切换到套餐设置界面(新增/编辑/查看)
|
||||||
|
function handleSwitchToSettings(params) {
|
||||||
|
console.log('切换到套餐设置界面:', params)
|
||||||
|
packageView.value = 'settings'
|
||||||
|
packageMode.value = params.mode
|
||||||
|
currentPackageData.value = params.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存成功后保持在套餐设置界面
|
||||||
|
function handleSaveSuccess() {
|
||||||
|
console.log('保存成功')
|
||||||
|
// 保存成功后保持在套餐设置界面,可以继续编辑或返回管理界面
|
||||||
|
ElMessage.success('保存成功')
|
||||||
|
}
|
||||||
|
|
||||||
// 根据菜单加载对应数据
|
// 根据菜单加载对应数据
|
||||||
async function loadMenuData(menu) {
|
async function loadMenuData(menu) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user