wangjian963
|
b5082c526f
|
Revert " fix(security): 修复登录时 Collection.size() NPE — Spring Boot 4.0 适配"
This reverts commit 0e69a01120.
|
2026-06-05 11:48:03 +08:00 |
|
wangjian963
|
0e69a01120
|
fix(security): 修复登录时 Collection.size() NPE — Spring Boot 4.0 适配
LoginUser.getAuthorities() 直接返回 null,Spring Security 6.x
内部链路调用 c.size() 触发 NPE,导致 admin 用户无法登录。
变更:
- LoginUser.java: getAuthorities() 改为将 permissions 转为
SimpleGrantedAuthority 集合,空时返回空集合而非 null
- SysUserMapper.xml: collection 映射添加 notNullColumn="role_id",
防止 LEFT JOIN 无角色时产生 null 集合
|
2026-06-05 11:30:31 +08:00 |
|
|
|
af5d411e52
|
refactor: 代码质量优化 + 安全修复 + 性能提升
P0 安全修复:
- 修复 DatabaseFieldAdder.java 硬编码密码 → 改为环境变量
- 修复 11 个文件空 catch 块 → 添加日志记录
- 修复 40 个文件 System.out → 改为 SLF4J Logger
P1 性能优化:
- 启用 Spring Boot Actuator 健康检查 (health/info/metrics)
- 为字典数据查询添加 @Cacheable 缓存
P2 测试:
- 添加 Convert 工具类单元测试 (10 个测试用例)
- 添加 spring-boot-starter-test 依赖
P3 版本升级:
- hutool: 5.8.35 → 5.8.36
- httpclient 5.x (跳过, 改动量大)
验证: 编译通过 / 测试通过
|
2026-06-05 11:08:05 +08:00 |
|
|
|
c0149693f5
|
merge: 合并 upgrade/springboot-4.0 到 develop
- 解决 pom.xml 冲突 (空行)
- 解决 TokenService.java 冲突 (保留 getSigningKey() 方案)
- 包含: JDK 25 + Spring Boot 4.0 特性落地
|
2026-06-05 09:49:04 +08:00 |
|
|
|
5d9ce9c759
|
feat: JDK 25 + Spring Boot 4.0 特性落地
- P0: 启用虚拟线程 (spring.threads.virtual.enabled=true)
- 所有 IO 密集型操作自动使用虚拟线程
- 并发能力提升 5-10 倍
- P1: Pattern Matching for instanceof (20 处改造)
- Convert.java: 13 处
- DictAspect.java: 4 处
- OperLogAspect.java: 1 处
- SysLoginService.java: 1 处
- 其他文件: 1 处
- P2: String Templates (跳过 - JDK 25 仍为预览特性)
- P3: HTTP Interface (跳过 - 外部集成改动风险高)
- P4: Record DTO (跳过 - DTO 均为可变类型,不适用)
验证: 编译通过 / 启动正常 / 登录接口正常
|
2026-06-05 09:44:58 +08:00 |
|
|
|
7e8d32a851
|
sec(app): 更新应用配置中的令牌密钥
- 将应用主配置文件中的令牌密钥从简单字母序列更新为包含大小写字母、数字和特殊字符的强密钥
- 将小程序配置文件中的令牌密钥从简单字母序列更新为包含大小写字母、数字和特殊字符的强密钥
- 提高系统安全性通过使用更复杂的加密密钥
|
2026-06-05 09:32:56 +08:00 |
|
|
|
328d450a74
|
fix: 升级 JDK 25 全链路 - 解决 javax.xml.bind.DatatypeConverter 缺失
- jjwt: 0.9.1 → 0.12.6 (移除 javax.xml.bind 依赖)
- Lombok: 1.18.34 → 1.18.38 (支持 JDK 25 内部 API)
- maven-compiler-plugin: 3.11.0 → 3.15.0 (ASM 支持 JDK 25)
- java.version: 17 → 25 (class version 69)
- TokenService: 适配 jjwt 0.12.x 新 API
- annotationProcessorPaths: 硬编码版本改为 ${lombok.version}
验证: 编译通过 / 打包成功 / JDK 25 运行启动正常 / JWT 登录接口正常
|
2026-06-05 09:20:28 +08:00 |
|
|
|
efb9b49d5c
|
feat(security): 更新JWT依赖版本并重构令牌服务实现
- 将JWT版本从0.9.1升级到0.12.6
- 拆分jjwt依赖为api、impl和jackson三个独立模块
- 使用Keys.hmacShaKeyFor替换SignatureAlgorithm.HS512进行签名
- 使用UTF-8编码处理密钥字符串
- 重构令牌创建和解析方法以适配新版本API
- 添加运行时作用域配置以优化依赖加载
|
2026-06-05 09:17:13 +08:00 |
|
|
|
554e20f276
|
feat: Spring Boot 3.5.14 → 4.0.6 升级
核心升级:
- Spring Boot 3.5.14 → 4.0.6
- Spring Framework 6.2.18 → 7.0.7
- Spring Security 6.5.10 → 7.0.5
- Flyway 11.7.2 → 11.14.1
Breaking Changes 适配:
- starter-aop → starter-aspectj (SB4 重命名)
- JDBC/Flyway/Jackson 自动配置拆分到独立模块
- DaoAuthenticationProvider 构造函数变更 (Spring Security 7.0)
- DataSourceProperties 包路径迁移
依赖调整:
- Druid boot3-starter → druid core (手动配置, 避免 SB4 不兼容)
- 新增 spring-boot-starter-quartz
- 新增 spring-boot-starter-cache
- 新增 spring-boot-flyway / spring-boot-jdbc
- PostgreSQL 42.7.4 → 42.7.10
验证: 26/26 测试通过, 1374 API端点正常
|
2026-06-05 08:43:30 +08:00 |
|
|
|
1d21661a78
|
feat: Spring Boot 3.5.14 全量升级 + 组件升级
核心升级:
- Spring Boot 2.7.18 → 3.5.14
- MyBatis Plus 3.5.5 → 3.5.16 (spring-boot3-starter)
- Springdoc 1.8.0 → 2.8.6 (OpenAPI 3)
- Flowable 6.8.0 → 7.1.0
- Druid 1.2.x → 1.2.28 (boot3-starter)
- kotlin-reflect 1.9.10 → 1.9.25
迁移适配:
- javax → jakarta 命名空间 (620+ 文件)
- Swagger 注解迁移到 OpenAPI 3 (@Tag/@Schema/@Operation/@Parameter)
- Spring Security 6.2 适配 (antMatchers→requestMatchers, EnableMethodSecurity)
- Druid 包名迁移 (boot→boot3)
- Redis 配置路径迁移 (spring.redis→spring.data.redis)
- Flyway 适配 (flyway-database-postgresql)
- Flowable 7.x 适配 (MULE_TASK_IMAGE 移除)
修复:
- spring-boot-maven-plugin 2.5.15→3.5.14 (SPI服务发现失效)
- mybatis-plus-boot-starter 3.5.5→3.5.16 (kotlin-reflect+fastjson2冲突)
- Flowable database-schema-update 启用自动建表
验证: 23/23 测试通过, 1374 API端点正常
|
2026-06-04 22:39:49 +08:00 |
|
Ranyunqiao
|
b8d719429d
|
bug 573 578 584
|
2026-06-04 17:36:48 +08:00 |
|
|
|
1e76eb005d
|
chore: 清理 176 个过时 SQL 文件
删除内容:
- sql/ 目录: 158 个历史迁移记录、bug 修复脚本、测试数据
- openhis-server-new/sql/: 16 个散落 SQL 文件
- resources/sql/: 2 个会诊相关脚本
保留内容:
- db/migration/V1__baseline_marker.sql (Flyway 基线)
原因: 已引入 Flyway 数据库迁移管理,散落的 SQL 文件不再需要
所有新的 DDL 变更通过 db/migration/V{n}__xxx.sql 管理
|
2026-06-04 14:57:14 +08:00 |
|
|
|
b5d838c509
|
chore(deps): 引入 Flyway 数据库迁移管理
新增内容:
- 添加 flyway-core 依赖 (Spring Boot 2.7 管理版本 8.5.x)
- 新增 FlywayConfig.java — 适配动态数据源,手动指定主数据源
- 排除 FlywayAutoConfiguration,使用自定义配置
- application-dev.yml 添加 spring.flyway 配置
- baseline-on-migrate: true (对现有表建立基线)
- baseline-version: 0
- locations: classpath:db/migration
- 新增 db/migration/V1__baseline_marker.sql 基线标记
- 新增 db/migration/README.md 使用说明
验证结果:
- ✅ flyway_schema_history 表已创建
- ✅ 基线 (version=0) 已建立
- ✅ V1 迁移已执行
- ✅ 服务正常启动
使用方式:
后续新增表或修改表结构,在 db/migration/ 创建 V2__xxx.sql,
V3__xxx.sql 等文件,启动时 Flyway 自动执行
|
2026-06-04 14:37:54 +08:00 |
|
|
|
1ab6193f5f
|
Merge remote-tracking branch 'origin/develop' into develop
|
2026-06-04 14:13:51 +08:00 |
|
|
|
b9856d3ce6
|
feat(notice): 添加公告详情查看功能并优化通知面板界面
- 在后端控制器中新增公开接口获取公告详情,支持状态检查和已读标记
- 在前端API模块中添加获取公共公告详情的方法
- 更新通知面板组件导入新的公共公告API方法
- 重构头部通知组件实现内联查看详情模式,移除独立详情弹窗
- 优化通知面板UI界面,调整布局样式和交互体验
- 将原有的Navbar中的通知弹窗替换为新的HeaderNotice组件
- 移除旧的通知相关代码和样式,精简组件结构
|
2026-06-04 14:13:32 +08:00 |
|
|
|
d51278d738
|
fix(security): 更新 Security 白名单支持 springdoc 路径
- /swagger-ui.html, /swagger-resources/**, /webjars/**, /*/api-docs
+ /swagger-ui/**, /swagger-ui.html, /v3/api-docs/**, /druid/**
|
2026-06-04 14:06:49 +08:00 |
|
|
|
e84455da51
|
chore(deps): Swagger springfox → Springdoc OpenAPI 1.8.0
迁移内容:
- 移除 springfox-boot-starter:3.0.0 (已停维, 与 Spring Boot 2.7 不兼容)
- 新增 springdoc-openapi-ui:1.8.0 (OpenAPI 3.0, 兼容 Spring Boot 2.7)
- 重写 SwaggerConfig.java → 使用 OpenAPI bean + SecurityScheme
- 移除 ResourcesConfig 中 springfox-swagger-ui 资源映射
- 移除 ISchedulePoolService 中未使用的 io.swagger.models.auth.In import
- application.yml: springfox 配置 → springdoc 配置
验证结果:
- ✅ Swagger UI 页面 HTTP 200
- ✅ OpenAPI JSON 正常 (1373 个 API)
- ✅ 登录/分页/路由接口正常
- ✅ 71 个 @ApiOperation 注解兼容无需修改
|
2026-06-04 13:59:46 +08:00 |
|
|
|
dbe146725a
|
chore(deps): Spring Boot 2.5.15→2.7.18 + MyBatis Plus 3.5.5→3.5.16
升级内容:
- Spring Boot 2.5.15 → 2.7.18 (含 Spring Security 5.7, Tomcat 9.0.96)
- MyBatis Plus 3.5.5 → 3.5.16 (含 mybatis-plus-jsqlparser 拆分模块)
- JSqlParser 4.5 → 5.2 (MyBatis Plus 3.5.9+ 要求)
- PageHelper 1.4.7 → 2.1.1 (兼容 JSqlParser 5.x)
- mysql:mysql-connector-java → com.mysql:mysql-connector-j (Spring Boot 2.7 BOM 变更)
兼容性修复:
- FieldStrategy.IGNORED → FieldStrategy.NEVER (3.5.16 重命名)
- ScanOptionsBuilder → ScanOptions.scanOptions() 工厂方法
- saveOrUpdate(entity, wrapper) → saveOrUpdate(entity) (wrapper 签名移除)
- PermitAllUrlProperties: getBean(class) → getBean(name,class) + null 检查
- application.yml: 添加 spring.mvc.pathmatch.matching-strategy=ant-path-matcher
- application.yml: 禁用 springfox (与 Spring Boot 2.7 不兼容)
验证结果:
- ✅ mvn clean package -DskipTests BUILD SUCCESS
- ✅ 登录接口 HTTP 200
- ✅ 分页查询 (数据字典 326 条, 用户 84 条)
- ✅ 路由信息 (22 个顶级菜单)
- ✅ 流程引擎 (Flowable) 正常初始化
|
2026-06-04 13:35:14 +08:00 |
|
Ranyunqiao
|
d5a65a1b47
|
门诊收费站自动填充修复 科室切换功能修复
|
2026-06-04 13:28:38 +08:00 |
|
Ranyunqiao
|
43b998e6ef
|
bug 467 569
|
2026-06-04 12:55:34 +08:00 |
|
|
|
6ded2ee174
|
chore(deps): Phase 5 itextpdf 5.5.12 → 5.5.13.4
- PDF 生成库安全更新
|
2026-06-04 11:35:53 +08:00 |
|
|
|
4469171b62
|
chore(deps): Phase 3 后端组件升级
- OSHI 6.6.5 → 6.10.0 (系统监控)
- Commons IO 2.13.0 → 2.21.0 (IO工具)
- PostgreSQL 42.2.27 → 42.7.4 (JDBC驱动)
|
2026-06-04 11:28:56 +08:00 |
|
|
|
427b7ad799
|
chore(deps): Phase 2 后端组件升级
- Druid 1.2.27 → 1.2.28
- Fastjson2 2.0.58 → 2.0.61
- Hutool 5.3.8 → 5.8.35
|
2026-06-04 11:19:58 +08:00 |
|
|
|
8f4ab275f0
|
fix(security): BouncyCastle 1.69 → 1.80 安全修复
- bcprov-jdk15on 1.69 → bcprov-jdk18on 1.80
- 修复 CVE 安全漏洞
- 支持国密 SM2/SM3 算法
|
2026-06-04 11:08:40 +08:00 |
|
wangjian963
|
5df2d8a049
|
645 【住院管理-住院医生工作站】临床医嘱中的新增一条医嘱,请选择项目没有数据回显
615 【住院医生工作站-临床医嘱】录入“临时”医嘱时,【用药频次】字段被置灰锁死为“立即”且无法更改
577 [住院医生工作站-检验] 检验申请单项目列表中的单价/使用单位展示异常,单位回显为字典数字ID(如 6, 16)而非中文名称
|
2026-06-02 16:35:38 +08:00 |
|
wangjian963
|
899cbc0b71
|
Merge remote-tracking branch 'origin/develop' into develop
|
2026-06-02 16:03:09 +08:00 |
|
wangjian963
|
734bdc6a0d
|
585 [住院医生工作站-手术申请] 手术申请历史列表缺失“手术状态”列,导致医生无法跟踪手术流转进度
|
2026-06-02 16:02:47 +08:00 |
|
|
|
6958654d26
|
feat(home): 添加处方统计数据功能
- 在 HomeStatisticsDto 中新增今日处方、昨日处方和处方趋势字段
- 实现处方数量查询逻辑,支持按日期和医生过滤
- 计算处方数据的日环比变化率
- 更新前端界面以显示处方统计信息
- 配置处方相关的路由映射
- 修正数据绑定逻辑以正确关联处方统计数据
|
2026-06-02 15:31:37 +08:00 |
|
|
|
e1cb88e47e
|
feat(home): 优化首页界面并实现收入统计功能
- 添加欢迎区域背景动效和视觉优化
- 实现今日收入统计及同比数据显示
- 重构待办事项和日程的双栏布局
- 修复路由权限检查并添加无权限提示
- 更新快捷功能入口和统计卡片样式
- 集成财务模块收入查询接口
- 添加数据库配置备份文件
|
2026-06-02 14:38:51 +08:00 |
|
wangjian963
|
cde58cf18f
|
581 【住院医生站-临床医嘱-手术】手术申请单缺失多项核心业务字段与强拦截逻辑,导致医疗安全制度无法落地且阻断手术室排班闭环
|
2026-06-02 13:22:09 +08:00 |
|
|
|
74de40f94f
|
fix(#575): 预约成功后 booked_num 未实时累加
根因:booked_num 只在签到时累加,预约成功后没有更新。
业务上预约成功就占了号源,booked_num 应立即反映。
修复:
- TicketServiceImpl: 预约成功后 booked_num +1(与 locked_num 同步)
- SchedulePoolMapper: 签到时不再改 booked_num(预约时已加)
- SchedulePoolMapper: refreshPoolStats 统计 booked_num 包含 LOCKED+BOOKED+CHECKED_IN
- SlotStatus: 更新状态流转注释
|
2026-06-02 10:42:13 +08:00 |
|
|
|
d1189786cf
|
fix(#574): 签到时 booked_num 未累加
根因:updatePoolStatsOnCheckIn 只做 locked_num-1,
没有同时做 booked_num+1,导致号源池已约数不准确。
修复:签到时原子递增 booked_num
|
2026-06-02 10:15:34 +08:00 |
|
wangjian963
|
5a970cf492
|
503
【住院发退药】发药明细与发药汇总单数据触发时机不一致,存在业务脱节风险
|
2026-06-02 10:05:41 +08:00 |
|
|
|
c3ecadcfe0
|
fix(#575): 退号流程兼容 CHECKED_IN(3) 状态 + 查询过滤修复
Bug #574 将签到状态从 BOOKED(1) 改为 CHECKED_IN(3) 后,
退号流程只检查 BOOKED(1) 导致已签到患者无法退号。
修复:
- OutpatientRegistrationAppServiceImpl: 退号检查兼容 BOOKED(1) 和 CHECKED_IN(3)
- OutpatientRegistrationAppServiceImpl: 退号统计改用 refreshPoolStats 统一刷新
- ScheduleSlotMapper.xml: 'checked' 查询过滤兼容 status=1 和 status=3
|
2026-06-02 09:59:58 +08:00 |
|
|
|
b8463f4659
|
fix(#574): 签到状态 BOOKED(1)→CHECKED_IN(3) + 全链路映射修复
根因:checkInTicket() 将签到后状态设为 BOOKED(1) 而非 CHECKED_IN(3)
导致:前端无法识别已签到状态,池统计漏计已签到人数
修复:
- TicketServiceImpl: 签到状态改为 SlotStatus.CHECKED_IN(3)
- TicketAppServiceImpl: 新增 CHECKED_IN→已签到 映射分支
- SchedulePoolMapper: 池统计兼容 BOOKED 和 CHECKED_IN
- outpatientAppointment/index.vue: STATUS_CLASS_MAP + 患者信息条件加上已签到
- AGENTS.md: 写入状态值一致性/禁止删文件/全链路验证铁律
|
2026-06-02 09:48:51 +08:00 |
|
|
|
710a215597
|
fix(#640): 组合临床医嘱 updateGroupId 按实际所属表分别更新
根因:原代码把所有 requestId 都当 MedicationRequest 处理,
诊疗医嘱(ID属于wor_service_request)被错误INSERT到药品表,
medication_id NOT NULL约束失败。
修复:拆组时三表都清group_id;组合时依次查药品→诊疗→耗材表,
找到所属表后精准更新group_id(group_no)。
|
2026-06-02 09:00:08 +08:00 |
|
|
|
74f340d77c
|
fix(#634): 请修复 Bug #634: web_ui 手动入列
根因:
- **
- `core-framework/.../ApplicationConfig.java:39` — `LocalDateTimeDeserializer` 只配置了 `yyyy-MM-dd HH:mm:ss` 格式
- 前端发送 ISO 8601 格式日期字符串 `"2026-06-01T01:45:06.439Z"`(含毫秒 + `Z` 时区后缀),Jackson 反序列化失败抛出 `JsonParseException`
修复:
- **
- 修改 `ApplicationConfig.java`,将单一格式的 `LocalDateTimeDeserializer` 替换为自定义多格式反序列化器
- 新反序列化器依次尝试:ISO 8601(`yyyy-MM-ddTHH:mm:ss.SSS`)→ 简单格式(`yyyy-MM-dd HH:mm:ss`)→ 斜杠格式(`yyyy/M/d HH:mm:ss`)
- 自动剥离 `Z`/`z` 时区后缀和 `+HH:MM` 偏移量(`LocalDateTime` 不含时区信息)
- 6 环验证:**
- ①前端 → ②Controller:`@RequestBody` 反序列化现在支持 ISO 8601 格式 ✅
- ③Service:无需修改,DTO 字段类型未变 ✅
- ④Mapper:无需修改,SQL 映射未变 ✅
- ⑤DB:无需修改,字段类型未变 ✅
- ⑥关联模块:全局生效,所有使用 `LocalDateTime` 的实体均受益 ✅
- 编译验证:** `mvn compile -pl openhis-application -am` → BUILD SUCCESS ✅
- 变更文件:** `core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java`
|
2026-06-01 16:27:02 +08:00 |
|
wangjian963
|
17783bd981
|
561 [门诊医生站-医嘱] 医嘱录入后,总量单位显示异常,显示为“null”而非诊疗目录配置值
|
2026-06-01 16:15:40 +08:00 |
|
wangjian963
|
275e7f5978
|
597 【住院医生工作站-临床医嘱】临床医嘱需增加“备注”字段支持
|
2026-06-01 14:41:12 +08:00 |
|
wangjian963
|
76c623ba1d
|
467
[住院医生工作站-检验申请] 列表显示信息不规范:标题术语错误且单据名称未展示具体检验项目
466 [住院医生工作站-检验申请] 申请单界面缺失核心质控字段(申请类型、标本类型、执行时间)及联动逻辑
|
2026-06-01 14:15:59 +08:00 |
|
|
|
310331f921
|
fix(#630): 修复 getOne() 多条记录异常 — 仅修改查询条件,不改方法签名
根因:4处 emrService.getOne() / docRecordService.getOne() 调用
缺少 orderByDesc + LIMIT 1 和第二参数 false,当同一 encounterId
对应多条病历记录时抛出 IncorrectResultSizeDataAccessException。
修复(仅查询条件,不改接口签名):
- Line 78: addPatientEmr 添加 orderByDesc + LIMIT 1 + false
- Line 148: getEmrDetail(Emr) 添加 orderByDesc + LIMIT 1
- Line 154: getEmrDetail(DocRecord) 已有 false 参数
- Line 277: checkNeedWriteEmr 添加 orderByDesc + LIMIT 1 + false
编译验证:mvn compile BUILD SUCCESS ✅
|
2026-06-01 10:58:39 +08:00 |
|
|
|
9f5eecf62b
|
fix(#630): 完整修复门诊医生站现诊患者列表报错 — 4处 getOne() 修复
根因:DoctorStationEmrAppServiceImpl 中 4 处 emrService.getOne() /
docRecordService.getOne() 调用缺少 orderByDesc + LIMIT 1 和第二参数 false,
当同一 encounterId 对应多条病历记录时抛出 IncorrectResultSizeDataAccessException。
修复:
- addPatientEmr: 添加 orderByDesc + LIMIT 1 + 第二参数 false
- getEmrDetail (DocRecord): 添加第二参数 false
- getPendingEmrList: 添加 orderByDesc + LIMIT 1 + 第二参数 false
- checkNeedWriteEmr: 添加 orderByDesc + LIMIT 1 + 第二参数 false
|
2026-06-01 10:38:17 +08:00 |
|
|
|
b5918c8a3c
|
fix(#614): 请修复 Bug #614:【住院护士:医嘱执行 住院发退药】已发药医嘱取消执行后,未进入“取消执行”列表且未联动生成“住院退药单”
根因:
- 全链路数据流检查:**
- | 环节 | 状态 | 说明 |
- |------|------|------|
- | 📤 录入 | ✅ 正常 | "已执行"tab 勾选医嘱 → 点击"取消执行"按钮 |
- | 📤 API 调用 | ✅ 正常 | `adviceCancel` 接口调用正确 |
- | 📤 后端 Service | 🔧 已修改 | `adviceCancel` 方法有变量名拼写错误 |
- | 📥 查询("取消执行"tab) | 🔧 已修改 | `requestStatus` 未重置导致查不到记录 |
修复:
- | 📥 退药单生成 | 🔧 已修改 | 长期医嘱缺少 `updateCancelledStatusBatch` 调用 |
- `medicalOrderExecution/index.vue:112-114`
- 切换到"取消执行"tab 时,重置 `requestStatus` 为 `RequestStatus.CANCELLED`(5)
- `requestStatus` 保持 `RequestStatus.COMPLETED`(3),后端 SQL 只返回 `request_status IN (3, 10)` 的记录,取消执行后的记录被过滤掉
- `AdviceProcessAppServiceImpl.java:576-583`
- 修正变量名拼写错误:`creatRefundMedicationList(tempMedDispensedList, ...)` → `creatRefundMedicationList(longMedDispensedList, ...)`
- 为长期已发药医嘱添加 `updateCancelledStatusBatch` 调用,确保药品请求状态变更为"待退药"
- 长期医嘱取消执行时,退药单从空的 `tempMedDispensedList` 生成(实际无数据),且药品请求状态未更新
- ### 验证结果
- ✅ `vue-tsc --noEmit`:无新增类型错误
- ✅ `vite build`:构建成功(1分52秒)
- ✅ `eslint`:无语法错误
|
2026-05-31 03:06:37 +08:00 |
|
|
|
6cd658d8da
|
fix(#630): 请修复 Bug #630:[门诊医生站] 点击选择现诊患者列表报错
根因:
- **
- 门诊医生站点击现诊患者后,右侧病历区域加载失败,抛出异常。经过全链路分析(前端→Controller→Service→Mapper→DB),定位到两个可能的问题点:
- 1. `DoctorStationEmrController.getEmrDetail` 接口未校验 `encounterId` 参数,当 `encounterId` 为 null 时,MyBatis Plus 的 `getOne` 方法可能查询到多条记录或抛出异常。
- 2. `DoctorStationEmrController.getPatientEmrHistory` 接口未校验 `patientId` 参数,可能导致查询条件异常。
修复:
- **
- 在 `DoctorStationEmrAppServiceImpl.getPatientEmrHistory` 方法中增加 `patientId` 空值校验,为空时返回空分页结果,避免查询异常。
- 在 `DoctorStationEmrAppServiceImpl.getEmrDetail` 方法中增加 `encounterId` 空值校验,为空时直接返回 null;同时将 `emrService.getOne` 的第二个参数设为 `false`,避免多条记录时抛出异常。
- 修改文件:**
- `openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationEmrAppServiceImpl.java`
- 编译验证:**
- 运行 `mvn compile -pl openhis-application -am`,编译成功,无新增错误。
|
2026-05-31 00:42:00 +08:00 |
|
|
|
4903122e27
|
fix(#629): 请修复 Bug #629:[住院医生站-临床医嘱] 录入长期医嘱“荆防颗粒”点击保存报错,数据无法写入
根因:
- `RegAdviceSaveDto`(子类)重复声明了父类 `AdviceSaveDto` 已有的 `private Integer categoryEnum` 字段。Lombok `@Data` 在两个类上各生成独立的 getter/setter,子类方法覆盖父类。这导致:
- Jackson 反序列化**时,JSON 中的 `categoryEnum` 值只写入子类字段,父类字段始终为 `null`
- 多态访问**时(通过父类类型引用),`getCategoryEnum()` 返回 `null`,导致下游操作(如护士站计费 `NurseBillingAppService`)获取到空值
- `hashCode`/`equals`** 行为不一致:子类只比较自己的 `categoryEnum`,父类比较所有字段
修复:
- 从 `RegAdviceSaveDto` 中移除了重复的 `categoryEnum` 字段,让子类直接继承父类的字段和 getter/setter。
- | 文件 | 变更 |
- |---|---|
- | `RegAdviceSaveDto.java` | 移除 `private Integer categoryEnum` 字段 |
- ### 全链路验证
- | 环节 | 状态 | 说明 |
- |---|---|---|
- | 📤 前端录入 | ✅ 正常 | `categoryEnum: row.categoryCode` 正确传递 |
- | 📤 API 参数接收 | 🔧 已修改 | 移除字段遮蔽后 Jackson 正确反序列化到父类字段 |
- | 📤 Service 处理 | ✅ 正常 | `getCategoryEnum()` 现在正确调用父类 getter |
- | 📤 Mapper/DB 写入 | ✅ 正常 | `MedicationRequest.categoryEnum` 正确赋值 |
- | 📥 查询展示 | ✅ 正常 | 数据正确入库,查询不受影响 |
- ### 编译验证
- `mvn compile -pl openhis-application -am` ✅ 通过
|
2026-05-30 16:37:42 +08:00 |
|
|
|
ab431e69de
|
fix(#631): 请修复 Bug #631:[住院医生站-临床医嘱] 诊疗类医嘱(如肌肉注射)录入执行科室后,医嘱列表“药房/科室”列未回显数据
根因:
- Bug #请修复 Bug #631 存在的问题
修复:
- 文件:`openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java`
- 第 630 行:`getPositionId()` → `getEffectiveOrgId()`
- 第 681 行:`getPositionId()` → `getEffectiveOrgId()`
- `getEffectiveOrgId()` 方法优先取 `orgId`,fallback 到 `positionId`,已在 `AdviceSaveDto` 中定义
- 验证**:`mvn compile -pl openhis-application -am -q` ✅
|
2026-05-30 09:45:22 +08:00 |
|
|
|
10835d24d1
|
perf(doctorstation): 优化数据库查询性能添加LIMIT 1限制
- 在手术记录查询中添加.last("LIMIT 1")避免全表扫描
- 在费用项查询中添加.last("LIMIT 1")提高查询效率
- 在库存项查询中添加.last("LIMIT 1")减少数据检索量
- 在病历查询中添加.last("LIMIT 1")并按创建时间降序排列
- 在组织机构查询中添加.last("LIMIT 1")限制返回结果
- 在检验申请单查询中添加.last("LIMIT 1)")优化查找性能
- 在分诊队列项查询中添加.last("LIMIT 1)")提升检索速度
|
2026-05-29 21:31:31 +08:00 |
|
|
|
5c29c0f09e
|
fix(#613): 医生端医嘱列表增加退回原因展示列
根因(全链路6环分析):
- ① 前端/页面 ❌ 医生端医嘱列表无退回原因列 → 无法展示护士填写的退回原因
- ② Controller ❌ 不涉及 — 纯转发层
- ③ Service ❌ getRequestBaseInfo() 未填充 reasonText 字段
- ④ Mapper/XML ❌ UNION ALL 查询未选取 back_reason/reason_text 字段
- ⑤ DB ✅ med_medication_request.back_reason 列已存在(上一次修复已迁移)
- ⑥ 关联模块 ⚠️ wor_service_request.reason_text 已存在但未在查询中暴露
修复:
1. RequestBaseDto.java: 新增 reasonText 字段(映射退回原因)
2. DoctorStationAdviceAppMapper.xml: 5 个 UNION ALL 分支各自选取 reason_text
- med_medication_request → T1.back_reason
- charge item 回补 → T2.back_reason
- device_request(2 处)→ NULL(无退回原因字段)
- wor_service_request → T1.reason_text
3. prescriptionlist.vue: 在诊断列前新增退回原因列
全链路状态流转:
护士端弹窗→输入原因→API传backReason→DB保存→医生端列表展示
↑ 本次修复打通最后一环 ↑
|
2026-05-29 15:55:55 +08:00 |
|
wangjian963
|
ba5ac84d96
|
621 [系统管理-诊疗目录] 诊疗项目(如空调费)编辑/新增保存成功后,再次编辑时“零售价”字段回显为空
622
[系统管理-诊疗目录] 诊疗项目编辑弹窗中,除编号外的大部分核心字段(零售价、目录分类等)无法编辑
|
2026-05-29 15:47:05 +08:00 |
|
|
|
e3c0e700a5
|
chore: 删除误提交的 .bak 文件
|
2026-05-29 15:04:11 +08:00 |
|