diff --git a/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysLoginController.java b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysLoginController.java index 4803ff12..db5ed9d3 100644 --- a/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysLoginController.java +++ b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysLoginController.java @@ -86,6 +86,7 @@ public class SysLoginController { } AjaxResult ajax = AjaxResult.success(); ajax.put("optionJson", loginUser.getOptionJson()); + ajax.put("optionMap", loginUser.getOptionMap()); ajax.put("practitionerId", String.valueOf(loginUser.getPractitionerId())); ajax.put("user", user); ajax.put("roles", roles); diff --git a/openhis-server-new/core-framework/pom.xml b/openhis-server-new/core-framework/pom.xml index 99a95038..4b4c44ac 100644 --- a/openhis-server-new/core-framework/pom.xml +++ b/openhis-server-new/core-framework/pom.xml @@ -60,6 +60,12 @@ core-system + + + com.github.jsqlparser + jsqlparser + + \ No newline at end of file diff --git a/openhis-server-new/core-system/src/main/java/com/core/system/mapper/SysMenuMapper.java b/openhis-server-new/core-system/src/main/java/com/core/system/mapper/SysMenuMapper.java index 104528d8..b994cad6 100644 --- a/openhis-server-new/core-system/src/main/java/com/core/system/mapper/SysMenuMapper.java +++ b/openhis-server-new/core-system/src/main/java/com/core/system/mapper/SysMenuMapper.java @@ -91,6 +91,15 @@ public interface SysMenuMapper { */ public SysMenu selectMenuByPath(String path); + /** + * 根据路径Path查询信息(排除指定菜单ID) + * + * @param path 路径 + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuByPathExcludeId(@Param("path") String path, @Param("menuId") Long menuId); + /** * 是否存在菜单子节点 * diff --git a/openhis-server-new/core-system/src/main/java/com/core/system/service/impl/SysMenuServiceImpl.java b/openhis-server-new/core-system/src/main/java/com/core/system/service/impl/SysMenuServiceImpl.java index f4025cab..d5e18186 100644 --- a/openhis-server-new/core-system/src/main/java/com/core/system/service/impl/SysMenuServiceImpl.java +++ b/openhis-server-new/core-system/src/main/java/com/core/system/service/impl/SysMenuServiceImpl.java @@ -14,6 +14,8 @@ import com.core.system.mapper.SysMenuMapper; import com.core.system.mapper.SysRoleMapper; import com.core.system.mapper.SysRoleMenuMapper; import com.core.system.service.ISysMenuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -27,6 +29,7 @@ import java.util.stream.Collectors; */ @Service public class SysMenuServiceImpl implements ISysMenuService { + private static final Logger log = LoggerFactory.getLogger(SysMenuServiceImpl.class); public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired @@ -281,12 +284,13 @@ public class SysMenuServiceImpl implements ISysMenuService { */ @Override public int updateMenu(SysMenu menu) { - //路径Path唯一性判断 + //路径Path唯一性判断(排除当前菜单本身) String path = menu.getPath(); if (StringUtils.isNotBlank(path)) { - SysMenu sysMenu = menuMapper.selectMenuByPath(menu.getPath()); - // 先判断sysMenu是否不为null,再比较menuId - if (sysMenu != null && !menu.getMenuId().equals(sysMenu.getMenuId())) { + SysMenu sysMenu = menuMapper.selectMenuByPathExcludeId(menu.getPath(), menu.getMenuId()); + if (sysMenu != null) { + log.warn("路由地址已存在 - menuId: {}, path: {}, 存在的menuId: {}", + menu.getMenuId(), menu.getPath(), sysMenu.getMenuId()); return -1; // 路由地址已存在 } } diff --git a/openhis-server-new/core-system/src/main/resources/mapper/system/SysMenuMapper.xml b/openhis-server-new/core-system/src/main/resources/mapper/system/SysMenuMapper.xml index b20d55fc..ab75c485 100644 --- a/openhis-server-new/core-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/openhis-server-new/core-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -177,6 +177,12 @@ + + + + - \ No newline at end of file + + + + + + + diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/PractitionerPatient.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/PractitionerPatient.java new file mode 100644 index 00000000..34a8075e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/PractitionerPatient.java @@ -0,0 +1,58 @@ +package com.openhis.administration.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 医生患者关系管理Entity实体 + * + * @author system + * @date 2026-01-02 + */ +@Data +@TableName("adm_practitioner_patient") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class PractitionerPatient extends HisBaseEntity { + + /** ID */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 医生ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long practitionerId; + + /** 患者ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long patientId; + + /** 关系类型:1-主治医生,2-签约医生,3-管床医生,4-家庭医生,5-会诊医生,6-随访医生 */ + private Integer relationshipType; + + /** 机构ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long organizationId; + + /** 关系开始时间 */ + private Date startDate; + + /** 关系结束时间 */ + private Date endDate; + + /** 状态:1-有效,0-无效 */ + private Integer status; + + /** 备注信息 */ + private String remark; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/dto/PractitionerPatientDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/dto/PractitionerPatientDto.java new file mode 100644 index 00000000..38061dc6 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/dto/PractitionerPatientDto.java @@ -0,0 +1,38 @@ +package com.openhis.administration.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 医生患者关系DTO + * + * @author system + * @date 2026-01-02 + */ +@Data +public class PractitionerPatientDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 医生ID */ + private Long practitionerId; + + /** 患者ID */ + private Long patientId; + + /** 关系类型:1-主治医生,2-签约医生,3-管床医生,4-家庭医生,5-会诊医生,6-随访医生 */ + private Integer relationshipType; + + /** 机构ID */ + private Long organizationId; + + /** 关系开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startDate; + + /** 备注信息 */ + private String remark; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/PractitionerPatientMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/PractitionerPatientMapper.java new file mode 100644 index 00000000..c991019e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/PractitionerPatientMapper.java @@ -0,0 +1,16 @@ +package com.openhis.administration.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.administration.domain.PractitionerPatient; +import org.springframework.stereotype.Repository; + +/** + * 医生患者关系管理Mapper接口 + * + * @author system + * @date 2026-01-02 + */ +@Repository +public interface PractitionerPatientMapper extends BaseMapper { + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPractitionerPatientService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPractitionerPatientService.java new file mode 100644 index 00000000..e703d78d --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPractitionerPatientService.java @@ -0,0 +1,65 @@ +package com.openhis.administration.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.administration.domain.PractitionerPatient; + +import java.util.List; + +/** + * 医生患者关系管理Service接口 + * + * @author system + * @date 2026-01-02 + */ +public interface IPractitionerPatientService extends IService { + + /** + * 获取医生的所有有效患者 + * + * @param practitionerId 医生ID + * @return 患者关系列表 + */ + List getValidPatientsByPractitioner(Long practitionerId); + + /** + * 获取患者的所有有效医生 + * + * @param patientId 患者ID + * @return 医生关系列表 + */ + List getValidPractitionersByPatient(Long patientId); + + /** + * 根据关系类型获取医生患者关系 + * + * @param practitionerId 医生ID + * @param patientId 患者ID + * @param relationshipType 关系类型 + * @return 医生患者关系 + */ + PractitionerPatient getRelationship(Long practitionerId, Long patientId, Integer relationshipType); + + /** + * 创建医生患者关系 + * + * @param practitionerPatient 医生患者关系 + * @return 是否成功 + */ + boolean createRelationship(PractitionerPatient practitionerPatient); + + /** + * 终止医生患者关系 + * + * @param id 关系ID + * @return 是否成功 + */ + boolean terminateRelationship(Long id); + + /** + * 批量创建医生患者关系 + * + * @param relationships 关系列表 + * @return 是否成功 + */ + boolean batchCreateRelationships(List relationships); +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerPatientServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerPatientServiceImpl.java new file mode 100644 index 00000000..3ba27582 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerPatientServiceImpl.java @@ -0,0 +1,135 @@ +package com.openhis.administration.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.administration.domain.PractitionerPatient; +import com.openhis.administration.mapper.PractitionerPatientMapper; +import com.openhis.administration.service.IPractitionerPatientService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * 医生患者关系管理Service实现 + * + * @author system + * @date 2026-01-02 + */ +@Slf4j +@Service +public class PractitionerPatientServiceImpl extends ServiceImpl + implements IPractitionerPatientService { + + @Override + public List getValidPatientsByPractitioner(Long practitionerId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PractitionerPatient::getPractitionerId, practitionerId) + .eq(PractitionerPatient::getStatus, 1) + .orderByDesc(PractitionerPatient::getCreateTime); + return list(wrapper); + } + + @Override + public List getValidPractitionersByPatient(Long patientId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PractitionerPatient::getPatientId, patientId) + .eq(PractitionerPatient::getStatus, 1) + .orderByDesc(PractitionerPatient::getCreateTime); + return list(wrapper); + } + + @Override + public PractitionerPatient getRelationship(Long practitionerId, Long patientId, Integer relationshipType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PractitionerPatient::getPractitionerId, practitionerId) + .eq(PractitionerPatient::getPatientId, patientId) + .eq(PractitionerPatient::getRelationshipType, relationshipType) + .eq(PractitionerPatient::getStatus, 1); + return getOne(wrapper); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean createRelationship(PractitionerPatient practitionerPatient) { + // 设置默认值 + if (practitionerPatient.getStatus() == null) { + practitionerPatient.setStatus(1); + } + if (practitionerPatient.getStartDate() == null) { + practitionerPatient.setStartDate(new Date()); + } + + // 检查是否已存在相同的关系 + PractitionerPatient existing = getRelationship( + practitionerPatient.getPractitionerId(), + practitionerPatient.getPatientId(), + practitionerPatient.getRelationshipType() + ); + + if (existing != null) { + // 如果关系已存在,更新结束时间 + existing.setEndDate(new Date()); + existing.setStatus(0); + updateById(existing); + log.info("已终止旧的医患关系:doctorId={}, patientId={}, relationshipType={}", + practitionerPatient.getPractitionerId(), + practitionerPatient.getPatientId(), + practitionerPatient.getRelationshipType()); + } + + // 创建新关系 + boolean result = save(practitionerPatient); + if (result) { + log.info("创建医患关系成功:doctorId={}, patientId={}, relationshipType={}", + practitionerPatient.getPractitionerId(), + practitionerPatient.getPatientId(), + practitionerPatient.getRelationshipType()); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean terminateRelationship(Long id) { + PractitionerPatient relationship = getById(id); + if (relationship == null) { + log.warn("医患关系不存在:id={}", id); + return false; + } + + relationship.setEndDate(new Date()); + relationship.setStatus(0); + boolean result = updateById(relationship); + if (result) { + log.info("终止医患关系成功:id={}, doctorId={}, patientId={}", + id, relationship.getPractitionerId(), relationship.getPatientId()); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean batchCreateRelationships(List relationships) { + if (relationships == null || relationships.isEmpty()) { + return false; + } + + boolean allSuccess = true; + for (PractitionerPatient relationship : relationships) { + boolean success = createRelationship(relationship); + if (!success) { + allSuccess = false; + log.error("批量创建医患关系失败:doctorId={}, patientId={}", + relationship.getPractitionerId(), relationship.getPatientId()); + } + } + + if (allSuccess) { + log.info("批量创建医患关系成功:count={}", relationships.size()); + } + return allSuccess; + } +} diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/PractitionerPatientMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/PractitionerPatientMapper.xml new file mode 100644 index 00000000..355b5099 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/PractitionerPatientMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, practitioner_id, patient_id, relationship_type, organization_id, + start_date, end_date, status, remark, tenant_id, + delete_flag, create_by, create_time, update_by, update_time + from adm_practitioner_patient + + + + + + + + + + + + + diff --git a/openhis-server-new/pom.xml b/openhis-server-new/pom.xml index b7ffedd0..d5e48b8c 100644 --- a/openhis-server-new/pom.xml +++ b/openhis-server-new/pom.xml @@ -40,7 +40,7 @@ 9.0.96 1.2.13 1.18.34 - 3.5.3 + 3.5.5 6.8.0 42.2.27 5.3.3 @@ -56,6 +56,7 @@ 5.2.0 9.4.0 1.3.2 + 4.5 @@ -340,6 +341,19 @@ 1.9.10 + + + com.github.jsqlparser + jsqlparser + ${jsqlparser.version} + + + + com.github.jsqlparser + jsqlparser + ${jsqlparser.version} + + diff --git a/openhis-ui-vue3/src/api/administration/practitionerPatient.js b/openhis-ui-vue3/src/api/administration/practitionerPatient.js new file mode 100644 index 00000000..c30e203f --- /dev/null +++ b/openhis-ui-vue3/src/api/administration/practitionerPatient.js @@ -0,0 +1,105 @@ +import request from '@/utils/request' + +/** + * 查询医生患者关系列表 + */ +export function listPractitionerPatient(query) { + return request({ + url: '/administration/practitioner-patient/list', + method: 'get', + params: query + }) +} + +/** + * 查询医生患者关系详细 + */ +export function getPractitionerPatient(id) { + return request({ + url: '/administration/practitioner-patient/' + id, + method: 'get' + }) +} + +/** + * 获取医生的所有有效患者 + */ +export function getPatientsByPractitioner(practitionerId) { + return request({ + url: '/administration/practitioner-patient/practitioner/' + practitionerId + '/patients', + method: 'get' + }) +} + +/** + * 获取患者的所有有效医生 + */ +export function getPractitionersByPatient(patientId) { + return request({ + url: '/administration/practitioner-patient/patient/' + patientId + '/practitioners', + method: 'get' + }) +} + +/** + * 新增医生患者关系 + */ +export function addPractitionerPatient(data) { + return request({ + url: '/administration/practitioner-patient', + method: 'post', + data: data + }) +} + +/** + * 修改医生患者关系 + */ +export function updatePractitionerPatient(data) { + return request({ + url: '/administration/practitioner-patient', + method: 'put', + data: data + }) +} + +/** + * 终止医生患者关系 + */ +export function terminatePractitionerPatient(id) { + return request({ + url: '/administration/practitioner-patient/terminate/' + id, + method: 'post' + }) +} + +/** + * 删除医生患者关系 + */ +export function delPractitionerPatient(id) { + return request({ + url: '/administration/practitioner-patient/' + id, + method: 'delete' + }) +} + +/** + * 批量删除医生患者关系 + */ +export function delPractitionerPatientBatch(ids) { + return request({ + url: '/administration/practitioner-patient/' + ids, + method: 'delete' + }) +} + +/** + * 批量创建医生患者关系 + */ +export function batchAddPractitionerPatient(data) { + return request({ + url: '/administration/practitioner-patient/batch', + method: 'post', + data: data + }) +} diff --git a/openhis-ui-vue3/src/api/home.js b/openhis-ui-vue3/src/api/home.js new file mode 100644 index 00000000..91f42345 --- /dev/null +++ b/openhis-ui-vue3/src/api/home.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取首页统计数据 +export function getHomeStatistics() { + return request({ + url: '/home/statistics', + method: 'get' + }) +} diff --git a/openhis-ui-vue3/src/router/index.js b/openhis-ui-vue3/src/router/index.js index 1ee2b1ae..c04ab127 100644 --- a/openhis-ui-vue3/src/router/index.js +++ b/openhis-ui-vue3/src/router/index.js @@ -92,6 +92,27 @@ export const constantRoutes = [ path: '/tpr', component: () => import('@/views/inpatientNurse/tprsheet/index.vue'), }, + // { + // path: '/patientmanagement', + // component: Layout, + // redirect: '/patientmanagement/patientmanagement', + // name: 'PatientManagement', + // meta: { title: '患者管理', icon: 'patient' }, + // children: [ + // { + // path: 'patientmanagement', + // component: () => import('@/views/patientmanagement/patientmanagement/index.vue'), + // name: 'PatientManagementList', + // meta: { title: '患者档案管理', icon: 'patient' }, + // }, + // { + // path: 'outpatienrecords', + // component: () => import('@/views/patientmanagement/outpatienrecords/index.vue'), + // name: 'OutpatientRecords', + // meta: { title: '门诊就诊记录', icon: 'record' }, + // }, + // ], + // }, ]; // 动态路由 - 基于用户权限动态加载的路由 diff --git a/openhis-ui-vue3/src/store/modules/user.js b/openhis-ui-vue3/src/store/modules/user.js index 8eca5e56..b1bf55ea 100644 --- a/openhis-ui-vue3/src/store/modules/user.js +++ b/openhis-ui-vue3/src/store/modules/user.js @@ -20,7 +20,8 @@ const useUserStore = defineStore( permissions: [], tenantId: '', tenantName: '', // 租户名称 - hospitalName:'' + hospitalName:'', + optionMap: {} // 租户配置项Map(从sys_tenant_option表读取) }), actions: { // 登录 @@ -63,7 +64,9 @@ const useUserStore = defineStore( this.practitionerId = res.practitionerId this.fixmedinsCode = res.optionJson.fixmedinsCode this.avatar = avatar - this.hospitalName = res.optionJson.hospitalName + this.optionMap = res.optionMap || {} + // 优先从optionMap获取配置,如果没有则从optionJson获取 + this.hospitalName = this.optionMap.hospitalName || res.optionJson.hospitalName || '' this.tenantName = res.tenantName || '' resolve(res) diff --git a/openhis-ui-vue3/src/views/index.vue b/openhis-ui-vue3/src/views/index.vue index 287a71b4..a530ae4e 100644 --- a/openhis-ui-vue3/src/views/index.vue +++ b/openhis-ui-vue3/src/views/index.vue @@ -1,154 +1,886 @@ - diff --git a/openhis-ui-vue3/src/views/login.vue b/openhis-ui-vue3/src/views/login.vue index 959e86bb..19892064 100644 --- a/openhis-ui-vue3/src/views/login.vue +++ b/openhis-ui-vue3/src/views/login.vue @@ -111,17 +111,6 @@