feat(check): T7.3 DICOM image capture + structured report - add AppService layer, align routes to /check/image/* and /check/report/*, add @PreAuthorize infection:check:edit/list

This commit is contained in:
2026-06-18 12:38:20 +08:00
parent 3fcc4c1ee7
commit e1e424b0d4
4 changed files with 185 additions and 88 deletions

View File

@@ -0,0 +1,29 @@
package com.healthlink.his.web.check.appservice;
import com.core.common.core.domain.R;
import com.healthlink.his.check.domain.DicomPrintRecord;
import com.healthlink.his.check.domain.RadiologyImage;
import com.healthlink.his.check.domain.RadiologyImageReport;
import java.util.List;
public interface IRadiologyImageAppService {
R<?> saveImage(RadiologyImage image);
R<?> getImagesByApplyId(Long applyId);
R<?> getImagesByExamId(Long examId);
R<?> saveReport(RadiologyImageReport report);
R<?> getReportPage(String status, String patientName, Integer pageNo, Integer pageSize);
R<?> submitReport(Long id);
R<?> verifyReport(Long id, String doctor);
R<?> savePrintRecord(DicomPrintRecord record);
R<?> getPrintPage(Integer pageNo, Integer pageSize);
}

View File

@@ -0,0 +1,119 @@
package com.healthlink.his.web.check.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.check.domain.DicomPrintRecord;
import com.healthlink.his.check.domain.RadiologyImage;
import com.healthlink.his.check.domain.RadiologyImageReport;
import com.healthlink.his.check.service.IDicomPrintRecordService;
import com.healthlink.his.check.service.IRadiologyImageReportService;
import com.healthlink.his.check.service.IRadiologyImageService;
import com.healthlink.his.web.check.appservice.IRadiologyImageAppService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.Date;
@Service
@Slf4j
@AllArgsConstructor
public class RadiologyImageAppServiceImpl implements IRadiologyImageAppService {
private final IRadiologyImageService imageService;
private final IRadiologyImageReportService reportService;
private final IDicomPrintRecordService printService;
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> saveImage(RadiologyImage image) {
image.setCreateTime(new Date());
imageService.save(image);
return R.ok(image);
}
@Override
public R<?> getImagesByApplyId(Long applyId) {
LambdaQueryWrapper<RadiologyImage> w = new LambdaQueryWrapper<>();
w.eq(RadiologyImage::getApplyId, applyId)
.orderByAsc(RadiologyImage::getInstanceNumber);
return R.ok(imageService.list(w));
}
@Override
public R<?> getImagesByExamId(Long examId) {
LambdaQueryWrapper<RadiologyImage> w = new LambdaQueryWrapper<>();
w.eq(RadiologyImage::getApplyId, examId)
.orderByAsc(RadiologyImage::getInstanceNumber);
return R.ok(imageService.list(w));
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> saveReport(RadiologyImageReport report) {
if (report.getId() == null) {
report.setStatus("DRAFT");
report.setCreateTime(new Date());
reportService.save(report);
} else {
report.setUpdateTime(new Date());
reportService.updateById(report);
}
return R.ok(report);
}
@Override
public R<?> getReportPage(String status, String patientName, Integer pageNo, Integer pageSize) {
LambdaQueryWrapper<RadiologyImageReport> w = new LambdaQueryWrapper<>();
w.eq(StringUtils.hasText(status), RadiologyImageReport::getStatus, status)
.like(StringUtils.hasText(patientName), RadiologyImageReport::getPatientName, patientName)
.orderByDesc(RadiologyImageReport::getCreateTime);
return R.ok(reportService.page(new Page<>(pageNo, pageSize), w));
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> submitReport(Long id) {
RadiologyImageReport r = reportService.getById(id);
if (r == null) {
return R.fail("报告不存在");
}
r.setStatus("REPORTED");
r.setReportTime(new Date());
reportService.updateById(r);
return R.ok();
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> verifyReport(Long id, String doctor) {
RadiologyImageReport r = reportService.getById(id);
if (r == null) {
return R.fail("报告不存在");
}
r.setStatus("VERIFIED");
r.setVerifyDoctor(doctor);
r.setVerifyTime(new Date());
reportService.updateById(r);
return R.ok();
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> savePrintRecord(DicomPrintRecord record) {
record.setPrintTime(new Date());
record.setCreateTime(new Date());
printService.save(record);
return R.ok(record);
}
@Override
public R<?> getPrintPage(Integer pageNo, Integer pageSize) {
LambdaQueryWrapper<DicomPrintRecord> w = new LambdaQueryWrapper<>();
w.orderByDesc(DicomPrintRecord::getPrintTime);
return R.ok(printService.page(new Page<>(pageNo, pageSize), w));
}
}

View File

@@ -1,132 +1,81 @@
package com.healthlink.his.web.check.controller;
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.check.domain.*;
import com.healthlink.his.check.service.*;
import com.healthlink.his.check.domain.DicomPrintRecord;
import com.healthlink.his.check.domain.RadiologyImage;
import com.healthlink.his.check.domain.RadiologyImageReport;
import com.healthlink.his.web.check.appservice.IRadiologyImageAppService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
@RestController
@RequestMapping("/radiology-image")
@RequestMapping("/check")
@Slf4j
@AllArgsConstructor
public class RadiologyImageController {
private final IRadiologyImageService imageService;
private final IRadiologyImageReportService reportService;
private final IDicomPrintRecordService printService;
private final IRadiologyImageAppService radiologyImageAppService;
// ==================== 图像管理 ====================
/** 图像列表 */
@GetMapping("/list")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:list')")
public R<?> getImageList(@RequestParam("applyId") Long applyId) {
LambdaQueryWrapper<RadiologyImage> w = new LambdaQueryWrapper<>();
w.eq(RadiologyImage::getApplyId, applyId)
.orderByAsc(RadiologyImage::getInstanceNumber);
return R.ok(imageService.list(w));
@PostMapping("/image/save")
@PreAuthorize("@ss.hasPermi('infection:check:edit')")
public R<?> saveImage(@RequestBody RadiologyImage image) {
return radiologyImageAppService.saveImage(image);
}
/** 上传影像图像 */
@PostMapping("/upload")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:add')")
@Transactional(rollbackFor = Exception.class)
public R<?> uploadImage(@RequestBody RadiologyImage img) {
img.setCreateTime(new Date());
imageService.save(img);
return R.ok(img);
@GetMapping("/image/list/{examId}")
@PreAuthorize("@ss.hasPermi('infection:check:list')")
public R<?> getImageList(@PathVariable Long examId) {
return radiologyImageAppService.getImagesByExamId(examId);
}
// ==================== 图文报告 ====================
// ==================== 结构化报告 ====================
@PostMapping("/report/save")
@PreAuthorize("@ss.hasPermi('infection:check:edit')")
public R<?> saveReport(@RequestBody RadiologyImageReport report) {
return radiologyImageAppService.saveReport(report);
}
/** 报告分页查询 */
@GetMapping("/report/page")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:report:list')")
@PreAuthorize("@ss.hasPermi('infection:check:list')")
public R<?> getReportPage(
@RequestParam(value = "status", required = false) String status,
@RequestParam(value = "patientName", required = false) String patientName,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) {
LambdaQueryWrapper<RadiologyImageReport> w = new LambdaQueryWrapper<>();
w.eq(StringUtils.hasText(status), RadiologyImageReport::getStatus, status)
.like(StringUtils.hasText(patientName), RadiologyImageReport::getPatientName, patientName)
.orderByDesc(RadiologyImageReport::getCreateTime);
return R.ok(reportService.page(new Page<>(pageNo, pageSize), w));
return radiologyImageAppService.getReportPage(status, patientName, pageNo, pageSize);
}
/** 新建报告(草稿) */
@PostMapping("/report/add")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:report:add')")
@Transactional(rollbackFor = Exception.class)
public R<?> addReport(@RequestBody RadiologyImageReport r) {
r.setStatus("DRAFT");
r.setCreateTime(new Date());
reportService.save(r);
return R.ok(r);
}
/** 提交报告 */
@PutMapping("/report/submit/{id}")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:report:edit')")
@Transactional(rollbackFor = Exception.class)
@PreAuthorize("@ss.hasPermi('infection:check:edit')")
public R<?> submitReport(@PathVariable Long id) {
RadiologyImageReport r = reportService.getById(id);
if (r == null) {
return R.fail("报告不存在");
}
r.setStatus("REPORTED");
r.setReportTime(new Date());
reportService.updateById(r);
return R.ok();
return radiologyImageAppService.submitReport(id);
}
/** 审核报告 */
@PutMapping("/report/verify/{id}")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:report:edit')")
@Transactional(rollbackFor = Exception.class)
@PreAuthorize("@ss.hasPermi('infection:check:edit')")
public R<?> verifyReport(@PathVariable Long id,
@RequestParam("doctor") String doctor) {
RadiologyImageReport r = reportService.getById(id);
if (r == null) {
return R.fail("报告不存在");
}
r.setStatus("VERIFIED");
r.setVerifyDoctor(doctor);
r.setVerifyTime(new Date());
reportService.updateById(r);
return R.ok();
return radiologyImageAppService.verifyReport(id, doctor);
}
// ==================== DICOM打印 ====================
/** DICOM打印记录 */
@PostMapping("/print")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:print:add')")
@Transactional(rollbackFor = Exception.class)
@PreAuthorize("@ss.hasPermi('infection:check:edit')")
public R<?> printDicom(@RequestBody DicomPrintRecord p) {
p.setPrintTime(new Date());
p.setCreateTime(new Date());
printService.save(p);
return R.ok(p);
return radiologyImageAppService.savePrintRecord(p);
}
/** 打印记录分页 */
@GetMapping("/print/page")
@PreAuthorize("@ss.hasPermi('check:radiologyImage:print:list')")
@PreAuthorize("@ss.hasPermi('infection:check:list')")
public R<?> getPrintPage(
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) {
LambdaQueryWrapper<DicomPrintRecord> w = new LambdaQueryWrapper<>();
w.orderByDesc(DicomPrintRecord::getPrintTime);
return R.ok(printService.page(new Page<>(pageNo, pageSize), w));
return radiologyImageAppService.getPrintPage(pageNo, pageSize);
}
}

View File

@@ -1,7 +1,7 @@
import request from '@/utils/request'
export function getReportPage(p){return request({url:'/radiology-image/report/page',method:'get',params:p})}
export function addReport(d){return request({url:'/radiology-image/report/add',method:'post',data:d})}
export function submitReport(id){return request({url:'/radiology-image/report/submit/'+id,method:'put'})}
export function verifyReport(id,doctor){return request({url:'/radiology-image/report/verify/'+id,method:'put',params:{doctor}})}
export function getImageList(p){return request({url:'/radiology-image/list',method:'get',params:p})}
export function printDicom(d){return request({url:'/radiology-image/print',method:'post',data:d})}
export function getReportPage(p){return request({url:'/check/report/page',method:'get',params:p})}
export function addReport(d){return request({url:'/check/report/save',method:'post',data:d})}
export function submitReport(id){return request({url:'/check/report/submit/'+id,method:'put'})}
export function verifyReport(id,doctor){return request({url:'/check/report/verify/'+id,method:'put',params:{doctor}})}
export function getImageList(examId){return request({url:'/check/image/list/'+examId,method:'get'})}
export function printDicom(d){return request({url:'/check/print',method:'post',data:d})}