feat(home): 优化首页界面并实现收入统计功能
- 添加欢迎区域背景动效和视觉优化 - 实现今日收入统计及同比数据显示 - 重构待办事项和日程的双栏布局 - 修复路由权限检查并添加无权限提示 - 更新快捷功能入口和统计卡片样式 - 集成财务模块收入查询接口 - 添加数据库配置备份文件
This commit is contained in:
@@ -39,6 +39,16 @@ public class HomeStatisticsDto {
|
|||||||
* 相对前日变化百分比
|
* 相对前日变化百分比
|
||||||
*/
|
*/
|
||||||
private Double revenueTrend;
|
private Double revenueTrend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日收入金额(数值,单位:元)
|
||||||
|
*/
|
||||||
|
private java.math.BigDecimal todayRevenueAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 昨日收入金额(数值,单位:元)
|
||||||
|
*/
|
||||||
|
private java.math.BigDecimal yesterdayRevenueAmount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 今日预约数量
|
* 今日预约数量
|
||||||
|
|||||||
@@ -13,7 +13,14 @@ import com.openhis.administration.service.IPatientService;
|
|||||||
import com.openhis.administration.service.IPractitionerService;
|
import com.openhis.administration.service.IPractitionerService;
|
||||||
import com.openhis.common.enums.ParticipantType;
|
import com.openhis.common.enums.ParticipantType;
|
||||||
import com.openhis.web.dto.HomeStatisticsDto;
|
import com.openhis.web.dto.HomeStatisticsDto;
|
||||||
|
import com.openhis.financial.domain.PaymentReconciliation;
|
||||||
|
import com.openhis.financial.service.IPaymentReconciliationService;
|
||||||
|
import com.openhis.common.enums.PaymentStatus;
|
||||||
import com.openhis.web.service.IHomeStatisticsService;
|
import com.openhis.web.service.IHomeStatisticsService;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
import com.openhis.web.patientmanage.mapper.PatientManageMapper;
|
import com.openhis.web.patientmanage.mapper.PatientManageMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -46,6 +53,9 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IPatientService patientService;
|
private IPatientService patientService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPaymentReconciliationService paymentReconciliationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取首页统计数据
|
* 获取首页统计数据
|
||||||
*
|
*
|
||||||
@@ -105,10 +115,17 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService {
|
|||||||
double patientTrend = calculateTrend(totalPatients, yesterdayPatients);
|
double patientTrend = calculateTrend(totalPatients, yesterdayPatients);
|
||||||
statistics.setPatientTrend(patientTrend);
|
statistics.setPatientTrend(patientTrend);
|
||||||
|
|
||||||
// 今日收入和预约等其他统计(暂时设为0,后续从相应表查询)
|
// 查询今日收入
|
||||||
statistics.setTodayRevenue("¥ 0");
|
BigDecimal todayRevenue = queryRevenueByDate(new Date());
|
||||||
statistics.setYesterdayRevenue("¥ 0");
|
BigDecimal yesterdayRevenue = queryRevenueByDate(getYesterday());
|
||||||
statistics.setRevenueTrend(0.0);
|
java.text.DecimalFormat df = new java.text.DecimalFormat("#,##0.00");
|
||||||
|
statistics.setTodayRevenue("¥ " + df.format(todayRevenue));
|
||||||
|
statistics.setYesterdayRevenue("¥ " + df.format(yesterdayRevenue));
|
||||||
|
statistics.setTodayRevenueAmount(todayRevenue);
|
||||||
|
statistics.setYesterdayRevenueAmount(yesterdayRevenue);
|
||||||
|
statistics.setRevenueTrend(calculateTrend(todayRevenue.doubleValue(), yesterdayRevenue.doubleValue()));
|
||||||
|
|
||||||
|
// 今日预约和待审核(暂时设为0,后续实现)
|
||||||
statistics.setTodayAppointments(0);
|
statistics.setTodayAppointments(0);
|
||||||
statistics.setYesterdayAppointments(0);
|
statistics.setYesterdayAppointments(0);
|
||||||
statistics.setAppointmentTrend(0.0);
|
statistics.setAppointmentTrend(0.0);
|
||||||
@@ -117,6 +134,49 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService {
|
|||||||
return statistics;
|
return statistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定日期的收款总额(状态为支付成功且未全部退款)
|
||||||
|
*
|
||||||
|
* @param date 日期
|
||||||
|
* @return 收款总额
|
||||||
|
*/
|
||||||
|
private BigDecimal queryRevenueByDate(Date date) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(date);
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
cal.set(Calendar.MINUTE, 0);
|
||||||
|
cal.set(Calendar.SECOND, 0);
|
||||||
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
|
Date dayStart = cal.getTime();
|
||||||
|
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, 1);
|
||||||
|
Date dayEnd = cal.getTime();
|
||||||
|
|
||||||
|
LambdaQueryWrapper<PaymentReconciliation> query = new LambdaQueryWrapper<>();
|
||||||
|
query.ge(PaymentReconciliation::getBillDate, dayStart)
|
||||||
|
.lt(PaymentReconciliation::getBillDate, dayEnd)
|
||||||
|
.eq(PaymentReconciliation::getStatusEnum, PaymentStatus.SUCCESS.getValue())
|
||||||
|
.eq(PaymentReconciliation::getDeleteFlag, "0")
|
||||||
|
.select(PaymentReconciliation::getDisplayAmount);
|
||||||
|
|
||||||
|
java.util.List<PaymentReconciliation> list = paymentReconciliationService.list(query);
|
||||||
|
if (list == null || list.isEmpty()) {
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
return list.stream()
|
||||||
|
.map(p -> p.getDisplayAmount() != null ? p.getDisplayAmount() : BigDecimal.ZERO)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取昨天的日期
|
||||||
|
*/
|
||||||
|
private Date getYesterday() {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
return cal.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算相对前日的百分比变化
|
* 计算相对前日的百分比变化
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# 数据源配置
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
|
driverClassName: org.postgresql.Driver
|
||||||
|
druid:
|
||||||
|
# 主库数据源
|
||||||
|
master:
|
||||||
|
url: jdbc:postgresql://192.168.110.252:15432/postgresql?currentSchema=hisdev&characterEncoding=UTF-8&client_encoding=UTF-8
|
||||||
|
username: postgresql
|
||||||
|
password: Jchl1528 # 请替换为实际的数据库密码
|
||||||
|
# 从库数据源
|
||||||
|
slave:
|
||||||
|
# 从数据源开关/默认关闭
|
||||||
|
enabled: false
|
||||||
|
url:
|
||||||
|
username:
|
||||||
|
password:
|
||||||
|
# 初始连接数
|
||||||
|
initialSize: 5
|
||||||
|
# 最小连接池数量
|
||||||
|
minIdle: 10
|
||||||
|
# 最大连接池数量
|
||||||
|
maxActive: 20
|
||||||
|
# 配置获取连接等待超时的时间
|
||||||
|
maxWait: 60000
|
||||||
|
# 配置连接超时时间
|
||||||
|
connectTimeout: 30000
|
||||||
|
# 配置网络超时时间
|
||||||
|
socketTimeout: 60000
|
||||||
|
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||||
|
timeBetweenEvictionRunsMillis: 60000
|
||||||
|
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
||||||
|
minEvictableIdleTimeMillis: 300000
|
||||||
|
# 配置一个连接在池中最大生存的时间,单位是毫秒
|
||||||
|
maxEvictableIdleTimeMillis: 900000
|
||||||
|
# 配置检测连接是否有效
|
||||||
|
validationQuery: SELECT 1
|
||||||
|
testWhileIdle: true
|
||||||
|
testOnBorrow: true # 改为true以确保连接有效
|
||||||
|
testOnReturn: false
|
||||||
|
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
|
||||||
|
filters: stat,wall,slf4j
|
||||||
|
webStatFilter:
|
||||||
|
enabled: true
|
||||||
|
statViewServlet:
|
||||||
|
enabled: true
|
||||||
|
# 设置白名单,不填则允许所有访问
|
||||||
|
allow:
|
||||||
|
url-pattern: /druid/*
|
||||||
|
# 控制台管理用户名和密码
|
||||||
|
login-username: openhis
|
||||||
|
login-password: 123456
|
||||||
|
filter:
|
||||||
|
stat:
|
||||||
|
enabled: true
|
||||||
|
# 慢SQL记录
|
||||||
|
log-slow-sql: true
|
||||||
|
slow-sql-millis: 1000
|
||||||
|
merge-sql: true
|
||||||
|
wall:
|
||||||
|
config:
|
||||||
|
multi-statement-allow: true
|
||||||
|
# redis 配置
|
||||||
|
redis:
|
||||||
|
# 地址
|
||||||
|
host: 192.168.110.252
|
||||||
|
# 端口,默认为6379
|
||||||
|
port: 6379
|
||||||
|
# 数据库索引
|
||||||
|
database: 1
|
||||||
|
# 密码
|
||||||
|
password: Jchl1528
|
||||||
|
# 连接超时时间
|
||||||
|
timeout: 10s
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
# 连接池中的最小空闲连接
|
||||||
|
min-idle: 0
|
||||||
|
# 连接池中的最大空闲连接
|
||||||
|
max-idle: 8
|
||||||
|
# 连接池的最大数据库连接数
|
||||||
|
max-active: 8
|
||||||
|
# #连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||||
|
max-wait: -1ms
|
||||||
|
|
||||||
|
# 服务器配置
|
||||||
|
server:
|
||||||
|
# 服务器的HTTP端口,默认为18080
|
||||||
|
port: 18080
|
||||||
|
servlet:
|
||||||
|
# 应用的访问路径
|
||||||
|
context-path: /openhis
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user