1.医疗票据文字识别的代码改造和优化

This commit is contained in:
jiangtd 2026-05-31 14:11:31 +08:00
parent 80857d6b62
commit e05fe180dd
13 changed files with 104 additions and 535 deletions

View File

@ -58,7 +58,7 @@ public class BMedicalInvoiceHandle extends BaiduBaseHandle<BMedicalInvoiceReques
if (checkNotTrueFalse(bMedicalInvoiceRequest.getProbability())) { if (checkNotTrueFalse(bMedicalInvoiceRequest.getProbability())) {
return "probability 必须为" + trueOrFalse + ",是否返回字段识别结果的置信度"; return "probability 必须为" + trueOrFalse + ",是否返回字段识别结果的置信度";
} }
if (!suport.containsKey(bMedicalInvoiceRequest.getMediQuery())) { if (StringUtils.isNotBlank(bMedicalInvoiceRequest.getMediQuery()) && !suport.containsKey(bMedicalInvoiceRequest.getMediQuery())) {
return "mediQuery必须为" + StringUtils.printMap(suport) + ",医保三目录查询,可选值为对应城市代码,可缺省,当此参数的输入值不为对应城市编码时,即进行全量查询,默认进行全量查询,如不需要进行医保三目录查询,无需添加此参数 "; return "mediQuery必须为" + StringUtils.printMap(suport) + ",医保三目录查询,可选值为对应城市代码,可缺省,当此参数的输入值不为对应城市编码时,即进行全量查询,默认进行全量查询,如不需要进行医保三目录查询,无需添加此参数 ";
} }
return checkImageUri(bMedicalInvoiceRequest); return checkImageUri(bMedicalInvoiceRequest);

View File

@ -0,0 +1,24 @@
package com.heyu.api.baidu.handle.medical;
import com.heyu.api.baidu.BaiduBaseHandle;
import com.heyu.api.baidu.request.medical.BMedicalReciptsClassifyRequest;
import com.heyu.api.baidu.response.medical.BMedicalReciptsClassifyResp;
import org.springframework.stereotype.Component;
@Component
public class BMedicalReciptsClassifyHandle extends BaiduBaseHandle<BMedicalReciptsClassifyRequest, BMedicalReciptsClassifyResp> {
@Override
public String getUri() {
return "/rest/2.0/ocr/v1/medical_recipts_classify";
}
@Override
public String check(BMedicalReciptsClassifyRequest request) {
return checkSimpleProbabilityLocation(request);
}
@Override
public String getContent(BMedicalReciptsClassifyRequest request) {
return getSimpleProbabilityLocationContent(request).toString();
}
}

View File

@ -1,29 +0,0 @@
package com.heyu.api.baidu.request.medical;
import com.heyu.api.baidu.BaiduBaseHandle;
import com.heyu.api.baidu.response.medical.BMedicalSurgeryResp;
import org.springframework.stereotype.Component;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740582858429#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_recipts_classify&method=post
* <p>
* 医疗票据类别检测
*/
@Component
public class BMedicalReciptsClassifyHandle extends BaiduBaseHandle<BMedicalSurgeryRequest, BMedicalSurgeryResp> {
@Override
public String getUri() {
return "/rest/2.0/ocr/v1/medical_recipts_classify";
}
@Override
public String check(BMedicalSurgeryRequest bMedicalSurgeryRequest) {
return checkSimpleProbabilityLocation(bMedicalSurgeryRequest);
}
@Override
public String getContent(BMedicalSurgeryRequest bMedicalSurgeryRequest) {
return getSimpleProbabilityLocationContent(bMedicalSurgeryRequest).toString();
}
}

View File

@ -0,0 +1,8 @@
package com.heyu.api.baidu.request.medical;
import com.heyu.api.baidu.request.BSimpleProbabilityLocationRequest;
import lombok.Data;
@Data
public class BMedicalReciptsClassifyRequest extends BSimpleProbabilityLocationRequest {
}

View File

@ -2,75 +2,26 @@ package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalDetailHandle; import com.heyu.api.baidu.handle.medical.BMedicalDetailHandle;
import com.heyu.api.baidu.request.medical.BMedicalDetailRequest; import com.heyu.api.baidu.request.medical.BMedicalDetailRequest;
import com.heyu.api.baidu.response.medical.BMedicalDetailResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalDetailResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740580669633#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_detail&method=post
* 医疗费用明细识别
* <p>
* <p>
* 接口描述
* 支持识别全国医疗费用明细的姓名日期病人ID总金额等关键字段支持识别费用明细项目清单包含项目类型项目名称单价数量规格金额其中北京地区识别效果最佳
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/detail")
@NotIntercept @NotIntercept
public class MedicalDetailController extends BaseController { public class MedicalDetailController extends BaseController {
@Autowired @Autowired
private BMedicalDetailHandle bMedicalDetailHandle; private BMedicalDetailHandle bMedicalDetailHandle;
@RequestMapping("/recognize")
@RequestMapping("/detail")
@CacheResult @CacheResult
public R detail(BMedicalDetailRequest req) { public R recognize(BMedicalDetailRequest request) {
return BaiduOcrResult.raw(bMedicalDetailHandle.handle(request));
MedicalDetailResp resp = new MedicalDetailResp();
ApiR<BMedicalDetailResp> bR = bMedicalDetailHandle.handle(req);
if (bR.isSuccess()) {
BMedicalDetailResp bMedicalDetailResp = bR.getData();
BMedicalDetailResp.WordsResultDTO wordsResultDTO = bMedicalDetailResp.getWordsResult();
resp.setPatient(wordsResultDTO.getPatientID().getWord()); //病人ID
resp.setTotalAmount(wordsResultDTO.getTotalAmount().getWord()); //总金额
resp.setDate(wordsResultDTO.getDate().getWord()); //日期
resp.setName(wordsResultDTO.getName().getWord()); //姓名
if (CollectionUtils.isNotEmpty(wordsResultDTO.getCostDetail())) {
List<List<MedicalDetailResp.CostDetailDTO>> list = new ArrayList<>();
for (List<BMedicalDetailResp.WordsResultDTO.CostDetailDTO> costDetailDTOS : wordsResultDTO.getCostDetail()) {
List<MedicalDetailResp.CostDetailDTO> list1 = new ArrayList<>();
for (BMedicalDetailResp.WordsResultDTO.CostDetailDTO costDetailDTO : costDetailDTOS) {
MedicalDetailResp.CostDetailDTO cost = new MedicalDetailResp.CostDetailDTO();
cost.setWord(costDetailDTO.getWord());
cost.setWordName(costDetailDTO.getWordName());
list1.add(cost);
}
list.add(list1);
}
resp.setCostDetail(list);
}
}
return R.error();
} }
} }

View File

@ -1,142 +1,27 @@
package com.heyu.api.controller.medical; package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalInvoiceHandle; import com.heyu.api.baidu.handle.medical.BMedicalInvoiceHandle;
import com.heyu.api.baidu.request.medical.BMedicalInvoiceRequest; import com.heyu.api.baidu.request.medical.BMedicalInvoiceRequest;
import com.heyu.api.baidu.response.medical.BMedicalInvoiceResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalInvoiceResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740580001377#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_invoice&method=post
*
*医疗发票识别
*
*
* 接口描述
* 支持识别全国各地门诊/住院发票的全字段信息包括业务流水号发票号姓名性别社保卡号金额大/小写收款单位省市医保统筹支付个人账户支付等关键字段及收费项目明细各省直辖市的专有信息
* 其中北京/广东/河北/河南/江苏/山东/上海/天津/浙江等地区票据识别效果较佳
* 支持识别收费项目明细并可根据不同省市地区返回对应的识别信息同时支持收费项目信息的医保三目录信息核验支持包括北京上海广州深圳等21 个城市的医保三目录信息核验
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/invoice")
@NotIntercept @NotIntercept
public class MedicalInvoiceController extends BaseController { public class MedicalInvoiceController extends BaseController {
@Autowired @Autowired
private BMedicalInvoiceHandle bMedicalInvoiceHandle; private BMedicalInvoiceHandle bMedicalInvoiceHandle;
@RequestMapping("/invoice") @RequestMapping("/recognize")
@CacheResult @CacheResult
public R invoice(BMedicalInvoiceRequest req) { public R recognize(BMedicalInvoiceRequest request) {
MedicalInvoiceResp resp = new MedicalInvoiceResp(); return BaiduOcrResult.raw(bMedicalInvoiceHandle.handle(request));
ApiR<BMedicalInvoiceResp> bR = bMedicalInvoiceHandle.handle(req);
if (bR.isSuccess()) {
BMedicalInvoiceResp bMedicalInvoiceResp = bR.getData();
BMedicalInvoiceResp.WordsResultDTO wordsResultDTO = bMedicalInvoiceResp.getWordsResult();
resp.setProvince(bMedicalInvoiceResp.getProvince()); // 省市支持返回以下省市 , n北京/广东/河北/河南/江苏/山东/上海/天津/浙江等
resp.setInvoiceType(bMedicalInvoiceResp.getInvoiceType()); //票据种类
resp.setAmountInWords(wordsResultDTO.getAmountInWords().getWord()); //大写合计金额
resp.setSex(wordsResultDTO.getAmountInWords().getWord()); //性别
resp.setInsuranceType(wordsResultDTO.getInsuranceType().getWord()); //医保类型
resp.setName(wordsResultDTO.getName().getWord()); //姓名
resp.setSocialSecurityNum(wordsResultDTO.getSocialSecurityNum().getWord()); //社保卡号
resp.setDischargeDate(wordsResultDTO.getDischargeDate().getWord()); //出院时间
resp.setHospitalNum(wordsResultDTO.getHospitalNum().getWord()); // 住院号
resp.setHospitalName(wordsResultDTO.getHospitalName().getWord()); //医院名称
//地区字段根据省市返回改地区特有的字段
resp.setClinicNum(wordsResultDTO.getClinicNum().getWord()); // 门诊号
resp.setAmountInFiguers(wordsResultDTO.getAmountInFiguers().getWord()); //小写合计金额
resp.setAdmissionDate(wordsResultDTO.getAdmissionDate().getWord()); // 入院时间
resp.setHospitalType(wordsResultDTO.getHospitalType().getWord()); //医疗机构类型
resp.setRefundAmount(wordsResultDTO.getRefundAmount().getWord()); //退费金额
resp.setDate(wordsResultDTO.getDate().getWord()); //开票日期
resp.setChargingUnit(wordsResultDTO.getChargingUnit().getWord()); //收款单位
resp.setPaymentAmount(wordsResultDTO.getPaymentAmount().getWord()); //补缴金额
resp.setPrepayAmount(wordsResultDTO.getPaymentAmount().getWord()); // 预缴金额
resp.setPersonalPayment(wordsResultDTO.getPersonalPayment().getWord()); //个人账户支付
resp.setHospitalDay(wordsResultDTO.getHospitalDay().getWord()); //住院天数
resp.setBusinessNum(wordsResultDTO.getBusinessNum().getWord()); //业务流水号
resp.setInsurancePayment(wordsResultDTO.getInsurancePayment().getWord()); //医保统筹支付
resp.setPayee(wordsResultDTO.getPayee().getWord()); //收款人
resp.setRecordNum(wordsResultDTO.getRecordNum().getWord()); //病例号
resp.setInvoiceNum(wordsResultDTO.getInvoiceNum().getWord()); //发票号码
List< List<MedicalInvoiceResp.CostDTO>> costCategories = new ArrayList<>();
if(CollectionUtils.isNotEmpty(wordsResultDTO.getCostCategories())){
for (List<BMedicalInvoiceResp.WordsResultDTO.CostCategoriesDTO> costCategory : wordsResultDTO.getCostCategories()) {
List<MedicalInvoiceResp.CostDTO> cost = new ArrayList<>();
for (BMedicalInvoiceResp.WordsResultDTO.CostCategoriesDTO costCategoriesDTO : costCategory) {
MedicalInvoiceResp.CostDTO costDTO = new MedicalInvoiceResp.CostDTO();
costDTO.setName(costCategoriesDTO.getName()); //字段名包括收费项目金额
costDTO.setWord(costCategoriesDTO.getWord()); //name字段对应的识别结果
costDTO.setMediInfo(costCategoriesDTO.getMediInfo()); //医保目录查询结果** medi_query 参数存在时仅在收费项目的数组里返回**以下参数同此说明
costDTO.setMediCheck(costCategoriesDTO.getMediCheck()); //查询是否成功1表示成功0表示不成功
costDTO.setMediName(costCategoriesDTO.getMediName()); //药品名
costDTO.setMediType(costCategoriesDTO.getMediType()); //医保类别
costDTO.setMediRegion(costCategoriesDTO.getMediRegion()); //医保目录的城市
costDTO.setMediCode(costCategoriesDTO.getMediCode()); // 药品编码
costDTO.setMediRegister(costCategoriesDTO.getMediRegister()); // 药品注册号
cost.add(costDTO);
}
costCategories.add(cost);
}
}
resp.setCostCategories(costCategories); //项目大类治疗费检查费等项目大类
List<MedicalInvoiceResp.CostDTO> regionSupplement = new ArrayList<>(); //地区字段根据省市返回改地区特有的字段
if(CollectionUtils.isNotEmpty(wordsResultDTO.getRegionSupplement())){
for (BMedicalInvoiceResp.WordsResultDTO.RegionSupplementDTO regionSupplementDTO : wordsResultDTO.getRegionSupplement()) {
MedicalInvoiceResp.CostDTO costDTO = new MedicalInvoiceResp.CostDTO();
costDTO.setName(regionSupplementDTO.getName());
costDTO.setWord(regionSupplementDTO.getWord());
}
}
resp.setRegionSupplement(regionSupplement);
List<List<MedicalInvoiceResp.CostDTO>> costDetail = new ArrayList<>(); //明细类别药物/检查的明细类别
if(CollectionUtils.isNotEmpty(wordsResultDTO.getCostDetail())){
for (List<BMedicalInvoiceResp.WordsResultDTO.CostDetailDTO> costDetailList : wordsResultDTO.getCostDetail()) {
List<MedicalInvoiceResp.CostDTO> cost = new ArrayList<>();
for (BMedicalInvoiceResp.WordsResultDTO.CostDetailDTO costCategoriesDTO : costDetailList) {
MedicalInvoiceResp.CostDTO costDTO = new MedicalInvoiceResp.CostDTO();
costDTO.setName(costCategoriesDTO.getName()); //字段名包括收费项目金额
costDTO.setWord(costCategoriesDTO.getWord()); //name字段对应的识别结果
costDTO.setMediInfo(costCategoriesDTO.getMediInfo()); //医保目录查询结果** medi_query 参数存在时仅在收费项目的数组里返回**以下参数同此说明
costDTO.setMediCheck(costCategoriesDTO.getMediCheck()); //查询是否成功1表示成功0表示不成功
costDTO.setMediName(costCategoriesDTO.getMediName()); //药品名
costDTO.setMediType(costCategoriesDTO.getMediType()); //医保类别
costDTO.setMediRegion(costCategoriesDTO.getMediRegion()); //医保目录的城市
costDTO.setMediCode(costCategoriesDTO.getMediCode()); // 药品编码
costDTO.setMediRegister(costCategoriesDTO.getMediRegister()); // 药品注册号
cost.add(costDTO);
}
costDetail.add(cost);
}
}
resp.setCostDetail(costDetail); //明细类别药物/检查的明细类别
}
return R.error();
} }
} }

View File

@ -1,94 +1,27 @@
package com.heyu.api.controller.medical; package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalPrescriptionHandle; import com.heyu.api.baidu.handle.medical.BMedicalPrescriptionHandle;
import com.heyu.api.baidu.request.medical.BMedicalPrescriptionRequest; import com.heyu.api.baidu.request.medical.BMedicalPrescriptionRequest;
import com.heyu.api.baidu.response.medical.BMedicalPrescriptionResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalOutpatientResp;
import com.heyu.api.resp.medical.MedicalPrescriptionResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
*
*
*
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740582532897#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_prescription&method=post
*
*处方笺识别
*
*
* 接口描述
* 支持识别全国各地各医院处方笺的姓名日期病人ID科别 4个关键字段及表格区清单项目名称规格单价数量金额频率用量用法等字段
*
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/prescription")
@NotIntercept @NotIntercept
public class MedicalPrescriptionController extends BaseController { public class MedicalPrescriptionController extends BaseController {
@Autowired @Autowired
private BMedicalPrescriptionHandle bMedicalPrescriptionHandle; private BMedicalPrescriptionHandle bMedicalPrescriptionHandle;
@RequestMapping("/recognize")
@RequestMapping("/prescription")
@CacheResult @CacheResult
public R prescription(BMedicalPrescriptionRequest req) { public R recognize(BMedicalPrescriptionRequest request) {
MedicalPrescriptionResp resp = new MedicalPrescriptionResp(); return BaiduOcrResult.raw(bMedicalPrescriptionHandle.handle(request));
ApiR<BMedicalPrescriptionResp> bR = bMedicalPrescriptionHandle.handle(req);
if (bR.isSuccess()) {
BMedicalPrescriptionResp bMedicalPrescriptionResp = bR.getData();
BMedicalPrescriptionResp.WordsResultDTO wordsResultDTO = bMedicalPrescriptionResp.getWordsResult();
List<MedicalOutpatientResp.DataDTO> commonData = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getCommonData())) {
for (BMedicalPrescriptionResp.WordsResultDTO.CommonDataDTO commonDatum : wordsResultDTO.getCommonData()) {
MedicalOutpatientResp.DataDTO dataDTO = new MedicalOutpatientResp.DataDTO();
dataDTO.setWordName(commonDatum.getWordName());
dataDTO.setWord(commonDatum.getWord());
commonData.add(dataDTO);
}
}
resp.setCommonData(commonData);
List<List<MedicalOutpatientResp.DataDTO>> costDetail = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getCostDetail())) {
for (List<BMedicalPrescriptionResp.WordsResultDTO.CostDetailDTO> costDetailDTOS : wordsResultDTO.getCostDetail()) {
List<MedicalOutpatientResp.DataDTO> dataDTO = new ArrayList<>();
for (BMedicalPrescriptionResp.WordsResultDTO.CostDetailDTO costDetailDTO : costDetailDTOS) {
MedicalOutpatientResp.DataDTO dataDTO1 = new MedicalOutpatientResp.DataDTO();
dataDTO1.setWordName(costDetailDTO.getWordName());
dataDTO1.setWord(costDetailDTO.getWord());
dataDTO.add(dataDTO1);
}
costDetail.add(dataDTO);
}
}
resp.setCostDetail(costDetail);
}
return R.error(bR.getErrorMsg());
} }
} }

View File

@ -0,0 +1,27 @@
package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalReciptsClassifyHandle;
import com.heyu.api.baidu.request.medical.BMedicalReciptsClassifyRequest;
import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/medical/receipts/classify")
@NotIntercept
public class MedicalReciptsClassifyController extends BaseController {
@Autowired
private BMedicalReciptsClassifyHandle bMedicalReciptsClassifyHandle;
@RequestMapping("/recognize")
@CacheResult
public R recognize(BMedicalReciptsClassifyRequest request) {
return BaiduOcrResult.raw(bMedicalReciptsClassifyHandle.handle(request));
}
}

View File

@ -1,67 +1,27 @@
package com.heyu.api.controller.medical; package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalRecordHandle; import com.heyu.api.baidu.handle.medical.BMedicalRecordHandle;
import com.heyu.api.baidu.request.medical.BMedicalRecordRequest; import com.heyu.api.baidu.request.medical.BMedicalRecordRequest;
import com.heyu.api.baidu.response.medical.BMedicalRecordResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalRecordResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740581634871#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_record&method=post
*
* 病案首页识别
*
*接口描述
* 支持识别全国各地病案首页的病案号姓名性别出生日期身份证号/入院科别住院次数药物过敏情况等 15 个关键字段其中北京地区票据识别效果最佳
*
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/record")
@NotIntercept @NotIntercept
public class MedicalRecordController extends BaseController { public class MedicalRecordController extends BaseController {
@Autowired @Autowired
private BMedicalRecordHandle bMedicalRecordHandle; private BMedicalRecordHandle bMedicalRecordHandle;
@RequestMapping("/recognize")
@RequestMapping("/record")
@CacheResult @CacheResult
public R record(BMedicalRecordRequest req) { public R recognize(BMedicalRecordRequest request) {
MedicalRecordResp resp = new MedicalRecordResp(); return BaiduOcrResult.raw(bMedicalRecordHandle.handle(request));
ApiR<BMedicalRecordResp> bR = bMedicalRecordHandle.handle(req);
if (bR.isSuccess()) {
BMedicalRecordResp bMedicalRecordResp = bR.getData();
BMedicalRecordResp.WordsResultDTO wordsResultDTO = bMedicalRecordResp.getWordsResult();
resp.setNation(wordsResultDTO.getNation().getWord()); //民族
resp.setAllergy(wordsResultDTO.getAllergy().getWord()); //药物过敏
resp.setSex(wordsResultDTO.getSex().getWord()); // 性别
resp.setBirthday(wordsResultDTO.getBirthday().getWord()); //出生日期
resp.setNationality(wordsResultDTO.getNationality().getWord()); //国籍
resp.setName(wordsResultDTO.getName().getWord()); //姓名
resp.setMaritalStatus(wordsResultDTO.getMaritalStatus().getWord()); //婚姻
resp.setHospitalDay(wordsResultDTO.getHospitalDay().getWord()); //住院次数
resp.setAdmissionDepartment(wordsResultDTO.getAdmissionDepartment().getWord()); // 入院科别
resp.setId(wordsResultDTO.getId().getWord()); //身份证号
resp.setDischargeDepartment(wordsResultDTO.getDischargeDepartment().getWord()); //出院科别
resp.setCareer(wordsResultDTO.getCareer().getWord()); // 职业
resp.setAge(wordsResultDTO.getAge().getWord()); //年龄
resp.setBloodType(wordsResultDTO.getAge().getWord()); //血型Rh血型ABO血型
resp.setRecordNum(wordsResultDTO.getRecordNum().getWord()); // 病案号
return R.ok().setData(resp);
}
return R.error(bR.getErrorMsg());
} }
} }

View File

@ -1,87 +1,27 @@
package com.heyu.api.controller.medical; package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalReportDetectionHandle; import com.heyu.api.baidu.handle.medical.BMedicalReportDetectionHandle;
import com.heyu.api.baidu.request.medical.BMedicalReportDetectionRequest; import com.heyu.api.baidu.request.medical.BMedicalReportDetectionRequest;
import com.heyu.api.baidu.response.medical.BMedicalReportDetectionResp; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalReportDetectionResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740581217710#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_report_detection&method=post
* <p>
* <p>
* 医疗检验报告单识别
*
*接口描述
* 支持识别全国各地医疗检验报告单的姓名性别医院名称报告单名称等关键字段支持识别检查具体项目的项目名称结果单位参考区间结果提示等明细字段
*
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/report/detection")
@NotIntercept @NotIntercept
public class MedicalReportDetectionController { public class MedicalReportDetectionController extends BaseController {
@Autowired @Autowired
private BMedicalReportDetectionHandle bMedicalReportDetectionHandle; private BMedicalReportDetectionHandle bMedicalReportDetectionHandle;
@RequestMapping("/recognize")
@RequestMapping("/reportDetection")
@CacheResult @CacheResult
public R reportDetection(BMedicalReportDetectionRequest req) { public R recognize(BMedicalReportDetectionRequest request) {
MedicalReportDetectionResp resp = new MedicalReportDetectionResp(); return BaiduOcrResult.raw(bMedicalReportDetectionHandle.handle(request));
ApiR<BMedicalReportDetectionResp> bR = bMedicalReportDetectionHandle.handle(req);
if (bR.isSuccess()) {
BMedicalReportDetectionResp bMedicalReportDetectionResp = bR.getData();
BMedicalReportDetectionResp.WordsResultDTO wordsResultDTO = bMedicalReportDetectionResp.getWordsResult();
List<List<MedicalReportDetectionResp.DataDTO>> item = new ArrayList<>(); // 检查项目
if (CollectionUtils.isNotEmpty(wordsResultDTO.getItem())) {
for (List<BMedicalReportDetectionResp.WordsResultDTO.ItemDTO> itemDTOS : wordsResultDTO.getItem()) {
List<MedicalReportDetectionResp.DataDTO> dataDTOS = new ArrayList<>();
for (BMedicalReportDetectionResp.WordsResultDTO.ItemDTO itemDTO : itemDTOS) {
MedicalReportDetectionResp.DataDTO tempDataDTO = new MedicalReportDetectionResp.DataDTO();
tempDataDTO.setWord(itemDTO.getWord());
tempDataDTO.setWordName(itemDTO.getWordName());
dataDTOS.add(tempDataDTO);
}
item.add(dataDTOS);
}
}
List<MedicalReportDetectionResp.DataDTO> commonData = new ArrayList<>(); // 患者具体信息
if (CollectionUtils.isNotEmpty(wordsResultDTO.getCommonData())) {
for (BMedicalReportDetectionResp.WordsResultDTO.CommonDataDTO commonDatum : wordsResultDTO.getCommonData()) {
MedicalReportDetectionResp.DataDTO tempDataDTO = new MedicalReportDetectionResp.DataDTO();
tempDataDTO.setWord(commonDatum.getWord());
tempDataDTO.setWordName(commonDatum.getWordName());
commonData.add(tempDataDTO);
}
}
resp.setItem(item);
resp.setCommonData(commonData);
}
return R.error(bR.getErrorMsg());
} }
} }

View File

@ -2,67 +2,26 @@ package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalStatementHandle; import com.heyu.api.baidu.handle.medical.BMedicalStatementHandle;
import com.heyu.api.baidu.request.medical.BMedicalStatementRequest; import com.heyu.api.baidu.request.medical.BMedicalStatementRequest;
import com.heyu.api.baidu.response.medical.BMedicalStatementResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalStatementResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740581091562#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_statement&method=post
* <p>
* 医疗费用结算单识别
*
*
* 接口描述
* 支持识别全国医疗费用结算单的姓名/入院时间发票总金额自费金额医保支付金额等 6 个关键字段其中北京地区票据识别效果最佳
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/statement")
@NotIntercept @NotIntercept
public class MedicalStatementController extends BaseController { public class MedicalStatementController extends BaseController {
@Autowired @Autowired
private BMedicalStatementHandle bMedicalStatementHandle; private BMedicalStatementHandle bMedicalStatementHandle;
@RequestMapping("/recognize")
@RequestMapping("/statement")
@CacheResult @CacheResult
public R statement(BMedicalStatementRequest req) { public R recognize(BMedicalStatementRequest request) {
return BaiduOcrResult.raw(bMedicalStatementHandle.handle(request));
MedicalStatementResp resp = new MedicalStatementResp();
ApiR<BMedicalStatementResp> bR = bMedicalStatementHandle.handle(req);
if (bR.isSuccess()) {
BMedicalStatementResp bMedicalStatementResp = bR.getData();
BMedicalStatementResp.WordResultDTO wordResultDTO = bMedicalStatementResp.getWordResult();
resp.setAmountInFiguers(wordResultDTO.getAmountInFiguers().getWord()); //发票总金额
resp.setMedicalInsuranceAmount(wordResultDTO.getMedicalInsuranceAmount().getWord()); // 医保支付
resp.setSelfPaymentAmount(wordResultDTO.getSelfPaymentAmount().getWord()); // 全自费
resp.setAdmissionDate(wordResultDTO.getAdmissionDate().getWord()); //入院时间
resp.setDischargeDate(wordResultDTO.getDischargeDate().getWord()); //出院时间
resp.setName(wordResultDTO.getName().getWord()); //姓名
return R.ok().setData(resp);
}
return R.error(bR.getErrorMsg());
} }
} }

View File

@ -1,72 +1,27 @@
package com.heyu.api.controller.medical; package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalSummaryHandle; import com.heyu.api.baidu.handle.medical.BMedicalSummaryHandle;
import com.heyu.api.baidu.request.medical.BMedicalSummaryRequest; import com.heyu.api.baidu.request.medical.BMedicalSummaryRequest;
import com.heyu.api.baidu.response.medical.BMedicalSummaryResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalSummaryResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
*
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740581767882#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fmedical_summary&method=post
*
*
*出院小结识别
*接口描述
* 支持识别全国各地各医院诊断证明的姓名性别年龄科室入院时间出院时间住院号出院诊断出院医嘱 9个关键字段
*
*
*
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/summary")
@NotIntercept @NotIntercept
public class MedicalSummaryController extends BaseController { public class MedicalSummaryController extends BaseController {
@Autowired @Autowired
private BMedicalSummaryHandle bMedicalSummaryHandle; private BMedicalSummaryHandle bMedicalSummaryHandle;
@RequestMapping("/recognize")
@RequestMapping("/summary")
@CacheResult @CacheResult
public R statement(BMedicalSummaryRequest req) { public R recognize(BMedicalSummaryRequest request) {
List<MedicalSummaryResp> respList = new ArrayList<>(); return BaiduOcrResult.raw(bMedicalSummaryHandle.handle(request));
ApiR<BMedicalSummaryResp> bR = bMedicalSummaryHandle.handle(req);
if (bR.isSuccess()) {
BMedicalSummaryResp bMedicalSummaryResp = bR.getData();
List<BMedicalSummaryResp.WordsResultDTO> wordsResultDTOS = bMedicalSummaryResp.getWordsResult();
if(CollectionUtils.isNotEmpty(wordsResultDTOS)){
for (BMedicalSummaryResp.WordsResultDTO wordsResultDTO : wordsResultDTOS) {
MedicalSummaryResp medicalSummaryResp = new MedicalSummaryResp();
medicalSummaryResp.setWordName(wordsResultDTO.getWordName());
medicalSummaryResp.setWord(wordsResultDTO.getWord());
respList.add(medicalSummaryResp);
}
}
return R.ok().setData(respList);
}
return R.error(bR.getErrorMsg());
} }
} }

View File

@ -2,70 +2,26 @@ package com.heyu.api.controller.medical;
import com.heyu.api.baidu.handle.medical.BMedicalSummaryDiagnosisHandle; import com.heyu.api.baidu.handle.medical.BMedicalSummaryDiagnosisHandle;
import com.heyu.api.baidu.request.medical.BMedicalSummaryDiagnosisRequest; import com.heyu.api.baidu.request.medical.BMedicalSummaryDiagnosisRequest;
import com.heyu.api.baidu.response.medical.BMedicalSummaryDiagnosisResp;
import com.heyu.api.controller.BaseController; import com.heyu.api.controller.BaseController;
import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept; import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.R;
import com.heyu.api.resp.medical.MedicalSummaryDiagnosisResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740582137426#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8C%BB%E7%96%97%E7%A5%A8%E6%8D%AEOCR&api=%2Frest%2F2.0%2Focr%2Fv1%2Fmedical_summary_diagnosis&method=post
*
*
* 诊断证明识别
*
*接口描述
* 支持识别全国各地各医院诊断证明的姓名性别年龄
*
*/
@Slf4j
@RestController @RestController
@RequestMapping("/medical") @RequestMapping("/medical/summary/diagnosis")
@NotIntercept @NotIntercept
public class MedicalSummaryDiagnosisController extends BaseController { public class MedicalSummaryDiagnosisController extends BaseController {
@Autowired @Autowired
private BMedicalSummaryDiagnosisHandle bMedicalSummaryDiagnosisHandle; private BMedicalSummaryDiagnosisHandle bMedicalSummaryDiagnosisHandle;
@RequestMapping("/recognize")
@RequestMapping("/summaryDiagnosis")
@CacheResult @CacheResult
public R summaryDiagnosis(BMedicalSummaryDiagnosisRequest req) { public R recognize(BMedicalSummaryDiagnosisRequest request) {
return BaiduOcrResult.raw(bMedicalSummaryDiagnosisHandle.handle(request));
List<MedicalSummaryDiagnosisResp> respList = new ArrayList<>();
ApiR<BMedicalSummaryDiagnosisResp> bR = bMedicalSummaryDiagnosisHandle.handle(req);
if (bR.isSuccess()) {
BMedicalSummaryDiagnosisResp bMedicalSummaryDiagnosisResp = bR.getData();
List<BMedicalSummaryDiagnosisResp.WordsResultDTO> wordsResult = bMedicalSummaryDiagnosisResp.getWordsResult();
if (CollectionUtils.isNotEmpty(wordsResult)) {
for (BMedicalSummaryDiagnosisResp.WordsResultDTO resultDTO : wordsResult) {
MedicalSummaryDiagnosisResp medicalSummaryDiagnosisResp = new MedicalSummaryDiagnosisResp();
medicalSummaryDiagnosisResp.setWord(resultDTO.getWord());
medicalSummaryDiagnosisResp.setWordName(resultDTO.getWordName());
respList.add(medicalSummaryDiagnosisResp);
}
}
return R.ok().setData(respList);
}
return R.error(bR.getErrorMsg());
} }
} }