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..3021fe3 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/图片,上传后自动识别明细)' }} +
@@ -70,12 +77,14 @@
拨款明细 - (上传发票后自动识别,删除条目将同步移除对应文件) + (上传发票后自动识别;识别失败或无发票时可手动添加) + 手动添加条目
事由说明 金额(元) + 附件
@@ -93,6 +102,16 @@ class="col-amount" @change="recalcTotal" /> +
+ + + + + + +
@@ -247,10 +266,11 @@