feat(报销/拨款): 进入页面检测OCR服务状态

- 后端新增 GET /ocr-health 端点,探测 Python OCR 服务 /health
- 前端页面 created 时调用健康检查,服务不可用时顶部显示红色警告
  "发票识别服务已停止,请联系信息化部门"
- 服务不可用时禁用附件上传区域(FileUpload 新增 disabled prop)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 18:47:51 +08:00
parent 6055f06f83
commit 40fdd14d13
9 changed files with 86 additions and 14 deletions

View File

@@ -68,9 +68,11 @@ public class HrmAppropriationReqController extends BaseController {
return R.ok(service.queryList(bo));
}
/**
* 通过ossId触发发票OCR识别返回识别条目不保存供前端实时回显
*/
@GetMapping("/ocr-health")
public R<Boolean> ocrHealth() {
return R.ok(invoiceOcrService.isAlive());
}
@PostMapping("/ocr-by-oss")
public R<HrmInvoiceOcrResultVo> ocrByOss(@RequestParam @NotNull Long ossId) {
return R.ok(invoiceOcrService.recognizeByOssId(ossId));

View File

@@ -68,9 +68,11 @@ public class HrmReimburseReqController extends BaseController {
return R.ok(service.queryList(bo));
}
/**
* 通过ossId触发发票OCR识别返回识别条目不保存供前端实时回显
*/
@GetMapping("/ocr-health")
public R<Boolean> ocrHealth() {
return R.ok(invoiceOcrService.isAlive());
}
@PostMapping("/ocr-by-oss")
public R<HrmInvoiceOcrResultVo> ocrByOss(@RequestParam @NotNull Long ossId) {
return R.ok(invoiceOcrService.recognizeByOssId(ossId));

View File

@@ -9,9 +9,11 @@ public interface IHrmInvoiceOcrService {
/**
* 通过ossId识别发票
*
* @param ossId 附件ID
* @return 识别结果
*/
HrmInvoiceOcrResultVo recognizeByOssId(Long ossId);
/**
* 检查OCR服务是否存活
*/
boolean isAlive();
}

View File

@@ -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<String> 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;