From 1a3a4e99a824e8da915732d94a6ec65b3cf28ee9 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Mon, 26 Apr 2021 17:53:52 +0800 Subject: [PATCH] ocr --- pom.xml | 4 +- .../com/ccsens/tcm/bean/po/ReportOcr.java | 84 +++ .../ccsens/tcm/bean/po/ReportOcrExample.java | 571 ++++++++++++++++++ .../tcm/bean/vo/BiologicalSamplesVo.java | 4 +- .../com/ccsens/tcm/bean/vo/PatientVo.java | 2 + .../tcm/persist/mapper/ReportOcrMapper.java | 30 + .../com/ccsens/tcm/service/OcrService.java | 110 +++- .../ccsens/tcm/service/PatientService.java | 5 +- .../java/com/ccsens/tcm/uitl/Constant.java | 4 +- tcm/src/main/resources/application.yml | 4 +- .../main/resources/mapper_dao/PatientDao.xml | 4 +- .../resources/mapper_raw/ReportOcrMapper.xml | 228 +++++++ util/pom.xml | 6 + .../com/ccsens/util/ali/AliInstanceUtil.java | 27 + .../util/ali/Demolyocr_general_advanced.java | 168 ++++++ .../HttpApiClientlyocr_general_advanced.java | 34 ++ .../HttpsApiClientlyocr_general_advanced.java | 50 ++ 17 files changed, 1297 insertions(+), 38 deletions(-) create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcr.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcrExample.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/persist/mapper/ReportOcrMapper.java create mode 100644 tcm/src/main/resources/mapper_raw/ReportOcrMapper.xml create mode 100644 util/src/main/java/com/ccsens/util/ali/AliInstanceUtil.java create mode 100644 util/src/main/java/com/ccsens/util/ali/Demolyocr_general_advanced.java create mode 100644 util/src/main/java/com/ccsens/util/ali/HttpApiClientlyocr_general_advanced.java create mode 100644 util/src/main/java/com/ccsens/util/ali/HttpsApiClientlyocr_general_advanced.java diff --git a/pom.xml b/pom.xml index 8b68ec59..e6b63103 100644 --- a/pom.xml +++ b/pom.xml @@ -219,13 +219,13 @@ org.apache.httpcomponents httpclient - 4.3.1 + 4.5.1 org.apache.httpcomponents httpcore - 4.3.1 + 4.4.3 diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcr.java b/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcr.java new file mode 100644 index 00000000..e2dbaf2f --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcr.java @@ -0,0 +1,84 @@ +package com.ccsens.tcm.bean.po; + +import java.io.Serializable; +import java.util.Date; + +public class ReportOcr implements Serializable { + private Long id; + + private String code; + + private Byte ocrChannel; + + private Date createdAt; + + private Date updatedAt; + + private Byte recStatus; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code == null ? null : code.trim(); + } + + public Byte getOcrChannel() { + return ocrChannel; + } + + public void setOcrChannel(Byte ocrChannel) { + this.ocrChannel = ocrChannel; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public Byte getRecStatus() { + return recStatus; + } + + public void setRecStatus(Byte recStatus) { + this.recStatus = recStatus; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", code=").append(code); + sb.append(", ocrChannel=").append(ocrChannel); + sb.append(", createdAt=").append(createdAt); + sb.append(", updatedAt=").append(updatedAt); + sb.append(", recStatus=").append(recStatus); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcrExample.java b/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcrExample.java new file mode 100644 index 00000000..9a8d6af0 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/po/ReportOcrExample.java @@ -0,0 +1,571 @@ +package com.ccsens.tcm.bean.po; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ReportOcrExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public ReportOcrExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andCodeIsNull() { + addCriterion("code is null"); + return (Criteria) this; + } + + public Criteria andCodeIsNotNull() { + addCriterion("code is not null"); + return (Criteria) this; + } + + public Criteria andCodeEqualTo(String value) { + addCriterion("code =", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeNotEqualTo(String value) { + addCriterion("code <>", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeGreaterThan(String value) { + addCriterion("code >", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeGreaterThanOrEqualTo(String value) { + addCriterion("code >=", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeLessThan(String value) { + addCriterion("code <", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeLessThanOrEqualTo(String value) { + addCriterion("code <=", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeLike(String value) { + addCriterion("code like", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeNotLike(String value) { + addCriterion("code not like", value, "code"); + return (Criteria) this; + } + + public Criteria andCodeIn(List values) { + addCriterion("code in", values, "code"); + return (Criteria) this; + } + + public Criteria andCodeNotIn(List values) { + addCriterion("code not in", values, "code"); + return (Criteria) this; + } + + public Criteria andCodeBetween(String value1, String value2) { + addCriterion("code between", value1, value2, "code"); + return (Criteria) this; + } + + public Criteria andCodeNotBetween(String value1, String value2) { + addCriterion("code not between", value1, value2, "code"); + return (Criteria) this; + } + + public Criteria andOcrChannelIsNull() { + addCriterion("ocr_channel is null"); + return (Criteria) this; + } + + public Criteria andOcrChannelIsNotNull() { + addCriterion("ocr_channel is not null"); + return (Criteria) this; + } + + public Criteria andOcrChannelEqualTo(Byte value) { + addCriterion("ocr_channel =", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelNotEqualTo(Byte value) { + addCriterion("ocr_channel <>", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelGreaterThan(Byte value) { + addCriterion("ocr_channel >", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelGreaterThanOrEqualTo(Byte value) { + addCriterion("ocr_channel >=", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelLessThan(Byte value) { + addCriterion("ocr_channel <", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelLessThanOrEqualTo(Byte value) { + addCriterion("ocr_channel <=", value, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelIn(List values) { + addCriterion("ocr_channel in", values, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelNotIn(List values) { + addCriterion("ocr_channel not in", values, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelBetween(Byte value1, Byte value2) { + addCriterion("ocr_channel between", value1, value2, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andOcrChannelNotBetween(Byte value1, Byte value2) { + addCriterion("ocr_channel not between", value1, value2, "ocrChannel"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNull() { + addCriterion("rec_status is null"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNotNull() { + addCriterion("rec_status is not null"); + return (Criteria) this; + } + + public Criteria andRecStatusEqualTo(Byte value) { + addCriterion("rec_status =", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotEqualTo(Byte value) { + addCriterion("rec_status <>", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThan(Byte value) { + addCriterion("rec_status >", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThanOrEqualTo(Byte value) { + addCriterion("rec_status >=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThan(Byte value) { + addCriterion("rec_status <", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThanOrEqualTo(Byte value) { + addCriterion("rec_status <=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusIn(List values) { + addCriterion("rec_status in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotIn(List values) { + addCriterion("rec_status not in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusBetween(Byte value1, Byte value2) { + addCriterion("rec_status between", value1, value2, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotBetween(Byte value1, Byte value2) { + addCriterion("rec_status not between", value1, value2, "recStatus"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/vo/BiologicalSamplesVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/BiologicalSamplesVo.java index 41d383e9..9ccd2d46 100644 --- a/tcm/src/main/java/com/ccsens/tcm/bean/vo/BiologicalSamplesVo.java +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/BiologicalSamplesVo.java @@ -14,8 +14,10 @@ public class BiologicalSamplesVo { public static class selBiolog { @ApiModelProperty("医院名称") private String name; - @ApiModelProperty("患者编号") + @ApiModelProperty("患者住院号") private String hospitalization; + @ApiModelProperty("患者研究编号") + private String patientCode; @ApiModelProperty("生物样本编号") private String code; @ApiModelProperty("样本类型 0:抗血凝10ml 1:促凝血5ml 2:晨尿10ml 3:24小时尿10ml") diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/vo/PatientVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/PatientVo.java index bf753325..a95c11ac 100644 --- a/tcm/src/main/java/com/ccsens/tcm/bean/vo/PatientVo.java +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/PatientVo.java @@ -21,6 +21,8 @@ public class PatientVo { private Long id; @ApiModelProperty("住院号") private String hospitalization; + @ApiModelProperty("研究编号") + private String code; @ApiModelProperty("对照组id") private Long inpatientId; @ApiModelProperty("录入状态:0:新建 1:数据搜集中 2数据搜集完成 3数据搜集超时 4:废弃") diff --git a/tcm/src/main/java/com/ccsens/tcm/persist/mapper/ReportOcrMapper.java b/tcm/src/main/java/com/ccsens/tcm/persist/mapper/ReportOcrMapper.java new file mode 100644 index 00000000..f8edf532 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/persist/mapper/ReportOcrMapper.java @@ -0,0 +1,30 @@ +package com.ccsens.tcm.persist.mapper; + +import com.ccsens.tcm.bean.po.ReportOcr; +import com.ccsens.tcm.bean.po.ReportOcrExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface ReportOcrMapper { + long countByExample(ReportOcrExample example); + + int deleteByExample(ReportOcrExample example); + + int deleteByPrimaryKey(Long id); + + int insert(ReportOcr record); + + int insertSelective(ReportOcr record); + + List selectByExample(ReportOcrExample example); + + ReportOcr selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") ReportOcr record, @Param("example") ReportOcrExample example); + + int updateByExample(@Param("record") ReportOcr record, @Param("example") ReportOcrExample example); + + int updateByPrimaryKeySelective(ReportOcr record); + + int updateByPrimaryKey(ReportOcr record); +} \ No newline at end of file diff --git a/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java b/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java index 4256cd74..6db98029 100644 --- a/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java +++ b/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java @@ -2,14 +2,22 @@ package com.ccsens.tcm.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.cloudapi.sdk.model.ApiResponse; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ccsens.tcm.bean.dto.QuestionOcrDto; +import com.ccsens.tcm.bean.po.ReportOcr; +import com.ccsens.tcm.bean.po.ReportOcrExample; import com.ccsens.tcm.bean.vo.QuestionOcrVo; import com.ccsens.tcm.persist.dao.QuestionOcrDao; +import com.ccsens.tcm.persist.mapper.ReportOcrMapper; import com.ccsens.tcm.uitl.Constant; +import com.ccsens.util.CodeEnum; +import com.ccsens.util.ali.AliInstanceUtil; import com.ccsens.util.baidu.BaiDuDto; import com.ccsens.util.baidu.BaiDuUtil; import com.ccsens.util.baidu.BaiDuVo; +import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -33,35 +41,83 @@ public class OcrService implements IOcrService { @Resource private QuestionOcrDao questionOcrDao; + @Resource + private ReportOcrMapper reportOcrMapper; + @Override public List identifyWords(QuestionOcrDto.GeneralBasic generalBasic, Long userId) { + long time1 = System.currentTimeMillis(); List vos = new ArrayList<>(); - BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic(); - basic.setUrl(generalBasic.getUrl()); - BaiDuVo.GeneralBasic words = BaiDuUtil.accurateBasic(Constant.BaiDu.APP_KEY, Constant.BaiDu.SECRET_KEY, basic); - log.info("文字识别:{}", words); - if (words == null || words.getWordsResultNum() <= 0) { - return vos; - } + // 类型测评规则 List rules = questionOcrDao.queryRules(generalBasic.getHospitalId(), generalBasic.getCode()); log.info("规则:{}", rules); if (CollectionUtil.isEmpty(rules)) { return vos; } - Map keyMap = new HashMap<>(); + long time2 = System.currentTimeMillis(); + log.info("查询规则时间:{}", time2 - time1); + ReportOcrExample ocrExample = new ReportOcrExample(); + ocrExample.createCriteria().andCodeEqualTo(generalBasic.getCode()); + List reportOcrList = reportOcrMapper.selectByExample(ocrExample); + long time3 = System.currentTimeMillis(); + log.info("查询reportOrc:{}", time3 - time2); + + boolean baidu = CollectionUtil.isEmpty(reportOcrList) || reportOcrList.get(0).getOcrChannel() != 1; + + // 识别字符串 + List contents = new ArrayList<>(); + long time4 = 0; + + if (baidu) { + BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic(); + basic.setUrl(generalBasic.getUrl()); + BaiDuVo.GeneralBasic words = BaiDuUtil.accurateBasic(Constant.BaiDu.APP_KEY, Constant.BaiDu.SECRET_KEY, basic); + log.info("文字识别:{}", words); + if (words == null || CollectionUtil.isEmpty(words.getWordsResult())) { + return vos; + } + words.getWordsResult().forEach(word -> contents.add(word.getWords())); + } else { + // 阿里 + String body = "{\"img\":\"\",\"url\":\""+generalBasic.getUrl()+"\",\"prob\":false,\"charInfo\":false,\"rotate\":false,\"table\":false}"; + ApiResponse response = AliInstanceUtil.getGeneralAdvancedHttps().ocrAdvancedSyncMode(body.getBytes()); + time4 = System.currentTimeMillis(); + log.info("阿里接口调用:{}", time4 -time3); + log.info("调用阿里的通用识别接口,请求:{}, 返回:{}", body, response); + int code = response.getCode(); + int curCode = 200; + if (code != curCode) { + CodeEnum thirdError = CodeEnum.THIRD_ERROR; + thirdError.setMsg(response.getEx().getMessage()); + throw new BaseException(thirdError); + } + String result = new String(response.getBody()); + log.info("result:{}", result); + JSONObject json = JSONObject.parseObject(result); + JSONArray infos = json.getJSONArray("prism_wordsInfo"); + for (Object obj: infos) { + JSONObject info = (JSONObject)obj; + contents.add(info.getString("word").replaceAll("\\s+","")); + } + } + + + + Map keyMap = new HashMap<>(16); rules.forEach(rule -> { JSONObject start = StrUtil.isEmpty(rule.getStart()) ? null : JSONObject.parseObject(rule.getStart()); JSONObject end = StrUtil.isEmpty(rule.getEnd()) ? null : JSONObject.parseObject(rule.getEnd()); - StringBuilder builder = new StringBuilder(); + StringBuilder builder; if (start == null) { // 不知道这种场景 + return; } else if (start.containsKey(Constant.BaiDu.NUM)) { // 包含读取第几个 - builder = getContent(words, keyMap, start); + builder = getContent(contents, keyMap, start); } else { - builder = getContent(words, start, end); + builder = getContent(contents, start, end); } QuestionOcrVo.GeneralBasic vo = new QuestionOcrVo.GeneralBasic(); @@ -71,24 +127,24 @@ public class OcrService implements IOcrService { vo.setContent(builder.toString()); vos.add(vo); }); - + long time5 = System.currentTimeMillis(); + log.info("数据处理时间:{}", time5 - time4); return vos; } - private StringBuilder getContent(BaiDuVo.GeneralBasic words, Map keyMap, JSONObject start) { + private StringBuilder getContent(List contents, Map keyMap, JSONObject start) { StringBuilder builder = new StringBuilder(); String key = start.getString(Constant.BaiDu.KEY); int index = start.getIntValue(Constant.BaiDu.NUM); if (keyMap.containsKey(key) ) { if (keyMap.get(key) >= 0) { - builder.append( words.getWordsResult().get(keyMap.get(key) + index).getWords()); + builder.append( contents.get(keyMap.get(key) + index)); } } else { - for (int i = 0; i < words.getWordsResultNum(); i++) { - BaiDuVo.GeneralWord word = words.getWordsResult().get(i); - if (word.getWords().contains(key)) { - keyMap.put(key, i); - builder.append(words.getWordsResult().get(i + index).getWords()); + for (int i = 0; i < contents.size(); i++) { + if (contents.get(i).contains(key)) { + keyMap.put(key.trim(), i); + builder.append(contents.get(i + index)); return builder; } } @@ -96,20 +152,18 @@ public class OcrService implements IOcrService { return builder; } - private StringBuilder getContent(BaiDuVo.GeneralBasic words, JSONObject start, JSONObject end) { + private StringBuilder getContent(List contents, JSONObject start, JSONObject end) { StringBuilder builder = new StringBuilder(); - for (int i = 0; i < words.getWordsResult().size(); i++) { - BaiDuVo.GeneralWord word = words.getWordsResult().get(i); - String wordStr = word.getWords(); - if (start != null && wordStr.startsWith(start.getString(Constant.BaiDu.KEY))) { + for (String content : contents) { + String word = content.trim(); + if (start != null && word.startsWith(start.getString(Constant.BaiDu.KEY))) { builder.delete(0, builder.length()); - builder.append(wordStr); - } else if (end != null && wordStr.startsWith(end.getString(Constant.BaiDu.KEY))) { + builder.append(word); + } else if (end != null && word.startsWith(end.getString(Constant.BaiDu.KEY))) { break; } else { - builder.append(wordStr); + builder.append(word); } - } return builder; } diff --git a/tcm/src/main/java/com/ccsens/tcm/service/PatientService.java b/tcm/src/main/java/com/ccsens/tcm/service/PatientService.java index 154ebad2..27288ca9 100644 --- a/tcm/src/main/java/com/ccsens/tcm/service/PatientService.java +++ b/tcm/src/main/java/com/ccsens/tcm/service/PatientService.java @@ -3,6 +3,7 @@ package com.ccsens.tcm.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.ccsens.tcm.bean.dto.BiologicalSamplesDto; import com.ccsens.tcm.bean.dto.ConRecDto; import com.ccsens.tcm.bean.dto.PatientDto; @@ -94,7 +95,7 @@ public class PatientService implements IPatientService { patientInformation.setId(snowflake.nextId()); patientInformation.setHospitalId(hospital.getId()); // 生成编号 - long incr = redisUtil.incr(Constant.Redis.HOSPITAL_NUM + hospital.getCode(), 1) + 1; + long incr = redisUtil.incr(StrUtil.format(Constant.Redis.HOSPITAL_NUM, hospital.getCode(), inpatient.getCode()) , 1); DecimalFormat df=new DecimalFormat("000"); String num = hospital.getCode() + inpatient.getCode() + df.format(incr); log.info("编号:{}", num); @@ -357,7 +358,7 @@ public class PatientService implements IPatientService { biologicalSamples.setId(snowflake.nextId()); biologicalSamples.setPatientInformationId(patientInformations.get(0).getId()); BeanUtils.copyProperties(param,biologicalSamples); - biologicalSamples.setCode(param.getHospitalization() + Constant.SPLIT_STRIKE + Constant.Biological.getByType(param.getSampleType()).getCode() + Constant.SPLIT_STRIKE + param.getCollectTime()); + biologicalSamples.setCode(patientInformations.get(0).getCode() + Constant.SPLIT_STRIKE + Constant.Biological.getByType(param.getSampleType()).getCode() + Constant.SPLIT_STRIKE + param.getCollectTime()); biologicalSamplesMapper.insertSelective(biologicalSamples); } diff --git a/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java b/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java index 93effda2..2a773a85 100644 --- a/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java +++ b/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java @@ -102,8 +102,8 @@ public class Constant { public final static String DISEASE_TIME = "disease_time"; /**所有题目按code分类*/ public final static String CODE_QUESTION = "code_question"; - /**医院排序*/ - public final static String HOSPITAL_NUM = "hospital_num_"; + /**医院_组别排序*/ + public final static String HOSPITAL_NUM = "hospital_num_{}_{}"; } public static class File{ diff --git a/tcm/src/main/resources/application.yml b/tcm/src/main/resources/application.yml index 33b76558..4ecd13fd 100644 --- a/tcm/src/main/resources/application.yml +++ b/tcm/src/main/resources/application.yml @@ -1,5 +1,5 @@ spring: profiles: - active: green - include: common, util-green + active: dev + include: common, util-dev diff --git a/tcm/src/main/resources/mapper_dao/PatientDao.xml b/tcm/src/main/resources/mapper_dao/PatientDao.xml index 149a59d8..b07f35b4 100644 --- a/tcm/src/main/resources/mapper_dao/PatientDao.xml +++ b/tcm/src/main/resources/mapper_dao/PatientDao.xml @@ -41,6 +41,7 @@ SELECT tpi.id, tpi.hospitalization, + tpi.code, tpi.inpatient_id AS inpatientId, tpi.input_status AS inputStatus, tpi.hospital_id AS hospitalId, @@ -148,6 +149,7 @@ SELECT tpi.id, tpi.hospitalization, + tpi.code, tpi.inpatient_id AS inpatientId, tpi.input_status AS inputStatus, tpi.hospital_id AS hospitalId, @@ -391,7 +393,7 @@ t.user_id + select + + distinct + + + from t_report_ocr + + + + + order by ${orderByClause} + + + + + delete from t_report_ocr + where id = #{id,jdbcType=BIGINT} + + + delete from t_report_ocr + + + + + + insert into t_report_ocr (id, code, ocr_channel, + created_at, updated_at, rec_status + ) + values (#{id,jdbcType=BIGINT}, #{code,jdbcType=VARCHAR}, #{ocrChannel,jdbcType=TINYINT}, + #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, #{recStatus,jdbcType=TINYINT} + ) + + + insert into t_report_ocr + + + id, + + + code, + + + ocr_channel, + + + created_at, + + + updated_at, + + + rec_status, + + + + + #{id,jdbcType=BIGINT}, + + + #{code,jdbcType=VARCHAR}, + + + #{ocrChannel,jdbcType=TINYINT}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{recStatus,jdbcType=TINYINT}, + + + + + + update t_report_ocr + + + id = #{record.id,jdbcType=BIGINT}, + + + code = #{record.code,jdbcType=VARCHAR}, + + + ocr_channel = #{record.ocrChannel,jdbcType=TINYINT}, + + + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{record.recStatus,jdbcType=TINYINT}, + + + + + + + + update t_report_ocr + set id = #{record.id,jdbcType=BIGINT}, + code = #{record.code,jdbcType=VARCHAR}, + ocr_channel = #{record.ocrChannel,jdbcType=TINYINT}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{record.recStatus,jdbcType=TINYINT} + + + + + + update t_report_ocr + + + code = #{code,jdbcType=VARCHAR}, + + + ocr_channel = #{ocrChannel,jdbcType=TINYINT}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{recStatus,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update t_report_ocr + set code = #{code,jdbcType=VARCHAR}, + ocr_channel = #{ocrChannel,jdbcType=TINYINT}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{recStatus,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/util/pom.xml b/util/pom.xml index e44755c6..7bc75312 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -38,6 +38,12 @@ javase 2.0 + + + com.aliyun.api.gateway + sdk-core-java + 1.1.6 + diff --git a/util/src/main/java/com/ccsens/util/ali/AliInstanceUtil.java b/util/src/main/java/com/ccsens/util/ali/AliInstanceUtil.java new file mode 100644 index 00000000..c1839d43 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/ali/AliInstanceUtil.java @@ -0,0 +1,27 @@ +package com.ccsens.util.ali; + +import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams; + +/** + * @description: + * @author: whj + * @time: 2021/4/25 16:53 + */ +public class AliInstanceUtil { + + private static String appKey = "203933478"; + private static String appSecret = "KrDev8GlVu6DyMOhjGSudngDZ8RsslYE"; + + /** + * + * @return + */ + public static HttpsApiClientlyocr_general_advanced getGeneralAdvancedHttps(){ + HttpClientBuilderParams httpsParam = new HttpClientBuilderParams(); + httpsParam.setAppKey(appKey); + httpsParam.setAppSecret(appSecret); + HttpsApiClientlyocr_general_advanced instance = HttpsApiClientlyocr_general_advanced.getInstance(); + instance.init(httpsParam); + return instance; + } +} diff --git a/util/src/main/java/com/ccsens/util/ali/Demolyocr_general_advanced.java b/util/src/main/java/com/ccsens/util/ali/Demolyocr_general_advanced.java new file mode 100644 index 00000000..98d141e0 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/ali/Demolyocr_general_advanced.java @@ -0,0 +1,168 @@ +// +// Created by fred on 2016/10/26. +// Copyright © 2016年 Alibaba. All rights reserved. +// + +package com.ccsens.util.ali; + +import com.alibaba.cloudapi.sdk.constant.SdkConstant; +import com.alibaba.cloudapi.sdk.model.ApiCallback; +import com.alibaba.cloudapi.sdk.model.ApiRequest; +import com.alibaba.cloudapi.sdk.model.ApiResponse; +import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams; +import java.io.IOException; + + + +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.TrustStrategy; +import javax.net.ssl.*; +import java.security.KeyStore; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class Demolyocr_general_advanced { + + + static{ + //HTTP Client init + HttpClientBuilderParams httpParam = new HttpClientBuilderParams(); + httpParam.setAppKey("203933478"); + httpParam.setAppSecret("KrDev8GlVu6DyMOhjGSudngDZ8RsslYE"); + HttpApiClientlyocr_general_advanced.getInstance().init(httpParam); + + + //HTTPS Client init + HttpClientBuilderParams httpsParam = new HttpClientBuilderParams(); + httpsParam.setAppKey("203933478"); + httpsParam.setAppSecret("KrDev8GlVu6DyMOhjGSudngDZ8RsslYE"); + + /** + * HTTPS request use DO_NOT_VERIFY mode only for demo + * Suggest verify for security + */ + //httpsParam.setRegistry(getNoVerifyRegistry()); + + HttpsApiClientlyocr_general_advanced.getInstance().init(httpsParam); + + + } + + + public static void ocrAdvancedHttpsTest(){ + HttpsApiClientlyocr_general_advanced.getInstance().ocrAdvanced("default".getBytes(SdkConstant.CLOUDAPI_ENCODING) , new ApiCallback() { + @Override + public void onFailure(ApiRequest request, Exception e) { + e.printStackTrace(); + } + + @Override + public void onResponse(ApiRequest request, ApiResponse response) { + try { + System.out.println(getResultString(response)); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + }); + } + + public static void ocrAdvancedHttpsSyncTest(){ + ApiResponse response = HttpsApiClientlyocr_general_advanced.getInstance().ocrAdvancedSyncMode("default".getBytes(SdkConstant.CLOUDAPI_ENCODING)); + try { + System.out.println(getResultString(response)); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + + + private static String getResultString(ApiResponse response) throws IOException { + StringBuilder result = new StringBuilder(); + result.append("Response from backend server").append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); + result.append("ResultCode:").append(SdkConstant.CLOUDAPI_LF).append(response.getCode()).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); + if(response.getCode() != 200){ + result.append("Error description:").append(response.getHeaders().get("X-Ca-Error-Message")).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); + } + + result.append("ResultBody:").append(SdkConstant.CLOUDAPI_LF).append(new String(response.getBody() , SdkConstant.CLOUDAPI_ENCODING)); + + return result.toString(); + } + + private static Registry getNoVerifyRegistry() { + RegistryBuilder registryBuilder = RegistryBuilder.create(); + try { + registryBuilder.register("http", PlainConnectionSocketFactory.INSTANCE).build(); + registryBuilder.register( + "https", + new SSLConnectionSocketFactory(new SSLContextBuilder().loadTrustMaterial( + KeyStore.getInstance(KeyStore.getDefaultType()), new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(), + new HostnameVerifier() { + @Override + public boolean verify(String paramString, SSLSession paramSSLSession) { + return true; + } + })); + + } catch (Exception e) { + throw new RuntimeException("HttpClientUtil init failure !", e); + } + return registryBuilder.build(); + } + + + private static void trustAllHttpsCertificates() throws Exception { + javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; + javax.net.ssl.TrustManager tm = new miTM(); + trustAllCerts[0] = tm; + javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext + .getInstance("SSL"); + sc.init(null, trustAllCerts, null); + javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc + .getSocketFactory()); + } + + static class miTM implements javax.net.ssl.TrustManager, + javax.net.ssl.X509TrustManager { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public boolean isServerTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + public boolean isClientTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException { + return; + } + + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException { + return; + } + } +} diff --git a/util/src/main/java/com/ccsens/util/ali/HttpApiClientlyocr_general_advanced.java b/util/src/main/java/com/ccsens/util/ali/HttpApiClientlyocr_general_advanced.java new file mode 100644 index 00000000..99c5d958 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/ali/HttpApiClientlyocr_general_advanced.java @@ -0,0 +1,34 @@ +// +// Created by fred on 2017/1/12. +// Copyright © 2016年 Alibaba. All rights reserved. +// + +package com.ccsens.util.ali; +import com.alibaba.cloudapi.sdk.client.ApacheHttpClient; +import com.alibaba.cloudapi.sdk.enums.Scheme; +import com.alibaba.cloudapi.sdk.enums.HttpMethod; +import com.alibaba.cloudapi.sdk.model.ApiRequest; +import com.alibaba.cloudapi.sdk.model.ApiResponse; +import com.alibaba.cloudapi.sdk.model.ApiCallback; +import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams; +import com.alibaba.cloudapi.sdk.enums.ParamPosition; +import com.alibaba.cloudapi.sdk.enums.WebSocketApiType; +import com.alibaba.fastjson.JSONObject; + + +public class HttpApiClientlyocr_general_advanced extends ApacheHttpClient{ + public final static String HOST = "ocrapi-advanced.taobao.com"; + static HttpApiClientlyocr_general_advanced instance = new HttpApiClientlyocr_general_advanced(); + public static HttpApiClientlyocr_general_advanced getInstance(){return instance;} + + public void init(HttpClientBuilderParams httpClientBuilderParams){ + httpClientBuilderParams.setScheme(Scheme.HTTP); + httpClientBuilderParams.setHost(HOST); + super.init(httpClientBuilderParams); + } + + + + + +} \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/ali/HttpsApiClientlyocr_general_advanced.java b/util/src/main/java/com/ccsens/util/ali/HttpsApiClientlyocr_general_advanced.java new file mode 100644 index 00000000..fa99dcbc --- /dev/null +++ b/util/src/main/java/com/ccsens/util/ali/HttpsApiClientlyocr_general_advanced.java @@ -0,0 +1,50 @@ +// +// Created by fred on 2017/1/12. +// Copyright © 2016年 Alibaba. All rights reserved. +// + +package com.ccsens.util.ali; + +import com.alibaba.cloudapi.sdk.client.ApacheHttpClient; +import com.alibaba.cloudapi.sdk.enums.HttpMethod; +import com.alibaba.cloudapi.sdk.enums.ParamPosition; +import com.alibaba.cloudapi.sdk.enums.Scheme; +import com.alibaba.cloudapi.sdk.model.ApiCallback; +import com.alibaba.cloudapi.sdk.model.ApiRequest; +import com.alibaba.cloudapi.sdk.model.ApiResponse; +import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams; +import com.alibaba.cloudapi.sdk.enums.WebSocketApiType; +import com.alibaba.fastjson.JSONObject; + +public class HttpsApiClientlyocr_general_advanced extends ApacheHttpClient{ + public final static String HOST = "ocrapi-advanced.taobao.com"; + static HttpsApiClientlyocr_general_advanced instance = new HttpsApiClientlyocr_general_advanced(); + public static HttpsApiClientlyocr_general_advanced getInstance(){return instance;} + + public void init(HttpClientBuilderParams httpClientBuilderParams){ + httpClientBuilderParams.setScheme(Scheme.HTTPS); + httpClientBuilderParams.setHost(HOST); + super.init(httpClientBuilderParams); + } + + + + public void ocrAdvanced(byte[] body , ApiCallback callback) { + String path = "/ocrservice/advanced"; + ApiRequest request = new ApiRequest(HttpMethod.POST_BODY , path, body); + + + + sendAsyncRequest(request , callback); + } + + public ApiResponse ocrAdvancedSyncMode(byte[] body) { + String path = "/ocrservice/advanced"; + ApiRequest request = new ApiRequest(HttpMethod.POST_BODY , path, body); + + + + return sendSyncRequest(request); + } + +} \ No newline at end of file