|
|
|
@ -1,10 +1,10 @@
|
|
|
|
package com.example.duplicate.service.impl;
|
|
|
|
package com.example.duplicate.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.example.duplicate.controller.param.EmrRateRequest;
|
|
|
|
import com.example.duplicate.controller.param.PageRequest;
|
|
|
|
import com.example.duplicate.controller.param.PageRequest;
|
|
|
|
import com.example.duplicate.controller.param.RcvPageRequest;
|
|
|
|
import com.example.duplicate.controller.param.RcvPageRequest;
|
|
|
|
import com.example.duplicate.controller.param.SginBasicDto;
|
|
|
|
import com.example.duplicate.controller.param.SginBasicDto;
|
|
|
|
import com.example.duplicate.controller.vo.ExportBasic;
|
|
|
|
import com.example.duplicate.controller.vo.*;
|
|
|
|
import com.example.duplicate.controller.vo.PageBasic;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.example.duplicate.infrastructure.dao.BasicMapper;
|
|
|
|
import com.example.duplicate.infrastructure.dao.BasicMapper;
|
|
|
|
import com.example.duplicate.service.RcvBasicService;
|
|
|
|
import com.example.duplicate.service.RcvBasicService;
|
|
|
|
@ -13,6 +13,7 @@ import com.example.utils.PageResult;
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
|
|
|
|
|
import io.swagger.models.auth.In;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
@ -26,15 +27,17 @@ import javax.servlet.http.HttpServletRequest;
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
import java.net.HttpURLConnection;
|
|
|
|
import java.net.HttpURLConnection;
|
|
|
|
import java.net.URL;
|
|
|
|
import java.net.URL;
|
|
|
|
import java.sql.*;
|
|
|
|
import java.sql.*;
|
|
|
|
|
|
|
|
import java.sql.Date;
|
|
|
|
import java.time.LocalDate;
|
|
|
|
import java.time.LocalDate;
|
|
|
|
import java.time.Period;
|
|
|
|
import java.time.Period;
|
|
|
|
import java.time.ZoneId;
|
|
|
|
import java.time.ZoneId;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @ClassName RcvBasicServiceImpl
|
|
|
|
* @ClassName RcvBasicServiceImpl
|
|
|
|
@ -58,8 +61,6 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
private String lzPassword;
|
|
|
|
private String lzPassword;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Value("${jsUrl}")
|
|
|
|
@Value("${jsUrl}")
|
|
|
|
private String jsUrl;
|
|
|
|
private String jsUrl;
|
|
|
|
|
|
|
|
|
|
|
|
@ -128,6 +129,8 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
sginBasicDto.setDisDeptName(resultSet.getString("出院科室"));
|
|
|
|
sginBasicDto.setDisDeptName(resultSet.getString("出院科室"));
|
|
|
|
sginBasicDto.setRevoveryState("已签收");
|
|
|
|
sginBasicDto.setRevoveryState("已签收");
|
|
|
|
sginBasicDto.setRevoveryName(userName);
|
|
|
|
sginBasicDto.setRevoveryName(userName);
|
|
|
|
|
|
|
|
sginBasicDto.setAge("年龄");
|
|
|
|
|
|
|
|
sginBasicDto.setIdCard("身份证号");
|
|
|
|
sginBasicDto.setRevoveryTime(new Timestamp(System.currentTimeMillis()));
|
|
|
|
sginBasicDto.setRevoveryTime(new Timestamp(System.currentTimeMillis()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 6. 关闭资源
|
|
|
|
// 6. 关闭资源
|
|
|
|
@ -150,6 +153,7 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return CommonResult.success("签收完成");
|
|
|
|
return CommonResult.success("签收完成");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @description: 获取当前用户名
|
|
|
|
* @description: 获取当前用户名
|
|
|
|
* @author linjj
|
|
|
|
* @author linjj
|
|
|
|
@ -219,7 +223,7 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
String username = jsUserName;
|
|
|
|
String username = jsUserName;
|
|
|
|
String password = jsPassword;
|
|
|
|
String password = jsPassword;
|
|
|
|
// 插入语句
|
|
|
|
// 插入语句
|
|
|
|
String insertQuery = "INSERT INTO lee_basic (patient_id, inpatient_no,admiss_times,name,admiss_date,dis_date) VALUES (replace(newid(), '-', ''),?, ?, ?, ?, ?);";
|
|
|
|
String insertQuery = "INSERT INTO lee_basic (patient_id, inpatient_no,admiss_times,name,admiss_date,dis_date,id_card,age) VALUES (replace(newid(), '-', ''),?, ?, ?, ?, ?,?,?);";
|
|
|
|
log.info("执行的SQL语句为: " + insertQuery);
|
|
|
|
log.info("执行的SQL语句为: " + insertQuery);
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 1. 加载SQL Server JDBC驱动
|
|
|
|
// 1. 加载SQL Server JDBC驱动
|
|
|
|
@ -237,6 +241,8 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
preparedStatement.setString(3, sginBasicDto.getName());
|
|
|
|
preparedStatement.setString(3, sginBasicDto.getName());
|
|
|
|
preparedStatement.setDate(4, new java.sql.Date(sginBasicDto.getAdmissDate().getTime()));
|
|
|
|
preparedStatement.setDate(4, new java.sql.Date(sginBasicDto.getAdmissDate().getTime()));
|
|
|
|
preparedStatement.setDate(5, new java.sql.Date(sginBasicDto.getDisDate().getTime()));
|
|
|
|
preparedStatement.setDate(5, new java.sql.Date(sginBasicDto.getDisDate().getTime()));
|
|
|
|
|
|
|
|
preparedStatement.setString(6, sginBasicDto.getIdCard());
|
|
|
|
|
|
|
|
preparedStatement.setString(7, sginBasicDto.getAge());
|
|
|
|
// 5. 执行插入操作
|
|
|
|
// 5. 执行插入操作
|
|
|
|
preparedStatement.executeUpdate();
|
|
|
|
preparedStatement.executeUpdate();
|
|
|
|
|
|
|
|
|
|
|
|
@ -285,4 +291,135 @@ public class RcvBasicServiceImpl implements RcvBasicService {
|
|
|
|
List<ExportBasic> pageBasics = basicMapper.pageExport(rcvPageRequest);
|
|
|
|
List<ExportBasic> pageBasics = basicMapper.pageExport(rcvPageRequest);
|
|
|
|
return pageBasics;
|
|
|
|
return pageBasics;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public List<EmrRateVo> ExportEmrRate(EmrRateRequest emrRateRequest) {
|
|
|
|
|
|
|
|
List<EmrRateVo> emrRateVos = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
//查询回收系统中归档率
|
|
|
|
|
|
|
|
List<EmrRateDetailVo> emrRateDetail = basicMapper.getEmrRateDetail(emrRateRequest);
|
|
|
|
|
|
|
|
//查询his视图中各个科室出院数量
|
|
|
|
|
|
|
|
List<HisRateVo> hisRateVo = getHisRateVo(emrRateRequest);
|
|
|
|
|
|
|
|
if (hisRateVo.isEmpty()||emrRateDetail.isEmpty()){
|
|
|
|
|
|
|
|
return emrRateVos;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 1. 把 hisRateVo 转成 Map<科室名, 出院人数>
|
|
|
|
|
|
|
|
Map<String, Integer> deptDischargeMap = hisRateVo.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.toMap(HisRateVo::getDisDeptName, HisRateVo::getDisCountNum));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//组织最终数据
|
|
|
|
|
|
|
|
emrRateVos = new ArrayList<>();
|
|
|
|
|
|
|
|
for (EmrRateDetailVo detail : emrRateDetail){
|
|
|
|
|
|
|
|
if (deptDischargeMap.get(detail.getDisDeptName())==null) {
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
EmrRateVo emrRateVo = new EmrRateVo();
|
|
|
|
|
|
|
|
//出院名称
|
|
|
|
|
|
|
|
emrRateVo.setDisDeptName(detail.getDisDeptName());
|
|
|
|
|
|
|
|
//出院人数
|
|
|
|
|
|
|
|
Integer outNum = deptDischargeMap.get(detail.getDisDeptName());
|
|
|
|
|
|
|
|
emrRateVo.setOutNum(outNum);
|
|
|
|
|
|
|
|
//组织病案签收情况
|
|
|
|
|
|
|
|
//签收总数
|
|
|
|
|
|
|
|
Integer signCountNum = detail.getSignCountNum();
|
|
|
|
|
|
|
|
//总签收率
|
|
|
|
|
|
|
|
emrRateVo.setSignStatus(new SignStatus(signCountNum,getRate(outNum,signCountNum)));
|
|
|
|
|
|
|
|
//组织2,3,5,7天内归档情况
|
|
|
|
|
|
|
|
DayRateDetailVo dayRateDetailVo = new DayRateDetailVo();
|
|
|
|
|
|
|
|
dayRateDetailVo.setDay2SignStatus(new TimeSlot(detail.getDay2(), getRate(outNum,detail.getDay2())));
|
|
|
|
|
|
|
|
dayRateDetailVo.setDay3SignStatus(new TimeSlot(detail.getDay3(), getRate(outNum,detail.getDay3())));
|
|
|
|
|
|
|
|
dayRateDetailVo.setDay5SignStatus(new TimeSlot(detail.getDay5(), getRate(outNum,detail.getDay5())));
|
|
|
|
|
|
|
|
dayRateDetailVo.setDay7SignStatus(new TimeSlot(detail.getDay7(), getRate(outNum,detail.getDay7())));
|
|
|
|
|
|
|
|
emrRateVo.setDayRateDetailVo(dayRateDetailVo);
|
|
|
|
|
|
|
|
emrRateVos.add(emrRateVo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
log.error("查询失败1: {}", e,e.getMessage());
|
|
|
|
|
|
|
|
return emrRateVos;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return emrRateVos;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String getRate(Integer outNum, Integer signCountNum) {
|
|
|
|
|
|
|
|
// 计算签收率(保留两位小数)
|
|
|
|
|
|
|
|
BigDecimal rate = new BigDecimal(signCountNum)
|
|
|
|
|
|
|
|
.divide(new BigDecimal(outNum), 4, RoundingMode.HALF_UP)
|
|
|
|
|
|
|
|
.multiply(BigDecimal.valueOf(100))
|
|
|
|
|
|
|
|
.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String signRate = rate.toPlainString() + "%";
|
|
|
|
|
|
|
|
return signRate;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @Author: linjj
|
|
|
|
|
|
|
|
* @Description: 查询his视图中各个科室出院数量
|
|
|
|
|
|
|
|
* @DateTime: 2025/8/5 17:17
|
|
|
|
|
|
|
|
* @Params: [emrRateRequest]
|
|
|
|
|
|
|
|
* @Return java.util.List<com.example.duplicate.controller.vo.HisRateVo>
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private List<HisRateVo> getHisRateVo(EmrRateRequest emrRateRequest) {
|
|
|
|
|
|
|
|
List<HisRateVo> hisRateVoList = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
hisRateVoList = new ArrayList<>();
|
|
|
|
|
|
|
|
// SQL Server连接信息
|
|
|
|
|
|
|
|
String url = lzUrl;
|
|
|
|
|
|
|
|
String username = lzUserName;
|
|
|
|
|
|
|
|
String password = lzPassword;
|
|
|
|
|
|
|
|
// 构建SQL查询语句
|
|
|
|
|
|
|
|
StringBuilder selectQuery = new StringBuilder();
|
|
|
|
|
|
|
|
selectQuery.append("SELECT 出院科室,COUNT(*) as 出院总数 ");
|
|
|
|
|
|
|
|
selectQuery.append("FROM dbo.V_sz_cybrxx ");
|
|
|
|
|
|
|
|
selectQuery.append("WHERE 1=1 ");
|
|
|
|
|
|
|
|
List<Object> parameters = new ArrayList<>();
|
|
|
|
|
|
|
|
// 添加出院科室条件
|
|
|
|
|
|
|
|
if (emrRateRequest.getDisDeptName() != null && !emrRateRequest.getDisDeptName().isEmpty()) {
|
|
|
|
|
|
|
|
String[] deptNames = emrRateRequest.getDisDeptName().split(",");
|
|
|
|
|
|
|
|
String inClause = String.join(",", Collections.nCopies(deptNames.length, "?"));
|
|
|
|
|
|
|
|
selectQuery.append(" AND 出院科室 IN (" + inClause + ")");
|
|
|
|
|
|
|
|
parameters.addAll(Arrays.asList(deptNames));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 添加时间范围条件
|
|
|
|
|
|
|
|
if (emrRateRequest.getStartTime() != null) {
|
|
|
|
|
|
|
|
selectQuery.append(" AND 出院日期 >= ?");
|
|
|
|
|
|
|
|
parameters.add(emrRateRequest.getStartTime());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (emrRateRequest.getEndTime() != null) {
|
|
|
|
|
|
|
|
selectQuery.append(" AND 出院日期 <= ?");
|
|
|
|
|
|
|
|
parameters.add(emrRateRequest.getEndTime());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//增加科室分组
|
|
|
|
|
|
|
|
selectQuery.append(" GROUP BY 出院科室");
|
|
|
|
|
|
|
|
// 原始 SQL 模板(带 ? 占位符)
|
|
|
|
|
|
|
|
String finalSql = selectQuery.toString();
|
|
|
|
|
|
|
|
// 逐个替换参数(注意类型处理)
|
|
|
|
|
|
|
|
for (int i = 0; i < parameters.size(); i++) {
|
|
|
|
|
|
|
|
Object param = parameters.get(i);
|
|
|
|
|
|
|
|
String value = param instanceof String ? "'" + param + "'" : param.toString();
|
|
|
|
|
|
|
|
finalSql = finalSql.replaceFirst("\\?", value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
log.info("最终SQL: " + finalSql);
|
|
|
|
|
|
|
|
try (Connection connection = DriverManager.getConnection(url, username, password);
|
|
|
|
|
|
|
|
PreparedStatement preparedStatement = connection.prepareStatement(selectQuery.toString())) {
|
|
|
|
|
|
|
|
// 设置查询参数
|
|
|
|
|
|
|
|
for (int i = 0; i < parameters.size(); i++) {
|
|
|
|
|
|
|
|
preparedStatement.setObject(i + 1, parameters.get(i));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ResultSet resultSet = preparedStatement.executeQuery();
|
|
|
|
|
|
|
|
// 处理查询结果
|
|
|
|
|
|
|
|
while (resultSet.next()) {
|
|
|
|
|
|
|
|
HisRateVo hisRateVo = new HisRateVo();
|
|
|
|
|
|
|
|
hisRateVo.setDisDeptName(resultSet.getString("出院科室"));
|
|
|
|
|
|
|
|
hisRateVo.setDisCountNum(resultSet.getInt("出院总数"));
|
|
|
|
|
|
|
|
hisRateVoList.add(hisRateVo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
log.error("his查询失败: {}", e,e.getMessage());
|
|
|
|
|
|
|
|
return hisRateVoList;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
log.error("his查询失败: {}", e,e.getMessage());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return hisRateVoList;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|