验证护理文件数量,进行质控或者异常的推送

3.2.4.44
wyb 2 years ago
parent 9eebb5e800
commit ef9b0aa3a6

@ -51,6 +51,13 @@ public interface TBasicMapper{
Integer getNurseFileCount(@Param("patientId")String patientId);
/**
*
* @param patientId
* @return
*/
Integer getNurseRemoveFileCount(@Param("patientId") String patientId);
/**
*
* @param patientId
@ -86,4 +93,5 @@ public interface TBasicMapper{
* @return
*/
TBasic getByPatientId(@Param("patientId") String patientId);
}

@ -0,0 +1,37 @@
package com.docus.server.common.config;
import com.docus.server.common.util.RedisKeyExpirationListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Bean
public RedisKeyExpirationListener redisKeyExpirationListener() {
return new RedisKeyExpirationListener(stringRedisTemplate);
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(){
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
// 监听 __keyevent@0__:expired ,使用键时间监听key的过期
redisMessageListenerContainer.addMessageListener(redisKeyExpirationListener(),
new PatternTopic("__keyevent@*__:expired"));
return redisMessageListenerContainer;
}
}

@ -0,0 +1,42 @@
package com.docus.server.common.util;
import lombok.extern.slf4j.Slf4j;
/**
* reidKey
*
* @author wyb
*/
@Slf4j
public abstract class RedisKeyExpirationHandler {
/**
* rediskey
*
* @param expireRedisKey redis key
*/
public void handle(String expireRedisKey) {
try {
businessHandle(expireRedisKey);
} catch (Exception ex) {
log.error("redis键"+expireRedisKey+" 过期,处理发生异常:"+ex.getMessage(),ex);
handleException(expireRedisKey);
}
}
;
/**
* ,
*
* @param expireRedisKey redis key
*/
public abstract void businessHandle(String expireRedisKey) throws Exception;
/**
*
*
* @param expireRedisKey redis key
*/
public abstract void handleException(String expireRedisKey);
}

@ -0,0 +1,42 @@
package com.docus.server.common.util;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* redis
*
* @author wyb
*/
public class RedisKeyExpirationListener implements MessageListener {
private final StringRedisTemplate stringRedisTemplate;
private final List<RedisKeyExpirationHandler> handlers = new CopyOnWriteArrayList<>();
public RedisKeyExpirationListener(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
@Override
public void onMessage(Message message, byte[] bytes) {
byte[] body = message.getBody();
String expireRedisKey = stringRedisTemplate.getStringSerializer().deserialize(body);
for (RedisKeyExpirationHandler handler : handlers) {
handler.handle(expireRedisKey);
}
}
/**
* redisKey
*
* @param handler redisKey
*/
public void register(RedisKeyExpirationHandler handler) {
Objects.requireNonNull(handler);
handlers.add(handler);
}
}

@ -1,8 +1,6 @@
package com.docus.server.report.api;
import com.docus.server.report.api.dto.SdJxReportDto;
import com.docus.server.report.api.dto.SdNurseInsertSugarRequest;
import com.docus.server.report.api.dto.SdNurseInsertSugarResponse;
import com.docus.server.report.api.dto.*;
import java.util.List;
@ -31,12 +29,15 @@ public interface ShunDePeopleService {
/**
*
*
* @param sdJxReportDto
* @return
*/
String getInspectReportByJxId(SdJxReportDto sdJxReportDto);
/**
* Lis
*
* @param sdJxReportDto
* @return
*/
@ -44,16 +45,26 @@ public interface ShunDePeopleService {
/**
* PACSPDFPDFBASE64
* @param examNo
*
* @param examNo
* @param reportNo
* @return pdfBase64
*/
String getBase64PdfFromPacs(String examNo,String reportNo);
String getBase64PdfFromPacs(String examNo, String reportNo);
/**
*
*
* @param request
* @return
*/
SdNurseInsertSugarResponse getNurseInsertSugarReport(SdNurseInsertSugarRequest request);
/**
*
*
* @param request
* @return
*/
SdNurDocFailResponse pushSdNurDocFail(SdNurDocFailRequest request);
}

@ -0,0 +1,47 @@
package com.docus.server.report.api.dto;
import lombok.Getter;
import java.util.Objects;
/**
*
*
* @author jiashi
*/
@Getter
public class SdNurDocFailRequest {
/**
* nurse_doc_fai
*/
private final String tradeCode;
/**
*
*/
private final String zyh;
/**
*
*/
private final String visit_id;
/**
* -1
*/
private final String error_code;
/**
*
*/
private final String error_msg;
public SdNurDocFailRequest(String zyh, String visit_id, String tradeCode,String error_code,String error_msg) {
Objects.requireNonNull(zyh);
Objects.requireNonNull(visit_id);
Objects.requireNonNull(tradeCode);
Objects.requireNonNull(error_code);
Objects.requireNonNull(error_msg);
this.tradeCode = tradeCode;
this.zyh = zyh;
this.visit_id = visit_id;
this.error_code = error_code;
this.error_msg = error_msg;
}
}

@ -0,0 +1,21 @@
package com.docus.server.report.api.dto;
import lombok.Data;
/**
*
*
* @author jiashi
*/
@Data
public class SdNurDocFailResponse {
/**
*
*/
private String error_code;
/**
*
*/
private String error_msg;
}

@ -7,10 +7,7 @@ import com.alibaba.fastjson.JSON;
import com.docus.core.util.DateUtil;
import com.docus.core.util.Func;
import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.dto.SdJxReportDto;
import com.docus.server.report.api.dto.SdNurseInsertSugarRequest;
import com.docus.server.report.api.dto.SdNurseInsertSugarResponse;
import com.docus.server.report.api.dto.SdPacsServerConfig;
import com.docus.server.report.api.dto.*;
import com.docus.server.report.client.JaxWsDynamicClient;
import com.docus.server.report.config.SdRyReportQueryConfig;
import com.docus.server.report.util.IdUtil;
@ -43,6 +40,7 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService {
private static final Lock INSPECT_REPORT_LOCK = new ReentrantLock();
private static final Lock LIS_REPORT_LOCK = new ReentrantLock();
private static final Lock NURSE_INSERT_SUGAR_LOCK = new ReentrantLock();
private static final Lock NURSE_INSERT_SUGAR_PUSH_ERR_LOCK = new ReentrantLock();
@Resource
private SdRyReportQueryConfig sdRyReportQueryConfig;
@ -178,6 +176,26 @@ public class ShunDePeopleServiceImpl implements ShunDePeopleService {
NURSE_INSERT_SUGAR_LOCK.unlock();
}
}
@Override
public SdNurDocFailResponse pushSdNurDocFail(SdNurDocFailRequest request) {
String randomUuid = Func.randomUUID();
NURSE_INSERT_SUGAR_PUSH_ERR_LOCK.lock();
try {
String body=Func.toJson(request);
log.info("[{}] 移动护理推送错误,请求地址:{},参数:{}", randomUuid,sdRyReportQueryConfig.getReportQueryNurseInsertSugarErrPushUrl(), body);
String respBody = sendPost(sdRyReportQueryConfig.getReportQueryNurseInsertSugarErrPushUrl(), body);
log.info("[{}] 移动护理推送错误,响应:{}", randomUuid, respBody);
TimeUnit.MILLISECONDS.sleep(sdRyReportQueryConfig.getReportQueryNurseInsertSugarErrPushInterval());
return JSON.parseObject(respBody,SdNurDocFailResponse.class);
}catch (Exception ex){
log.error("["+randomUuid+"]"+"移动护理推送异常,出错了:" + ex.getMessage(), ex);
return null;
}finally {
NURSE_INSERT_SUGAR_PUSH_ERR_LOCK.unlock();
}
}
private String organizationQuerySdRyInspectReportUrl(String reportQueryLisUrl) {
return reportQueryLisUrl + "/query?uuid=" + IdUtil.standardUUID() +
"&action=" + sdRyReportQueryConfig.getReportQueryInspectAction() +

@ -61,4 +61,8 @@ public class SdRyReportQueryConfig {
private String reportQueryNurseInsertSugarCollectorId;
@Value("${sdry.report-query-url.nurseInsertSugar.defaultAssortType:other}")
private String reportQueryNurseInsertSugarDefaultAssortType;
@Value("${sdry.report-query-url.nurseInsertSugar.pushErr.url:}")
private String reportQueryNurseInsertSugarErrPushUrl;
@Value("${sdry.report-query-url.nurseInsertSugar.pushErr.interval:1000}")
private int reportQueryNurseInsertSugarErrPushInterval;
}

@ -0,0 +1,15 @@
package com.docus.server.report.consts;
/**
*
*/
public interface ReportDownloadWait {
/**
*
*/
int REPORT_DOWNLOAD_WAIT_TIME = 30 * 60;
/**
* redisKey,docus:collect:report:download:wait:{id}:{}
*/
String REPORT_DOWNLOAD_WAIT_KEY = "docus:collect:report:download:wait:%s:%s";
}

@ -3,6 +3,7 @@ package com.docus.server.report.controller;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.TaskDistributeService;
import com.docus.server.report.api.dto.SdNurDocFailRequest;
import com.docus.server.report.api.dto.SdNurseInsertSugarRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -35,6 +36,13 @@ public class ApiTestController {
SdNurseInsertSugarRequest sdNurseInsertSugarRequest = new SdNurseInsertSugarRequest(inpatientNo, admissTimes, traceCode);
return CommonResult.success(shunDePeopleService.getNurseInsertSugarReport(sdNurseInsertSugarRequest));
}
@ApiOperation(value = "移动护理报告推送错误接口测试")
@GetMapping("/nisPushErrTest")
public CommonResult<Object> nisPushErrTest(@Param("inpatientNo") String inpatientNo, @Param("admissTimes") String admissTimes,@Param("errorCode") String errorCode,@Param("errMsg") String errMsg) {
final String traceCode = "nurse_doc_fail";
SdNurDocFailRequest failRequest = new SdNurDocFailRequest(inpatientNo,admissTimes,traceCode,errorCode,errMsg);
return CommonResult.success(shunDePeopleService.pushSdNurDocFail(failRequest));
}
@ApiOperation(value = "获取任务测试")
@PostMapping("/getTaskTest")

@ -1,5 +1,7 @@
package com.docus.server.report.controller;
import com.alibaba.fastjson.JSON;
import com.docus.server.report.api.dto.SdNurDocFailRequest;
import com.docus.server.report.api.dto.SdNurseInsertSugarRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -18,7 +20,7 @@ public class MockTestController {
@PostMapping("/nurseReturnMock")
@ApiOperation("护理请求模拟数据")
public String nurseReturnMock(@RequestBody SdNurseInsertSugarRequest request){
log.info("收到护理请求消息:{},返回模拟数据!",request);
log.info("收到护理请求消息:{},返回模拟数据!",JSON.toJSONString(request));
String result="{\n" +
" \"data\": [\n" +
" {\n" +
@ -57,6 +59,15 @@ public class MockTestController {
return result;
}
@PostMapping("/nurseErrMock")
@ApiOperation("护理异常推送模拟数据")
public String nurseReturnMock(@RequestBody SdNurDocFailRequest request){
log.info("收到护理异常推送消息:{},返回模拟数据!", JSON.toJSONString(request));
String result="{\"error_code\":\"1\",\"error_msg\":\"接收成功\"}";
System.out.println(result);
return result;
}
public static void main(String[] args) {
String result="{\n" +
" \"data\": [\n" +

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.redis.service.RedisOps;
import com.docus.infrastructure.web.api.ResultCode;
import com.docus.server.collection.entity.TBasic;
import com.docus.server.collection.mapper.TBasicMapper;
@ -14,11 +15,13 @@ import com.docus.server.report.config.SdRyCollectNurseInsertSugarConfig;
import com.docus.server.report.config.SdRyReportQueryConfig;
import com.docus.server.report.config.TaskValidateConfig;
import com.docus.server.report.config.ZdAssortConfig;
import com.docus.server.report.consts.ReportDownloadWait;
import com.docus.server.report.entity.AfJobTime;
import com.docus.server.report.entity.AfReportRecord;
import com.docus.server.report.mapper.AfJobTimeMapper;
import com.docus.server.report.mapper.AfReportRecordMapper;
import com.docus.server.report.service.ReportService;
import com.docus.server.report.service.ShunDePeopleBusinessService;
import com.docus.server.report.util.TableJsonRead;
import com.docus.server.report.util.XmlUtil;
import com.docus.server.report.validate.CollectTaskValidation;
@ -63,6 +66,10 @@ public class ReportJob {
private TaskDistributeService taskDistributeService;
@Resource
private ShunDePeopleService shunDePeopleService;
@Resource
private ShunDePeopleBusinessService shunDePeopleBusinessService;
@Resource
RedisOps redisOps;
@XxlJob("SdRyLisCollectJob")
public void sdRyLisCollectJob() {
@ -176,14 +183,18 @@ public class ReportJob {
if (Func.isNotEmpty(nurseInsertSugarReportList)) {
Integer filesNumber = nurseInsertSugarReportList.get(0).getFILES_NUMBER();
Integer nurseFileCount = tBasicMapper.getNurseFileCount(patientId);
if (filesNumber == null || nurseFileCount == null) {
log.warn("{} , {},未保存护理提交的文件数量或者未获取到接口返回的文件数量!", inpatientNo, admissTimes);
nurseFileCountError(inpatientNo, admissTimes);
if (filesNumber == null) {
log.warn("{} ,{},接口未返回文件数量!",inpatientNo,admissTimes);
return;
}
if (nurseFileCount == null) {
log.warn("{} , {},未获取到护理提交的文件数量!", inpatientNo, admissTimes);
shunDePeopleBusinessService.nurseFileCountError(inpatientNo, admissTimes,"未获取到护理提交的文件数量!");
return;
}
if (!filesNumber.equals(nurseFileCount)) {
log.warn("{} , {},护理提交的文件数量与接口返回的文件数量不匹配!", inpatientNo, admissTimes);
nurseFileCountError(inpatientNo, admissTimes);
shunDePeopleBusinessService.nurseFileCountError(inpatientNo, admissTimes,"护理提交的文件数量与接口返回的文件数量不匹配");
return;
}
// 从配置获取需要过滤的文件名称
@ -219,6 +230,9 @@ public class ReportJob {
collectFileCount++;
}
log.info("住院号:{},住院次数{},护理采集文件: {} 条", inpatientNo, admissTimes, collectFileCount);
// 设置一个redisKey,过期被监听处理
String redisKey=String.format(ReportDownloadWait.REPORT_DOWNLOAD_WAIT_KEY,reportQueryNurseInsertSugarCollectorId,patientId);
redisOps.setEx(redisKey,"0",ReportDownloadWait.REPORT_DOWNLOAD_WAIT_TIME);
}
}
@ -234,9 +248,7 @@ public class ReportJob {
return false;
}
private void nurseFileCountError(String inpatientNo, Integer admissTimes) {
// todo 未提供!
}
/**
*

@ -0,0 +1,125 @@
package com.docus.server.report.listener;
import com.docus.infrastructure.redis.service.RedisOps;
import com.docus.server.collection.entity.TBasic;
import com.docus.server.collection.mapper.TBasicMapper;
import com.docus.server.common.util.RedisKeyExpirationHandler;
import com.docus.server.common.util.RedisKeyExpirationListener;
import com.docus.server.report.config.SdRyReportQueryConfig;
import com.docus.server.report.consts.ReportDownloadWait;
import com.docus.server.report.mapper.AfScanAssortMapper;
import com.docus.server.report.service.ShunDePeopleBusinessService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
* @author WYBDEV
*/
@Component
@Slf4j
public class NisReportDownloadWaitHandler extends RedisKeyExpirationHandler {
@Autowired
private RedisKeyExpirationListener redisKeyExpirationListener;
@Autowired
private RedisOps redisOps;
@Autowired
private SdRyReportQueryConfig sdRyReportQueryConfig;
@Autowired
private TBasicMapper tBasicMapper;
@Autowired
private AfScanAssortMapper scanAssortMapper;
@Resource
private ShunDePeopleBusinessService shunDePeopleBusinessService;
@PostConstruct
public void registerRedisKeyExpireListener() {
redisKeyExpirationListener.register(this);
}
public static void main(String[] args) {
String collectId = "3";
String redisKey = String.format(ReportDownloadWait.REPORT_DOWNLOAD_WAIT_KEY, collectId, "20230501");
System.out.println(redisKey);
String redisKeyPrefix1 = String.format(ReportDownloadWait.REPORT_DOWNLOAD_WAIT_KEY, collectId, "");
System.out.println(redisKey.startsWith(redisKeyPrefix1));
// 得到病案主键
System.out.println(redisKey.replace(redisKeyPrefix1, ""));
}
@Override
public void businessHandle(String expireRedisKey) throws Exception {
// 是否是护理采集要校验的redisKey校验护理采集下载的文件数量是否和推送过滤后的匹配匹配则调用 质控,不匹配发送异常信息
if (!isNisReportWaitKey(expireRedisKey)) {
return;
}
String patientId = getPatientId(expireRedisKey);
log.info("病案主键:{} 护理采集数量校对开始!", patientId);
boolean verifyNisFileCountResult = verifyNisFileCountAndPushErr(patientId);
if (verifyNisFileCountResult) {
nisQualityControl(patientId);
}
}
private boolean verifyNisFileCountAndPushErr(String patientId) {
TBasic tBasic = tBasicMapper.getByPatientId(patientId);
String inpatientNo = tBasic.getInpatientNo();
Integer admissTimes = tBasic.getAdmissTimes();
Integer submitNurseFileCount = tBasicMapper.getNurseFileCount(patientId);
// 判断提交的文件数量
if (submitNurseFileCount == null || submitNurseFileCount == 0) {
log.warn("{} , {},未获取到护理提交的文件数量!", inpatientNo, admissTimes);
shunDePeopleBusinessService.nurseFileCountError(inpatientNo, admissTimes, "未获取到护理提交的文件数量!");
return false;
}
// 有些报告在采集的时候会过滤掉,有记录过滤的条数,计算实际应该要采集到的文件数量,和文件表数量做对比,文件表数量的小于应该采集到的,推送错误信息
Integer nurseRemoveFileCount = tBasicMapper.getNurseRemoveFileCount(patientId);
int realFileCount = submitNurseFileCount - nurseRemoveFileCount;
String collectorId = sdRyReportQueryConfig.getReportQueryNurseInsertSugarCollectorId();
Integer downloadSuccessFileCount = scanAssortMapper.countByPatientAndCollectorId(patientId, collectorId);
if (downloadSuccessFileCount < realFileCount) {
shunDePeopleBusinessService.nurseFileCountError(inpatientNo, admissTimes, "未完整采集该病案的文件!");
return false;
}
return true;
}
private void nisQualityControl(String patientId) {
// todo 调用护理质控接口等待 质控那边开发
log.info("调用护理质控:{}", patientId);
}
@Override
public void handleException(String expireRedisKey) {
// 异常主键重新推送
redisOps.setEx(expireRedisKey, "0", ReportDownloadWait.REPORT_DOWNLOAD_WAIT_TIME);
}
/**
* redisKey
*
* @param expireRedisKey redisKey
* @return redisKey
*/
private boolean isNisReportWaitKey(String expireRedisKey) {
String collectorId = sdRyReportQueryConfig.getReportQueryNurseInsertSugarCollectorId();
// 护理报告的key的前缀
String nisKeyPrefix = String.format(ReportDownloadWait.REPORT_DOWNLOAD_WAIT_KEY, collectorId, "");
return expireRedisKey.startsWith(nisKeyPrefix);
}
/**
* id
*/
private String getPatientId(String expireRedisKey) {
String collectorId = sdRyReportQueryConfig.getReportQueryNurseInsertSugarCollectorId();
// 护理报告的key的前缀
String nisKeyPrefix = String.format(ReportDownloadWait.REPORT_DOWNLOAD_WAIT_KEY, collectorId, "");
return expireRedisKey.replace(nisKeyPrefix, "");
}
}

@ -0,0 +1,20 @@
package com.docus.server.report.mapper;
import org.apache.ibatis.annotations.Param;
/**
* mapper
*
* @author wyb
*/
public interface AfScanAssortMapper {
/**
* id
*
* @param patientId
* @param collectorId id
* @return
*/
Integer countByPatientAndCollectorId(@Param("patientId") String patientId, @Param("collectorId") String collectorId);
}

@ -0,0 +1,12 @@
package com.docus.server.report.service;
public interface ShunDePeopleBusinessService {
/**
*
*
* @param inpatientNo
* @param admissTimes
* @param errorMsg
*/
void nurseFileCountError(String inpatientNo, Integer admissTimes, String errorMsg);
}

@ -0,0 +1,24 @@
package com.docus.server.report.service.impl;
import com.docus.server.report.api.ShunDePeopleService;
import com.docus.server.report.api.dto.SdNurDocFailRequest;
import com.docus.server.report.service.ShunDePeopleBusinessService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
@Slf4j
public class ShunDePeopleBusinessServiceImpl implements ShunDePeopleBusinessService {
@Resource
private ShunDePeopleService shunDePeopleService;
@Override
public void nurseFileCountError(String inpatientNo, Integer admissTimes,String errorMsg) {
final String traceCode = "nurse_doc_fail";
final String errorCode = "-1";
SdNurDocFailRequest failRequest = new SdNurDocFailRequest(inpatientNo,admissTimes.toString(),traceCode,errorCode,errorMsg);
shunDePeopleService.pushSdNurDocFail(failRequest);
}
}

@ -77,6 +77,10 @@ sdry:
url: http://127.0.0.1:9311/api/mockTest/nurseReturnMock
interval: 1000
defaultAssortType: hl-other
# 异常推送 地址和调用时间间隔 ms
pushErr:
url: http://127.0.0.1:9311/api/mockTest/nurseErrMock
interval: 1000

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.report.mapper.AfScanAssortMapper">
<select id="countByPatientAndCollectorId" resultType="java.lang.Integer">
SELECT count(1)
from `docus_archivefile`.`t_scan_assort`
WHERE `patient_id` = #{patientId}
and `source` = #{collectorId}
</select>
</mapper>

@ -177,6 +177,12 @@
from `docus_medicalrecord`.`t_basic_extend`
WHERE patient_id=#{patientId}
</select>
<select id="getNurseRemoveFileCount" resultType="java.lang.Integer">
select ifnull(nurse_file_collect_remove_count,0)
from `docus_medicalrecord`.`t_basic_extend`
WHERE patient_id=#{patientId}
</select>
<select id="getSdRyIndex" resultType="java.lang.String">
select sdry_index
from `docus_medicalrecord`.`t_basic_extend`
@ -197,4 +203,5 @@
from `docus_medicalrecord`.`t_basic`
where patient_id=#{patientId}
</select>
</mapper>

Loading…
Cancel
Save