From a5afa9955df53774a5d1670127e450e5e18ccdf9 Mon Sep 17 00:00:00 2001 From: daichao <1438977546@qq.com> Date: Mon, 16 Jun 2025 14:10:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8D=AF=E5=93=81=E8=BF=BD=E6=BA=AF=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=AD=97=E6=AE=B5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provtest/VO/DrugDeliveryNoteInfoVO.java | 37 +++++ .../d2d/provtest/VO/DrugInvoiceInfoVO.java | 29 ++++ .../d2d/provtest/VO/DrugProductionInfoVO.java | 105 +++++++++++++ .../provtest/VO/DrugRetailAndUseInfoVO.java | 41 +++++ .../d2d/provtest/VO/DrugRetraceVO.java | 33 ++++ .../controller/DrugRetraceController.java | 7 +- .../DomesticDrugProductionApplyInfo.java | 39 ++++- .../provtest/domain/DrugImportApplyInfo.java | 50 +++++- .../exception/GlobalExceptionHandler.java | 127 ++++++++++++++++ .../provtest/exception/ServiceException.java | 73 +++++++++ ...DomesticDrugProductionApplyInfoMapper.java | 10 +- .../DrugDeliveryNoteApplyInfoMapper.java | 10 ++ .../mapper/DrugImportApplyInfoMapper.java | 6 + .../mapper/DrugInvoiceApplyInfoMapper.java | 10 ++ .../DrugRetailAndUseApplyInfoMapper.java | 8 + .../searcher/DrugRetraceSearcher.java | 19 +++ .../provtest/service/DrugRetraceService.java | 14 ++ .../handle/business/SubType2011Handler.java | 15 +- .../handle/business/SubType2012Handler.java | 22 ++- .../service/impl/DrugRetraceServiceImpl.java | 57 +++++++ .../d2d/provtest/utils/EscapeUtil.java | 142 ++++++++++++++++++ .../DomesticDrugProductionApplyInfoMapper.xml | 22 +++ .../DrugDeliveryNoteApplyInfoMapper.xml | 12 +- .../mapper/DrugImportApplyInfoMapper.xml | 23 ++- .../mapper/DrugInvoiceApplyInfoMapper.xml | 12 +- .../DrugRetailAndUseApplyInfoMapper.xml | 16 +- 26 files changed, 910 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/alihealth/d2d/provtest/VO/DrugDeliveryNoteInfoVO.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/VO/DrugInvoiceInfoVO.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/VO/DrugProductionInfoVO.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/VO/DrugRetailAndUseInfoVO.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/VO/DrugRetraceVO.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/exception/ServiceException.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/searcher/DrugRetraceSearcher.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/service/DrugRetraceService.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/service/impl/DrugRetraceServiceImpl.java create mode 100644 src/main/java/com/alihealth/d2d/provtest/utils/EscapeUtil.java diff --git a/src/main/java/com/alihealth/d2d/provtest/VO/DrugDeliveryNoteInfoVO.java b/src/main/java/com/alihealth/d2d/provtest/VO/DrugDeliveryNoteInfoVO.java new file mode 100644 index 0000000..ad9ca2a --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/VO/DrugDeliveryNoteInfoVO.java @@ -0,0 +1,37 @@ +package com.alihealth.d2d.provtest.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 药品收货单信息,多条 + */ +@Data +public class DrugDeliveryNoteInfoVO implements Serializable { + + private static final long serialVersionUID = -6817830718249051422L; + + /** + * 收货时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date shsj; + + /** + * 收货公司社会信用代码 + */ + private String tyshxydmshjg; + + /** + * 收货公司名称 + */ + private String shjgmc; + + /** + * 收货单号 + */ + private String shdbh; +} diff --git a/src/main/java/com/alihealth/d2d/provtest/VO/DrugInvoiceInfoVO.java b/src/main/java/com/alihealth/d2d/provtest/VO/DrugInvoiceInfoVO.java new file mode 100644 index 0000000..56d38ef --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/VO/DrugInvoiceInfoVO.java @@ -0,0 +1,29 @@ +package com.alihealth.d2d.provtest.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 描述: 药品发货单信息 + */ +@Data +public class DrugInvoiceInfoVO implements Serializable { + + private static final long serialVersionUID = 6502538268319598412L; + + /** 发货时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date fhsj; + + /** 发货公司社会信用代码 */ + private String tyshxydmfhjg; + + /** 发货公司名称 */ + private String fhjgmc; + + /** 发货单号 */ + private String fhdbh; +} diff --git a/src/main/java/com/alihealth/d2d/provtest/VO/DrugProductionInfoVO.java b/src/main/java/com/alihealth/d2d/provtest/VO/DrugProductionInfoVO.java new file mode 100644 index 0000000..be274a0 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/VO/DrugProductionInfoVO.java @@ -0,0 +1,105 @@ +package com.alihealth.d2d.provtest.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 描述: 药品生产信息 : 包含境内与境外的药品生产信息两个表,查询时注意字段转换 + */ +@Data +public class DrugProductionInfoVO implements Serializable { + + private static final long serialVersionUID = 2214859259608999147L; + + /** + * 药品生产日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date scrq; + + /** + * 药品有效期截止日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date ypyxqjzrq; + + /** + * 药品生产批号 + */ + private String ypscph; + + /** + * 药品生产企业信用代码 + */ + private String tyshxydm; + + /** + * 药品生产企业名称 + */ + private String scqymc; + + /** + * 药品通用名称 + */ + private String yptymc; + + /** + * 药品商用名称(中文) + */ + private String ypspmc; + + /** + * 国家药品标识码 + */ + private String gjypbsm; + + + /** + * 药品本位码 + */ + private String ypbwm; + + /** + * 剂型 + */ + private String jx; + + /** + * 制剂规格 + */ + private String zjgg; + + /** + * 包装规格 + */ + private String bzgg; + + /** + * 包装转换比 + */ + private Integer bzzhb; + + /** + * 药品有效期 + */ + private Integer ypyxq; + + /** + * 药品有效期单位 + */ + private String ypyxqdw; + + /** + * 药品批准文号 + */ + private String yppzwh; + + /** + * 药品批准文号有效期 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date yppzwhyxq; +} diff --git a/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetailAndUseInfoVO.java b/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetailAndUseInfoVO.java new file mode 100644 index 0000000..5ee36c2 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetailAndUseInfoVO.java @@ -0,0 +1,41 @@ +package com.alihealth.d2d.provtest.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 描述:药品与零售信息,暂时展示下列信息,后续有必要再展示更多信息 + */ +@Data +public class DrugRetailAndUseInfoVO implements Serializable { + + private static final long serialVersionUID = 8169288349155391871L; + + /** 售药时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date scsj; + + /** 购买人身份信息 */ + private String gmrsfxx; + + /** 购买人电话号码 */ + private String gmrdhhm; + + /** 互联网订单标识 */ + private String hlwddbz; + + /** 零售药店名称 */ + private String lsydmc; + + /** 零售药店编号 */ + private String lsdjbh; + + /** 统一社会信用代码(零售药店) */ + private String tyshxydmlsyd; + + /** 开方医师(非处方药没有该字段) */ + private String kfys; +} diff --git a/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetraceVO.java b/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetraceVO.java new file mode 100644 index 0000000..f1c7913 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/VO/DrugRetraceVO.java @@ -0,0 +1,33 @@ +package com.alihealth.d2d.provtest.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class DrugRetraceVO implements Serializable { + + private static final long serialVersionUID = 5380130274842679836L; + + /** + * 药品生产信息 + */ + private DrugProductionInfoVO drugProductionInfoVO; + + /** + * 药品发货信息, 发货信息可能会有多条 + */ + private List drugInvoiceInfoVOList; + + /** + * 药品收货信息, 收货信息可能会有多条 + */ + private List drugDeliveryNoteInfoVOList; + + /** + * 药品零售与药品使用信息 + */ + private DrugRetailAndUseInfoVO drugRetailAndUseInfoVO; + +} diff --git a/src/main/java/com/alihealth/d2d/provtest/controller/DrugRetraceController.java b/src/main/java/com/alihealth/d2d/provtest/controller/DrugRetraceController.java index 5cb811a..1b71dde 100644 --- a/src/main/java/com/alihealth/d2d/provtest/controller/DrugRetraceController.java +++ b/src/main/java/com/alihealth/d2d/provtest/controller/DrugRetraceController.java @@ -1,5 +1,6 @@ package com.alihealth.d2d.provtest.controller; +import com.alihealth.d2d.provtest.VO.DrugRetraceVO; import com.alihealth.d2d.provtest.common.AjaxResult; import com.alihealth.d2d.provtest.searcher.DrugRetraceSearcher; import com.alihealth.d2d.provtest.service.DrugRetraceService; @@ -20,8 +21,8 @@ public class DrugRetraceController { private DrugRetraceService drugRetraceService; @PostMapping(value = "/retrace") - public AjaxResult retrace(@RequestBody(required = true) DrugRetraceSearcher searcher) { - drugRetraceService.retrace(searcher); - return AjaxResult.success(null); + public AjaxResult retrace(@RequestBody DrugRetraceSearcher searcher) { + DrugRetraceVO drugRetraceVO = drugRetraceService.retrace(searcher); + return AjaxResult.success(drugRetraceVO); } } diff --git a/src/main/java/com/alihealth/d2d/provtest/domain/DomesticDrugProductionApplyInfo.java b/src/main/java/com/alihealth/d2d/provtest/domain/DomesticDrugProductionApplyInfo.java index 8bfbd51..fd0d4ac 100644 --- a/src/main/java/com/alihealth/d2d/provtest/domain/DomesticDrugProductionApplyInfo.java +++ b/src/main/java/com/alihealth/d2d/provtest/domain/DomesticDrugProductionApplyInfo.java @@ -1,10 +1,8 @@ package com.alihealth.d2d.provtest.domain; -import com.alihealth.d2d.provtest.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import lombok.Builder; import lombok.Data; @@ -68,8 +66,8 @@ public class DomesticDrugProductionApplyInfo { @Column(name = "scrq") private Date scrq; - @Column(name = "ymyxqjzrq") - private Date ymyxqjzrq; + @Column(name = "ypyxqjzrq") + private Date ypyxqjzrq; @Column(name = "scsl") private Integer scsl; @@ -91,4 +89,37 @@ public class DomesticDrugProductionApplyInfo { @Column(name = "rkdwlx") private String rkdwlx; + + @Column(name = "ypspmc") + private String ypspmc; + + @Column(name = "ypbwm") + private String ypbwm; + + @Column(name = "jx") + private String jx; + + @Column(name = "zjgg") + private String zjgg; + + @Column(name = "bzgg") + private String bzgg; + + @Column(name = "bzzhb") + private Integer bzzhb; + + @Column(name = "ypyxq") + private Integer ypyxq; + + @Column(name = "ypyxqdw") + private String ypyxqdw; + + @Column(name = "yppzwh") + private String yppzwh; + + @Column(name = "yppzwhyxq") + private Date yppzwhyxq; + + @Column(name = "ypscph") + private String ypscph; } diff --git a/src/main/java/com/alihealth/d2d/provtest/domain/DrugImportApplyInfo.java b/src/main/java/com/alihealth/d2d/provtest/domain/DrugImportApplyInfo.java index 623fb52..79528b3 100644 --- a/src/main/java/com/alihealth/d2d/provtest/domain/DrugImportApplyInfo.java +++ b/src/main/java/com/alihealth/d2d/provtest/domain/DrugImportApplyInfo.java @@ -41,12 +41,12 @@ public class DrugImportApplyInfo { //暂无 @Column(name = "ymzt") private String ymzt; - //统一社会信用代码(进口疫苗代理企业) - @Column(name = "tyshxydmjkymdlqy") - private String tyshxydmjkymdlqy; - //进口疫苗代理企业名称 - @Column(name = "jkymdlqymc") - private String jkymdlqymc; + //统一社会信用代码(进口药品代理企业) + @Column(name = "tyshxydmjkypdlqy") + private String tyshxydmjkypdlqy; + //进口药品代理企业名称 + @Column(name = "jkypdlqymc") + private String jkypdlqymc; //境外药品上市许可持有人代码 @Column(name = "jwypssxkcyrdm") private String jwypssxkcyrdm; @@ -78,8 +78,8 @@ public class DrugImportApplyInfo { @Column(name = "scrq") private Date scrq; //药品有效期截止日期 - @Column(name = "ymyxqjzrq") - private Date ymyxqjzrq; + @Column(name = "ypyxqjzrq") + private Date ypyxqjzrq; //生产数量 @Column(name = "scsl") private Integer scsl; @@ -89,6 +89,40 @@ public class DrugImportApplyInfo { //入库时间 @Column(name = "rksj") private Date rksj; + + @Column(name = "ypspmc") + private String ypspmc; + + @Column(name = "ypbwm") + private String ypbwm; + + @Column(name = "jx") + private String jx; + + @Column(name = "zjgg") + private String zjgg; + + @Column(name = "bzgg") + private String bzgg; + + @Column(name = "bzzhb") + private Integer bzzhb; + + @Column(name = "ypyxq") + private Integer ypyxq; + + @Column(name = "ypyxqdw") + private String ypyxqdw; + + @Column(name = "yppzwh") + private String yppzwh; + + @Column(name = "yppzwhyxq") + private Date yppzwhyxq; + + @Column(name = "ypscph") + private String ypscph; + //创建时间 @Column(name = "create_time") private Date createTime; diff --git a/src/main/java/com/alihealth/d2d/provtest/exception/GlobalExceptionHandler.java b/src/main/java/com/alihealth/d2d/provtest/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..a661d40 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/exception/GlobalExceptionHandler.java @@ -0,0 +1,127 @@ +package com.alihealth.d2d.provtest.exception; + + +import cn.hutool.core.convert.Convert; +import com.alihealth.d2d.provtest.common.AjaxResult; +import com.alihealth.d2d.provtest.constant.HttpStatus; +import com.alihealth.d2d.provtest.utils.EscapeUtil; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import javax.servlet.http.HttpServletRequest; +import java.nio.file.AccessDeniedException; + +/** + * 全局异常处理器 + * + * @author tcctyn + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isEmpty(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + String value = Convert.toStr(e.getValue()); + if (!StringUtils.isEmpty(value)) { + value = EscapeUtil.clean(value); + } + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), value)); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + +} diff --git a/src/main/java/com/alihealth/d2d/provtest/exception/ServiceException.java b/src/main/java/com/alihealth/d2d/provtest/exception/ServiceException.java new file mode 100644 index 0000000..915c1ed --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/exception/ServiceException.java @@ -0,0 +1,73 @@ +package com.alihealth.d2d.provtest.exception; + +/** + * 业务异常 + * + * @author tcctyn + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public String getDetailMessage() + { + return detailMessage; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/alihealth/d2d/provtest/mapper/DomesticDrugProductionApplyInfoMapper.java b/src/main/java/com/alihealth/d2d/provtest/mapper/DomesticDrugProductionApplyInfoMapper.java index 75a5713..8683b5e 100644 --- a/src/main/java/com/alihealth/d2d/provtest/mapper/DomesticDrugProductionApplyInfoMapper.java +++ b/src/main/java/com/alihealth/d2d/provtest/mapper/DomesticDrugProductionApplyInfoMapper.java @@ -1,8 +1,16 @@ package com.alihealth.d2d.provtest.mapper; +import com.alihealth.d2d.provtest.VO.DrugProductionInfoVO; import com.alihealth.d2d.provtest.domain.DomesticDrugProductionApplyInfo; -import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; public interface DomesticDrugProductionApplyInfoMapper extends BaseMapper { + + /** + * 根据药品追溯码查询药品信息 + * @param ypzsm + * @return + */ + DrugProductionInfoVO selectByYpzsm(@Param("ypzsm") String ypzsm); } diff --git a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugDeliveryNoteApplyInfoMapper.java b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugDeliveryNoteApplyInfoMapper.java index b1d179b..067d082 100644 --- a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugDeliveryNoteApplyInfoMapper.java +++ b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugDeliveryNoteApplyInfoMapper.java @@ -1,7 +1,11 @@ package com.alihealth.d2d.provtest.mapper; +import com.alihealth.d2d.provtest.VO.DrugDeliveryNoteInfoVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.alihealth.d2d.provtest.domain.DrugDeliveryNoteApplyInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 收货单信息数据子集(DrugDeliveryNoteApplyInfo)表数据库访问层 @@ -11,5 +15,11 @@ import com.alihealth.d2d.provtest.domain.DrugDeliveryNoteApplyInfo; */ public interface DrugDeliveryNoteApplyInfoMapper extends BaseMapper { + /** + * 根据ypzsm查询收货单信息 + * @param ypzsm + * @return + */ + List selectByYpzsm(@Param("ypzsm") String ypzsm); } diff --git a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugImportApplyInfoMapper.java b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugImportApplyInfoMapper.java index a1879eb..d291664 100644 --- a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugImportApplyInfoMapper.java +++ b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugImportApplyInfoMapper.java @@ -1,7 +1,9 @@ package com.alihealth.d2d.provtest.mapper; +import com.alihealth.d2d.provtest.VO.DrugProductionInfoVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.alihealth.d2d.provtest.domain.DrugImportApplyInfo; +import org.apache.ibatis.annotations.Param; /** * 药品进口信息数据子集(DrugImportApplyInfo)表数据库访问层 @@ -11,5 +13,9 @@ import com.alihealth.d2d.provtest.domain.DrugImportApplyInfo; */ public interface DrugImportApplyInfoMapper extends BaseMapper { + /* + * 根据药品追溯码查询药品生产信息 + */ + DrugProductionInfoVO selectByYpzsm(@Param("ypzsm") String ypzsm); } diff --git a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugInvoiceApplyInfoMapper.java b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugInvoiceApplyInfoMapper.java index 70b38a7..6814481 100644 --- a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugInvoiceApplyInfoMapper.java +++ b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugInvoiceApplyInfoMapper.java @@ -1,7 +1,11 @@ package com.alihealth.d2d.provtest.mapper; +import com.alihealth.d2d.provtest.VO.DrugInvoiceInfoVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.alihealth.d2d.provtest.domain.DrugInvoiceApplyInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 发货单信息数据子集(DrugInvoiceApplyInfo)表数据库访问层 @@ -11,5 +15,11 @@ import com.alihealth.d2d.provtest.domain.DrugInvoiceApplyInfo; */ public interface DrugInvoiceApplyInfoMapper extends BaseMapper { + /** + * 根据药品追溯码查询发货单信息 + * @param ypzsm + * @return + */ + List selectByYpzsm(@Param("ypzsm") String ypzsm); } diff --git a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugRetailAndUseApplyInfoMapper.java b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugRetailAndUseApplyInfoMapper.java index 01a065c..8143591 100644 --- a/src/main/java/com/alihealth/d2d/provtest/mapper/DrugRetailAndUseApplyInfoMapper.java +++ b/src/main/java/com/alihealth/d2d/provtest/mapper/DrugRetailAndUseApplyInfoMapper.java @@ -1,7 +1,9 @@ package com.alihealth.d2d.provtest.mapper; +import com.alihealth.d2d.provtest.VO.DrugRetailAndUseInfoVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.alihealth.d2d.provtest.domain.DrugRetailAndUseApplyInfo; +import org.apache.ibatis.annotations.Param; /** * 药品零售与药品使用信息数据子集(DrugRetailAndUseApplyInfo)表数据库访问层 @@ -11,5 +13,11 @@ import com.alihealth.d2d.provtest.domain.DrugRetailAndUseApplyInfo; */ public interface DrugRetailAndUseApplyInfoMapper extends BaseMapper { + /** + * 根据药品追溯码查询零售与使用信息 + * @param ypzsm + * @return + */ + DrugRetailAndUseInfoVO selectByYpzsm(@Param("ypzsm") String ypzsm); } diff --git a/src/main/java/com/alihealth/d2d/provtest/searcher/DrugRetraceSearcher.java b/src/main/java/com/alihealth/d2d/provtest/searcher/DrugRetraceSearcher.java new file mode 100644 index 0000000..8f3b016 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/searcher/DrugRetraceSearcher.java @@ -0,0 +1,19 @@ +package com.alihealth.d2d.provtest.searcher; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 药品追溯查询请求参数 + */ +@Data +public class DrugRetraceSearcher implements Serializable { + + private static final long serialVersionUID = 6736979196768225595L; + + /** + * 药品追溯码 + */ + private String ypzsm; +} diff --git a/src/main/java/com/alihealth/d2d/provtest/service/DrugRetraceService.java b/src/main/java/com/alihealth/d2d/provtest/service/DrugRetraceService.java new file mode 100644 index 0000000..34bb58b --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/service/DrugRetraceService.java @@ -0,0 +1,14 @@ +package com.alihealth.d2d.provtest.service; + +import com.alihealth.d2d.provtest.VO.DrugRetraceVO; +import com.alihealth.d2d.provtest.searcher.DrugRetraceSearcher; + +public interface DrugRetraceService { + + /** + * 药品追溯流程,根据药品追溯码进行查询 + * @param searcher + * @return + */ + DrugRetraceVO retrace(DrugRetraceSearcher searcher); +} diff --git a/src/main/java/com/alihealth/d2d/provtest/service/handle/business/SubType2011Handler.java b/src/main/java/com/alihealth/d2d/provtest/service/handle/business/SubType2011Handler.java index 120758d..12d74a0 100644 --- a/src/main/java/com/alihealth/d2d/provtest/service/handle/business/SubType2011Handler.java +++ b/src/main/java/com/alihealth/d2d/provtest/service/handle/business/SubType2011Handler.java @@ -62,10 +62,23 @@ public class SubType2011Handler extends AbstractEventDataHandler drugInvoiceInfoVOList = drugInvoiceApplyInfoMapper.selectByYpzsm(searcher.getYpzsm()); + drugRetraceVO.setDrugInvoiceInfoVOList(drugInvoiceInfoVOList); + // 查询收货单 + List drugDeliveryNoteInfoVOList = drugDeliveryNoteApplyInfoMapper.selectByYpzsm(searcher.getYpzsm()); + drugRetraceVO.setDrugDeliveryNoteInfoVOList(drugDeliveryNoteInfoVOList); + // 查询零售及使用信息 + DrugRetailAndUseInfoVO drugRetailAndUseInfoVO = drugRetailAndUseApplyInfoMapper.selectByYpzsm(searcher.getYpzsm()); + drugRetraceVO.setDrugRetailAndUseInfoVO(drugRetailAndUseInfoVO); + + return drugRetraceVO; + } +} diff --git a/src/main/java/com/alihealth/d2d/provtest/utils/EscapeUtil.java b/src/main/java/com/alihealth/d2d/provtest/utils/EscapeUtil.java new file mode 100644 index 0000000..bbf3591 --- /dev/null +++ b/src/main/java/com/alihealth/d2d/provtest/utils/EscapeUtil.java @@ -0,0 +1,142 @@ +package com.alihealth.d2d.provtest.utils; + + +import cn.hutool.http.HTMLFilter; +import org.springframework.util.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author tcctyn + */ +public class EscapeUtil { + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static { + for (int i = 0; i < 64; i++) { + TEXT[i] = new char[]{(char) i}; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) { + if (StringUtils.isEmpty(text)) { + return ""; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) { + c = text.charAt(i); + if (c < 256) { + tmp.append("%"); + if (c < 16) { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } else { + tmp.append("%u"); + if (c <= 0xfff) { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) { + if (StringUtils.isEmpty(content)) { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) { + if (content.charAt(pos + 1) == 'u') { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } else { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } else { + if (pos == -1) { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } else { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/src/main/resources/mapper/DomesticDrugProductionApplyInfoMapper.xml b/src/main/resources/mapper/DomesticDrugProductionApplyInfoMapper.xml index ca85ec7..e960aff 100644 --- a/src/main/resources/mapper/DomesticDrugProductionApplyInfoMapper.xml +++ b/src/main/resources/mapper/DomesticDrugProductionApplyInfoMapper.xml @@ -5,4 +5,26 @@ + \ No newline at end of file diff --git a/src/main/resources/mapper/DrugDeliveryNoteApplyInfoMapper.xml b/src/main/resources/mapper/DrugDeliveryNoteApplyInfoMapper.xml index 4ec80dc..4a33449 100644 --- a/src/main/resources/mapper/DrugDeliveryNoteApplyInfoMapper.xml +++ b/src/main/resources/mapper/DrugDeliveryNoteApplyInfoMapper.xml @@ -2,7 +2,17 @@ - + diff --git a/src/main/resources/mapper/DrugImportApplyInfoMapper.xml b/src/main/resources/mapper/DrugImportApplyInfoMapper.xml index 153557b..c57c9a8 100644 --- a/src/main/resources/mapper/DrugImportApplyInfoMapper.xml +++ b/src/main/resources/mapper/DrugImportApplyInfoMapper.xml @@ -2,7 +2,28 @@ - + diff --git a/src/main/resources/mapper/DrugInvoiceApplyInfoMapper.xml b/src/main/resources/mapper/DrugInvoiceApplyInfoMapper.xml index 42d2d16..a47e7a9 100644 --- a/src/main/resources/mapper/DrugInvoiceApplyInfoMapper.xml +++ b/src/main/resources/mapper/DrugInvoiceApplyInfoMapper.xml @@ -2,7 +2,17 @@ - + diff --git a/src/main/resources/mapper/DrugRetailAndUseApplyInfoMapper.xml b/src/main/resources/mapper/DrugRetailAndUseApplyInfoMapper.xml index 30f33dd..c39f8f7 100644 --- a/src/main/resources/mapper/DrugRetailAndUseApplyInfoMapper.xml +++ b/src/main/resources/mapper/DrugRetailAndUseApplyInfoMapper.xml @@ -2,7 +2,21 @@ - +