下载完关闭流

master
linjj 1 year ago
parent 798d1e9560
commit 3f7ce59054

@ -15,6 +15,17 @@
</sourceRoots>
</configuration>
</facet>
<facet type="jpa" name="JPA">
<configuration>
<setting name="validation-enabled" value="true" />
<setting name="provider-name" value="Hibernate" />
<datasource-mapping>
<factory-entry name="AcquisitionServer" />
<factory-entry name="entityManagerFactory" />
</datasource-mapping>
<naming-strategy-map />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
@ -23,6 +34,8 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/${project.build.directory}/classes" />
<excludeFolder url="file://$MODULE_DIR$/${project.build.directory}/test-classes" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
@ -102,6 +115,9 @@
<orderEntry type="library" name="Maven: org.springframework:spring-orm:5.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.30" level="project" />
<orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.0.4" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.4" level="project" />
<orderEntry type="library" name="Maven: jaxen:jaxen:1.1-beta-11" level="project" />
<orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
@ -151,5 +167,7 @@
<orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.unbescape:unbescape:1.1.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.4.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.3.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
</component>
</module>

@ -81,5 +81,7 @@ public class AliasName {
public static final String OTHER_REPORT = "110";
public static final String NEW_PATHOLOGY_REPORT = "53";
}

@ -25,10 +25,17 @@ public interface ArchiveDetailRepository extends JpaRepository<ArchiveDetail, St
Integer countByMasterIDAndAssortIDAndSourceAndCheckReportId(String masterId, String AssortID, String source, String CheckReportId);
@Query("select count (o) from ArchiveDetail o where o.masterID = ?1 and o.checkReportId = ?2 and o.applyId=?3 and o.flag = 0")
Integer countByMasterIDAndAndCheckReportIdAndApplyId(String id,String checkReportId,String applyId);
public ArchiveDetail findByMasterIDAndAssortIDAndSourceAndApplyIdAndFlag(String masterId, String AssortID, String source, String applyId,String flag);
public ArchiveDetail findByMasterIDAndAssortIDAndSourceAndCheckReportIdAndFlag(String masterId, String AssortID, String source, String checkReportId,String flag);
public ArchiveDetail findByMasterIDAndAndCheckReportIdAndApplyId(String id,String checkReportId,String applyId);
@Query("select count (o) from ArchiveDetail o where o.masterID = ?1 and o.assortID = ?2 and o.title=?3 and o.flag = 0 ")
Integer countByMasterIDAndAssortIDAndTitleAndFlag(String masterId, String AssortID, String title);

@ -19,6 +19,9 @@ public interface ArchiveDetailService {
public ArchiveDetail isExitCheckReportId(String id, String type, String source, String checkReportId) throws Exception;
public ArchiveDetail isExitCheckReportIdAndApplyId(String id,String checkReportId,String applyId) throws Exception;
public Integer countByMasterIDAndAssortIDAndTitleAndFlag(String masterId, String AssortID, String title) throws Exception;
// public String getTypeNotExits(List<String> type, String masterId);

@ -46,6 +46,15 @@ public class ArchiveDetailServiceImpl implements ArchiveDetailService {
return null;
}
@Override
public ArchiveDetail isExitCheckReportIdAndApplyId(String id,String checkReportId,String applyId) throws Exception {
if (archiveDetailRepository.countByMasterIDAndAndCheckReportIdAndApplyId(id, checkReportId, applyId) > 0)
return archiveDetailRepository.findByMasterIDAndAndCheckReportIdAndApplyId(id, checkReportId, applyId);
return null;
}
@Override
public Integer countByMasterIDAndAssortIDAndTitleAndFlag(String masterId, String AssortID,String title) throws Exception {
return archiveDetailRepository.countByMasterIDAndAssortIDAndTitleAndFlag(masterId, AssortID, title);

@ -47,6 +47,7 @@ public class QueueService {
ArchiveDetailService archiveDetailService;
@Autowired
MessageService messageService;
//---------------------定时器
public void doSomething(List<MessageSubordinate> all) throws Exception {
if (all.size() > 0) {
@ -64,14 +65,14 @@ public class QueueService {
if (outJson != null) {
MessageDto messageDto = JSON.parseObject(outJson, MessageDto.class);
if (messageDto.getSource().equals(InterfaceName.NURSE_DATA) && (messageDto.getReportAddress().endsWith(".jpg")
|| messageDto.getReportAddress().endsWith(".JPG") )){
|| messageDto.getReportAddress().endsWith(".JPG"))) {
messageSubordinate.setRemark("住院号:" + messageDto.getInpNo() + "pdf路径为空可能出现下载问题。。。");
} else {
ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(messageDto.getInpNo(), messageDto.getVisitId());
Date date = new Date();
if (archiveMaster != null) {
/**2021-1-26 等lis程序升级 去掉*/
if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT) && archiveMaster.getArchiveState().equals("已归档")){
if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT) && archiveMaster.getArchiveState().equals("已归档")) {
messageSubordinate.setStatus(3);
messageSubordinateService.save(messageSubordinate);
continue;
@ -79,33 +80,28 @@ public class QueueService {
/**2021-1-26 等lis程序升级 去掉*/
/**2021-4-25 等超声补传完 去掉*/
if (Objects.equals(messageDto.getType(), AliasName.ULTRASONIC_REPORT) && archiveMaster.getArchiveState().equals("已归档")){
if (Objects.equals(messageDto.getType(), AliasName.ULTRASONIC_REPORT) && archiveMaster.getArchiveState().equals("已归档")) {
messageSubordinate.setStatus(3);
messageSubordinateService.save(messageSubordinate);
continue;
}
/**2021-4-25 等超声补传完 去掉*/
/**2021-4-25 等心电图补传完 去掉*/
if (Objects.equals(messageDto.getType(), AliasName.EKG_REPORT) && archiveMaster.getArchiveState().equals("已归档")){
if (Objects.equals(messageDto.getType(), AliasName.EKG_REPORT) && archiveMaster.getArchiveState().equals("已归档")) {
messageSubordinate.setStatus(3);
messageSubordinateService.save(messageSubordinate);
continue;
}
/**2021-4-25 等心电图补传完 去掉*/
if ( !Objects.equals(messageDto.getType(), AliasName.PATHOLOGY_REPORT)
if (!Objects.equals(messageDto.getType(), AliasName.PATHOLOGY_REPORT)
/**2021-1-26 等lis程序升级 去掉*/
&& !Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT)
/**2021-1-26 等lis程序升级 去掉*/
/**2021-4-25 等超声补传完 去掉*/
&& !Objects.equals(messageDto.getType(), AliasName.ULTRASONIC_REPORT)
/**2021-4-25 等超声补传完 去掉*/
/**2021-4-25 等心电图补传完 去掉*/
&& !Objects.equals(messageDto.getType(), AliasName.EKG_REPORT)
/**2021-4-25 等心电图补传完 去掉*/
&& !Objects.equals(messageDto.getType(), AliasName.NEW_PATHOLOGY_REPORT)
&& (archiveMaster.getArchiveState().equals("初审") || archiveMaster.getArchiveState().equals("已归档"))
){
) {
messageSubordinate.setStatus(3);
messageSubordinateService.save(messageSubordinate);
continue;
@ -119,40 +115,40 @@ public class QueueService {
archiveDetailService.save(archiveDetail);
} else {
//如果是检验报告 单独处理
if(Objects.equals(messageDto.getType(),AliasName.INSPECTION_REPORT)){
if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT)) {
// 查询库中是否存在 如果存在就更新
archiveDetail = archiveDetailService.isExitCheckReportId(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), messageDto.getCheckReportId());
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(),messageDto.getApplyId(), messageDto.getCheckReportId(),
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(), messageDto.getCheckReportId(),
messageDto.getDetailType());
archiveDetailService.save(archiveDetail);
} else {
//更新时间
archiveDetail.setUpLoadDateTime(date);
}
}else{
} else {
//获取下载下载
if(Objects.equals(messageDto.getType(),AliasName.RADIATION_REPORT)) {
if (Objects.equals(messageDto.getType(), AliasName.RADIATION_REPORT)) {
//PACS
//获取报告单号|申请单号 DR20210430233|97497407
String checkReportId = messageDto.getCheckReportId();
//定义是否走下载逻辑 第一次推送需要下载,报告单号为空或非第一次推送不需要下载
boolean downFlag = false;
if(StringUtils.isNotBlank(checkReportId)){
if (StringUtils.isNotBlank(checkReportId)) {
//获报告单号DR20210430233
String[] checkReportIdArr = checkReportId.split("\\|");
checkReportId = checkReportIdArr[0];
//判断报告单号是否存在
archiveDetail = archiveDetailService.isExitCheckReportId(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(),checkReportId);
archiveDetail = archiveDetailService.isExitCheckReportId(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), checkReportId);
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),checkReportId,
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(), checkReportId,
messageDto.getDetailType());
archiveDetailService.save(archiveDetail);
downFlag = true;
} else {
//横杠拼接申请单号
String applyId = archiveDetail.getApplyId();
if(!applyId.contains(checkReportIdArr[1])) {
if (!applyId.contains(checkReportIdArr[1])) {
archiveDetail.setApplyId(applyId + "-" + checkReportIdArr[1]);
//更新时间
archiveDetail.setUpLoadDateTime(date);
@ -160,16 +156,30 @@ public class QueueService {
}
status = 1;
}
}else{
} else {
messageSubordinate.setRemark("住院号为:" + messageDto.getInpNo() + "的checkReportId为空。。。。");
}
if(!downFlag) {
if (!downFlag) {
messageSubordinate.setStatus(status);
messageSubordinateService.save(messageSubordinate);
continue;
}
}else{
}
//如果是新病历报告单独处理
if (Objects.equals(messageDto.getType(), AliasName.NEW_PATHOLOGY_REPORT)) {
//获取报告单号|申请单号 如果存在更新不存在新增
String checkReportId = messageDto.getCheckReportId();
String applyId = messageDto.getApplyId();
archiveDetail = archiveDetailService.isExitCheckReportIdAndApplyId(archiveMaster.getId(), checkReportId, applyId);
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, "52", messageDto.getSource(), messageDto.getApplyId(), checkReportId,messageDto.getDetailType());
archiveDetailService.save(archiveDetail);
}else {
//更新时间
archiveDetail.setUpLoadDateTime(date);
}
} else {
//非PACS
// 查询库中是否存在 如果存在就更新
archiveDetail = archiveDetailService.isExit(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId());
@ -184,7 +194,7 @@ public class QueueService {
}
}
}
logger.error("保存文件数据耗时:"+(System.currentTimeMillis() - start1));
logger.error("保存文件数据耗时:" + (System.currentTimeMillis() - start1));
String pdfPath = null;
String tempPath = "";
Integer pageNum = 1;
@ -192,11 +202,11 @@ public class QueueService {
// 护理单独做处理
boolean saveFlag = false;
if(archiveMaster.getEmrNurseCommitTime() == null ){
if (archiveMaster.getEmrNurseCommitTime() == null) {
archiveMaster.setEmrNurseCommitTime(messageDto.getEmrCommitTime());
saveFlag = true;
}else if(messageDto.getEmrCommitTime() != null && archiveMaster.getEmrNurseCommitTime() !=null &&
!Objects.equals( messageDto.getEmrCommitTime().getTime(),archiveMaster.getEmrNurseCommitTime().getTime())){
} else if (messageDto.getEmrCommitTime() != null && archiveMaster.getEmrNurseCommitTime() != null &&
!Objects.equals(messageDto.getEmrCommitTime().getTime(), archiveMaster.getEmrNurseCommitTime().getTime())) {
archiveMaster.setEmrNurseCommitTime(messageDto.getEmrCommitTime());
saveFlag = true;
}
@ -205,23 +215,15 @@ public class QueueService {
archiveMaster.setEmrNurseCmt("提交");
saveFlag = true;
}
if(saveFlag){
if (saveFlag) {
archiveMasterService.save(archiveMaster);
}
String tempPageNum = "";
// if (messageDto.getApplyId().lastIndexOf("_") != -1 ) {
//apply_id 000562390700_1_000562390700_0_1_JHR06.00.02_34_2.pdf
// if(archiveMaster.getInpNo().lastIndexOf("_") != -1){
// }
// tempPageNum = messageDto.getApplyId().substring(0, messageDto.getApplyId().indexOf(".pdf"));
// }else{
// address ftp://10.6.0.155/2020-08-04/000562390700_1_000562390700_0_1_JHR06.00.02_34_2_0.pdf
tempPageNum = address.substring(0, address.lastIndexOf("_"));
// }
tempPageNum = tempPageNum.substring(tempPageNum.lastIndexOf("_") + 1, tempPageNum.length() );
if(isInteger(tempPageNum)){
tempPageNum = tempPageNum.substring(tempPageNum.lastIndexOf("_") + 1, tempPageNum.length());
if (isInteger(tempPageNum)) {
pageNum = Integer.valueOf(tempPageNum);
}
@ -231,11 +233,11 @@ public class QueueService {
// 医生单独做处理
boolean saveFlag = false;
if(archiveMaster.getEmrDoctorCommitTime() == null ){
if (archiveMaster.getEmrDoctorCommitTime() == null) {
archiveMaster.setEmrDoctorCommitTime(messageDto.getEmrCommitTime());
saveFlag = true;
}else if(messageDto.getEmrCommitTime() != null && archiveMaster.getEmrDoctorCommitTime() !=null &&
!Objects.equals( messageDto.getEmrCommitTime().getTime(),archiveMaster.getEmrDoctorCommitTime().getTime())){
} else if (messageDto.getEmrCommitTime() != null && archiveMaster.getEmrDoctorCommitTime() != null &&
!Objects.equals(messageDto.getEmrCommitTime().getTime(), archiveMaster.getEmrDoctorCommitTime().getTime())) {
archiveMaster.setEmrDoctorCommitTime(messageDto.getEmrCommitTime());
saveFlag = true;
}
@ -244,14 +246,14 @@ public class QueueService {
archiveMaster.setEmrDoctorCmt("提交");
saveFlag = true;
}
if(saveFlag){
if (saveFlag) {
archiveMasterService.save(archiveMaster);
}
tempPath = messageDto.getType() + "~" + messageDto.getCaptionDateTime() + "~";
} else {
// 20200518 给重症系统的文件排序
if (messageDto.getType().equals(AliasName.ICU_REPORT)) {
if(isInteger(messageDto.getCaptionDateTime())){
if (isInteger(messageDto.getCaptionDateTime())) {
pageNum = Integer.valueOf(messageDto.getCaptionDateTime());
}
//重症如果是pdf
@ -288,12 +290,9 @@ public class QueueService {
}
}
}
} else if (address.contains("http")){//新心电以http协议传
logger.error("类型为:" + messageDto.getType());
} else if (address.contains("http")) {//新心电以http协议传
if (Objects.equals(messageDto.getType(), AliasName.PETCT_REPORT)) {
HttpDownloader httpDownloader = new HttpDownloader(null);
logger.error("核医学下载地址为URL" + address);
logger.error("核医学下载文件名:" + address);
httpDownloader.downLoadFromUrl(address, pdfFile.getName(), pdfFile.getParent());
pdfPath = pdfFile.getAbsolutePath();
} else {
@ -311,9 +310,9 @@ public class QueueService {
}
//金域外送报告解析 2021-05-06
if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT)){
PdfUtils.base64StringToPDF(address,pdfFile.getAbsolutePath());
pdfPath=pdfFile.getAbsolutePath();
if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT)) {
PdfUtils.base64StringToPDF(address, pdfFile.getAbsolutePath());
pdfPath = pdfFile.getAbsolutePath();
}
}
}
@ -322,11 +321,11 @@ public class QueueService {
// 转成格式
archiveDetail.setPageNumber(pageNum);
archiveDetail.setPdfPath(pdfPath);
int i=archiveDetailService.countByMasterIDAndAssortIDAndTitleAndFlag(archiveDetail.getMasterID(),archiveDetail.getAssortID(),archiveDetail.getTitle());
int i = archiveDetailService.countByMasterIDAndAssortIDAndTitleAndFlag(archiveDetail.getMasterID(), archiveDetail.getAssortID(), archiveDetail.getTitle());
//如果detail表有重复的分段数据则把falg改为55为没人使用的自定义数字同时修改修改完整性接口的sql
// if(archiveDetailService.countByMasterIDAndAssortIDAndTitleAndFlag(archiveDetail.getMasterID(),archiveDetail.getAssortID(),archiveDetail.getTitle())>1)
// {
// archiveDetail.setFlag("5");
// archiveDetail.setFlag("5");
//}
archiveDetailService.save(archiveDetail);
@ -346,11 +345,11 @@ public class QueueService {
archiveDetailService.delete(archiveDetail.getId());
}
}
logger.error("文件下载耗时:"+(System.currentTimeMillis() - start3));
logger.error("文件下载耗时:" + (System.currentTimeMillis() - start3));
} else {
messageSubordinate.setRemark("地址为空。。。。");
}
} else{
} else {
messageSubordinate.setRemark("住院号为:" + messageDto.getInpNo() + "的ArchiveMaster为空。。。。");
}
}
@ -358,14 +357,14 @@ public class QueueService {
}
} catch (Exception e) {
// 设置参数
messageSubordinate.setRemark(e + ",问题发生时间:"+new Date());
messageSubordinate.setRemark(e + ",问题发生时间:" + new Date());
// 报错删掉患者报告详情信息
if (archiveDetail != null) {
if (archiveDetail.getId() != null) {
archiveDetailService.delete(archiveDetail.getId());
}
}
logger.error("messageId:"+messageId+"报错了:" ,e);
logger.error("messageId:" + messageId + "报错了:", e);
}
messageSubordinate.setStatus(status);
@ -390,38 +389,37 @@ public class QueueService {
}
public void doSomethingByHIS() {
try {
while (true) {
//循环开始处理 所有未处理的
List<InterfaceHisCacheDto> interfaceHisCaches = interfaceHisCacheService.findInterfaceHisCacheByState();
if(CollectionUtils.isEmpty(interfaceHisCaches)){
if (CollectionUtils.isEmpty(interfaceHisCaches)) {
break;
}
doSomethingByHISMethod(interfaceHisCaches);
}
}catch (Exception e){
logger.error("出错咯!错误信息为{},以及错误行数为:{}" ,e,e.getStackTrace()[0]);
} catch (Exception e) {
logger.error("出错咯!错误信息为{},以及错误行数为:{}", e, e.getStackTrace()[0]);
}
}
private void doSomethingByHISMethod(List<InterfaceHisCacheDto> interfaceHisCaches){
for (InterfaceHisCacheDto interfaceHisCacheDto: interfaceHisCaches) {
private void doSomethingByHISMethod(List<InterfaceHisCacheDto> interfaceHisCaches) {
for (InterfaceHisCacheDto interfaceHisCacheDto : interfaceHisCaches) {
InterfaceHisCache interfaceHisCache = new InterfaceHisCache();
BeanUtils.copyProperties(interfaceHisCacheDto,interfaceHisCache);
String type = null,remark = null,title = null,pdfPath = null,state = "2";
BeanUtils.copyProperties(interfaceHisCacheDto, interfaceHisCache);
String type = null, remark = null, title = null, pdfPath = null, state = "2";
ArchiveDetail archiveDetail = null;
try{
try {
ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(interfaceHisCache.getInpNo(), interfaceHisCache.getVisitId());
if(archiveMaster != null){
if(interfaceHisCache.getType() != null){
if (archiveMaster != null) {
if (interfaceHisCache.getType() != null) {
//给type 属性赋值
if(Objects.equals(interfaceHisCache.getType(),"0")){
if (Objects.equals(interfaceHisCache.getType(), "0")) {
type = AliasName.SOS;
title = "临时医嘱";
}else if(Objects.equals(interfaceHisCache.getType(),"1")){
} else if (Objects.equals(interfaceHisCache.getType(), "1")) {
type = AliasName.PRN;
title = "长期医嘱";
}
@ -431,9 +429,9 @@ public class QueueService {
Date date = new Date();
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, type, "HIS系统", title,
title ,1);
title, 1);
archiveDetailService.save(archiveDetail);
}else{
} else {
//更新时间
archiveDetail.setUpLoadDateTime(date);
}
@ -448,28 +446,28 @@ public class QueueService {
archiveDetail.setPdfPath(pdfPath);
archiveDetailService.save(archiveDetail);
//删除FTP文件
if(FTPUtil.deleteFile(interfaceHisCache.getPdfPath())){
if (FTPUtil.deleteFile(interfaceHisCache.getPdfPath())) {
// 成功
state = "1";
}
}else {
} else {
remark = "下载失败";
}
}
}else{
} else {
remark = "文件创建失败";
}
}else{
} else {
remark = "类型为空";
}
}else{
} else {
remark = "没有入院信息";
}
}catch (Exception e){
} catch (Exception e) {
remark = e.getMessage();
}
if(remark != null){
if (remark != null) {
// 报错删掉患者报告详情信息
if (archiveDetail != null) {
try {
@ -480,12 +478,12 @@ public class QueueService {
}
}
//赋值
interfaceHisCache.setValue(state,remark,new Date());
interfaceHisCache.setValue(state, remark, new Date());
interfaceHisCacheService.save(interfaceHisCache);
}
}
public boolean isInteger(String str) {
public boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}

Loading…
Cancel
Save