From f5fcf5bc8dcd1e1b42ffc7c9f099e58fbb2154a8 Mon Sep 17 00:00:00 2001 From: hyy-alt <1041001226@qq.com> Date: Thu, 1 Apr 2021 09:28:12 +0800 Subject: [PATCH 1/5] 4.1 --- .../src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java | 2 +- .../main/java/com/ccsens/tall/web/InputDocController.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java index 4380626c..f5270a59 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java @@ -59,7 +59,7 @@ public class InputDocDto { @ApiModelProperty("任务id") private Long taskId; @NotEmpty(message = "文档名称不能为空") - @ApiModelProperty("文件名称") + @ApiModelProperty("文档名称") private String[] fileName; } diff --git a/tall/src/main/java/com/ccsens/tall/web/InputDocController.java b/tall/src/main/java/com/ccsens/tall/web/InputDocController.java index 633673e5..c44a22f4 100644 --- a/tall/src/main/java/com/ccsens/tall/web/InputDocController.java +++ b/tall/src/main/java/com/ccsens/tall/web/InputDocController.java @@ -30,9 +30,11 @@ import java.util.List; @RestController @RequestMapping("/inputDoc") public class InputDocController { + @Autowired private IInputDocService iInputDocService; - @MustLogin + + /*@MustLogin @ApiOperation(value = "添加输入文档", notes = "1007:添加输入文档") @RequestMapping(value = "/addInputDoc", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public JsonResponse addInputDoc(@ApiParam @Validated @RequestBody QueryDto params) { @@ -40,7 +42,7 @@ public class InputDocController { //iInputDocService.addInputDoc(params.getParam(),params.getUserId()); log.info("添加输入文档"); return JsonResponse.newInstance().ok(); - } + }*/ @MustLogin @ApiOperation(value = "通过任务id查询输入文档", notes = "1007:通过任务id查询输入文档") From e4ec2e5e53785346511102a3571107a5e6140e00 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Thu, 1 Apr 2021 18:31:14 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/tcm/api/OcrController.java | 52 + .../ccsens/tcm/bean/dto/QuestionOcrDto.java | 27 + .../com/ccsens/tcm/bean/po/QuestionOcr.java | 139 +++ .../tcm/bean/po/QuestionOcrExample.java | 901 ++++++++++++++++++ .../com/ccsens/tcm/bean/vo/QuestionOcrVo.java | 45 + .../com/ccsens/tcm/bean/vo/QuestionVo.java | 2 + .../tcm/persist/dao/QuestionOcrDao.java | 20 + .../tcm/persist/mapper/QuestionOcrMapper.java | 30 + .../com/ccsens/tcm/service/IOcrService.java | 20 + .../com/ccsens/tcm/service/OcrService.java | 118 +++ .../java/com/ccsens/tcm/uitl/Constant.java | 7 + .../resources/mapper_dao/QuestionOcrDao.xml | 25 + .../resources/mapper_dao/ReportCodeDao.xml | 1 + .../mapper_raw/QuestionOcrMapper.xml | 305 ++++++ .../main/java/com/ccsens/util/CodeEnum.java | 6 + .../com/ccsens/util/RestTemplateUtil.java | 10 +- .../java/com/ccsens/util/baidu/BaiDuDto.java | 19 + .../java/com/ccsens/util/baidu/BaiDuUtil.java | 95 ++ .../java/com/ccsens/util/baidu/BaiDuVo.java | 33 + 19 files changed, 1853 insertions(+), 2 deletions(-) create mode 100644 tcm/src/main/java/com/ccsens/tcm/api/OcrController.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcr.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcrExample.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionOcrVo.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionOcrDao.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/persist/mapper/QuestionOcrMapper.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java create mode 100644 tcm/src/main/java/com/ccsens/tcm/service/OcrService.java create mode 100644 tcm/src/main/resources/mapper_dao/QuestionOcrDao.xml create mode 100644 tcm/src/main/resources/mapper_raw/QuestionOcrMapper.xml create mode 100644 util/src/main/java/com/ccsens/util/baidu/BaiDuDto.java create mode 100644 util/src/main/java/com/ccsens/util/baidu/BaiDuUtil.java create mode 100644 util/src/main/java/com/ccsens/util/baidu/BaiDuVo.java diff --git a/tcm/src/main/java/com/ccsens/tcm/api/OcrController.java b/tcm/src/main/java/com/ccsens/tcm/api/OcrController.java new file mode 100644 index 00000000..26f1c139 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/api/OcrController.java @@ -0,0 +1,52 @@ +package com.ccsens.tcm.api; + +import com.ccsens.cloudutil.annotation.MustLogin; +import com.ccsens.tcm.bean.dto.QuestionOcrDto; +import com.ccsens.tcm.bean.vo.InpatientVo; +import com.ccsens.tcm.bean.vo.QuestionOcrVo; +import com.ccsens.tcm.service.IOcrService; +import com.ccsens.tcm.uitl.Constant; +import com.ccsens.util.JsonResponse; +import com.ccsens.util.baidu.BaiDuDto; +import com.ccsens.util.baidu.BaiDuUtil; +import com.ccsens.util.baidu.BaiDuVo; +import com.ccsens.util.bean.dto.QueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @description: 图片识别文字 + * @author: whj + * @time: 2021/3/31 18:03 + */ +@Slf4j +@Api(tags = "图片识别文字") +@RestController +@RequestMapping("/ocr") +public class OcrController { + + @Resource + private IOcrService ocrService; + + @MustLogin + @ApiOperation(value = "图片文字识别",notes = "") + @RequestMapping(value="/general/basic",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse> queryInpatient(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { +// + log.info("图片文字识别请求:{}", params); + List words = ocrService.identifyWords(params.getParam(), params.getUserId()); + log.info("图片文字识别结束:{}", words); + return JsonResponse.newInstance().ok(words); + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java b/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java new file mode 100644 index 00000000..83f7711f --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java @@ -0,0 +1,27 @@ +package com.ccsens.tcm.bean.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @description: 通用文字识别 + * @author: whj + * @time: 2021/4/1 10:31 + */ +public class QuestionOcrDto { + + @ApiModel("报告单图片文字通用识别-请求") + @Data + public static class GeneralBasic{ + @ApiModelProperty("医院ID") + private Long hospitalId; + @ApiModelProperty("报告单类型") + @NotBlank + private String code; + @ApiModelProperty("图片路径") + private String url; + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcr.java b/tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcr.java new file mode 100644 index 00000000..821eaa44 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcr.java @@ -0,0 +1,139 @@ +package com.ccsens.tcm.bean.po; + +import java.io.Serializable; +import java.util.Date; + +public class QuestionOcr implements Serializable { + private Long id; + + private String code; + + private Integer sort; + + private Long hospital; + + private String start; + + private String end; + + private String remark; + + private Long operator; + + 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 Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Long getHospital() { + return hospital; + } + + public void setHospital(Long hospital) { + this.hospital = hospital; + } + + public String getStart() { + return start; + } + + public void setStart(String start) { + this.start = start == null ? null : start.trim(); + } + + public String getEnd() { + return end; + } + + public void setEnd(String end) { + this.end = end == null ? null : end.trim(); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Long getOperator() { + return operator; + } + + public void setOperator(Long operator) { + this.operator = operator; + } + + 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(", sort=").append(sort); + sb.append(", hospital=").append(hospital); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", remark=").append(remark); + sb.append(", operator=").append(operator); + 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/QuestionOcrExample.java b/tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcrExample.java new file mode 100644 index 00000000..d5383b79 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/po/QuestionOcrExample.java @@ -0,0 +1,901 @@ +package com.ccsens.tcm.bean.po; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class QuestionOcrExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public QuestionOcrExample() { + 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 andSortIsNull() { + addCriterion("sort is null"); + return (Criteria) this; + } + + public Criteria andSortIsNotNull() { + addCriterion("sort is not null"); + return (Criteria) this; + } + + public Criteria andSortEqualTo(Integer value) { + addCriterion("sort =", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortNotEqualTo(Integer value) { + addCriterion("sort <>", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortGreaterThan(Integer value) { + addCriterion("sort >", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortGreaterThanOrEqualTo(Integer value) { + addCriterion("sort >=", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortLessThan(Integer value) { + addCriterion("sort <", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortLessThanOrEqualTo(Integer value) { + addCriterion("sort <=", value, "sort"); + return (Criteria) this; + } + + public Criteria andSortIn(List values) { + addCriterion("sort in", values, "sort"); + return (Criteria) this; + } + + public Criteria andSortNotIn(List values) { + addCriterion("sort not in", values, "sort"); + return (Criteria) this; + } + + public Criteria andSortBetween(Integer value1, Integer value2) { + addCriterion("sort between", value1, value2, "sort"); + return (Criteria) this; + } + + public Criteria andSortNotBetween(Integer value1, Integer value2) { + addCriterion("sort not between", value1, value2, "sort"); + return (Criteria) this; + } + + public Criteria andHospitalIsNull() { + addCriterion("hospital is null"); + return (Criteria) this; + } + + public Criteria andHospitalIsNotNull() { + addCriterion("hospital is not null"); + return (Criteria) this; + } + + public Criteria andHospitalEqualTo(Long value) { + addCriterion("hospital =", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalNotEqualTo(Long value) { + addCriterion("hospital <>", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalGreaterThan(Long value) { + addCriterion("hospital >", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalGreaterThanOrEqualTo(Long value) { + addCriterion("hospital >=", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalLessThan(Long value) { + addCriterion("hospital <", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalLessThanOrEqualTo(Long value) { + addCriterion("hospital <=", value, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalIn(List values) { + addCriterion("hospital in", values, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalNotIn(List values) { + addCriterion("hospital not in", values, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalBetween(Long value1, Long value2) { + addCriterion("hospital between", value1, value2, "hospital"); + return (Criteria) this; + } + + public Criteria andHospitalNotBetween(Long value1, Long value2) { + addCriterion("hospital not between", value1, value2, "hospital"); + return (Criteria) this; + } + + public Criteria andStartIsNull() { + addCriterion("start is null"); + return (Criteria) this; + } + + public Criteria andStartIsNotNull() { + addCriterion("start is not null"); + return (Criteria) this; + } + + public Criteria andStartEqualTo(String value) { + addCriterion("start =", value, "start"); + return (Criteria) this; + } + + public Criteria andStartNotEqualTo(String value) { + addCriterion("start <>", value, "start"); + return (Criteria) this; + } + + public Criteria andStartGreaterThan(String value) { + addCriterion("start >", value, "start"); + return (Criteria) this; + } + + public Criteria andStartGreaterThanOrEqualTo(String value) { + addCriterion("start >=", value, "start"); + return (Criteria) this; + } + + public Criteria andStartLessThan(String value) { + addCriterion("start <", value, "start"); + return (Criteria) this; + } + + public Criteria andStartLessThanOrEqualTo(String value) { + addCriterion("start <=", value, "start"); + return (Criteria) this; + } + + public Criteria andStartLike(String value) { + addCriterion("start like", value, "start"); + return (Criteria) this; + } + + public Criteria andStartNotLike(String value) { + addCriterion("start not like", value, "start"); + return (Criteria) this; + } + + public Criteria andStartIn(List values) { + addCriterion("start in", values, "start"); + return (Criteria) this; + } + + public Criteria andStartNotIn(List values) { + addCriterion("start not in", values, "start"); + return (Criteria) this; + } + + public Criteria andStartBetween(String value1, String value2) { + addCriterion("start between", value1, value2, "start"); + return (Criteria) this; + } + + public Criteria andStartNotBetween(String value1, String value2) { + addCriterion("start not between", value1, value2, "start"); + return (Criteria) this; + } + + public Criteria andEndIsNull() { + addCriterion("end is null"); + return (Criteria) this; + } + + public Criteria andEndIsNotNull() { + addCriterion("end is not null"); + return (Criteria) this; + } + + public Criteria andEndEqualTo(String value) { + addCriterion("end =", value, "end"); + return (Criteria) this; + } + + public Criteria andEndNotEqualTo(String value) { + addCriterion("end <>", value, "end"); + return (Criteria) this; + } + + public Criteria andEndGreaterThan(String value) { + addCriterion("end >", value, "end"); + return (Criteria) this; + } + + public Criteria andEndGreaterThanOrEqualTo(String value) { + addCriterion("end >=", value, "end"); + return (Criteria) this; + } + + public Criteria andEndLessThan(String value) { + addCriterion("end <", value, "end"); + return (Criteria) this; + } + + public Criteria andEndLessThanOrEqualTo(String value) { + addCriterion("end <=", value, "end"); + return (Criteria) this; + } + + public Criteria andEndLike(String value) { + addCriterion("end like", value, "end"); + return (Criteria) this; + } + + public Criteria andEndNotLike(String value) { + addCriterion("end not like", value, "end"); + return (Criteria) this; + } + + public Criteria andEndIn(List values) { + addCriterion("end in", values, "end"); + return (Criteria) this; + } + + public Criteria andEndNotIn(List values) { + addCriterion("end not in", values, "end"); + return (Criteria) this; + } + + public Criteria andEndBetween(String value1, String value2) { + addCriterion("end between", value1, value2, "end"); + return (Criteria) this; + } + + public Criteria andEndNotBetween(String value1, String value2) { + addCriterion("end not between", value1, value2, "end"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andOperatorIsNull() { + addCriterion("operator is null"); + return (Criteria) this; + } + + public Criteria andOperatorIsNotNull() { + addCriterion("operator is not null"); + return (Criteria) this; + } + + public Criteria andOperatorEqualTo(Long value) { + addCriterion("operator =", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotEqualTo(Long value) { + addCriterion("operator <>", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThan(Long value) { + addCriterion("operator >", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThanOrEqualTo(Long value) { + addCriterion("operator >=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThan(Long value) { + addCriterion("operator <", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThanOrEqualTo(Long value) { + addCriterion("operator <=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorIn(List values) { + addCriterion("operator in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotIn(List values) { + addCriterion("operator not in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorBetween(Long value1, Long value2) { + addCriterion("operator between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotBetween(Long value1, Long value2) { + addCriterion("operator not between", value1, value2, "operator"); + 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/QuestionOcrVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionOcrVo.java new file mode 100644 index 00000000..92a440c7 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionOcrVo.java @@ -0,0 +1,45 @@ +package com.ccsens.tcm.bean.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * @description: + * @author: whj + * @time: 2021/4/1 10:34 + */ +public class QuestionOcrVo { + @ApiModel("报告单图片文字通用识别-返回") + @Data + public static class GeneralBasic{ + @ApiModelProperty("报告单类型") + private String code; + @ApiModelProperty("排序") + private Integer sort; + @ApiModelProperty("试题ID") + private Long questionId; + @ApiModelProperty("答案") + private String content; + } + + @ApiModel("orc规则") + @Data + public static class OcrRule{ + @ApiModelProperty("规则ID") + private Long id; + @ApiModelProperty("code") + private String code; + @ApiModelProperty("排序") + private Integer sort; + @ApiModelProperty("医院ID") + private Long hospital; + @ApiModelProperty("试题ID") + private Long questionId; + @ApiModelProperty("开始标识") + private String start; + @ApiModelProperty("结束标识") + private String end; + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java index 9e793ac5..11cb2768 100644 --- a/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java @@ -101,6 +101,8 @@ public class QuestionVo { private String code; @ApiModelProperty("名称") private String name; + @ApiModelProperty("记录类型 0:仅手动输入1:手动输入+图片识别") + private Byte recordType; @ApiModelProperty("是否为必做 0否 1是") private byte must; @ApiModelProperty("排序") diff --git a/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionOcrDao.java b/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionOcrDao.java new file mode 100644 index 00000000..d7982196 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionOcrDao.java @@ -0,0 +1,20 @@ +package com.ccsens.tcm.persist.dao; + +import com.ccsens.tcm.bean.vo.QuestionOcrVo; +import com.ccsens.tcm.persist.mapper.QuestionOcrMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author whj + */ +public interface QuestionOcrDao extends QuestionOcrMapper { + /** + * 查询识别规则 + * @param hospitalId 医院ID + * @param code 类型 + * @return 规则 + */ + List queryRules(@Param("hospitalId") Long hospitalId, @Param("code") String code); +} diff --git a/tcm/src/main/java/com/ccsens/tcm/persist/mapper/QuestionOcrMapper.java b/tcm/src/main/java/com/ccsens/tcm/persist/mapper/QuestionOcrMapper.java new file mode 100644 index 00000000..4068c1a1 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/persist/mapper/QuestionOcrMapper.java @@ -0,0 +1,30 @@ +package com.ccsens.tcm.persist.mapper; + +import com.ccsens.tcm.bean.po.QuestionOcr; +import com.ccsens.tcm.bean.po.QuestionOcrExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface QuestionOcrMapper { + long countByExample(QuestionOcrExample example); + + int deleteByExample(QuestionOcrExample example); + + int deleteByPrimaryKey(Long id); + + int insert(QuestionOcr record); + + int insertSelective(QuestionOcr record); + + List selectByExample(QuestionOcrExample example); + + QuestionOcr selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") QuestionOcr record, @Param("example") QuestionOcrExample example); + + int updateByExample(@Param("record") QuestionOcr record, @Param("example") QuestionOcrExample example); + + int updateByPrimaryKeySelective(QuestionOcr record); + + int updateByPrimaryKey(QuestionOcr record); +} \ No newline at end of file diff --git a/tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java b/tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java new file mode 100644 index 00000000..5b3386c9 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java @@ -0,0 +1,20 @@ +package com.ccsens.tcm.service; + + +import com.ccsens.tcm.bean.dto.QuestionOcrDto; +import com.ccsens.tcm.bean.vo.QuestionOcrVo; + +import java.util.List; + +/** + * @author whj + */ +public interface IOcrService { + /** + * 文字识别 + * @param param 参数 + * @param userId 用户ID + * @return words + */ + List identifyWords(QuestionOcrDto.GeneralBasic param, Long userId); +} diff --git a/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java b/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java new file mode 100644 index 00000000..4fc2fb28 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/service/OcrService.java @@ -0,0 +1,118 @@ +package com.ccsens.tcm.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.ccsens.tcm.bean.dto.QuestionOcrDto; +import com.ccsens.tcm.bean.po.QuestionOcr; +import com.ccsens.tcm.bean.po.QuestionOcrExample; +import com.ccsens.tcm.bean.vo.QuestionOcrVo; +import com.ccsens.tcm.persist.dao.QuestionOcrDao; +import com.ccsens.tcm.uitl.Constant; +import com.ccsens.util.baidu.BaiDuDto; +import com.ccsens.util.baidu.BaiDuUtil; +import com.ccsens.util.baidu.BaiDuVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: 图像识别 + * @author: whj + * @time: 2021/4/1 10:14 + */ +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class OcrService implements IOcrService { + + @Resource + private QuestionOcrDao questionOcrDao; + + @Override + public List identifyWords(QuestionOcrDto.GeneralBasic generalBasic, Long userId) { + List vos = new ArrayList<>(); + BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic(); + basic.setUrl(generalBasic.getUrl()); + BaiDuVo.GeneralBasic words = BaiDuUtil.generalBasic(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<>(); + 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(); + + if (start == null) { + // 不知道这种场景 + } else if (start.containsKey(Constant.BaiDu.NUM)) { + // 包含读取第几个 + builder = getContent(words, keyMap, start); + } else { + builder = getContent(words, start, end); + } + + QuestionOcrVo.GeneralBasic vo = new QuestionOcrVo.GeneralBasic(); + vo.setQuestionId(rule.getQuestionId()); + vo.setCode(rule.getCode()); + vo.setSort(rule.getSort()); + vo.setContent(builder == null ? "" : builder.toString()); + vos.add(vo); + }); + + return vos; + } + + private StringBuilder getContent(BaiDuVo.GeneralBasic words, 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()); + } + } 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()); + return builder; + } + } + } + return builder; + } + + private StringBuilder getContent(BaiDuVo.GeneralBasic words, 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))) { + builder.delete(0, builder.length()); + builder.append(wordStr); + } else if (end != null && wordStr.startsWith(end.getString(Constant.BaiDu.KEY))) { + break; + } else { + builder.append(wordStr); + } + + } + return builder; + } +} 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 2f970339..9a7efbff 100644 --- a/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java +++ b/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java @@ -69,4 +69,11 @@ public class Constant { public static final String UPLOAD_URL = "upload"; } + public static class BaiDu{ + public static final String APP_KEY = "F43SLi3hDra3EgWiSi8bIH8c"; + public static final String SECRET_KEY = "wGhbTXGsrbxfuCQT7WyLDndYRxrSYqbD"; + public static final String KEY = "key"; + public static final String NUM = "num"; + } + } diff --git a/tcm/src/main/resources/mapper_dao/QuestionOcrDao.xml b/tcm/src/main/resources/mapper_dao/QuestionOcrDao.xml new file mode 100644 index 00000000..770dc5ff --- /dev/null +++ b/tcm/src/main/resources/mapper_dao/QuestionOcrDao.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file diff --git a/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml b/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml index 0e86b75b..c4d93f35 100644 --- a/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml +++ b/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml @@ -116,6 +116,7 @@ c1.sort as fSort, c1.remark as fRemark, c1.report_type as fReportType, + c1.record_type as recordType, c2.id as sId, c2.code as sCode, c2.`name` as sName, diff --git a/tcm/src/main/resources/mapper_raw/QuestionOcrMapper.xml b/tcm/src/main/resources/mapper_raw/QuestionOcrMapper.xml new file mode 100644 index 00000000..234718b9 --- /dev/null +++ b/tcm/src/main/resources/mapper_raw/QuestionOcrMapper.xml @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, code, sort, hospital, start, end, remark, operator, created_at, updated_at, rec_status + + + + + delete from t_question_ocr + where id = #{id,jdbcType=BIGINT} + + + delete from t_question_ocr + + + + + + insert into t_question_ocr (id, code, sort, + hospital, start, end, + remark, operator, created_at, + updated_at, rec_status) + values (#{id,jdbcType=BIGINT}, #{code,jdbcType=VARCHAR}, #{sort,jdbcType=INTEGER}, + #{hospital,jdbcType=BIGINT}, #{start,jdbcType=VARCHAR}, #{end,jdbcType=VARCHAR}, + #{remark,jdbcType=VARCHAR}, #{operator,jdbcType=BIGINT}, #{createdAt,jdbcType=TIMESTAMP}, + #{updatedAt,jdbcType=TIMESTAMP}, #{recStatus,jdbcType=TINYINT}) + + + insert into t_question_ocr + + + id, + + + code, + + + sort, + + + hospital, + + + start, + + + end, + + + remark, + + + operator, + + + created_at, + + + updated_at, + + + rec_status, + + + + + #{id,jdbcType=BIGINT}, + + + #{code,jdbcType=VARCHAR}, + + + #{sort,jdbcType=INTEGER}, + + + #{hospital,jdbcType=BIGINT}, + + + #{start,jdbcType=VARCHAR}, + + + #{end,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{operator,jdbcType=BIGINT}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{recStatus,jdbcType=TINYINT}, + + + + + + update t_question_ocr + + + id = #{record.id,jdbcType=BIGINT}, + + + code = #{record.code,jdbcType=VARCHAR}, + + + sort = #{record.sort,jdbcType=INTEGER}, + + + hospital = #{record.hospital,jdbcType=BIGINT}, + + + start = #{record.start,jdbcType=VARCHAR}, + + + end = #{record.end,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + operator = #{record.operator,jdbcType=BIGINT}, + + + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{record.recStatus,jdbcType=TINYINT}, + + + + + + + + update t_question_ocr + set id = #{record.id,jdbcType=BIGINT}, + code = #{record.code,jdbcType=VARCHAR}, + sort = #{record.sort,jdbcType=INTEGER}, + hospital = #{record.hospital,jdbcType=BIGINT}, + start = #{record.start,jdbcType=VARCHAR}, + end = #{record.end,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + operator = #{record.operator,jdbcType=BIGINT}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{record.recStatus,jdbcType=TINYINT} + + + + + + update t_question_ocr + + + code = #{code,jdbcType=VARCHAR}, + + + sort = #{sort,jdbcType=INTEGER}, + + + hospital = #{hospital,jdbcType=BIGINT}, + + + start = #{start,jdbcType=VARCHAR}, + + + end = #{end,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + operator = #{operator,jdbcType=BIGINT}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{recStatus,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update t_question_ocr + set code = #{code,jdbcType=VARCHAR}, + sort = #{sort,jdbcType=INTEGER}, + hospital = #{hospital,jdbcType=BIGINT}, + start = #{start,jdbcType=VARCHAR}, + end = #{end,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + operator = #{operator,jdbcType=BIGINT}, + 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/src/main/java/com/ccsens/util/CodeEnum.java b/util/src/main/java/com/ccsens/util/CodeEnum.java index b7817af2..2a1ac73f 100644 --- a/util/src/main/java/com/ccsens/util/CodeEnum.java +++ b/util/src/main/java/com/ccsens/util/CodeEnum.java @@ -9,6 +9,8 @@ public enum CodeEnum { */ SUCCESS(200, "ok", true), SYS_ERROR(500, "网络繁忙,请您稍后重试", false), + THIRD_ERROR(-1, "调用第三方刚接口异常", false), + FILE_FORMAT_ERROR(1, "文件格式错误", true), AUDITED(2, "已经审核通过,不重复提交。", true), POSITION_NO_FOUND(3, "未找到对应职务,请重新选择职务。", true), @@ -241,5 +243,9 @@ public enum CodeEnum { private Integer code; private String msg; private boolean success; + + public void setMsg(String msg) { + this.msg = msg; + } } diff --git a/util/src/main/java/com/ccsens/util/RestTemplateUtil.java b/util/src/main/java/com/ccsens/util/RestTemplateUtil.java index ff73a2ab..4217d105 100644 --- a/util/src/main/java/com/ccsens/util/RestTemplateUtil.java +++ b/util/src/main/java/com/ccsens/util/RestTemplateUtil.java @@ -78,8 +78,14 @@ public class RestTemplateUtil { } public static String postUrlEncode(String url, Object params) { log.info("请求路径:{},请求参数:{}", url, params); - JSONObject json = JSON.parseObject(JSON.toJSONString(params)); - MultiValueMap paramMap = transMultiValueMap(json); + MultiValueMap paramMap; + if (params == null) { + paramMap = new LinkedMultiValueMap<>(); + } else { + JSONObject json = JSON.parseObject(JSON.toJSONString(params)); + paramMap = transMultiValueMap(json); + } + HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity formEntity = new HttpEntity<>(paramMap, headers); diff --git a/util/src/main/java/com/ccsens/util/baidu/BaiDuDto.java b/util/src/main/java/com/ccsens/util/baidu/BaiDuDto.java new file mode 100644 index 00000000..e336a488 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/baidu/BaiDuDto.java @@ -0,0 +1,19 @@ +package com.ccsens.util.baidu; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * @description: + * @author: whj + * @time: 2021/3/31 16:39 + */ +public class BaiDuDto { + + @ApiModel("通用文字识别(标准版)-请求参数") + @Data + public static class GeneralBasic{ + private String image; + private String url; + } +} diff --git a/util/src/main/java/com/ccsens/util/baidu/BaiDuUtil.java b/util/src/main/java/com/ccsens/util/baidu/BaiDuUtil.java new file mode 100644 index 00000000..1dc4b127 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/baidu/BaiDuUtil.java @@ -0,0 +1,95 @@ +package com.ccsens.util.baidu; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.ccsens.util.CodeEnum; +import com.ccsens.util.RedisUtil; +import com.ccsens.util.RestTemplateUtil; +import com.ccsens.util.exception.BaseException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * @description: 百度API + * @author: whj + * @time: 2021/3/31 15:30 + */ +@Component +@Slf4j +public class BaiDuUtil { + + @Resource + private RedisUtil redisUtil; + private static BaiDuUtil util; + /**token_appKey*/ + private static final String tokenKey = "baidu_token_"; + + private static final String authUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}"; + private static final String generalBasicUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}"; + + @PostConstruct + public void init(){ + util = this; + util.redisUtil = this.redisUtil; + } + + /** + * 获取token + * @param appKey appKey + * @param secretKey secretKey + * @return token + */ + public static String getToken(String appKey, String secretKey){ + log.info("获取百度认证:{},{}", appKey, secretKey); + String key = tokenKey + appKey; + String token = (String) util.redisUtil.get(key); + log.info("缓存token:{}", token); + if (StrUtil.isNotEmpty(token)) { + return token; + } + String url = StrUtil.format(authUrl, appKey, secretKey); + String result = RestTemplateUtil.postUrlEncode(url, null); + log.info("获取百度认证:{}", result); + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey(Code.ERROR)) { + log.info("获取token失败"); + CodeEnum thirdError = CodeEnum.THIRD_ERROR; + thirdError.setMsg(result); + throw new BaseException(thirdError); + } + token = json.getString(Code.ACCESS_TOKEN); + // 有效期,减10分钟 + int expiresTime = json.getIntValue(Code.EXPIRES_TIME) - 10*60; + util.redisUtil.set(key, token, expiresTime); + return token; + } + + + public static BaiDuVo.GeneralBasic generalBasic(String appKey, String secretKey, BaiDuDto.GeneralBasic basic) { + String token = getToken(appKey, secretKey); + String url = StrUtil.format(generalBasicUrl, token); +// String result = RestTemplateUtil.postBody(url, basic); + String result = RestTemplateUtil.postUrlEncode(url, basic); + log.info("调用通用文字识别(标准版)结果:{}", result); + if (result.contains(Code.GENERAL_BASIC_ERROR)) { + CodeEnum thirdError = CodeEnum.THIRD_ERROR; + thirdError.setMsg(result); + throw new BaseException(thirdError); + } + BaiDuVo.GeneralBasic basicVo = JSONObject.parseObject(result, BaiDuVo.GeneralBasic.class); + return basicVo; + } + + private static class Code{ + private final static String ERROR = "error"; + private final static String GENERAL_BASIC_ERROR = "error_code"; + private final static String ERROR_DESC = "error_description"; + private final static String ACCESS_TOKEN = "access_token"; + private final static String EXPIRES_TIME = "expires_in"; + + } + +} diff --git a/util/src/main/java/com/ccsens/util/baidu/BaiDuVo.java b/util/src/main/java/com/ccsens/util/baidu/BaiDuVo.java new file mode 100644 index 00000000..4c722df6 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/baidu/BaiDuVo.java @@ -0,0 +1,33 @@ +package com.ccsens.util.baidu; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.util.List; + +/** + * @description: + * @author: whj + * @time: 2021/3/31 16:11 + */ +public class BaiDuVo { + + @ApiModel("通用文字识别(标准版)") + @Data + public static class GeneralBasic{ + @JSONField(name="log_id") + private String logId; + @JSONField(name="words_result") + private List wordsResult; + @JSONField(name="words_result_num") + private int wordsResultNum; + } + + @Data + @ApiModel("文字识别-文字") + public static class GeneralWord{ + private String words; + } +} From 0f8efeddc84c5813005dfbc32930b4d68f11c5f9 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Thu, 1 Apr 2021 23:44:07 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ocr=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tcm/src/main/resources/application-green.yml | 4 ++-- tcm/src/main/resources/mapper_dao/ReportCodeDao.xml | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tcm/src/main/resources/application-green.yml b/tcm/src/main/resources/application-green.yml index 287cc757..8f683a2a 100644 --- a/tcm/src/main/resources/application-green.yml +++ b/tcm/src/main/resources/application-green.yml @@ -36,8 +36,8 @@ eureka: ip-address: 49.232.6.143 file: path: /home/cloud/tcm/uploads/ - domain: https://www.sxwikionline.com/gateway/tcm/ - imgDomain: https://www.sxwikionline.com/gateway/tcm/uploads/ + domain: http://sxzxyzzlm.tall.wiki/gateway/tcm/ + imgDomain: http://sxzxyzzlm.tall.wiki/gateway/tcm/uploads/ day: one: 9 two: 30 diff --git a/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml b/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml index c4d93f35..7d68c55b 100644 --- a/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml +++ b/tcm/src/main/resources/mapper_dao/ReportCodeDao.xml @@ -96,12 +96,14 @@ + + @@ -116,14 +118,15 @@ c1.sort as fSort, c1.remark as fRemark, c1.report_type as fReportType, - c1.record_type as recordType, + c1.record_type as fRecordType, c2.id as sId, c2.code as sCode, c2.`name` as sName, c2.must as sMust, c2.sort as sSort, c2.remark as sRemark, - c2.report_type as sReportType + c2.report_type as sReportType, + c2.record_type as sRecordType FROM t_report_code c1 LEFT JOIN ( From 42f742b4d1fdc70bda3ea6fd9e5ca7fa53f52585 Mon Sep 17 00:00:00 2001 From: hyy-alt <1041001226@qq.com> Date: Fri, 2 Apr 2021 09:36:25 +0800 Subject: [PATCH 4/5] 4.2 --- tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java index f5270a59..2d44b92c 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/InputDocDto.java @@ -93,8 +93,8 @@ public class InputDocDto { @Data @ApiModel("修改上传文件的备注信息") public static class UpdateDocOfRemark{ - @NotNull(message = "请选择要删除的备注信息") - @ApiModelProperty("文档上传记录id") + @NotNull(message = "请选择要修改输入文件上传id") + @ApiModelProperty("输入文件上传id") private Long recordId; @ApiModelProperty("备注信息") private String remark; From afee4601fae8928ee4b57bc662078880aaf5bc22 Mon Sep 17 00:00:00 2001 From: wang0018 <1007152140@qq.com> Date: Fri, 2 Apr 2021 11:20:03 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/tall/bean/dto/RoleDto.java | 18 ++ .../java/com/ccsens/tall/bean/vo/RoleVo.java | 3 + .../ccsens/tall/persist/dao/ProRoleDao.java | 8 +- .../com/ccsens/tall/service/ExcelService.java | 95 ++++--- .../ccsens/tall/service/IProRoleService.java | 4 + .../ccsens/tall/service/ProRoleService.java | 255 +++++++++++++++++- .../tall/service/TaskDeliverService.java | 1 + .../com/ccsens/tall/web/RoleController.java | 16 ++ .../main/resources/mapper_dao/ProRoleDao.xml | 17 +- .../main/java/com/ccsens/util/CodeEnum.java | 4 + 10 files changed, 362 insertions(+), 59 deletions(-) diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java index 7a14081d..0573485a 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java @@ -79,4 +79,22 @@ public class RoleDto { @ApiModelProperty("项目id") private Long projectId; } + @Data + @ApiModel("修改角色是否展示") + public static class QueryRoleIsShows { + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("角色id") + private List roleIds; + @ApiModelProperty("是否展示 true是展示,false是删除不展示") + private Boolean isShow; + } + @Data + @ApiModel("为角色排序得集合") + public static class UpRoleShowsOrder { + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("按照展示的排序进行排序号") + private List roleIds; + } } diff --git a/tall/src/main/java/com/ccsens/tall/bean/vo/RoleVo.java b/tall/src/main/java/com/ccsens/tall/bean/vo/RoleVo.java index f92d163a..e28a5382 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/vo/RoleVo.java +++ b/tall/src/main/java/com/ccsens/tall/bean/vo/RoleVo.java @@ -1,5 +1,6 @@ package com.ccsens.tall.bean.vo; +import com.sun.org.apache.xpath.internal.operations.Bool; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -36,6 +37,8 @@ public class RoleVo { private String name; @ApiModelProperty("角色排序") private Integer sequence; + @ApiModelProperty("是否是pm 是pm;true 不是pm; false ") + private Boolean isPM; } @Data @ApiModel("添加时返回成员信息") diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/ProRoleDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/ProRoleDao.java index b9e509f7..ca3fe9e5 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/ProRoleDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/ProRoleDao.java @@ -72,18 +72,18 @@ public interface ProRoleDao extends ProRoleMapper{ /** * 查询已经存在的角色 - * @param projectId + * @param memberId * @return */ - List queryRoleShowslistAfter(Long projectId); + List queryRoleShowslistAfter(Long memberId); /** * 查询未添加的角色 - * @param memberId + * @param projectId * @param listBeforeId * @return */ - List queryRoleShowslistBefore(Long memberId, List listBeforeId); + List queryRoleShowslistBefore(Long projectId, List listBeforeId); // /** // * 查找项目下的所有成员的名字用“,”分隔 diff --git a/tall/src/main/java/com/ccsens/tall/service/ExcelService.java b/tall/src/main/java/com/ccsens/tall/service/ExcelService.java index 710fac62..14f29455 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ExcelService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ExcelService.java @@ -8,6 +8,7 @@ import com.ccsens.tall.bean.dto.WpsDto; import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.persist.dao.*; +import com.ccsens.tall.persist.mapper.ProTaskDeliverMapper; import com.ccsens.util.*; import com.ccsens.util.cron.CronConstant; import com.ccsens.util.cron.NatureToDate; @@ -82,6 +83,8 @@ public class ExcelService implements IExcelService { private ProRoleDao proRoleDao; @Resource private ProPluginConfigDao proPluginConfigDao; + @Resource + private ProTaskDeliverMapper proTaskDeliverMapper; @Override @@ -1001,6 +1004,7 @@ public class ExcelService implements IExcelService { // else { // //不是分组任务,直接添加交付物 readDeliverSheet(deliver, xssfWorkbook, taskDetail.getId()); + // } //添加任务 proTaskDetailService.saveTaskDetail(taskDetail); @@ -1178,45 +1182,60 @@ public class ExcelService implements IExcelService { */ @Override public void readDeliverSheet(String deliverCell, XSSFWorkbook xssfWorkbook, Long taskId) { - if (StrUtil.isNotEmpty(deliverCell)) { - String str = ""; - if (deliverCell.length() > 4) { - str = deliverCell.substring(0, 3); - } - if ("关联表".equalsIgnoreCase(str)) { - String subStr = deliverCell.substring(4); - XSSFSheet subSheet = xssfWorkbook.getSheet(subStr); - if(ObjectUtil.isNull(subSheet)){ - throw new BaseException(CodeEnum.WBS_NOT_SUB_TASK); - } - for (int i = 2; i <= subSheet.getLastRowNum(); i++) { - XSSFRow row = subSheet.getRow(i); - if(ObjectUtil.isNull(row)){ - continue; - } - String deliver = ExcelUtil.getCellValue(row.getCell(1)); - if (StrUtil.isNotEmpty(deliver)) { - ProTaskDeliver taskDeliver = new ProTaskDeliver(); - taskDeliver.setId(snowflake.nextId()); - taskDeliver.setName(deliver); - taskDeliver.setTaskDetailId(taskId); - taskDeliver.setIsInput(0); - taskDeliver.setIsFinal(0); - if (i == subSheet.getLastRowNum()) { - taskDeliver.setIsFinal(1); - } - taskDeliverService.saveDeliver(taskDeliver); - } +// if (StrUtil.isNotEmpty(deliverCell)) { +// String str = ""; +// if (deliverCell.length() > 4) { +// str = deliverCell.substring(0, 3); +// } +// if ("关联表".equalsIgnoreCase(str)) { +// String subStr = deliverCell.substring(4); +// XSSFSheet subSheet = xssfWorkbook.getSheet(subStr); +// if(ObjectUtil.isNull(subSheet)){ +// throw new BaseException(CodeEnum.WBS_NOT_SUB_TASK); +// } +// for (int i = 2; i <= subSheet.getLastRowNum(); i++) { +// XSSFRow row = subSheet.getRow(i); +// if(ObjectUtil.isNull(row)){ +// continue; +// } +// String deliver = ExcelUtil.getCellValue(row.getCell(1)); +// if (StrUtil.isNotEmpty(deliver)) { +// ProTaskDeliver taskDeliver = new ProTaskDeliver(); +// taskDeliver.setId(snowflake.nextId()); +// taskDeliver.setName(deliver); +// taskDeliver.setTaskDetailId(taskId); +// taskDeliver.setIsInput(0); +// taskDeliver.setIsFinal(0); +// if (i == subSheet.getLastRowNum()) { +// taskDeliver.setIsFinal(1); +// } +// taskDeliverService.saveDeliver(taskDeliver); +// } +// } +// } else { +// ProTaskDeliver taskDeliver = new ProTaskDeliver(); +// taskDeliver.setId(snowflake.nextId()); +// taskDeliver.setTaskDetailId(taskId); +// taskDeliver.setName(deliverCell); +// taskDeliver.setIsInput(0); +// taskDeliver.setIsFinal(1); +// taskDeliverService.saveDeliver(taskDeliver); +// } +// } + String regex=",|,|;|:|;|:|、|。"; + deliverCell= deliverCell.replace("\n","").replace("\r",""); + String[] fileNames= deliverCell.split(regex); + if(fileNames.length>0){ + for (int i = 0; i < fileNames.length; i++) { + if(StringUtils.isNotBlank(fileNames[i])){ + ProTaskDeliver proTaskDeliver=new ProTaskDeliver(); + proTaskDeliver.setName(fileNames[i].trim()); + proTaskDeliver.setId(snowflake.nextId()); + proTaskDeliver.setTaskDetailId(taskId); + proTaskDeliverMapper.insertSelective(proTaskDeliver); } - } else { - ProTaskDeliver taskDeliver = new ProTaskDeliver(); - taskDeliver.setId(snowflake.nextId()); - taskDeliver.setTaskDetailId(taskId); - taskDeliver.setName(deliverCell); - taskDeliver.setIsInput(0); - taskDeliver.setIsFinal(1); - taskDeliverService.saveDeliver(taskDeliver); } + } } @@ -1240,7 +1259,7 @@ public class ExcelService implements IExcelService { throw new BaseException(CodeEnum.NOT_ROW.addMsg(sheet.getSheetName() + (2))); } - for (int i = 2; i < sheet.getLastRowNum() + 1; i++) { + for (int i = 3; i < sheet.getLastRowNum() + 1; i++) { List taskNameList = null; XSSFRow pluginRow = sheet.getRow(i); if(ObjectUtil.isNull(pluginRow)){ diff --git a/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java b/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java index 18d1299a..3c9df8fd 100644 --- a/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java +++ b/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java @@ -66,4 +66,8 @@ public interface IProRoleService { * @return */ RoleVo.JueSeByProIdLists queryRoleShows(QueryDto param); + + void queryRoleIsShows(QueryDto param); + + void upRoleShowsOrder(QueryDto param); } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java index 6e7a55be..dc79d93b 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java @@ -12,16 +12,14 @@ import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.RoleVo; import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.persist.dao.*; -import com.ccsens.tall.persist.mapper.ProMemberMapper; -import com.ccsens.tall.persist.mapper.ProMemberRoleMapper; -import com.ccsens.tall.persist.mapper.ProMemberRoleShowMapper; -import com.ccsens.tall.persist.mapper.ProUserAttentionRoleMapper; +import com.ccsens.tall.persist.mapper.*; import com.ccsens.util.CodeEnum; import com.ccsens.util.WebConstant; import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.util.exception.BaseException; import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import org.aspectj.apache.bcel.classfile.Code; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -29,6 +27,7 @@ import org.w3c.dom.ls.LSInput; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -71,6 +70,10 @@ public class ProRoleService implements IProRoleService { private ProMemberMapper proMemberMapper; @Resource private ProMemberRoleMapper proMemberRoleMapper; + @Resource + private ProRoleMapper proRoleMapper; + @Resource + private ProRoleExcludeMapper proRoleExcludeMapper; @Override public void saveProRole(ProRole proRole) { proRoleDao.insertSelective(proRole); @@ -265,6 +268,7 @@ public class ProRoleService implements IProRoleService { proMemberRoleShowExample.createCriteria().andMemberIdEqualTo(memberId).andRecStatusEqualTo((byte)0); List proMemberRoleShows = proMemberRoleShowMapper.selectByExample(proMemberRoleShowExample); if(CollectionUtil.isEmpty(proMemberRoleShows)){ + Integer[] seq=new Integer[]{0}; //需要从原表中导入数据 ProMemberRoleExample proMemberRoleExample=new ProMemberRoleExample(); proMemberRoleExample.createCriteria().andMemberIdEqualTo(memberId).andRecStatusEqualTo((byte)0); @@ -272,7 +276,7 @@ public class ProRoleService implements IProRoleService { if(CollectionUtil.isNotEmpty(proMemberRoles)){ ProMemberRoleShow proMemberRoleShow=new ProMemberRoleShow(); Long finalMemberId = memberId; - Integer[] seq=new Integer[]{0}; + proMemberRoles.forEach(action->{ proMemberRoleShow.setId(action.getId()); proMemberRoleShow.setMemberId(finalMemberId); @@ -281,6 +285,68 @@ public class ProRoleService implements IProRoleService { proMemberRoleShowMapper.insertSelective(proMemberRoleShow); }); } + //这里插入项目经理 + + + //查一下项目经理的角色id, + ProRoleExample proRoleExample=new ProRoleExample(); + proRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andNameEqualTo(WebConstant.ROLE_NAME.PM.value).andParentIdEqualTo(0L).andProjectIdEqualTo(projectId); + //一级角色项目经理 + List jili=proRoleMapper.selectByExample(proRoleExample).stream().map(action->action.getId()).collect(Collectors.toList()); + //二级角色项目经理 + ProRoleExample proRoleExample1=new ProRoleExample(); + proRoleExample1.createCriteria().andRecStatusEqualTo((byte)0).andParentIdIn(jili); + List proRoles = proRoleMapper.selectByExample(proRoleExample1); + List jili1=proRoles.stream().map(action->action.getId()).collect(Collectors.toList()); + //是否是pm true是经理 false不是经理 + boolean[] isPm = new boolean[]{false}; + //经理是否对他不可见 true不可见 false可见 + boolean[] isshow=new boolean[]{false}; + + //查询已经添加的角色 + List listBefor=proRoleDao.queryRoleShowslistAfter(memberId); + List listBeforeId= listBefor.stream().map(action ->{return action.getId();}).collect(Collectors.toList()); + + //判断该成员是不是项目经理 + ProMemberRoleExample proMemberRoleExample1=new ProMemberRoleExample(); + proMemberRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andMemberIdEqualTo(memberId).andRoleIdEqualTo(jili1.get(0)); + List proMemberRoles1 = proMemberRoleMapper.selectByExample(proMemberRoleExample1); + if(CollectionUtil.isEmpty(proMemberRoles1)){ + isPm[0]=false; + }else { + isPm[0]=true; + } + + if(!isPm[0]){ + //先按照一个经理的算 + ProRoleExcludeExample proRoleExcludeExample=new ProRoleExcludeExample(); + proRoleExcludeExample.createCriteria().andRecStatusEqualTo((byte)0).andRoleIdEqualTo(jili1.get(0)); + List proRoleExcludes = proRoleExcludeMapper.selectByExample(proRoleExcludeExample); + proRoleExcludes.forEach(action->{ + //查看查询出的不可见角色id是否在角色id里面 + if(listBeforeId.contains(action.getOtherRoleId())) + { + isshow[0]=true; + } + }); + } + if(!isPm[0]&&!isshow[0]){ + //添加经理 + if(!listBeforeId.contains(jili1.get(0))) { + RoleVo.JueSeByProId jueSeByProId = new RoleVo.JueSeByProId(); + jueSeByProId.setId(proRoles.get(0).getId()); + jueSeByProId.setName(proRoles.get(0).getName()); + jueSeByProId.setSequence(proRoles.get(0).getSequence()); + listBefor.add(jueSeByProId); + //顺道插入到show表里面 + ProMemberRoleShow proMemberRoleShow=new ProMemberRoleShow(); + proMemberRoleShow.setId(snowflake.nextId()); + proMemberRoleShow.setRoleId(proRoles.get(0).getId()); + proMemberRoleShow.setMemberId(memberId); + proMemberRoleShow.setSequence(0); + proMemberRoleShowMapper.insertSelective(proMemberRoleShow); + } + } } //查询二级角色 List memberRoleList; @@ -646,9 +712,177 @@ public class ProRoleService implements IProRoleService { @Override public RoleVo.JueSeByProIdLists queryRoleShows(QueryDto param) { + RoleVo.JueSeByProIdLists jueSeByProIdLists=new RoleVo.JueSeByProIdLists(); //获取成员id + Long memberId = queryMemberId(param.getParam().getProjectId(), param.getUserId()); + //获取经理角色id + ProRoleExample proRoleExample=new ProRoleExample(); + proRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andNameEqualTo(WebConstant.ROLE_NAME.PM.value).andParentIdEqualTo(0L).andProjectIdEqualTo(param.getParam().getProjectId()); + //一级角色项目经理 + List jili=proRoleMapper.selectByExample(proRoleExample).stream().map(action->action.getId()).collect(Collectors.toList()); + //二级角色项目经理 + ProRoleExample proRoleExample1=new ProRoleExample(); + proRoleExample1.createCriteria().andRecStatusEqualTo((byte)0).andParentIdIn(jili); + List proRoles = proRoleMapper.selectByExample(proRoleExample1); + List jili1=proRoles.stream().map(action->action.getId()).collect(Collectors.toList()); + + //查询已经添加的角色 + List listBefor=proRoleDao.queryRoleShowslistAfter(memberId); + List listBeforeId= listBefor.stream().map(action ->{return action.getId();}).collect(Collectors.toList()); + for (int i = 0; i < listBefor.size(); i++) { + if(jili1.contains(listBefor.get(i).getId())){ + listBefor.get(i).setIsPM(true); + }else { + listBefor.get(i).setIsPM(false); + } + } + //查询未添加的角色 + List listAfter=proRoleDao.queryRoleShowslistBefore(param.getParam().getProjectId(),listBeforeId); + jueSeByProIdLists.setListAfter(listAfter); + jueSeByProIdLists.setListBefore(listBefor); + return jueSeByProIdLists; + } + + /** + * 修改角色是否展示 + * @param param + */ + @Override + public void queryRoleIsShows(QueryDto param) { + //获取成员id + Long memberId=queryMemberId(param.getParam().getProjectId(),param.getUserId()); + //获取经理得id + ProRoleExample proRoleExample=new ProRoleExample(); + proRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andNameEqualTo(WebConstant.ROLE_NAME.PM.value).andParentIdEqualTo(0L).andProjectIdEqualTo(param.getParam().getProjectId()); + //一级角色项目经理 + List jili=proRoleMapper.selectByExample(proRoleExample).stream().map(action->action.getId()).collect(Collectors.toList()); + //二级角色项目经理 + ProRoleExample proRoleExample1=new ProRoleExample(); + proRoleExample1.createCriteria().andRecStatusEqualTo((byte)0).andParentIdIn(jili); + List proRoles = proRoleMapper.selectByExample(proRoleExample1); + List jili1=proRoles.stream().map(action->action.getId()).collect(Collectors.toList()); + + if(param.getParam().getIsShow()){ + //展示的 增加的 不需要考虑是否为经理 + ProMemberRoleShowExample proMemberRoleShowExample=new ProMemberRoleShowExample(); + proMemberRoleShowExample.createCriteria().andRecStatusEqualTo((byte) 0).andMemberIdEqualTo(memberId); + List proMemberRoleShows = proMemberRoleShowMapper.selectByExample(proMemberRoleShowExample); + if((proMemberRoleShows.size()+param.getParam().getRoleIds().size())>10){ + throw new BaseException(CodeEnum.CHAOGUOSHI); + }else { + + if(param.getParam().getRoleIds().size()>0){ + //查一下目前最大得排序是多少 + Integer[] seq=new Integer[]{proMemberRoleShows.stream().mapToInt(action->action.getSequence()).max().getAsInt()}; + ProMemberRoleShowExample proMemberRoleShowExample1=new ProMemberRoleShowExample(); + proMemberRoleShowExample1.createCriteria().andMemberIdEqualTo(memberId).andRoleIdIn(param.getParam().getRoleIds()).andRecStatusEqualTo((byte)0); + List proMemberRoleShows1 = proMemberRoleShowMapper.selectByExample(proMemberRoleShowExample1); + if(proMemberRoleShows1.size()>0){ + throw new BaseException(CodeEnum.CHONGFUTIJIAO); + } + param.getParam().getRoleIds().forEach(ac->{ + + ProMemberRoleShow proMemberRoleShow=new ProMemberRoleShow(); + proMemberRoleShow.setId(snowflake.nextId()); + proMemberRoleShow.setRoleId(ac); + proMemberRoleShow.setMemberId(memberId); + if(jili1.contains(ac)){ + proMemberRoleShow.setSequence(0); + }else { + proMemberRoleShow.setSequence(++seq[0]); + } + proMemberRoleShowMapper.insertSelective(proMemberRoleShow); + }); + } + } + }else { + //不展示的,删除的 + if(param.getParam().getRoleIds().size()>0){ + //先判断是不是经理了 + if(param.getParam().getRoleIds().contains(jili1.get(0))){ + throw new BaseException(CodeEnum.BAOHANJINLI); + } + for (int i = 0; i param) { + if(param.getParam().getRoleIds().size()<=1){ + throw new BaseException(CodeEnum.ZUISHAOCHUANLIANGE); + } + Long memberId=queryMemberId(param.getParam().getProjectId(),param.getUserId()); + ProRoleExample proRoleExample=new ProRoleExample(); + proRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andNameEqualTo(WebConstant.ROLE_NAME.PM.value).andParentIdEqualTo(0L).andProjectIdEqualTo(param.getParam().getProjectId()); + //一级角色项目经理 + List jili=proRoleMapper.selectByExample(proRoleExample).stream().map(action->action.getId()).collect(Collectors.toList()); + //二级角色项目经理 + ProRoleExample proRoleExample1=new ProRoleExample(); + proRoleExample1.createCriteria().andRecStatusEqualTo((byte)0).andParentIdIn(jili); + List proRoles = proRoleMapper.selectByExample(proRoleExample1); + List jili1=proRoles.stream().map(action->action.getId()).collect(Collectors.toList()); + for (int i = param.getParam().getRoleIds().size() - 1; i >= 0; i--) { + if(jili1.get(0).equals(param.getParam().getRoleIds().get(i))){ + param.getParam().getRoleIds().remove(i); + } + } + //先查出来在数据库中这几个数据中最大的序号是多少,然后再最大的上面进行加加操作 + ProMemberRoleShowExample proMemberRoleShowExample=new ProMemberRoleShowExample(); + proMemberRoleShowExample.createCriteria().andRoleIdIn(param.getParam().getRoleIds()).andRecStatusEqualTo((byte)0); + List proMemberRoleShows = proMemberRoleShowMapper.selectByExample(proMemberRoleShowExample); + Integer[] seq=new Integer[]{ proMemberRoleShows.stream().mapToInt(action->action.getSequence()).max().getAsInt()}; + param.getParam().getRoleIds().forEach(action->{ + ProMemberRoleShowExample proMemberRoleShowExample1=new ProMemberRoleShowExample(); + proMemberRoleShowExample1.createCriteria().andRecStatusEqualTo((byte)0).andMemberIdEqualTo(memberId).andRoleIdEqualTo(action); + ProMemberRoleShow proMemberRoleShow=new ProMemberRoleShow(); + proMemberRoleShow.setSequence(++seq[0]); + proMemberRoleShowMapper.updateByExampleSelective(proMemberRoleShow,proMemberRoleShowExample1); + }); + } + + /** + * 是否是pm + * @return + */ + public boolean queryIsPm(Long projectId,Long memberId){ + ProRoleExample proRoleExample=new ProRoleExample(); + proRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andNameEqualTo(WebConstant.ROLE_NAME.PM.value).andParentIdEqualTo(0L).andProjectIdEqualTo(projectId); + //一级角色项目经理 + List jili=proRoleMapper.selectByExample(proRoleExample).stream().map(action->action.getId()).collect(Collectors.toList()); + //二级角色项目经理 + ProRoleExample proRoleExample1=new ProRoleExample(); + proRoleExample1.createCriteria().andRecStatusEqualTo((byte)0).andParentIdIn(jili); + List proRoles = proRoleMapper.selectByExample(proRoleExample1); + List jili1=proRoles.stream().map(action->action.getId()).collect(Collectors.toList()); + //目前考虑的是只有一个经理 + ProMemberRoleExample proMemberRoleExample=new ProMemberRoleExample(); + proMemberRoleExample.createCriteria().andRecStatusEqualTo((byte)0).andMemberIdEqualTo(memberId).andRoleIdEqualTo(jili1.get(0)); + List proMemberRoles = proMemberRoleMapper.selectByExample(proMemberRoleExample); + if(CollectionUtil.isEmpty(proMemberRoles)){ + return false; + } + return true; + } + + /** + * 查询成员id + * @return + */ + public Long queryMemberId(Long projectId,Long userId){ ProMemberExample proMemberExample=new ProMemberExample(); - proMemberExample.createCriteria().andUserIdEqualTo(param.getUserId()).andProjectIdEqualTo(param.getParam().getProjectId()).andRecStatusEqualTo((byte)0); + proMemberExample.createCriteria().andUserIdEqualTo(userId).andProjectIdEqualTo(projectId).andRecStatusEqualTo((byte)0); List proMembers = proMemberMapper.selectByExample(proMemberExample); Long memberId=0L; if(CollectionUtil.isNotEmpty(proMembers)&&proMembers.size()==1){ @@ -656,13 +890,6 @@ public class ProRoleService implements IProRoleService { }else { throw new BaseException(CodeEnum.CHONGFU); } - RoleVo.JueSeByProIdLists jueSeByProIdLists=new RoleVo.JueSeByProIdLists(); - //查询已经添加的角色 - List listAfter=proRoleDao.queryRoleShowslistAfter(param.getParam().getProjectId()); - List listBeforeId= listAfter.stream().map(action ->{ - return action.getId(); - }).collect(Collectors.toList()); - List listBefor=proRoleDao.queryRoleShowslistBefore(memberId,listBeforeId); - return null; + return memberId; } } diff --git a/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java b/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java index d05580a0..6f8ca570 100644 --- a/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java +++ b/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java @@ -83,6 +83,7 @@ public class TaskDeliverService implements ITaskDeliverService { public void saveProTaskInputDoc(String[] inputs,Long taskId){ for (int i = 0; i < inputs.length; i++) { if(StringUtils.isNotBlank(inputs[i])){ + inputs[i]=inputs[i].replace("\r","").replace("\n",""); ProTaskInputDoc proTaskInputDoc = new ProTaskInputDoc(); proTaskInputDoc.setId(snowflake.nextId()); proTaskInputDoc.setTaskDetailId(taskId); diff --git a/tall/src/main/java/com/ccsens/tall/web/RoleController.java b/tall/src/main/java/com/ccsens/tall/web/RoleController.java index 426d55d9..2930ab70 100644 --- a/tall/src/main/java/com/ccsens/tall/web/RoleController.java +++ b/tall/src/main/java/com/ccsens/tall/web/RoleController.java @@ -128,4 +128,20 @@ public class RoleController { RoleVo.JueSeByProIdLists jueSeByProIdLists=proRoleService.queryRoleShows(param); return JsonResponse.newInstance().ok(jueSeByProIdLists); } + @MustLoginTall + @ApiOperation(value = "修改角色是否展示",notes = "") + @RequestMapping(value = "/queryRoleIsShows", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse queryRoleIsShows(@ApiParam @Validated @RequestBody QueryDto param){ + log.info("传入参数:{}", param); + proRoleService.queryRoleIsShows(param); + return JsonResponse.newInstance().ok(); + } + @MustLoginTall + @ApiOperation(value = "给角色排序",notes = "") + @RequestMapping(value = "/upRoleShowsOrder", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse upRoleShowsOrder(@ApiParam @Validated @RequestBody QueryDto param){ + log.info("传入参数:{}", param); + proRoleService.upRoleShowsOrder(param); + return JsonResponse.newInstance().ok(); + } } diff --git a/tall/src/main/resources/mapper_dao/ProRoleDao.xml b/tall/src/main/resources/mapper_dao/ProRoleDao.xml index 04618218..3624e021 100644 --- a/tall/src/main/resources/mapper_dao/ProRoleDao.xml +++ b/tall/src/main/resources/mapper_dao/ProRoleDao.xml @@ -311,14 +311,25 @@ \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/CodeEnum.java b/util/src/main/java/com/ccsens/util/CodeEnum.java index b7817af2..9e0276ca 100644 --- a/util/src/main/java/com/ccsens/util/CodeEnum.java +++ b/util/src/main/java/com/ccsens/util/CodeEnum.java @@ -189,6 +189,10 @@ public enum CodeEnum { DOC_REPEAT(158,"输入文档已存在",true), NOTNAME(159,"未找到该列",true), CHONGFU(160,"该成员在项目下有多个成员角色",true), + CHAOGUOSHI(161,"角色展示不能超过10个",true), + BAOHANJINLI(162,"不能删除包含经理得角色",true), + CHONGFUTIJIAO(163,"不要重复提交",true), + ZUISHAOCHUANLIANGE(164,"排序最少需要传入两个",true), ;