feat(system): 添加菜单显示状态控制功能并完善租户ID设置
- 在MetaVo中添加visible字段用于控制菜单显示状态 - 修改SysMenuServiceImpl中的路由构建逻辑,传递visible信息到前端 - 更新SidebarItem.vue组件,根据visible属性控制菜单项显示 - 在多个医嘱管理相关服务类中显式设置租户ID以确保多租户隔离 - 调整字典管理相关路由配置,优化页面跳转路径 - 在菜单管理界面添加显示状态查询和表格列展示功能
This commit is contained in:
@@ -28,6 +28,11 @@ public class MetaVo {
|
||||
*/
|
||||
private String link;
|
||||
|
||||
/**
|
||||
* 菜单是否可见(用于前端侧边栏显示控制)
|
||||
*/
|
||||
private String visible;
|
||||
|
||||
public MetaVo() {}
|
||||
|
||||
public MetaVo(String title, String icon) {
|
||||
@@ -56,6 +61,16 @@ public class MetaVo {
|
||||
}
|
||||
}
|
||||
|
||||
public MetaVo(String title, String icon, boolean noCache, String link, String visible) {
|
||||
this.title = title;
|
||||
this.icon = icon;
|
||||
this.noCache = noCache;
|
||||
if (StringUtils.ishttp(link)) {
|
||||
this.link = link;
|
||||
}
|
||||
this.visible = visible;
|
||||
}
|
||||
|
||||
public boolean isNoCache() {
|
||||
return noCache;
|
||||
}
|
||||
@@ -87,4 +102,12 @@ public class MetaVo {
|
||||
public void setLink(String link) {
|
||||
this.link = link;
|
||||
}
|
||||
|
||||
public String getVisible() {
|
||||
return visible;
|
||||
}
|
||||
|
||||
public void setVisible(String visible) {
|
||||
this.visible = visible;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,13 +147,15 @@ public class SysMenuServiceImpl implements ISysMenuService {
|
||||
List<RouterVo> routers = new LinkedList<RouterVo>();
|
||||
for (SysMenu menu : menus) {
|
||||
RouterVo router = new RouterVo();
|
||||
router.setHidden("1".equals(menu.getVisible()));
|
||||
// 不再根据 visible 字段设置 hidden,确保所有有权限的路由都可用
|
||||
// router.setHidden("1".equals(menu.getVisible()));
|
||||
router.setHidden(false);
|
||||
router.setName(getRouteName(menu));
|
||||
router.setPath(getRouterPath(menu));
|
||||
router.setComponent(getComponent(menu));
|
||||
router.setQuery(menu.getQuery());
|
||||
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()),
|
||||
menu.getPath()));
|
||||
menu.getPath(), menu.getVisible()));
|
||||
List<SysMenu> cMenus = menu.getChildren();
|
||||
if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
|
||||
router.setAlwaysShow(true);
|
||||
@@ -167,12 +169,12 @@ public class SysMenuServiceImpl implements ISysMenuService {
|
||||
children.setComponent(menu.getComponent());
|
||||
children.setName(getRouteName(menu.getRouteName(), menu.getPath()));
|
||||
children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(),
|
||||
StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
|
||||
StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getVisible()));
|
||||
children.setQuery(menu.getQuery());
|
||||
childrenList.add(children);
|
||||
router.setChildren(childrenList);
|
||||
} else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
|
||||
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
|
||||
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), false, null, menu.getVisible()));
|
||||
router.setPath("/");
|
||||
List<RouterVo> childrenList = new ArrayList<RouterVo>();
|
||||
RouterVo children = new RouterVo();
|
||||
@@ -180,7 +182,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
|
||||
children.setPath(routerPath);
|
||||
children.setComponent(UserConstants.INNER_LINK);
|
||||
children.setName(getRouteName(menu.getRouteName(), routerPath));
|
||||
children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()));
|
||||
children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), false, menu.getPath(), menu.getVisible()));
|
||||
childrenList.add(children);
|
||||
router.setChildren(childrenList);
|
||||
}
|
||||
|
||||
@@ -383,6 +383,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
|
||||
newRefundRequest.setStatusEnum(RequestStatus.CANCELLED.getValue());
|
||||
newRefundRequest.setRefundDeviceId(deviceRequest.getId()); // 关联原ID
|
||||
newRefundRequest.setPrescriptionNo("T" + deviceRequest.getPrescriptionNo());
|
||||
newRefundRequest.setTenantId(deviceRequest.getTenantId()); // 显式设置租户ID
|
||||
deviceRequestService.save(newRefundRequest);
|
||||
Long newRequestId = newRefundRequest.getId();
|
||||
|
||||
|
||||
@@ -554,6 +554,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
medicationRequest.setId(adviceSaveDto.getRequestId()); // 主键id
|
||||
medicationRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
|
||||
medicationRequest.setPrescriptionNo(adviceSaveDto.getPrescriptionNo()); // 处方号
|
||||
medicationRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
medicationRequest.setGroupId(adviceSaveDto.getGroupId()); // 组号
|
||||
if (is_sign) {
|
||||
medicationRequest.setSignCode(signCode);
|
||||
@@ -683,6 +684,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
deviceRequest = new DeviceRequest();
|
||||
deviceRequest.setId(adviceSaveDto.getRequestId()); // 主键id
|
||||
deviceRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
|
||||
deviceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
|
||||
// 保存时,处理数据(请求,发放,账单)
|
||||
if (is_save) {
|
||||
@@ -794,6 +796,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
serviceRequest = new ServiceRequest();
|
||||
serviceRequest.setId(adviceSaveDto.getRequestId()); // 主键id
|
||||
serviceRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue());// 请求状态
|
||||
serviceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
if (is_sign) {
|
||||
serviceRequest.setSignCode(signCode);
|
||||
}
|
||||
|
||||
@@ -462,6 +462,7 @@ public class NurseBillingAppService implements INurseBillingAppService {
|
||||
|
||||
// 基础配置:主键(新增为null,修改为已有ID)、状态、业务编号
|
||||
deviceRequest.setId(adviceDto.getRequestId());
|
||||
deviceRequest.setTenantId(loginUser.getTenantId()); // 显式设置租户ID
|
||||
// 业务编号:按日生成,前缀+4位序列号(确保每日唯一)
|
||||
deviceRequest
|
||||
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), DEVICE_RES_NO_SEQ_LENGTH));
|
||||
@@ -533,6 +534,7 @@ public class NurseBillingAppService implements INurseBillingAppService {
|
||||
// 基础配置:主键、状态、业务编号、签发编码
|
||||
serviceRequest.setId(activityDto.getRequestId()); // 主键ID(新增为null,修改为已有ID)
|
||||
serviceRequest.setStatusEnum(RequestStatus.ACTIVE.getValue()); // 状态:激活(划价即生效)
|
||||
serviceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
serviceRequest.setAuthoredTime(authoredTime); // 医嘱签发时间
|
||||
serviceRequest.setSignCode(signCode); // 全局签发编码(关联同一批次划价的医嘱)
|
||||
serviceRequest.setOccurrenceStartTime(startTime); // 医嘱开始执行时间
|
||||
|
||||
@@ -276,6 +276,7 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
|
||||
.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
|
||||
longMedicationRequest.setPrescriptionNo(regAdviceSaveDto.getPrescriptionNo()); // 处方号
|
||||
longMedicationRequest.setGroupId(regAdviceSaveDto.getGroupId()); // 组号
|
||||
longMedicationRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
if (is_sign) {
|
||||
longMedicationRequest.setReqAuthoredTime(authoredTime); // 医嘱签发时间
|
||||
longMedicationRequest.setSignCode(signCode);
|
||||
@@ -340,6 +341,7 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
|
||||
.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
|
||||
tempMedicationRequest.setPrescriptionNo(regAdviceSaveDto.getPrescriptionNo()); // 处方号
|
||||
tempMedicationRequest.setGroupId(regAdviceSaveDto.getGroupId()); // 组号
|
||||
tempMedicationRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
if (is_sign) {
|
||||
tempMedicationRequest.setReqAuthoredTime(authoredTime); // 医嘱签发时间
|
||||
tempMedicationRequest.setSignCode(signCode);
|
||||
@@ -458,6 +460,7 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
|
||||
longServiceRequest.setId(regAdviceSaveDto.getRequestId()); // 主键id
|
||||
longServiceRequest
|
||||
.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue());// 请求状态
|
||||
longServiceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
if (is_sign) {
|
||||
longServiceRequest.setAuthoredTime(authoredTime); // 医嘱签发时间
|
||||
longServiceRequest.setSignCode(signCode);
|
||||
@@ -505,6 +508,7 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
|
||||
tempServiceRequest.setId(regAdviceSaveDto.getRequestId()); // 主键id
|
||||
tempServiceRequest
|
||||
.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue());// 请求状态
|
||||
tempServiceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID
|
||||
if (is_sign) {
|
||||
tempServiceRequest.setAuthoredTime(authoredTime); // 医嘱签发时间
|
||||
tempServiceRequest.setSignCode(signCode);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div v-if="!item.hidden">
|
||||
<div v-if="!item.hidden && !(item.meta && item.meta.visible === '1')">
|
||||
<template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
|
||||
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
|
||||
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
|
||||
|
||||
@@ -97,22 +97,6 @@ export const constantRoutes = [
|
||||
|
||||
// 动态路由,基于用户权限动态去加载
|
||||
export const dynamicRoutes = [
|
||||
{
|
||||
path: '/basicmanage',
|
||||
component: Layout,
|
||||
redirect: '/basicmanage/invoice-management',
|
||||
name: 'BasicManage',
|
||||
meta: { title: '基础管理', icon: 'component' },
|
||||
children: [
|
||||
{
|
||||
path: 'invoice-management',
|
||||
component: () => import('@/views/basicmanage/InvoiceManagement/index.vue'),
|
||||
name: 'invoice-management',
|
||||
meta: { title: '发票管理' }
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
path: '/system/tenant-user',
|
||||
component: Layout,
|
||||
@@ -169,20 +153,7 @@ export const dynamicRoutes = [
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/system/dict-data',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
permissions: ['system:dict:list'],
|
||||
children: [
|
||||
{
|
||||
path: 'index/:dictId(\\d+)',
|
||||
component: () => import('@/views/system/dict/data'),
|
||||
name: 'Data',
|
||||
meta: { title: '字典数据', activeMenu: '/system/dict' }
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
path: '/monitor',
|
||||
component: Layout,
|
||||
@@ -265,33 +236,7 @@ export const dynamicRoutes = [
|
||||
meta: { title: '帮助中心'},
|
||||
},
|
||||
],
|
||||
},
|
||||
// 字典类型路由(直接复制这段)
|
||||
{
|
||||
path: '/system/dict',
|
||||
component: Layout,
|
||||
alwaysShow: true,
|
||||
name: 'DictType',
|
||||
meta: {
|
||||
title: '字典类型管理',
|
||||
icon: 'list' // 图标随便选一个,比如list、dict,不影响跳转
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
component: () => import('@/views/system/dict/index.vue'),
|
||||
name: 'DictTypeList',
|
||||
meta: {title: '字典类型', noCache: false}
|
||||
},
|
||||
{
|
||||
path: 'data/:dictId?', // 带字典ID参数,?表示可选
|
||||
component: () => import('@/views/system/dict/data.vue'), // 你的data.vue路径
|
||||
name: 'DictData',
|
||||
hidden: true, // 不在侧边栏显示(子页面)
|
||||
meta: {title: '字典数据', activeMenu: '/system/dict'} // 保持侧边栏高亮
|
||||
}
|
||||
]
|
||||
},
|
||||
}
|
||||
];
|
||||
|
||||
// 合并常量路由和动态路由,确保所有路由都能被访问
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
<el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
|
||||
<template #default="scope">
|
||||
<router-link :to="'/system/dict/data/' + scope.row.dictId" class="link-type">
|
||||
<router-link :to="'/system/basicmanage/dict/data/' + scope.row.dictId" class="link-type">
|
||||
<span>{{ scope.row.dictType }}</span>
|
||||
</router-link>
|
||||
</template>
|
||||
|
||||
@@ -20,6 +20,16 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="显示状态" prop="visible">
|
||||
<el-select v-model="queryParams.visible" placeholder="显示状态" clearable style="width: 200px">
|
||||
<el-option
|
||||
v-for="dict in sys_show_hide"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item class="search-buttons">
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
@@ -70,6 +80,11 @@
|
||||
<dict-tag :options="sys_normal_disable" :value="scope.row.status" class="dict-tag" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="visible" label="显示状态" width="100">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="sys_show_hide" :value="scope.row.visible" class="dict-tag" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" width="160" prop="createTime">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
|
||||
Reference in New Issue
Block a user