refactor(config): 重构应用配置中的Jackson序列化设置

- 将Jackson2ObjectMapperBuilderCustomizer替换为直接配置ObjectMapper实例
- 移除未使用的Logger导入和日志变量声明
- 统一日期时间序列化配置方式,禁用时间戳格式
- 更新反序列化上下文参数命名以保持一致性
- 简化泛型类型声明,使用钻石操作符

fix(patient): 修复患者管理中的数据库查询语法错误

- 移除PatientManageMapper.xml中多余的逗号导致的SQL语法问题
- 确保字段列表格式正确以避免数据库解析错误

fix(rationaldrug): 修正合理用药模块API端点路径

- 移除API路径中的healthlink-his前缀,统一使用/api/v1基础路径
- 保持所有处方审核相关接口的一致性

feat(patient): 在患者添加对话框中增加联系人信息字段

- 添加联系人姓名、关系和电话号码输入表单
- 为新字段提供相应的验证规则和占位符提示
- 保持与现有监护人信息字段的界面布局一致
This commit is contained in:
2026-06-09 16:37:59 +08:00
parent d47c83eec5
commit 68cfa48820
6 changed files with 96 additions and 45 deletions

View File

@@ -1,20 +1,19 @@
package com.core.framework.config; package com.core.framework.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.jackson2.autoconfigure.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.EnableAspectJAutoProxy;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.TimeZone; import java.util.TimeZone;
@@ -23,15 +22,14 @@ import java.util.TimeZone;
@EnableAspectJAutoProxy(exposeProxy = true) @EnableAspectJAutoProxy(exposeProxy = true)
@MapperScan({"com.core.**.mapper", "com.healthlink.his.**.mapper"}) @MapperScan({"com.core.**.mapper", "com.healthlink.his.**.mapper"})
public class ApplicationConfig { public class ApplicationConfig {
private static final Logger log = LoggerFactory.getLogger(ApplicationConfig.class);
private static final JsonDeserializer<LocalDateTime> LOCAL_DATE_TIME_DESERIALIZER = new JsonDeserializer<LocalDateTime>() { private static final JsonDeserializer<LocalDateTime> LOCAL_DATE_TIME_DESERIALIZER = new JsonDeserializer<>() {
private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
private static final DateTimeFormatter SIMPLE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final DateTimeFormatter SIMPLE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter SLASH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss"); private static final DateTimeFormatter SLASH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss");
@Override @Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws IOException {
String text = p.getText(); String text = p.getText();
if (text == null || text.isEmpty()) return null; if (text == null || text.isEmpty()) return null;
String cleaned = text.replaceAll("[Zz]$", "").replaceAll("[+-]\\d{2}:?\\d{2}$", ""); String cleaned = text.replaceAll("[Zz]$", "").replaceAll("[+-]\\d{2}:?\\d{2}$", "");
@@ -42,14 +40,17 @@ public class ApplicationConfig {
}; };
@Bean @Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { public ObjectMapper objectMapper() {
return builder -> { ObjectMapper mapper = new ObjectMapper();
builder.timeZone(TimeZone.getDefault()); mapper.setTimeZone(TimeZone.getDefault());
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss"); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
JavaTimeModule javaTimeModule = new JavaTimeModule(); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
javaTimeModule.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER);
builder.modules(javaTimeModule); JavaTimeModule javaTimeModule = new JavaTimeModule();
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); javaTimeModule.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER);
}; javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mapper.registerModule(javaTimeModule);
return mapper;
} }
} }

View File

@@ -26,7 +26,7 @@ public class FlexibleDateDeserializer extends JsonDeserializer<Date> {
}; };
@Override @Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { public Date deserialize(JsonParser p, DeserializationContext context) throws IOException {
String dateStr = p.getValueAsString(); String dateStr = p.getValueAsString();
if (dateStr == null || dateStr.isEmpty()) { if (dateStr == null || dateStr.isEmpty()) {
return null; return null;

View File

@@ -49,7 +49,7 @@
pt.guardian_address, pt.guardian_address,
pt.patient_derived, pt.patient_derived,
pt.education_level, pt.education_level,
pt.company_address, pt.company_address
FROM ( FROM (
SELECT SELECT
( (
@@ -103,7 +103,7 @@
p.guardian_address, p.guardian_address,
p.patient_derived, p.patient_derived,
p.education_level, p.education_level,
p.company_address, p.company_address
FROM adm_patient p FROM adm_patient p
where p.delete_flag = '0' where p.delete_flag = '0'
) AS pt ) AS pt

View File

@@ -2,51 +2,51 @@ import request from '@/utils/request'
// ==================== 处方审核 ==================== // ==================== 处方审核 ====================
export function auditPrescription(data) { export function auditPrescription(data) {
return request({ url: '/healthlink-his/api/v1/rational-drug/audit', method: 'post', data }) return request({ url: '/api/v1/rational-drug/audit', method: 'post', data })
} }
export function batchAudit(prescriptionIds) { export function batchAudit(prescriptionIds) {
return request({ url: '/healthlink-his/api/v1/rational-drug/batch-audit', method: 'post', data: prescriptionIds }) return request({ url: '/api/v1/rational-drug/batch-audit', method: 'post', data: prescriptionIds })
} }
export function getAuditStatistics() { export function getAuditStatistics() {
return request({ url: '/healthlink-his/api/v1/rational-drug/statistics', method: 'get' }) return request({ url: '/api/v1/rational-drug/statistics', method: 'get' })
} }
export function getAuditTrend(startDate) { export function getAuditTrend(startDate) {
return request({ url: '/healthlink-his/api/v1/rational-drug/trend', method: 'get', params: { startDate } }) return request({ url: '/api/v1/rational-drug/trend', method: 'get', params: { startDate } })
} }
export function getAuditLog(encounterId) { export function getAuditLog(encounterId) {
return request({ url: `/healthlink-his/api/v1/rational-drug/audit-log/${encounterId}`, method: 'get' }) return request({ url: `/api/v1/rational-drug/audit-log/${encounterId}`, method: 'get' })
} }
// ==================== 配伍禁忌 ==================== // ==================== 配伍禁忌 ====================
export function checkInteraction(drugCodes) { export function checkInteraction(drugCodes) {
return request({ url: '/healthlink-his/api/v1/rational-drug/check-interaction', method: 'post', data: drugCodes }) return request({ url: '/api/v1/rational-drug/check-interaction', method: 'post', data: drugCodes })
} }
export function listInteractionRules(params) { export function listInteractionRules(params) {
return request({ url: '/healthlink-his/api/v1/rational-drug/interaction-rules', method: 'get', params }) return request({ url: '/api/v1/rational-drug/interaction-rules', method: 'get', params })
} }
export function addInteractionRule(data) { export function addInteractionRule(data) {
return request({ url: '/healthlink-his/api/v1/rational-drug/interaction-rules', method: 'post', data }) return request({ url: '/api/v1/rational-drug/interaction-rules', method: 'post', data })
} }
export function updateInteractionRule(data) { export function updateInteractionRule(data) {
return request({ url: '/healthlink-his/api/v1/rational-drug/interaction-rules', method: 'put', data }) return request({ url: '/api/v1/rational-drug/interaction-rules', method: 'put', data })
} }
export function delInteractionRule(id) { export function delInteractionRule(id) {
return request({ url: `/healthlink-his/api/v1/rational-drug/interaction-rules/${id}`, method: 'delete' }) return request({ url: `/api/v1/rational-drug/interaction-rules/${id}`, method: 'delete' })
} }
// ==================== 剂量规则 ==================== // ==================== 剂量规则 ====================
export function listDosageRules(params) { export function listDosageRules(params) {
return request({ url: '/healthlink-his/api/v1/rational-drug/dosage-rules', method: 'get', params }) return request({ url: '/api/v1/rational-drug/dosage-rules', method: 'get', params })
} }
export function checkDosage(drugCode, dosage, population) { export function checkDosage(drugCode, dosage, population) {
return request({ url: '/healthlink-his/api/v1/rational-drug/check-dosage', method: 'get', params: { drugCode, dosage, population } }) return request({ url: '/api/v1/rational-drug/check-dosage', method: 'get', params: { drugCode, dosage, population } })
} }

View File

@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 处方审核 // 处方审核
export function auditPrescription(data) { export function auditPrescription(data) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/audit', url: '/api/v1/rational-drug/audit',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -12,7 +12,7 @@ export function auditPrescription(data) {
// 批量审核 // 批量审核
export function batchAudit(data) { export function batchAudit(data) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/batch-audit', url: '/api/v1/rational-drug/batch-audit',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -21,7 +21,7 @@ export function batchAudit(data) {
// 审核统计 // 审核统计
export function getAuditStatistics() { export function getAuditStatistics() {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/statistics', url: '/api/v1/rational-drug/statistics',
method: 'get' method: 'get'
}) })
} }
@@ -29,7 +29,7 @@ export function getAuditStatistics() {
// 审核趋势 // 审核趋势
export function getAuditTrend(params) { export function getAuditTrend(params) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/trend', url: '/api/v1/rational-drug/trend',
method: 'get', method: 'get',
params: params params: params
}) })
@@ -38,7 +38,7 @@ export function getAuditTrend(params) {
// 审核记录 // 审核记录
export function getAuditLog(encounterId) { export function getAuditLog(encounterId) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/audit-log/' + encounterId, url: '/api/v1/rational-drug/audit-log/' + encounterId,
method: 'get' method: 'get'
}) })
} }
@@ -46,7 +46,7 @@ export function getAuditLog(encounterId) {
// 配伍禁忌检查 // 配伍禁忌检查
export function checkInteraction(data) { export function checkInteraction(data) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/check-interaction', url: '/api/v1/rational-drug/check-interaction',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -55,7 +55,7 @@ export function checkInteraction(data) {
// 配伍禁忌规则列表 // 配伍禁忌规则列表
export function listInteractionRules(params) { export function listInteractionRules(params) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/interaction-rules', url: '/api/v1/rational-drug/interaction-rules',
method: 'get', method: 'get',
params: params params: params
}) })
@@ -64,7 +64,7 @@ export function listInteractionRules(params) {
// 新增配伍禁忌规则 // 新增配伍禁忌规则
export function addInteractionRule(data) { export function addInteractionRule(data) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/interaction-rules', url: '/api/v1/rational-drug/interaction-rules',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -73,7 +73,7 @@ export function addInteractionRule(data) {
// 修改配伍禁忌规则 // 修改配伍禁忌规则
export function updateInteractionRule(data) { export function updateInteractionRule(data) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/interaction-rules', url: '/api/v1/rational-drug/interaction-rules',
method: 'put', method: 'put',
data: data data: data
}) })
@@ -82,7 +82,7 @@ export function updateInteractionRule(data) {
// 删除配伍禁忌规则 // 删除配伍禁忌规则
export function delInteractionRule(id) { export function delInteractionRule(id) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/interaction-rules/' + id, url: '/api/v1/rational-drug/interaction-rules/' + id,
method: 'delete' method: 'delete'
}) })
} }
@@ -90,7 +90,7 @@ export function delInteractionRule(id) {
// 剂量规则列表 // 剂量规则列表
export function listDosageRules(params) { export function listDosageRules(params) {
return request({ return request({
url: '/healthlink-his/api/v1/rational-drug/dosage-rules', url: '/api/v1/rational-drug/dosage-rules',
method: 'get', method: 'get',
params: params params: params
}) })

View File

@@ -455,7 +455,57 @@
</el-col> </el-col>
</el-row> </el-row>
<!-- 第八行监护监护人关系监护人电话 --> <!-- 第八行联系联系人关系联系人电话 -->
<el-row>
<el-col :span="8">
<el-form-item
label="联系人"
prop="linkName"
>
<el-input
v-model="form.linkName"
clearable
:disabled="isViewMode"
placeholder="请输入联系人"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="联系人关系"
prop="linkRelationCode"
>
<el-select
v-model="form.linkRelationCode"
placeholder="联系人关系"
clearable
:disabled="isViewMode"
>
<el-option
v-for="item in link_relation_code"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="联系人电话"
prop="linkTelcom"
>
<el-input
v-model="form.linkTelcom"
clearable
:disabled="isViewMode"
placeholder="请输入联系人电话"
/>
</el-form-item>
</el-col>
</el-row>
<!-- 第九行监护人监护人关系监护人电话 -->
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item