diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/IOutpatientRegistrationAppService.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/IOutpatientRegistrationAppService.java index 2f79e2a89..8b5de03b9 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/IOutpatientRegistrationAppService.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/IOutpatientRegistrationAppService.java @@ -48,6 +48,11 @@ public interface IOutpatientRegistrationAppService { IPage getPractitionerMetadataByLocationId(Long orgId, String searchKey, Integer pageNo, Integer pageSize); + /** + * 查询全院医生(不限科室),按角色过滤 + */ + IPage getAllDoctors(String searchKey, Integer pageNo, Integer pageSize); + /** * 根据机构id筛选服务项目 * diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java index c92887ae4..a707111e6 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java @@ -243,6 +243,22 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra return practitionerMetadataPage; } + /** + * 查询全院医生(不限科室),按角色过滤 + */ + @Override + public IPage getAllDoctors(String searchKey, Integer pageNo, Integer pageSize) { + QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(null, searchKey, + new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null); + IPage page = + outpatientRegistrationAppMapper.getAllDoctorPage(new Page<>(pageNo, pageSize), + PractitionerRoles.DOCTOR.getCode(), queryWrapper); + page.getRecords().forEach(e -> { + e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum())); + }); + return page; + } + /** * 根据机构id筛选服务项目 * diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/controller/OutpatientRegistrationController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/controller/OutpatientRegistrationController.java index 7446fe099..43fee617d 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/controller/OutpatientRegistrationController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/controller/OutpatientRegistrationController.java @@ -87,6 +87,17 @@ public class OutpatientRegistrationController { iOutpatientRegistrationAppService.getPractitionerMetadataByLocationId(orgId, searchKey, pageNo, pageSize)); } + /** + * 查询全院医生(不限科室),用于手术申请等需跨科室选择医生的场景 + */ + @GetMapping(value = "/all-doctors") + public R getAllDoctors( + @RequestParam(value = "searchKey", defaultValue = "") String searchKey, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + return R.ok(iOutpatientRegistrationAppService.getAllDoctors(searchKey, pageNo, pageSize)); + } + /** * 根据机构id筛选服务项目 */ diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/mapper/OutpatientRegistrationAppMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/mapper/OutpatientRegistrationAppMapper.java index 7d3352737..7f4d23b74 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/mapper/OutpatientRegistrationAppMapper.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/mapper/OutpatientRegistrationAppMapper.java @@ -24,6 +24,13 @@ public interface OutpatientRegistrationAppMapper { @Param("orgId") Long orgId, @Param("RoleCode") String RoleCode, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + /** + * 查询全院医生(不限科室),按角色过滤 + */ + IPage getAllDoctorPage(@Param("page") Page page, + @Param("RoleCode") String RoleCode, + @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + /** * 根据病人id和科室id查询当日挂号次数 */ diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java index 36a7b79b7..9e8b35173 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java @@ -39,6 +39,16 @@ public class HomeStatisticsDto { * 相对前日变化百分比 */ private Double revenueTrend; + + /** + * 今日收入金额(数值,单位:元) + */ + private java.math.BigDecimal todayRevenueAmount; + + /** + * 昨日收入金额(数值,单位:元) + */ + private java.math.BigDecimal yesterdayRevenueAmount; /** * 今日预约数量 @@ -69,4 +79,19 @@ public class HomeStatisticsDto { * 待写病历数量 */ private Integer pendingEmr; -} + + /** + * 今日处方数量 + */ + private Integer todayPrescriptions; + + /** + * 昨日处方数量 + */ + private Integer yesterdayPrescriptions; + + /** + * 处方相对前日变化百分比 + */ + private Double prescriptionTrend; +} \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java index c46a6c878..acc67f090 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java @@ -13,7 +13,16 @@ import com.openhis.administration.service.IPatientService; import com.openhis.administration.service.IPractitionerService; import com.openhis.common.enums.ParticipantType; import com.openhis.web.dto.HomeStatisticsDto; +import com.openhis.financial.domain.PaymentReconciliation; +import com.openhis.financial.service.IPaymentReconciliationService; +import com.openhis.medication.domain.MedicationRequest; +import com.openhis.medication.service.IMedicationRequestService; +import com.openhis.common.enums.PaymentStatus; 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -46,6 +55,12 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService { @Autowired private IPatientService patientService; + @Autowired + private IPaymentReconciliationService paymentReconciliationService; + + @Autowired + private IMedicationRequestService medicationRequestService; + /** * 获取首页统计数据 * @@ -105,18 +120,108 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService { double patientTrend = calculateTrend(totalPatients, yesterdayPatients); statistics.setPatientTrend(patientTrend); - // 今日收入和预约等其他统计(暂时设为0,后续从相应表查询) - statistics.setTodayRevenue("¥ 0"); - statistics.setYesterdayRevenue("¥ 0"); - statistics.setRevenueTrend(0.0); + // 查询今日收入 + BigDecimal todayRevenue = queryRevenueByDate(new Date()); + BigDecimal yesterdayRevenue = queryRevenueByDate(getYesterday()); + 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.setYesterdayAppointments(0); statistics.setAppointmentTrend(0.0); statistics.setPendingApprovals(0); + + // 查询今日处方数量 + int todayPrescriptions = queryPrescriptionCountByDate(new Date(), practitioner); + int yesterdayPrescriptions = queryPrescriptionCountByDate(getYesterday(), practitioner); + statistics.setTodayPrescriptions(todayPrescriptions); + statistics.setYesterdayPrescriptions(yesterdayPrescriptions); + statistics.setPrescriptionTrend(calculateTrend(todayPrescriptions, yesterdayPrescriptions)); + return statistics; } + /** + * 查询指定日期的处方数量 + * + * @param date 日期 + * @param practitioner 当前医生(null 则查全部) + * @return 处方数量 + */ + private int queryPrescriptionCountByDate(Date date, Practitioner practitioner) { + 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 query = new LambdaQueryWrapper<>(); + query.ge(MedicationRequest::getCreateTime, dayStart) + .lt(MedicationRequest::getCreateTime, dayEnd) + .eq(MedicationRequest::getDeleteFlag, "0"); + + // 如果是医生角色,只统计自己开的处方 + if (practitioner != null) { + query.eq(MedicationRequest::getPractitionerId, practitioner.getId()); + } + + return (int) medicationRequestService.count(query); + } + + /** + * 查询指定日期的收款总额(状态为支付成功且未全部退款) + * + * @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 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 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(); + } + /** * 计算相对前日的百分比变化 * diff --git a/openhis-server-new/openhis-application/src/main/resources/application-dev.yml.bak b/openhis-server-new/openhis-application/src/main/resources/application-dev.yml.bak new file mode 100644 index 000000000..bf984f0d4 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/application-dev.yml.bak @@ -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 \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml index 383d78c02..772db5d2c 100755 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml @@ -31,6 +31,34 @@ ${ew.customSqlSegment} + + +