From 40fdd14d13eb153def91f833bf9a3a364fb8ebc5 Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Fri, 8 May 2026 18:47:51 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(=E6=8A=A5=E9=94=80/=E6=8B=A8=E6=AC=BE)?= =?UTF-8?q?:=20=E8=BF=9B=E5=85=A5=E9=A1=B5=E9=9D=A2=E6=A3=80=E6=B5=8BOCR?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端新增 GET /ocr-health 端点,探测 Python OCR 服务 /health - 前端页面 created 时调用健康检查,服务不可用时顶部显示红色警告 "发票识别服务已停止,请联系信息化部门" - 服务不可用时禁用附件上传区域(FileUpload 新增 disabled prop) Co-Authored-By: Claude Sonnet 4.6 --- .../HrmAppropriationReqController.java | 8 ++++--- .../controller/HrmReimburseReqController.java | 8 ++++--- .../hrm/service/IHrmInvoiceOcrService.java | 8 ++++--- .../impl/HrmInvoiceOcrServiceImpl.java | 14 +++++++++++ ruoyi-ui/src/api/hrm/appropriation.js | 4 ++++ ruoyi-ui/src/api/hrm/reimburse.js | 4 ++++ ruoyi-ui/src/components/FileUpload/index.vue | 7 +++++- .../src/views/hrm/requests/appropriation.vue | 24 +++++++++++++++++-- ruoyi-ui/src/views/hrm/requests/reimburse.vue | 23 ++++++++++++++++-- 9 files changed, 86 insertions(+), 14 deletions(-) diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java index 5473c46..098c778 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java @@ -68,9 +68,11 @@ public class HrmAppropriationReqController extends BaseController { return R.ok(service.queryList(bo)); } - /** - * 通过ossId触发发票OCR识别,返回识别条目(不保存,供前端实时回显) - */ + @GetMapping("/ocr-health") + public R ocrHealth() { + return R.ok(invoiceOcrService.isAlive()); + } + @PostMapping("/ocr-by-oss") public R ocrByOss(@RequestParam @NotNull Long ossId) { return R.ok(invoiceOcrService.recognizeByOssId(ossId)); diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java index 48599f7..4fd45da 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java @@ -68,9 +68,11 @@ public class HrmReimburseReqController extends BaseController { return R.ok(service.queryList(bo)); } - /** - * 通过ossId触发发票OCR识别,返回识别条目(不保存,供前端实时回显) - */ + @GetMapping("/ocr-health") + public R ocrHealth() { + return R.ok(invoiceOcrService.isAlive()); + } + @PostMapping("/ocr-by-oss") public R ocrByOss(@RequestParam @NotNull Long ossId) { return R.ok(invoiceOcrService.recognizeByOssId(ossId)); diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmInvoiceOcrService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmInvoiceOcrService.java index 3e13b99..bf25469 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmInvoiceOcrService.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmInvoiceOcrService.java @@ -9,9 +9,11 @@ public interface IHrmInvoiceOcrService { /** * 通过ossId识别发票 - * - * @param ossId 附件ID - * @return 识别结果 */ HrmInvoiceOcrResultVo recognizeByOssId(Long ossId); + + /** + * 检查OCR服务是否存活 + */ + boolean isAlive(); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmInvoiceOcrServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmInvoiceOcrServiceImpl.java index 7ff09fa..7bdf36a 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmInvoiceOcrServiceImpl.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmInvoiceOcrServiceImpl.java @@ -193,6 +193,20 @@ public class HrmInvoiceOcrServiceImpl implements IHrmInvoiceOcrService { return val.toString(); } + @Override + public boolean isAlive() { + String ocrUrl = ocrProperties.getUrl(); + if (StringUtils.isBlank(ocrUrl)) return false; + try { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity resp = restTemplate.getForEntity(ocrUrl + "/health", String.class); + return resp.getStatusCode().is2xxSuccessful(); + } catch (Exception e) { + log.warn("[OCR] 健康检查失败: {}", e.getMessage()); + return false; + } + } + private String getStringOrFieldValue(JSONObject obj, String key) { Object val = obj.get(key); if (val == null) return null; diff --git a/ruoyi-ui/src/api/hrm/appropriation.js b/ruoyi-ui/src/api/hrm/appropriation.js index a7f2f66..111b859 100644 --- a/ruoyi-ui/src/api/hrm/appropriation.js +++ b/ruoyi-ui/src/api/hrm/appropriation.js @@ -58,6 +58,10 @@ export function getAppropriationStats (query) { }) } +export function checkAppropriationOcrHealth () { + return request({ url: '/hrm/appropriation/ocr-health', method: 'get' }) +} + /** * 通过ossId触发发票OCR识别(返回识别条目,不保存) */ diff --git a/ruoyi-ui/src/api/hrm/reimburse.js b/ruoyi-ui/src/api/hrm/reimburse.js index 7fbc4f0..4056016 100644 --- a/ruoyi-ui/src/api/hrm/reimburse.js +++ b/ruoyi-ui/src/api/hrm/reimburse.js @@ -47,6 +47,10 @@ export function allReimburseReq(query) { }) } +export function checkReimburseOcrHealth() { + return request({ url: '/hrm/reimburse/ocr-health', method: 'get' }) +} + /** * 通过ossId触发发票OCR识别(返回识别条目,不保存) */ diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/ruoyi-ui/src/components/FileUpload/index.vue index e2c6c82..8eef326 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -3,7 +3,7 @@ + :disabled="disabled" class="upload-file-uploader" ref="fileUpload">
将文件拖到此处,或点击上传 @@ -71,6 +71,10 @@ export default { isShowTip: { type: Boolean, default: true + }, + disabled: { + type: Boolean, + default: false } }, inject: ['$folder'], @@ -126,6 +130,7 @@ export default { this.$download.oss(file.ossId); }, handleBeforeUpload (file) { + if (this.disabled) return false; const ext = file.name.split('.').pop().toLowerCase(); if (this.fileType && !this.fileType.includes(ext)) { this.$modal.msgError(`文件格式不正确,请上传${this.fileType.join('/')}格式文件!`); diff --git a/ruoyi-ui/src/views/hrm/requests/appropriation.vue b/ruoyi-ui/src/views/hrm/requests/appropriation.vue index f79c2f7..0fdc2d6 100644 --- a/ruoyi-ui/src/views/hrm/requests/appropriation.vue +++ b/ruoyi-ui/src/views/hrm/requests/appropriation.vue @@ -9,6 +9,10 @@
+ + 发票识别服务已停止,请联系信息化部门。在服务恢复前,您暂时无法上传发票附件。 + +
发起拨款申请
@@ -57,8 +61,11 @@ -
上传发票、收据、付款截图等(支持 PDF/图片,上传后自动识别明细)
+
+ {{ ocrAvailable === false ? '识别服务不可用,暂时无法上传' : '上传发票、收据、付款截图等(支持 PDF/图片,上传后自动识别明细)' }} +
@@ -247,7 +254,7 @@