Compare commits

...

4 Commits

Author SHA1 Message Date
3e650dd041 perf(utils): 优化字典工具类性能并移除重复依赖
- 在DictUtils中添加类型检查避免不必要的序列化反序列化操作
- 移除pom.xml中的重复jackson-databind依赖配置
- 提升字典数据获取的执行效率
2026-06-11 14:49:42 +08:00
773a485114 refactor(redis): 重构Redis配置以兼容fastjson格式
- 移除Jackson多态类型验证器配置
- 使用FastjsonCompatibleRedisSerializer替代GenericJacksonJsonRedisSerializer
- 添加Primary注解优化Bean注入
- 移除不必要的ValueOperations Bean定义
- 更新限流脚本中的变量名提高可读性
- 在TokenService中添加对多种缓存格式的兼容性支持
- 创建FastjsonCompatibleRedisSerializer类处理不同数据格式的反序列化
- 添加数据库迁移脚本为相关表增加基础字段和删除标识
2026-06-11 14:49:19 +08:00
9675106d4b Merge remote-tracking branch 'origin/develop' into develop 2026-06-11 14:17:01 +08:00
2c2dbd7542 fix(antibiotic): 修复实体类字段映射和接口路径配置问题
- 修正了AntibioticApproval实体类中的字段名从delFlag改为deleteFlag
- 移除了SysAuditLog实体类中多余的空行
- 为YbDao中的结算明细方法添加了医疗类型参数校验
- 统一了前端API接口路径,移除了healthlink-his前缀
- 更新了麻醉、抗菌药物、CA签名等多个模块的接口调用路径
- 修正了医嘱闭环、危急值管理等页面的API请求地址
2026-06-11 12:02:10 +08:00
27 changed files with 252 additions and 132 deletions

View File

@@ -115,10 +115,6 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- éÜÿéââ¬Â¡Ã…’JSONèçãæžÐå™è -->
<!-- ioåøøçââ¬ÂÃ¨Ã¥Ã·Ã¥Ã¥ââ¬Â¦Ã·Ã§Ã±Ã» -->

View File

@@ -43,6 +43,12 @@ public class DictUtils {
if (StringUtils.isNull(cached)) {
return null;
}
// 如果已经是目标类型,直接返回
if (cached instanceof List && ((List<?>) cached).stream().allMatch(e -> e instanceof SysDictData)) {
@SuppressWarnings("unchecked")
List<SysDictData> result = (List<SysDictData>) cached;
return result;
}
com.fasterxml.jackson.core.type.TypeReference<List<SysDictData>> typeRef =
new com.fasterxml.jackson.core.type.TypeReference<List<SysDictData>>() {};
ObjectMapper mapper = new ObjectMapper()

View File

@@ -0,0 +1,79 @@
package com.core.framework.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.nio.charset.StandardCharsets;
/**
* Jackson Redis序列化器 - 兼容fastjson旧格式
*
* 新数据: 纯JSON (无类型包装),调用方用 convertValue 转换
* 旧fastjson: 去除L后缀后按JSON解析
* 旧Jackson activateDefaultTyping: 解包 ["className",{data}] 后取data部分
*/
public class FastjsonCompatibleRedisSerializer implements RedisSerializer<Object> {
private static final Logger log = LoggerFactory.getLogger(FastjsonCompatibleRedisSerializer.class);
private final ObjectMapper objectMapper;
/** 全局ObjectMapper供外部调用方做 convertValue 转换 */
private static final ObjectMapper sharedMapper = createMapper();
public FastjsonCompatibleRedisSerializer() { log.info("[INIT] FastjsonCompatibleRedisSerializer loaded - plain JSON mode");
this.objectMapper = createMapper();
}
private static ObjectMapper createMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
/** 获取共享ObjectMapper供 DictUtils / TokenService 等做 convertValue */
public static ObjectMapper getSharedMapper() {
return sharedMapper;
}
@Override
public byte[] serialize(Object object) throws SerializationException {
if (object == null) {
return new byte[0];
}
try {
return objectMapper.writeValueAsBytes(object);
} catch (Exception e) {
throw new SerializationException("Redis序列化失败: " + e.getMessage(), e);
}
}
@Override
public Object deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String json = new String(bytes, StandardCharsets.UTF_8);
// 移除fastjson特有的Long L后缀: 123L -> 123
String cleaned = json.replaceAll("(\\d+)L", "$1");
try {
// 处理旧Jackson activateDefaultTyping格式: ["className", {data}]
if (cleaned.startsWith("[\"") && cleaned.length() > 10) {
com.fasterxml.jackson.databind.JsonNode node = objectMapper.readTree(cleaned);
if (node.isArray() && node.size() >= 2 && node.get(0).isTextual()) {
// 取data部分第2个元素忽略className
return objectMapper.treeToValue(node.get(1), Object.class);
}
}
return objectMapper.readValue(cleaned, Object.class);
} catch (Exception e) {
log.warn("Redis数据反序列化失败(已忽略): {}", e.getMessage());
return null;
}
}
}

View File

@@ -4,51 +4,24 @@ import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.GenericJacksonJsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.DatabindContext;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.jsontype.PolymorphicTypeValidator;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
private static final PolymorphicTypeValidator ALLOW_ALL = new PolymorphicTypeValidator() {
@Override
public Validity validateBaseType(DatabindContext ctxt, JavaType baseType) {
return Validity.ALLOWED;
}
@Override
public Validity validateSubClassName(DatabindContext ctxt, JavaType baseType, String subClassName) {
return Validity.ALLOWED;
}
@Override
public Validity validateSubType(DatabindContext ctxt, JavaType baseType, JavaType subType) {
return Validity.ALLOWED;
}
};
@Bean
@Primary
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
tools.jackson.databind.ObjectMapper objectMapper = JsonMapper.builder()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.activateDefaultTyping(ALLOW_ALL, tools.jackson.databind.DefaultTyping.NON_FINAL)
.build();
GenericJacksonJsonRedisSerializer serializer = new GenericJacksonJsonRedisSerializer(objectMapper);
FastjsonCompatibleRedisSerializer serializer = new FastjsonCompatibleRedisSerializer();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
@@ -68,16 +41,18 @@ public class RedisConfig extends CachingConfigurerSupport {
return redisScript;
}
@Bean
public ValueOperations<Object, Object> valueOperations(RedisTemplate<Object, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
private String limitScriptText() {
return "local key = KEYS[1]\n" + "local count = tonumber(ARGV[1])\n" + "local time = tonumber(ARGV[2])\n"
+ "local current = redis.call('get', key);\n" + "if current and tonumber(current) > count then\n"
+ " return tonumber(current);\n" + "end\n" + "current = redis.call('incr', key)\n"
+ "if tonumber(current) == 1 then\n" + " redis.call('expire', key, time)\n" + "end\n"
+ "return tonumber(current);";
return "local key = KEYS[1]\n" +
"local count = tonumber(ARGV[1])\n" +
"local ttl = tonumber(ARGV[2])\n" +
"local current = redis.call('get', KEYS[1]);\n" +
"if current and tonumber(current) > count then\n" +
" return tonumber(current);\n" +
"end\n" +
"current = redis.call('incr', KEYS[1]);\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('expire', KEYS[1], ttl);\n" +
"end\n" +
"return tonumber(current);\n";
}
}

View File

@@ -63,8 +63,28 @@ public class TokenService {
// 解析对应的权限以及用户信息
String uuid = (String)claims.get(Constants.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);
LoginUser user = redisCache.getCacheObject(userKey);
return user;
Object cached = redisCache.getCacheObject(userKey);
if (cached instanceof LoginUser) {
return (LoginUser) cached;
}
// 兼容旧Jackson activateDefaultTyping格式: ["className",{data}]
if (cached instanceof java.util.List<?> list && list.size() >= 2 && list.get(0) instanceof String) {
Object data = list.get(1);
if (data instanceof java.util.Map) {
com.fasterxml.jackson.databind.ObjectMapper mapper =
new com.fasterxml.jackson.databind.ObjectMapper();
mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.convertValue(data, LoginUser.class);
}
}
// 兼容纯JSON格式: LinkedHashMap -> LoginUser
if (cached instanceof java.util.Map) {
com.fasterxml.jackson.databind.ObjectMapper mapper =
new com.fasterxml.jackson.databind.ObjectMapper();
mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.convertValue(cached, LoginUser.class);
}
return null;
} catch (Exception e) {
log.error("获取用户信息异常'{}'", e.getMessage());
}

View File

@@ -28,7 +28,7 @@ public class AntibioticAppServiceImpl implements IAntibioticAppService {
}
@Override
public AntibioticApproval requestApproval(AntibioticApproval a) {
a.setStatus("PENDING"); a.setDelFlag("0"); approvalService.save(a); return a;
a.setStatus("PENDING"); a.setDeleteFlag("0"); approvalService.save(a); return a;
}
@Override
public void approve(Long id, Long approverId, String approverName, String result) {

View File

@@ -0,0 +1,7 @@
-- Fix: prescription_intercept_log missing HisBaseEntity columns
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS delete_flag VARCHAR(1) DEFAULT '0';
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS create_by VARCHAR(64) DEFAULT '';
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS update_by VARCHAR(64) DEFAULT '';
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS update_time TIMESTAMP;
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS tenant_id BIGINT DEFAULT 1;

View File

@@ -0,0 +1,10 @@
-- 为 sys_audit_log 和 antibiotic_approval 添加 delete_flag 列以匹配 HisBaseEntity 默认映射
-- HisBaseEntity.deleteFlag 映射到 delete_flag (MyBatis-Plus camelCase默认)
ALTER TABLE sys_audit_log ADD COLUMN IF NOT EXISTS delete_flag CHAR(1) DEFAULT '0';
COMMENT ON COLUMN sys_audit_log.delete_flag IS '删除标识(0=正常,1=删除)';
UPDATE sys_audit_log SET delete_flag = '0' WHERE delete_flag IS NULL;
-- antibiotic_approval 表原有 del_flag 列,新增 delete_flag 列供 HisBaseEntity 使用
ALTER TABLE antibiotic_approval ADD COLUMN IF NOT EXISTS delete_flag CHAR(1) DEFAULT '0';
COMMENT ON COLUMN antibiotic_approval.delete_flag IS '删除标识(0=正常,1=删除)';
UPDATE antibiotic_approval SET delete_flag = '0' WHERE delete_flag IS NULL;

View File

@@ -0,0 +1,5 @@
-- 为 clinical_pathway_execution 添加 HisBaseEntity 所需的基础字段
ALTER TABLE clinical_pathway_execution ADD COLUMN IF NOT EXISTS create_by VARCHAR(64);
ALTER TABLE clinical_pathway_execution ADD COLUMN IF NOT EXISTS create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE clinical_pathway_execution ADD COLUMN IF NOT EXISTS update_by VARCHAR(64);
ALTER TABLE clinical_pathway_execution ADD COLUMN IF NOT EXISTS update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

View File

@@ -0,0 +1,4 @@
-- 为 prescription_intercept_log 添加 delete_flag 列以匹配 HisBaseEntity 默认映射
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS delete_flag CHAR(1) DEFAULT '0';
COMMENT ON COLUMN prescription_intercept_log.delete_flag IS '删除标识(0=正常,1=删除)';
UPDATE prescription_intercept_log SET delete_flag = '0' WHERE delete_flag IS NULL;

View File

@@ -1,16 +1,31 @@
package com.healthlink.his.antibiotic.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.core.common.core.domain.HisBaseEntity;
import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
@Data @TableName("antibiotic_approval") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false)
@Data
@TableName("antibiotic_approval")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
public class AntibioticApproval extends HisBaseEntity {
@TableId(type = IdType.ASSIGN_ID) private Long id;
private Long encounterId; private Long patientId;
private String drugCode; private String drugName; private String antibioticClass;
private Long requesterId; private String requesterName;
private Long approverId; private String approverName; private Date approvalTime;
private String approvalResult; private String reason; private String status; private String delFlag;
}
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private Long encounterId;
private Long patientId;
private String drugCode;
private String drugName;
private String antibioticClass;
private Long requesterId;
private String requesterName;
private Long approverId;
private String approverName;
private Date approvalTime;
private String approvalResult;
private String reason;
private String status;
}

View File

@@ -25,4 +25,4 @@ public class SysAuditLog extends HisBaseEntity {
private String result;
private String errorMsg;
private Integer durationMs;
}
}

View File

@@ -1317,6 +1317,9 @@ public class YbDao {
public List<Settlement3201DetailDto> reconcileGeneralLedgerDetail(Settlement3201WebParam settlement3201WebParam) {
// 获取条件
String clrType = settlement3201WebParam.getClrType();// 住院 or 门诊
if (StringUtils.isEmpty(clrType)) {
throw new ServiceException("请选择医疗类型:住院/门诊");
}
Integer kindEnum;
if (clrType.equals(YbClrType.OUTPATIENT_CLINIC.getValue())) {
kindEnum = PaymentKind.OUTPATIENT_CLINIC.getValue();

View File

@@ -1,9 +1,9 @@
import request from '@/utils/request'
export function createRecord(data) { return request({ url: '/healthlink-his/api/v1/anesthesia/record', method: 'post', data }) }
export function updateRecord(data) { return request({ url: '/healthlink-his/api/v1/anesthesia/record', method: 'put', data }) }
export function getRecordDetail(id) { return request({ url: '/healthlink-his/api/v1/anesthesia/record/' + id, method: 'get' }) }
export function getByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/anesthesia/record/encounter/' + encounterId, method: 'get' }) }
export function getVitalSigns(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/vital-sign/' + recordId, method: 'get' }) }
export function getMedications(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/medication/' + recordId, method: 'get' }) }
export function getIoSummary(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/io-summary/' + recordId, method: 'get' }) }
export function completeRecord(id) { return request({ url: '/healthlink-his/api/v1/anesthesia/complete/' + id, method: 'put' }) }
export function createRecord(data) { return request({ url: '/api/v1/anesthesia/record', method: 'post', data }) }
export function updateRecord(data) { return request({ url: '/api/v1/anesthesia/record', method: 'put', data }) }
export function getRecordDetail(id) { return request({ url: '/api/v1/anesthesia/record/' + id, method: 'get' }) }
export function getByEncounter(encounterId) { return request({ url: '/api/v1/anesthesia/record/encounter/' + encounterId, method: 'get' }) }
export function getVitalSigns(recordId) { return request({ url: '/api/v1/anesthesia/vital-sign/' + recordId, method: 'get' }) }
export function getMedications(recordId) { return request({ url: '/api/v1/anesthesia/medication/' + recordId, method: 'get' }) }
export function getIoSummary(recordId) { return request({ url: '/api/v1/anesthesia/io-summary/' + recordId, method: 'get' }) }
export function completeRecord(id) { return request({ url: '/api/v1/anesthesia/complete/' + id, method: 'put' }) }

View File

@@ -2,23 +2,23 @@ import request from '@/utils/request'
// ==================== 抗菌药物管控 ====================
export function getRules(drugCode) {
return request({ url: `/healthlink-his/api/v1/antibiotic/rules/${drugCode}`, method: 'get' })
return request({ url: `/api/v1/antibiotic/rules/${drugCode}`, method: 'get' })
}
export function checkRestriction(drugCode, doctorLevel) {
return request({ url: '/healthlink-his/api/v1/antibiotic/check-restriction', method: 'get', params: { drugCode, doctorLevel } })
return request({ url: '/api/v1/antibiotic/check-restriction', method: 'get', params: { drugCode, doctorLevel } })
}
export function requestApproval(data) {
return request({ url: '/healthlink-his/api/v1/antibiotic/approval', method: 'post', data })
return request({ url: '/api/v1/antibiotic/approval', method: 'post', data })
}
export function approve(id, approverId, approverName, result) {
return request({ url: `/healthlink-his/api/v1/antibiotic/approval/${id}`, method: 'put', params: { approverId, approverName, result } })
return request({ url: `/api/v1/antibiotic/approval/${id}`, method: 'put', params: { approverId, approverName, result } })
}
export function getStatistics(startDate, endDate) {
return request({ url: '/healthlink-his/api/v1/antibiotic/statistics', method: 'get', params: { startDate, endDate } })
return request({ url: '/api/v1/antibiotic/statistics', method: 'get', params: { startDate, endDate } })
}
// 新增抗菌药物规则

View File

@@ -1,6 +1,6 @@
import request from '@/utils/request'
export function getRules(drugCode) { return request({ url: '/healthlink-his/api/v1/antibiotic/rules/' + drugCode, method: 'get' }) }
export function checkRestriction(drugCode, doctorLevel) { return request({ url: '/healthlink-his/api/v1/antibiotic/check-restriction', method: 'get', params: { drugCode, doctorLevel } }) }
export function requestApproval(data) { return request({ url: '/healthlink-his/api/v1/antibiotic/approval', method: 'post', data }) }
export function approve(id, params) { return request({ url: '/healthlink-his/api/v1/antibiotic/approval/' + id, method: 'put', params }) }
export function getStatistics() { return request({ url: '/healthlink-his/api/v1/antibiotic/statistics', method: 'get' }) }
export function getRules(drugCode) { return request({ url: '/api/v1/antibiotic/rules/' + drugCode, method: 'get' }) }
export function checkRestriction(drugCode, doctorLevel) { return request({ url: '/api/v1/antibiotic/check-restriction', method: 'get', params: { drugCode, doctorLevel } }) }
export function requestApproval(data) { return request({ url: '/api/v1/antibiotic/approval', method: 'post', data }) }
export function approve(id, params) { return request({ url: '/api/v1/antibiotic/approval/' + id, method: 'put', params }) }
export function getStatistics() { return request({ url: '/api/v1/antibiotic/statistics', method: 'get' }) }

View File

@@ -1,5 +1,5 @@
import request from '@/utils/request'
export function verifySignature(documentType, documentId) { return request({ url: '/healthlink-his/api/v1/ca-signature/verify/' + documentType + '/' + documentId, method: 'get' }) }
export function getSignatureHistory(documentType, documentId) { return request({ url: '/healthlink-his/api/v1/ca-signature/history/' + documentType + '/' + documentId, method: 'get' }) }
export function revokeSignature(id) { return request({ url: '/healthlink-his/api/v1/ca-signature/revoke/' + id, method: 'put' }) }
export function getSignatureStatistics() { return request({ url: '/healthlink-his/api/v1/ca-signature/statistics', method: 'get' }) }
export function verifySignature(documentType, documentId) { return request({ url: '/api/v1/ca-signature/verify/' + documentType + '/' + documentId, method: 'get' }) }
export function getSignatureHistory(documentType, documentId) { return request({ url: '/api/v1/ca-signature/history/' + documentType + '/' + documentId, method: 'get' }) }
export function revokeSignature(id) { return request({ url: '/api/v1/ca-signature/revoke/' + id, method: 'put' }) }
export function getSignatureStatistics() { return request({ url: '/api/v1/ca-signature/statistics', method: 'get' }) }

View File

@@ -1,6 +1,6 @@
import request from '@/utils/request'
export function getPendingList() { return request({ url: '/healthlink-his/api/v1/critical-value/pending', method: 'get' }) }
export function confirmValue(id, params) { return request({ url: '/healthlink-his/api/v1/critical-value/confirm/' + id, method: 'put', params }) }
export function closeValue(id) { return request({ url: '/healthlink-his/api/v1/critical-value/close/' + id, method: 'put' }) }
export function getStatistics() { return request({ url: '/healthlink-his/api/v1/critical-value/statistics', method: 'get' }) }
export function getOverdueList() { return request({ url: '/healthlink-his/api/v1/critical-value/overdue', method: 'get' }) }
export function getPendingList() { return request({ url: '/api/v1/critical-value/pending', method: 'get' }) }
export function confirmValue(id, params) { return request({ url: '/api/v1/critical-value/confirm/' + id, method: 'put', params }) }
export function closeValue(id) { return request({ url: '/api/v1/critical-value/close/' + id, method: 'put' }) }
export function getStatistics() { return request({ url: '/api/v1/critical-value/statistics', method: 'get' }) }
export function getOverdueList() { return request({ url: '/api/v1/critical-value/overdue', method: 'get' }) }

View File

@@ -1,9 +1,9 @@
import request from '@/utils/request'
export function createRevision(data) { return request({ url: '/healthlink-his/api/v1/emr/revision', method: 'post', data }) }
export function getRevisionHistory(emrId) { return request({ url: '/healthlink-his/api/v1/emr/revision/' + emrId, method: 'get' }) }
export function executeCompletenessCheck(emrId) { return request({ url: '/healthlink-his/api/v1/emr/completeness-check/' + emrId, method: 'post' }) }
export function getCompletenessCheck(emrId) { return request({ url: '/healthlink-his/api/v1/emr/completeness-check/' + emrId, method: 'get' }) }
export function getTimelinessByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/encounter/' + encounterId, method: 'get' }) }
export function getOverdueList() { return request({ url: '/healthlink-his/api/v1/emr/timeliness/overdue', method: 'get' }) }
export function getTimelinessStatistics(params) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/statistics', method: 'get', params }) }
export function checkTimeliness(data) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/check', method: 'post', data }) }
export function createRevision(data) { return request({ url: '/api/v1/emr/revision', method: 'post', data }) }
export function getRevisionHistory(emrId) { return request({ url: '/api/v1/emr/revision/' + emrId, method: 'get' }) }
export function executeCompletenessCheck(emrId) { return request({ url: '/api/v1/emr/completeness-check/' + emrId, method: 'post' }) }
export function getCompletenessCheck(emrId) { return request({ url: '/api/v1/emr/completeness-check/' + emrId, method: 'get' }) }
export function getTimelinessByEncounter(encounterId) { return request({ url: '/api/v1/emr/timeliness/encounter/' + encounterId, method: 'get' }) }
export function getOverdueList() { return request({ url: '/api/v1/emr/timeliness/overdue', method: 'get' }) }
export function getTimelinessStatistics(params) { return request({ url: '/api/v1/emr/timeliness/statistics', method: 'get', params }) }
export function checkTimeliness(data) { return request({ url: '/api/v1/emr/timeliness/check', method: 'post', data }) }

View File

@@ -1,4 +1,4 @@
import request from '@/utils/request'
export function getCaseList(params) { return request({ url: '/healthlink-his/api/v1/infection/case', method: 'get', params }) }
export function getStatistics() { return request({ url: '/healthlink-his/api/v1/infection/statistics', method: 'get' }) }
export function getExposureList() { return request({ url: '/healthlink-his/api/v1/infection/exposure', method: 'get' }) }
export function getCaseList(params) { return request({ url: '/api/v1/infection/case', method: 'get', params }) }
export function getStatistics() { return request({ url: '/api/v1/infection/statistics', method: 'get' }) }
export function getExposureList() { return request({ url: '/api/v1/infection/exposure', method: 'get' }) }

View File

@@ -1,8 +1,8 @@
import request from '@/utils/request'
export function generateHomepage(data) { return request({ url: '/healthlink-his/api/v1/mr-homepage/generate', method: 'post', data }) }
export function updateHomepage(data) { return request({ url: '/healthlink-his/api/v1/mr-homepage', method: 'put', data }) }
export function getHomepageDetail(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/' + id, method: 'get' }) }
export function executeQualityCheck(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/quality-check/' + id, method: 'post' }) }
export function getQualityCheck(homepageId) { return request({ url: '/healthlink-his/api/v1/mr-homepage/quality-check/' + homepageId, method: 'get' }) }
export function getStatistics(params) { return request({ url: '/healthlink-his/api/v1/mr-homepage/statistics', method: 'get', params }) }
export function submitHomepage(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/submit/' + id, method: 'put' }) }
export function generateHomepage(data) { return request({ url: '/api/v1/mr-homepage/generate', method: 'post', data }) }
export function updateHomepage(data) { return request({ url: '/api/v1/mr-homepage', method: 'put', data }) }
export function getHomepageDetail(id) { return request({ url: '/api/v1/mr-homepage/' + id, method: 'get' }) }
export function executeQualityCheck(id) { return request({ url: '/api/v1/mr-homepage/quality-check/' + id, method: 'post' }) }
export function getQualityCheck(homepageId) { return request({ url: '/api/v1/mr-homepage/quality-check/' + homepageId, method: 'get' }) }
export function getStatistics(params) { return request({ url: '/api/v1/mr-homepage/statistics', method: 'get', params }) }
export function submitHomepage(id) { return request({ url: '/api/v1/mr-homepage/submit/' + id, method: 'put' }) }

View File

@@ -1,7 +1,7 @@
import request from '@/utils/request'
export function createAssessment(data) { return request({ url: '/healthlink-his/api/v1/nursing/assessment', method: 'post', data }) }
export function getAssessmentsByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/nursing/assessment/encounter/' + encounterId, method: 'get' }) }
export function createCarePlan(data) { return request({ url: '/healthlink-his/api/v1/nursing/care-plan', method: 'post', data }) }
export function getCarePlansByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/nursing/care-plan/encounter/' + encounterId, method: 'get' }) }
export function createHandoff(data) { return request({ url: '/healthlink-his/api/v1/nursing/handoff', method: 'post', data }) }
export function getHandoffList(params) { return request({ url: '/healthlink-his/api/v1/nursing/handoff', method: 'get', params }) }
export function createAssessment(data) { return request({ url: '/api/v1/nursing/assessment', method: 'post', data }) }
export function getAssessmentsByEncounter(encounterId) { return request({ url: '/api/v1/nursing/assessment/encounter/' + encounterId, method: 'get' }) }
export function createCarePlan(data) { return request({ url: '/api/v1/nursing/care-plan', method: 'post', data }) }
export function getCarePlansByEncounter(encounterId) { return request({ url: '/api/v1/nursing/care-plan/encounter/' + encounterId, method: 'get' }) }
export function createHandoff(data) { return request({ url: '/api/v1/nursing/handoff', method: 'post', data }) }
export function getHandoffList(params) { return request({ url: '/api/v1/nursing/handoff', method: 'get', params }) }

View File

@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 医嘱执行记录列表
export function listOrderExecuteRecord(params) {
return request({
url: '/healthlink-his/api/v1/order-closed-loop/list',
url: '/api/v1/order-closed-loop/list',
method: 'get',
params: params
})
@@ -12,7 +12,7 @@ export function listOrderExecuteRecord(params) {
// 医嘱闭环状态查询
export function getOrderClosedLoopStatus(orderId) {
return request({
url: '/healthlink-his/api/v1/order-closed-loop/status/' + orderId,
url: '/api/v1/order-closed-loop/status/' + orderId,
method: 'get'
})
}
@@ -20,7 +20,7 @@ export function getOrderClosedLoopStatus(orderId) {
// 执行医嘱步骤
export function executeOrderStep(data) {
return request({
url: '/healthlink-his/api/v1/order-closed-loop/execute',
url: '/api/v1/order-closed-loop/execute',
method: 'post',
data: data
})
@@ -29,7 +29,7 @@ export function executeOrderStep(data) {
// 闭环统计
export function getClosedLoopStatistics(params) {
return request({
url: '/healthlink-his/api/v1/order-closed-loop/statistics',
url: '/api/v1/order-closed-loop/statistics',
method: 'get',
params: params
})

View File

@@ -1,4 +1,4 @@
import request from '@/utils/request'
export function createPlan(data) { return request({ url: '/healthlink-his/api/v1/review/plan', method: 'post', data }) }
export function getRecords(planId) { return request({ url: '/healthlink-his/api/v1/review/records/' + planId, method: 'get' }) }
export function getStatistics() { return request({ url: '/healthlink-his/api/v1/review/statistics', method: 'get' }) }
export function createPlan(data) { return request({ url: '/api/v1/review/plan', method: 'post', data }) }
export function getRecords(planId) { return request({ url: '/api/v1/review/records/' + planId, method: 'get' }) }
export function getStatistics() { return request({ url: '/api/v1/review/statistics', method: 'get' }) }

View File

@@ -35,7 +35,7 @@ const open = (data) => { formData.value = data || {}; visible.value = true }
const handleSign = async () => {
try {
await request({ url: '/healthlink-his/api/v1/ca-signature/sign', method: 'post', data: formData.value })
await request({ url: '/api/v1/ca-signature/sign', method: 'post', data: formData.value })
ElMessage.success('签名成功')
visible.value = false
} catch (e) { ElMessage.error('签名失败') }

View File

@@ -1,9 +1,9 @@
import request from '@/utils/request'
export function reportCriticalValue(data) { return request({ url: '/healthlink-his/api/v1/critical-value/report', method: 'post', data }) }
export function confirmCriticalValue(id, params) { return request({ url: '/healthlink-his/api/v1/critical-value/confirm/' + id, method: 'put', params }) }
export function processCriticalValue(id, params) { return request({ url: '/healthlink-his/api/v1/critical-value/process/' + id, method: 'put', params }) }
export function closeCriticalValue(id) { return request({ url: '/healthlink-his/api/v1/critical-value/close/' + id, method: 'put' }) }
export function getPendingList() { return request({ url: '/healthlink-his/api/v1/critical-value/pending', method: 'get' }) }
export function getOverdueList() { return request({ url: '/healthlink-his/api/v1/critical-value/overdue', method: 'get' }) }
export function getStatistics(params) { return request({ url: '/healthlink-his/api/v1/critical-value/statistics', method: 'get', params }) }
export function reportCriticalValue(data) { return request({ url: '/api/v1/critical-value/report', method: 'post', data }) }
export function confirmCriticalValue(id, params) { return request({ url: '/api/v1/critical-value/confirm/' + id, method: 'put', params }) }
export function processCriticalValue(id, params) { return request({ url: '/api/v1/critical-value/process/' + id, method: 'put', params }) }
export function closeCriticalValue(id) { return request({ url: '/api/v1/critical-value/close/' + id, method: 'put' }) }
export function getPendingList() { return request({ url: '/api/v1/critical-value/pending', method: 'get' }) }
export function getOverdueList() { return request({ url: '/api/v1/critical-value/overdue', method: 'get' }) }
export function getStatistics(params) { return request({ url: '/api/v1/critical-value/statistics', method: 'get', params }) }

View File

@@ -1,11 +1,11 @@
import request from '@/utils/request'
export function registerPerson(data) { return request({ url: '/healthlink-his/api/v1/empi/person', method: 'post', data }) }
export function mergePersons(primaryId, secondaryIds) { return request({ url: '/healthlink-his/api/v1/empi/merge', method: 'post', params: { primaryId, secondaryIds: secondaryIds.join(',') } }) }
export function findByGlobalId(globalId) { return request({ url: '/healthlink-his/api/v1/empi/person/global/' + globalId, method: 'get' }) }
export function findByIdCard(idCardNo) { return request({ url: '/healthlink-his/api/v1/empi/person/idcard/' + idCardNo, method: 'get' }) }
export function getMappings(globalId) { return request({ url: '/healthlink-his/api/v1/empi/mappings/' + globalId, method: 'get' }) }
export function getStatistics() { return request({ url: '/healthlink-his/api/v1/empi/statistics', method: 'get' }) }
export function registerPerson(data) { return request({ url: '/api/v1/empi/person', method: 'post', data }) }
export function mergePersons(primaryId, secondaryIds) { return request({ url: '/api/v1/empi/merge', method: 'post', params: { primaryId, secondaryIds: secondaryIds.join(',') } }) }
export function findByGlobalId(globalId) { return request({ url: '/api/v1/empi/person/global/' + globalId, method: 'get' }) }
export function findByIdCard(idCardNo) { return request({ url: '/api/v1/empi/person/idcard/' + idCardNo, method: 'get' }) }
export function getMappings(globalId) { return request({ url: '/api/v1/empi/mappings/' + globalId, method: 'get' }) }
export function getStatistics() { return request({ url: '/api/v1/empi/statistics', method: 'get' }) }
export function getPhotos(patientId) { return request({ url: '/empi-enhanced/photo/list', method: 'get', params: { patientId } }) }
export function addPhoto(data) { return request({ url: '/empi-enhanced/photo/add', method: 'post', data }) }