From 3fcc4c1ee7de96df1a852569645c65fbf3c99865 Mon Sep 17 00:00:00 2001 From: chenqi Date: Thu, 18 Jun 2026 12:36:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(lab):=20T7.2=20=E5=AE=A4=E9=97=B4=E8=B4=A8?= =?UTF-8?q?=E8=AF=84+=E6=8A=A5=E5=91=8A=E6=89=93=E5=8D=B0=20-=20AppService?= =?UTF-8?q?/Controller/=E5=89=8D=E7=AB=AF=E6=8A=A5=E5=91=8A=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/lab/appservice/ILabEqaAppService.java | 13 ++ .../appservice/impl/LabEqaAppServiceImpl.java | 67 ++++++ .../web/lab/controller/LabEqaController.java | 40 ++++ healthlink-his-ui/src/api/lab/labEqa.js | 24 ++ healthlink-his-ui/src/views/lab/LabEqa.vue | 206 ++++++++++++++++++ 5 files changed, 350 insertions(+) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/ILabEqaAppService.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/impl/LabEqaAppServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/controller/LabEqaController.java create mode 100644 healthlink-his-ui/src/api/lab/labEqa.js create mode 100644 healthlink-his-ui/src/views/lab/LabEqa.vue diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/ILabEqaAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/ILabEqaAppService.java new file mode 100644 index 000000000..e3f64b5de --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/ILabEqaAppService.java @@ -0,0 +1,13 @@ +package com.healthlink.his.web.lab.appservice; + +import com.core.common.core.domain.R; +import com.healthlink.his.lab.domain.LabExternalEqa; + +public interface ILabEqaAppService { + + R recordEqa(LabExternalEqa eqa); + + R getEqaResults(String assessmentName, Integer pageNo, Integer pageSize); + + R getEqaStats(); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/impl/LabEqaAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/impl/LabEqaAppServiceImpl.java new file mode 100644 index 000000000..2cb5749bc --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/appservice/impl/LabEqaAppServiceImpl.java @@ -0,0 +1,67 @@ +package com.healthlink.his.web.lab.appservice.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.core.common.core.domain.R; +import com.healthlink.his.lab.domain.LabExternalEqa; +import com.healthlink.his.lab.service.ILabExternalEqaService; +import com.healthlink.his.web.lab.appservice.ILabEqaAppService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class LabEqaAppServiceImpl implements ILabEqaAppService { + + @Resource + private ILabExternalEqaService externalEqaService; + + @Override + public R recordEqa(LabExternalEqa eqa) { + if (eqa.getTargetValue() != null && eqa.getActualValue() != null) { + try { + BigDecimal target = new BigDecimal(eqa.getTargetValue()); + BigDecimal actual = new BigDecimal(eqa.getActualValue()); + if (target.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal deviation = actual.subtract(target).abs() + .divide(target, 4, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")); + eqa.setDeviationRate(deviation); + eqa.setResult(deviation.compareTo(new BigDecimal("10")) <= 0 ? "合格" : "不合格"); + } + } catch (NumberFormatException e) { + log.warn("EQA数值解析失败: target={}, actual={}", eqa.getTargetValue(), eqa.getActualValue()); + } + } + externalEqaService.save(eqa); + return R.ok(eqa); + } + + @Override + public R getEqaResults(String assessmentName, Integer pageNo, Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.like(StringUtils.hasText(assessmentName), LabExternalEqa::getAssessmentName, assessmentName) + .orderByDesc(LabExternalEqa::getCreateTime); + return R.ok(externalEqaService.page(new Page<>(pageNo, pageSize), w)); + } + + @Override + public R getEqaStats() { + Map stats = new HashMap<>(); + stats.put("total", externalEqaService.count()); + LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); + wq.eq(LabExternalEqa::getResult, "合格"); + stats.put("qualified", externalEqaService.count(wq)); + LambdaQueryWrapper wf = new LambdaQueryWrapper<>(); + wf.eq(LabExternalEqa::getResult, "不合格"); + stats.put("unqualified", externalEqaService.count(wf)); + return R.ok(stats); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/controller/LabEqaController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/controller/LabEqaController.java new file mode 100644 index 000000000..3445ff701 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/lab/controller/LabEqaController.java @@ -0,0 +1,40 @@ +package com.healthlink.his.web.lab.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.lab.domain.LabExternalEqa; +import com.healthlink.his.web.lab.appservice.ILabEqaAppService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; + +@RestController +@RequestMapping("/lab/eqa") +@Slf4j +public class LabEqaController { + + @Resource + private ILabEqaAppService labEqaAppService; + + @PostMapping("/record") + @PreAuthorize("hasPermi('infection:lab:edit')") + public R recordEqa(@RequestBody LabExternalEqa eqa) { + return labEqaAppService.recordEqa(eqa); + } + + @GetMapping("/results") + @PreAuthorize("hasPermi('infection:lab:list')") + public R getEqaResults( + @RequestParam(value = "assessmentName", required = false) String assessmentName, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + return labEqaAppService.getEqaResults(assessmentName, pageNo, pageSize); + } + + @GetMapping("/stats") + @PreAuthorize("hasPermi('infection:lab:list')") + public R getEqaStats() { + return labEqaAppService.getEqaStats(); + } +} diff --git a/healthlink-his-ui/src/api/lab/labEqa.js b/healthlink-his-ui/src/api/lab/labEqa.js new file mode 100644 index 000000000..10ee781d8 --- /dev/null +++ b/healthlink-his-ui/src/api/lab/labEqa.js @@ -0,0 +1,24 @@ +import request from '@/utils/request'; + +export function recordEqa(data) { + return request({ + url: '/lab/eqa/record', + method: 'post', + data: data, + }); +} + +export function getEqaResults(query) { + return request({ + url: '/lab/eqa/results', + method: 'get', + params: query, + }); +} + +export function getEqaStats() { + return request({ + url: '/lab/eqa/stats', + method: 'get', + }); +} diff --git a/healthlink-his-ui/src/views/lab/LabEqa.vue b/healthlink-his-ui/src/views/lab/LabEqa.vue new file mode 100644 index 000000000..6058785fc --- /dev/null +++ b/healthlink-his-ui/src/views/lab/LabEqa.vue @@ -0,0 +1,206 @@ + + +