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

View File

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

View File

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

View File

@@ -454,8 +454,58 @@
</el-form-item>
</el-col>
</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-col :span="8">
<el-form-item