增加归档率导出

master
linjj 4 months ago
parent d7371ef834
commit 8cf8be59f7

@ -9,10 +9,10 @@
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.example</groupId> <groupId>com.example</groupId>
<artifactId>springbootDemo</artifactId> <artifactId>docus_recovery</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>springbootDemo</name> <name>docus_recovery</name>
<description>springbootDemo</description> <description>docus_recovery</description>
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<skipTests>true</skipTests> <skipTests>true</skipTests>

@ -1,8 +1,10 @@
package com.example.duplicate.controller; package com.example.duplicate.controller;
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.vo.EmrRateVo;
import com.example.duplicate.controller.vo.ExportBasic; import com.example.duplicate.controller.vo.ExportBasic;
import com.example.duplicate.controller.vo.PageBasic; import com.example.duplicate.controller.vo.PageBasic;
import com.example.duplicate.service.RcvBasicService; import com.example.duplicate.service.RcvBasicService;
@ -18,7 +20,6 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
@ -68,4 +69,12 @@ public class RcvBasicController {
} }
} }
@ApiOperation("归档率导出")
@PostMapping("/exportEmrRate")
public CommonResult<?> ExportEmrRate(@RequestBody EmrRateRequest emrRateRequest) {
List<EmrRateVo> emrRateVos = rcvBasicService.ExportEmrRate(emrRateRequest);
return CommonResult.success(emrRateVos);
}
} }

@ -0,0 +1,31 @@
package com.example.duplicate.controller.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName EmrRateRequest
* @Description
* @Author linjj
* @Date 2025/8/5 11:02
* @Version 1.0
*/
@Data
public class EmrRateRequest {
@ApiModelProperty("开始时间")
private String startTime;//开始时间
@ApiModelProperty("结束时间")
private String endTime;//结束时间
@ApiModelProperty("出院科室")
private String disDeptName;//出院科室
}

@ -49,6 +49,12 @@ public class SginBasicDto {
private String disDeptName; private String disDeptName;
@ApiModelProperty(value = "操作人") @ApiModelProperty(value = "操作人")
private String revoveryName; private String revoveryName;
@ApiModelProperty(value = "年龄")
private String age;
@ApiModelProperty(value = "身份证信息")
private String idCard;
} }

@ -0,0 +1,27 @@
package com.example.duplicate.controller.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName RateDetailVo
* @Description
* @Author linjj
* @Date 2025/8/5 17:04
* @Version 1.0
*/
@Data
public class DayRateDetailVo {
@ApiModelProperty(value = "2天内病案签收情况")
private TimeSlot day2SignStatus;
@ApiModelProperty(value = "3天内病案签收情况")
private TimeSlot day3SignStatus;
@ApiModelProperty(value = "5天内病案签收情况")
private TimeSlot day5SignStatus;
@ApiModelProperty(value = "7天内病案签收情况")
private TimeSlot day7SignStatus;
}

@ -0,0 +1,33 @@
package com.example.duplicate.controller.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName EmrRateDetailVo
* @Description
* @Author linjj
* @Date 2025/8/5 16:42
* @Version 1.0
*/
@Data
public class EmrRateDetailVo {
@ApiModelProperty(value = "科室名称")
private String disDeptName;
@ApiModelProperty(value = "签收总数")
private Integer signCountNum;
@ApiModelProperty(value = "2天出院数量")
private Integer day2;
@ApiModelProperty(value = "3天出院数量")
private Integer day3;
@ApiModelProperty(value = "5天出院数量")
private Integer day5;
@ApiModelProperty(value = "7天出院数量")
private Integer day7;
}

@ -0,0 +1,24 @@
package com.example.duplicate.controller.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName EmrRateVo
* @Description
* @Author linjj
* @Date 2025/8/5 11:49
* @Version 1.0
*/
@Data
public class EmrRateVo {
@ApiModelProperty(value = "科室名称")
private String disDeptName;
@ApiModelProperty(value = "出院总数")
private Integer outNum;
@ApiModelProperty(value = "病案签收情况")
private SignStatus signStatus;
@ApiModelProperty(value = "天数详情")
private DayRateDetailVo dayRateDetailVo;
}

@ -0,0 +1,21 @@
package com.example.duplicate.controller.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName HisRateVo
* @Description his
* @Author linjj
* @Date 2025/8/5 16:29
* @Version 1.0
*/
@Data
public class HisRateVo {
@ApiModelProperty(value = "科室名称")
private String disDeptName;
@ApiModelProperty(value = "出院总数")
private Integer disCountNum;
}

@ -0,0 +1,25 @@
package com.example.duplicate.controller.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName SignStatus
* @Description
* @Author linjj
* @Date 2025/8/5 11:54
* @Version 1.0
*/
@Data
public class SignStatus {
@ApiModelProperty(value = "签收份数")
private Integer signCount;
@ApiModelProperty(value = "签收率")
private String signRate;
public SignStatus(Integer signCount, String signRate) {
this.signCount = signCount;
this.signRate = signRate;
}
}

@ -0,0 +1,24 @@
package com.example.duplicate.controller.vo;
import lombok.Data;
/**
* @ClassName TimeSlot
* @Description
* @Author linjj
* @Date 2025/8/5 16:54
* @Version 1.0
*/
@Data
public class TimeSlot {
//总数
private int count;
//签收率
private String rate;
public TimeSlot(int count, String rate) {
this.count = count;
this.rate = rate;
}
}

@ -1,10 +1,8 @@
package com.example.duplicate.infrastructure.dao; package com.example.duplicate.infrastructure.dao;
import com.example.duplicate.controller.param.CallRequest; import com.example.duplicate.controller.param.*;
import com.example.duplicate.controller.param.PageRequest;
import com.example.duplicate.controller.param.RcvPageRequest;
import com.example.duplicate.controller.param.SginBasicDto;
import com.example.duplicate.controller.vo.DeptCodeAndName; import com.example.duplicate.controller.vo.DeptCodeAndName;
import com.example.duplicate.controller.vo.EmrRateDetailVo;
import com.example.duplicate.controller.vo.ExportBasic; import com.example.duplicate.controller.vo.ExportBasic;
import com.example.duplicate.controller.vo.PageBasic; import com.example.duplicate.controller.vo.PageBasic;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -36,4 +34,6 @@ public interface BasicMapper {
List<DeptCodeAndName>getDeptCodeAndName(); List<DeptCodeAndName>getDeptCodeAndName();
List<EmrRateDetailVo> getEmrRateDetail(EmrRateRequest emrRateRequest);
} }

@ -1,7 +1,9 @@
package com.example.duplicate.service; package com.example.duplicate.service;
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.vo.EmrRateVo;
import com.example.duplicate.controller.vo.ExportBasic; import com.example.duplicate.controller.vo.ExportBasic;
import com.example.duplicate.controller.vo.PageBasic; import com.example.duplicate.controller.vo.PageBasic;
import com.example.utils.CommonResult; import com.example.utils.CommonResult;
@ -27,4 +29,6 @@ public interface RcvBasicService {
CommonResult<?> UpdateSign(String patientId,String revoveryState); CommonResult<?> UpdateSign(String patientId,String revoveryState);
List<ExportBasic>pageExport(RcvPageRequest rcvPageRequest); List<ExportBasic>pageExport(RcvPageRequest rcvPageRequest);
List<EmrRateVo> ExportEmrRate(EmrRateRequest emrRateRequest);
} }

@ -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;
}
} }

@ -41,38 +41,6 @@ public class RcvCallServiceImpl implements RcvCallService {
@Override @Override
public List<DeptCodeAndName> deptName() { public List<DeptCodeAndName> deptName() {
// // SQL Server连接信息
// String url = lzUrl;
// String username = lzUserName;
// String password = lzPassword;
// try {
// List<String> deptNames=new ArrayList<>();
// // SQL语句根据patientId查询患者基础信息
// String selectQuery = "SELECT 出院科室 FROM dbo.V_sz_cybrxx where 出院科室 is not null AND 出院科室 !='' GROUP BY 出院科室";
// // 1. 加载SQL Server JDBC驱动
// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//
// // 2. 建立数据库连接
// Connection connection = DriverManager.getConnection(url, username, password);
//
// // 3. 创建Statement对象用于执行SQL语句
// Statement statement = connection.createStatement();
// // 4. 执行查询操作
// ResultSet resultSet = statement.executeQuery(selectQuery);
// // 5. 遍历查询结果并添加到deptNames列表中
// while (resultSet.next()) {
// String deptName = resultSet.getString("出院科室");
// deptNames.add(deptName);
// }
// // 6. 关闭数据库资源
// resultSet.close();
// statement.close();
// connection.close();
// return deptNames;
// } catch (Exception e) {
// log.error("查询科室失败: " + e, e.getMessage());
// return null;
// }
List<DeptCodeAndName> deptCodeAndName = basicMapper.getDeptCodeAndName(); List<DeptCodeAndName> deptCodeAndName = basicMapper.getDeptCodeAndName();
return deptCodeAndName; return deptCodeAndName;
} }

@ -81,6 +81,33 @@
<select id="getDeptCodeAndName" resultType="com.example.duplicate.controller.vo.DeptCodeAndName"> <select id="getDeptCodeAndName" resultType="com.example.duplicate.controller.vo.DeptCodeAndName">
select * from deptcode select * from deptcode
</select> </select>
<select id="getEmrRateDetail" resultType="com.example.duplicate.controller.vo.EmrRateDetailVo">
SELECT
disDeptName,
COUNT( patientId ) AS signCountNum,
SUM( CASE WHEN DATEDIFF( revoveryTime, disDate ) &lt;= 2 THEN 1 ELSE 0 END ) AS day2,
SUM( CASE WHEN DATEDIFF( revoveryTime, disDate ) &lt;= 3 THEN 1 ELSE 0 END ) AS day3,
SUM( CASE WHEN DATEDIFF( revoveryTime, disDate ) &lt;= 5 THEN 1 ELSE 0 END ) AS day5,
SUM( CASE WHEN DATEDIFF( revoveryTime, disDate ) &lt;= 7 THEN 1 ELSE 0 END ) AS day7
FROM
basic
<where>
revoveryState='已签收' AND disDeptName IS NOT NULL
<if test="startTime != null and startTime != ''">
AND disDate >= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND disDate &lt;= #{endTime}
</if>
<if test="disDeptName != null and disDeptName != ''">
AND disDeptName IN
<foreach item="dept" index="index" collection="disDeptName.split(',')" open="(" separator="," close=")">
#{dept}
</foreach>
</if>
</where>
GROUP BY disDeptName
</select>
</mapper> </mapper>
Loading…
Cancel
Save