Compare commits

..

336 Commits
dev ... master

Author SHA1 Message Date
LiZhong b1c3c21d02 Merge remote-tracking branch 'origin/master'
2 years ago
LiZhong 6083a85e34 修复任务并发执行次数
2 years ago
郭向斌 21a022ca7d 图片获取
2 years ago
郭向斌 1ed303f7c6 配置文件修改
2 years ago
郭向斌 c65202d585 配置文件修改
2 years ago
郭向斌 b94407c1de 配置文件修改
2 years ago
郭向斌 fc39d130aa 配置文件修改
2 years ago
郭向斌 291cadcbec 配置文件修改
2 years ago
郭向斌 e021526a26 配置文件修改
2 years ago
郭向斌 b903c453d7 配置文件修改
2 years ago
郭向斌 cdc3c5fe23 配置文件修改
2 years ago
郭向斌 10ecb1179c 配置文件修改
2 years ago
郭向斌 d75970a3e2 配置文件修改
2 years ago
郭向斌 c325db2c58 配置文件修改
2 years ago
郭向斌 af81d8b1be 配置文件修改
2 years ago
郭向斌 5eedb16ec0 配置文件修改
2 years ago
郭向斌 6cfced5860 配置文件修改
2 years ago
郭向斌 d541c0560f 配置文件修改
2 years ago
郭向斌 fcdf01600b 配置文件修改
2 years ago
郭向斌 e2893a2fd7 配置文件修改
2 years ago
郭向斌 d07f666e64 配置文件修改
2 years ago
郭向斌 8348b79ba4 Merge remote-tracking branch 'origin/master'
2 years ago
郭向斌 41e3ab829d 配置文件修改
2 years ago
DELL d092e9c418 新增方法:计算最近任务创建时间差修改
2 years ago
DELL eb50805c86 新增方法:计算最近任务创建时间差
2 years ago
周文涛 96573a1c92 updates
2 years ago
周文涛 09fe33ce1e updates
2 years ago
周文涛 9286533797 updates
2 years ago
周文涛 76cfd00bfd updates
2 years ago
周文涛 b88eafe8ab updates
2 years ago
周文涛 132976ba13 updates
2 years ago
周文涛 1a50167360 updates
2 years ago
周文涛 343321d815 updates
2 years ago
DELL 7bc5d74200 规则更新
2 years ago
周文涛 0f7c5b20e4 updates
2 years ago
DELL 258b40332a 规则更新
2 years ago
周文涛 d519ba7f2d updates
2 years ago
周文涛 4a0b5f2393 updates
2 years ago
周文涛 ce00cf05c0 updates
2 years ago
周文涛 1c3ba1028a updates
2 years ago
周文涛 537d0e460c updates
2 years ago
周文涛 33d29b3232 updates
2 years ago
周文涛 bfe706f970 updates
2 years ago
周文涛 69da49eed5 updates
2 years ago
周文涛 a5723cecd0 updates
2 years ago
周文涛 3a80503761 updates
2 years ago
周文涛 d9d1665378 updates
2 years ago
周文涛 dcdc4f317a updates
2 years ago
周文涛 3b09493ebf updates
2 years ago
周文涛 678d3c47c1 updates
2 years ago
周文涛 15307f7e09 updates
2 years ago
周文涛 c867dece0e updates
2 years ago
周文涛 698ceae0f4 updates
2 years ago
周文涛 fc3c4866fe updates
2 years ago
周文涛 ba9e0b7550 updates
2 years ago
周文涛 182b38965d updates
2 years ago
周文涛 3a41bd5e0e updates
2 years ago
周文涛 d15ae5b208 updates
2 years ago
周文涛 7d20f3dad9 updates
2 years ago
周文涛 276f148cb3 updates
2 years ago
周文涛 47a1ed8eac updates
2 years ago
周文涛 72503772da updates
2 years ago
周文涛 c8d35315b3 updates
2 years ago
周文涛 07cc681201 updates
2 years ago
周文涛 f7b45222f7 updates
2 years ago
周文涛 9049166cde updates
2 years ago
周文涛 902ad5c8b7 updates
2 years ago
周文涛 f62c0d1bf3 updates
2 years ago
周文涛 46e22c6ab5 updates
2 years ago
周文涛 6674c51c6e updates
2 years ago
周文涛 69dfdfd0a0 updates
2 years ago
周文涛 4511bb78fe updates
2 years ago
周文涛 f7e4034732 updates
2 years ago
周文涛 97c9b08790 updates
2 years ago
周文涛 e38f4b4aa1 updates
2 years ago
周文涛 b758bd4f87 updates
2 years ago
周文涛 8e129d80c6 updates
2 years ago
周文涛 0309321d26 updates
2 years ago
周文涛 3eafba9df1 updates
2 years ago
周文涛 d48bff334f updates
2 years ago
周文涛 5c97997a69 updates
2 years ago
周文涛 3e686bafac updates
2 years ago
周文涛 2a72c19af5 updates
2 years ago
周文涛 a7986f6d13 updates
2 years ago
周文涛 019d2e9a25 updates
2 years ago
周文涛 644ca1c4a0 updates
2 years ago
周文涛 40cf324747 updates
2 years ago
周文涛 2222c2f66d updates
2 years ago
周文涛 27a143c65b updates
2 years ago
周文涛 c0a939fc42 updates
2 years ago
周文涛 ae945f8653 updates
2 years ago
周文涛 2d16bbd0c0 updates
2 years ago
周文涛 03eed5fa84 updates
2 years ago
周文涛 6d6ae664ef updates
2 years ago
周文涛 04cc2a204d updates
2 years ago
周文涛 5d500c90d8 updates
2 years ago
周文涛 f03227bce2 updates
2 years ago
周文涛 15ac5069f2 updates
2 years ago
周文涛 2d65be3bc3 updates
2 years ago
周文涛 7756c7117b updates
2 years ago
周文涛 829d85703b updates
2 years ago
周文涛 32e0bf881d updates
2 years ago
周文涛 2ee3568acd updates
2 years ago
周文涛 50ea63f94b updates
2 years ago
周文涛 3c0fe9f1fa updates
2 years ago
周文涛 61243310a7 updates
2 years ago
周文涛 801c6f2dbc updates
2 years ago
周文涛 ee6b061f8e updates
2 years ago
周文涛 c8d987a483 updates
2 years ago
周文涛 fb410c30fa updates
2 years ago
周文涛 69677d5e8a updates
2 years ago
周文涛 b0d9be39c7 updates
2 years ago
周文涛 80b4634b2f updates
2 years ago
周文涛 c9b067e36a updates
2 years ago
周文涛 9b23f25920 updates
2 years ago
周文涛 ded11d2b02 updates
2 years ago
周文涛 1a13a8e89c updates
2 years ago
周文涛 619c557762 updates
2 years ago
周文涛 aaeab8258e updates
2 years ago
周文涛 03bfda1495 updates
2 years ago
周文涛 c7551b3df8 updates
2 years ago
周文涛 f5f5b01305 updates
2 years ago
周文涛 4f50d1bb04 updates
2 years ago
周文涛 65bfd590b6 updates
2 years ago
周文涛 d3c06e1fee updates
2 years ago
周文涛 1ecf45fd04 updates
2 years ago
周文涛 34f2a2fe2e updates
2 years ago
周文涛 543192f981 updates
2 years ago
周文涛 1b5b71eae2 updates
2 years ago
周文涛 460ac40b45 updates
2 years ago
周文涛 5780d79193 updates
2 years ago
周文涛 d877f41342 updates
2 years ago
周文涛 8b72febc5b updates
2 years ago
周文涛 eb9b7fd11a updates
2 years ago
周文涛 38fabe6bff updates
2 years ago
周文涛 846199887f updates
2 years ago
周文涛 2ae870e7eb updates
2 years ago
周文涛 814a344891 updates
2 years ago
周文涛 7b7f6fc97a updates
2 years ago
周文涛 8c18316bb4 updates
2 years ago
周文涛 e922f825b6 updates
2 years ago
周文涛 3005edc34f updates
2 years ago
周文涛 508d2afba3 updates
2 years ago
周文涛 835b1be4f8 updates
2 years ago
周文涛 d789fdc880 updates
2 years ago
周文涛 fb740fa111 updates
2 years ago
周文涛 e4b5767ec6 updates
2 years ago
周文涛 bf598bb341 updates
2 years ago
周文涛 69ce1ef405 updates
2 years ago
周文涛 37f53be1b9 updates
2 years ago
周文涛 97b3921291 updates
2 years ago
周文涛 7347ba6668 updates
2 years ago
周文涛 6429b9f2c8 updates
2 years ago
周文涛 8b84eda5b7 updates
2 years ago
周文涛 a903cc5c99 updates
2 years ago
周文涛 093a9fbb03 updates
2 years ago
周文涛 ee81400249 updates
2 years ago
周文涛 5158b489a2 updates
2 years ago
周文涛 3353e0f53c updates
2 years ago
周文涛 183384e84a updates
2 years ago
周文涛 2d97e7342c updates
2 years ago
周文涛 f5cfb278e2 updates
2 years ago
周文涛 0c7ea504ff updates
2 years ago
周文涛 f7c5914775 updates
2 years ago
周文涛 a83877351c updates
2 years ago
周文涛 15e15df835 updates
2 years ago
周文涛 4421870d60 updates
2 years ago
周文涛 6c37ad5f23 updates
2 years ago
周文涛 ed168416ac updates
2 years ago
周文涛 5a50b096ce updates
2 years ago
周文涛 0f51d3f9d2 updates
2 years ago
周文涛 b8100b4e3b updates
2 years ago
周文涛 5056094b68 updates
2 years ago
周文涛 72f4f7bbea updates
2 years ago
周文涛 ad00f96e3e updates
2 years ago
周文涛 35d3d117c3 updates
2 years ago
周文涛 26bd0bf88a updates
2 years ago
周文涛 25236bb71a updates
2 years ago
周文涛 2c78c3e01f updates
2 years ago
周文涛 ed6b8df54a updates
2 years ago
周文涛 d528dad28f updates
2 years ago
周文涛 f322015e6d updates
2 years ago
周文涛 5508fb9356 updates
2 years ago
周文涛 446161aa7f updates
2 years ago
周文涛 53677a8222 updates
2 years ago
周文涛 575ba02918 updates
2 years ago
周文涛 5d0e27a549 updates
2 years ago
周文涛 bbf8824bf5 updates
2 years ago
周文涛 f15fa61da5 updates
2 years ago
周文涛 ac8d063774 updates
2 years ago
周文涛 e5eb15019d updates
2 years ago
周文涛 c545729918 updates
2 years ago
周文涛 134a86233a updates
2 years ago
周文涛 727f25379f updates
2 years ago
周文涛 a91b6fe6d0 updates
2 years ago
周文涛 d1bdabcf3e updates
2 years ago
周文涛 760ae9a3d3 updates
2 years ago
周文涛 8629ed02dd updates
2 years ago
周文涛 6bd8c26095 updates
2 years ago
周文涛 2609cc2e3b updates
2 years ago
周文涛 03e46c3c39 updates
2 years ago
周文涛 82cd93d232 updates
2 years ago
周文涛 d678700078 updates
2 years ago
周文涛 110e440311 updates
2 years ago
周文涛 d5589df394 updates
2 years ago
周文涛 1157cd3835 updates
2 years ago
周文涛 e95faf2f7e updates
2 years ago
周文涛 190db3d608 updates
2 years ago
周文涛 7d64a67859 updates
2 years ago
周文涛 a5a7bb3324 updates
2 years ago
周文涛 a9945aa2ec updates
2 years ago
周文涛 22b737320e updates
2 years ago
周文涛 2e4227ade2 updates
2 years ago
周文涛 f2318b6bab updates
2 years ago
周文涛 5e2196b2cc updates
2 years ago
周文涛 9eaaf47ebb updates
2 years ago
周文涛 84f3ca2808 updates
2 years ago
周文涛 4012766341 updates
2 years ago
周文涛 27ad210e89 updates
2 years ago
周文涛 9e6fa254f7 updates
2 years ago
周文涛 b3b7fac351 updates
2 years ago
周文涛 95215ca3d8 updates
2 years ago
周文涛 dc77f1bc0b updates
2 years ago
周文涛 d655afd3c1 updates
2 years ago
周文涛 2775305af5 updates
2 years ago
周文涛 f9e2b5401f updates
2 years ago
周文涛 27d0e94396 updates
2 years ago
周文涛 2fa171fc1d updates
2 years ago
周文涛 8217f0e367 updates
2 years ago
周文涛 70c120492b updates
2 years ago
周文涛 451ba8dd73 updates
2 years ago
周文涛 f52600fa68 updates
2 years ago
周文涛 903d4f23de updates
2 years ago
周文涛 5176c25d86 updates
2 years ago
周文涛 81c0a4df49 updates
2 years ago
周文涛 d00695773f updates
2 years ago
周文涛 12d2c788d0 updates
2 years ago
周文涛 1c7e66bdae updates
2 years ago
周文涛 f52553f830 updates
2 years ago
周文涛 a81833222a updates
2 years ago
周文涛 8838201d18 updates
2 years ago
周文涛 dc78ccf20c updates
2 years ago
周文涛 ecc1fc3a96 updates
2 years ago
周文涛 75f786ebb8 updates
2 years ago
周文涛 7e7992a2de updates
2 years ago
周文涛 0c136afcbc updates
2 years ago
周文涛 8c77574131 updates
2 years ago
周文涛 112b3c2bc4 updates
2 years ago
周文涛 947e9b3c26 updates
2 years ago
周文涛 790d112cea updates
2 years ago
周文涛 33f86db96d updates
2 years ago
周文涛 a45ebe826b updates
2 years ago
周文涛 23c6ea5164 updates
2 years ago
周文涛 333df0f37e updates
2 years ago
周文涛 463debeb89 updates
2 years ago
周文涛 962283716e updates
2 years ago
周文涛 a95a4e1926 updates
2 years ago
周文涛 ee705dfc4e updates
2 years ago
周文涛 1794a5a6f8 updates
2 years ago
周文涛 bc7ecaabe3 updates
2 years ago
周文涛 bf6a486208 updates
2 years ago
周文涛 ffd6e0aadd updates
2 years ago
周文涛 d76fbcc9a8 updates
2 years ago
周文涛 77f65ef0d3 updates
2 years ago
周文涛 81feaf9e2d updates
2 years ago
周文涛 b9e45f1c4c updates
2 years ago
周文涛 8df9a2d73c updates
2 years ago
周文涛 6e829fc65a updates
2 years ago
周文涛 e4b06cc9cc updates
2 years ago
周文涛 e90f0ac226 updates
2 years ago
周文涛 961740757d updates
2 years ago
周文涛 bc992b5f13 updates
2 years ago
周文涛 cc14a88c18 updates
2 years ago
周文涛 b0c292c3ba updates
2 years ago
周文涛 91ecb9ea18 updates
2 years ago
周文涛 74cb1133fb updates
2 years ago
周文涛 963749ebe7 updates
2 years ago
周文涛 11e6ee53f2 updates
2 years ago
周文涛 3fabeccf05 updates
2 years ago
周文涛 8cdd18a3bc updates
2 years ago
周文涛 8744b00a45 updates
2 years ago
周文涛 2b7c4a0f04 updates
2 years ago
周文涛 bfd96e88e5 updates
2 years ago
周文涛 5e66e6f273 updates
2 years ago
周文涛 156e642572 updates
2 years ago
周文涛 972b24322d updates
2 years ago
周文涛 66ee319396 updates
2 years ago
周文涛 27bc36aa53 updates
2 years ago
周文涛 0a067dee45 updates
2 years ago
周文涛 b1bed8e255 updates
2 years ago
周文涛 a875784187 updates
2 years ago
周文涛 6cd0cdf306 updates
2 years ago
周文涛 61e7a4d50e updates
2 years ago
周文涛 23b6ed6bcb updates
2 years ago
周文涛 c81d69a502 updates
2 years ago
周文涛 568b57684b updates
2 years ago
周文涛 f5d0781aa8 updates
2 years ago
周文涛 7498bdcf5b updates
2 years ago
周文涛 3b2a5b3c6a updates
2 years ago
周文涛 4a8c438543 updates
2 years ago
周文涛 0f210717af updates
2 years ago
周文涛 4ac6b8927d updates
2 years ago
周文涛 859a3a8719 updates
2 years ago
周文涛 74d86f3407 updates
2 years ago
周文涛 f9f6e9700a updates
2 years ago
周文涛 0f7818d124 updates
2 years ago
周文涛 9c009bdf66 updates
2 years ago
周文涛 fdc9480961 updates
2 years ago
周文涛 2d40a3c2ee updates
2 years ago
周文涛 388edd2e3e updates
2 years ago
周文涛 ed5409e952 updates
2 years ago
周文涛 af5417efc5 updates
2 years ago
周文涛 fd13f6d221 updates
2 years ago
周文涛 b1d2699882 updates
2 years ago
周文涛 2f9c49fa1b updates
2 years ago
周文涛 da34a7525f updates
2 years ago
周文涛 3f6d657297 updates
2 years ago
周文涛 5f10f7a769 updates
2 years ago
周文涛 7acf4d1bfe updates
2 years ago
han a6ffcab86e Merge branch 'master' of https://git.mcnetmart.com/zhouwentao/ocr-java
2 years ago
周文涛 1e01f90c92 updates
2 years ago
周文涛 28208dc89e updates
2 years ago
han e41cf35f06 基础代码提交
2 years ago
周文涛 b260e7066b updates
2 years ago
周文涛 650635327e updates
2 years ago
周文涛 386b04e02b updates
2 years ago
周文涛 4540f4fe43 updates
2 years ago
周文涛 ff985a0ac9 updates
2 years ago
周文涛 758dae5f99 Merge remote-tracking branch 'origin/master'
2 years ago
周文涛 51b7268a43 updates
2 years ago
周文涛 402df55e07 updates
2 years ago
周文涛 af729c279e updates
2 years ago
周文涛 6cb14422a5 remove .idea/
2 years ago
周文涛 6a5c735a33 updates
2 years ago
周文涛 6425e7f194 updates
2 years ago
han 2b2c3e4093 基础代码提交
2 years ago

@ -17,13 +17,8 @@ public class OcrConstant {
*/ */
public static String ruleCheckSplitChar="&"; public static String ruleCheckSplitChar="&";
public static String ruleHz="||"; public static String ruleCheckOrChar="||";
public static String ruleZkh="\\(";
public static String ruleYkh="\\)";
public static String ruleDyh=">";
public static String ruleXyh="<";
public static String ruleTh="!";
public static String ruleBq="&&";
public static String ruleCheckValueRightChar="="; public static String ruleCheckValueRightChar="=";
/** /**

@ -237,8 +237,8 @@ public class RestUtil {
//回调接口 //回调接口
if (url.contains("callback")) { if (url.contains("callback")) {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(300000); requestFactory.setConnectTimeout(30000);
requestFactory.setReadTimeout(300000); requestFactory.setReadTimeout(30000);
RT = new RestTemplate(requestFactory); RT = new RestTemplate(requestFactory);
}else{ }else{
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

@ -28,7 +28,6 @@ import org.jeecg.modules.ocr.utils.ImageUtils;
import org.jeecg.modules.ocr.dto.OcrIdentifyDTO; import org.jeecg.modules.ocr.dto.OcrIdentifyDTO;
import org.jeecg.modules.ocr.dto.OcrRuleCheckDTO; import org.jeecg.modules.ocr.dto.OcrRuleCheckDTO;
import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.system.service.ISysDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
@ -38,8 +37,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.awt.*; import java.awt.*;
import java.io.File; import java.io.File;
import java.rmi.RemoteException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -69,7 +66,7 @@ public class ApiController {
@Value("${system.project.wlyCallback}") @Value("${system.project.wlyCallback}")
private String wlyCallback; private String wlyCallback;
@ApiOperation(value = "通用识别") @ApiOperation(value = "通用识别")
@PostMapping("/identify") @RequestMapping("/identify")
@Transactional @Transactional
@ResponseBody @ResponseBody
@AutoLog(value = "api接口-通用识别",logType = CommonConstant.LOG_TYPE_2,operateType=CommonConstant.OPERATE_TYPE_1) @AutoLog(value = "api接口-通用识别",logType = CommonConstant.LOG_TYPE_2,operateType=CommonConstant.OPERATE_TYPE_1)
@ -77,6 +74,7 @@ public class ApiController {
// if (!"test".equals(profiles)) { // if (!"test".equals(profiles)) {
// return Result.error("当前环境不支持该功能,请访问测试环境"); // return Result.error("当前环境不支持该功能,请访问测试环境");
// } // }
log.info("api接口-通用识别请求开始,{}",requestBody);
if (requestBody == null) { if (requestBody == null) {
return Result.error("请输入请求参数"); return Result.error("请输入请求参数");
} }
@ -143,6 +141,7 @@ public class ApiController {
ocrIdentify.setSourceJson(requestBody.getJSONArray("sourceJson").toJSONString());//校验数据源 ocrIdentify.setSourceJson(requestBody.getJSONArray("sourceJson").toJSONString());//校验数据源
ocrIdentifyService.save(ocrIdentify); ocrIdentifyService.save(ocrIdentify);
} }
log.info("api接口-通用识别请求结束,{}",requestBody);
Thread.sleep(1000L); Thread.sleep(1000L);
//3.请求python ocr识别异步执行 //3.请求python ocr识别异步执行
//taskService.postSemantic(ocrIdentify,fileList); //taskService.postSemantic(ocrIdentify,fileList);
@ -260,7 +259,7 @@ public class ApiController {
@ApiOperation(value = "调试101") @ApiOperation(value = "调试101")
@PostMapping(value = "/test_101") @PostMapping(value = "/test_101")
public Result test101(@RequestBody JSONObject jsonObject) { public Result test101(@RequestBody JSONObject jsonObject){
//ocrIdentifyService.callbackWly("1688915746261848065"); //ocrIdentifyService.callbackWly("1688915746261848065");
//OcrIdentifyDTO byId = ocrIdentifyService.findById("1692068694831755265"); //OcrIdentifyDTO byId = ocrIdentifyService.findById("1692068694831755265");
//ocrIdentifyService.updateTaskResultInfo(byId.getId()); //ocrIdentifyService.updateTaskResultInfo(byId.getId());
@ -270,8 +269,9 @@ public class ApiController {
Map<String, String> configRuleMap = ocrRuleCheckVo.getConfigRuleMap();*/ Map<String, String> configRuleMap = ocrRuleCheckVo.getConfigRuleMap();*/
OcrIdentifyDTO identifyDTO = ocrIdentifyService.findById("1702560400245035009"); OcrIdentifyDTO identifyDTO = ocrIdentifyService.findById("1702560400245035009");
List<OcrIdentifyDetail> identifyDetailList = ocrIdentifyDetailService.listByIdentifyId(identifyDTO.getId()); List<OcrIdentifyDetail> identifyDetailList = ocrIdentifyDetailService.listByIdentifyId(identifyDTO.getId());
CallBackWlyUtils.callbackWly(wlyCallback, identifyDTO, identifyDetailList); CallBackWlyUtils.callbackWly(wlyCallback,identifyDTO,identifyDetailList);
return Result.OK(""); return Result.OK("");
} }
} }

@ -1,32 +0,0 @@
package org.jeecg.modules.ocr.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Title:
* @Description:
* @Author
* @Date 2023-10-27 10:21
* @Version V1.0
*/
//@Configuration
public class TesseractOcrConfiguration {
// @Value("${tess4j.data-path}")
// private String dataPath;
//
// @Value("${tess4j.language}")
// private String language;
// @Bean
// public Tesseract tesseract() {
//
// Tesseract tesseract = new Tesseract();
// // 设置训练数据文件夹路径
// tesseract.setDatapath(dataPath);
// // 设置为中文简体
// tesseract.setLanguage(language);
// return tesseract;
// }
}

@ -90,7 +90,6 @@ public class OcrRuleCheckController extends JeecgController<OcrRuleCheck, IOcrRu
String configName = saveOcrRuleCheckVO.getConfigName(); String configName = saveOcrRuleCheckVO.getConfigName();
boolean existsFlag = ocrRuleCheckService.existsByConfigName(configName, null);//true 已存在,false不存在 boolean existsFlag = ocrRuleCheckService.existsByConfigName(configName, null);//true 已存在,false不存在
AssertUtils.notTrue(existsFlag, String.format("[配置名称]-%s 已存在", configName)); AssertUtils.notTrue(existsFlag, String.format("[配置名称]-%s 已存在", configName));
AssertUtils.notTrue(saveOcrRuleCheckVO.getType()==null, String.format("[是否或者并且组合规则] 为空"));
ocrRuleCheckService.saveModel(saveOcrRuleCheckVO); ocrRuleCheckService.saveModel(saveOcrRuleCheckVO);
return Result.OK("添加成功!"); return Result.OK("添加成功!");
} }

@ -24,7 +24,6 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -61,7 +60,6 @@ public class OcrSimulatorController{
List<String> imageList = images.toJavaList(String.class); List<String> imageList = images.toJavaList(String.class);
OcrIdentify ocrIdentify=new OcrIdentify(); OcrIdentify ocrIdentify=new OcrIdentify();
ocrIdentify.setTaskSource("模拟实验");//模拟实验-场景识别 ocrIdentify.setTaskSource("模拟实验");//模拟实验-场景识别
ocrIdentify.setTaskType(requestBody.getString("taskType"));
ocrIdentifyService.save(ocrIdentify); ocrIdentifyService.save(ocrIdentify);
List<OcrIdentifyDetail> ocrIdentifyDetailList=new ArrayList<>(); List<OcrIdentifyDetail> ocrIdentifyDetailList=new ArrayList<>();
double nluTimeSum=0d; double nluTimeSum=0d;
@ -79,15 +77,6 @@ public class OcrSimulatorController{
ocrIdentifyDetail.setImageUrl(uploadFilePath + "/" + image);//图片地址 ocrIdentifyDetail.setImageUrl(uploadFilePath + "/" + image);//图片地址
semanticRequestBody.put("img_path", uploadFilePath + "/" + image); semanticRequestBody.put("img_path", uploadFilePath + "/" + image);
} }
if(requestBody.getString("taskType")!=null&&requestBody.getString("taskType").equals("1699246961812586497")){
semanticRequestBody.put("scenes",1);
List<String> schema=new ArrayList<>();
schema.add("姓名");schema.add("年龄");schema.add("主要症状");schema.add("体征");schema.add("入院时主要症状和体征");
semanticRequestBody.put("schema",schema);
}else{
semanticRequestBody.put("scenes",0);
}
log.info("ocr识别模型请求参数{}",semanticRequestBody.toJSONString());
JSONObject semanticResponseJson = RestUtil.post(OcrConstant.api_test2_identify_url, semanticRequestBody); JSONObject semanticResponseJson = RestUtil.post(OcrConstant.api_test2_identify_url, semanticRequestBody);
//执行时间 调整小数点 //执行时间 调整小数点
Double nluTime = semanticResponseJson.getDouble("nlu_time"); Double nluTime = semanticResponseJson.getDouble("nlu_time");

@ -23,9 +23,9 @@ public class OcrRuleCheckDTO extends OcrRuleCheck {
@Excel(name = "元数据配置名称", width = 15) @Excel(name = "元数据配置名称", width = 15)
private String metadataConfigName; private String metadataConfigName;
private String configRuleAdapter; private String configRuleAdapter;
private Map<String,Object> configRuleMap=new LinkedHashMap<>(); private Map<String,String> configRuleMap=new LinkedHashMap<>();
private Map<String,String> fieldMap=new LinkedHashMap<>(); private Map<String,String> fieldMap=new LinkedHashMap<>();
Map<String,Map<String,Object>> configRuleTypeMap=new LinkedHashMap<>(); Map<String,Map<String,String>> configRuleTypeMap=new LinkedHashMap<>();
} }

@ -64,7 +64,4 @@ public class OcrRuleCheck implements Serializable {
@ApiModelProperty(value = "元数据配置id") @ApiModelProperty(value = "元数据配置id")
/*@Excel(name = "元数据配置id", width = 15)*/ /*@Excel(name = "元数据配置id", width = 15)*/
private String metadataConfigId; private String metadataConfigId;
@ApiModelProperty(value = "是否并且或者表达式1不是2是")
private Integer type;
} }

@ -88,6 +88,10 @@ public class HandleTaskInit implements ApplicationRunner {
String image;//图片 String image;//图片
//执行获取到的任务 //执行获取到的任务
identifyFor: for (OcrIdentify ocrIdentify : list) { identifyFor: for (OcrIdentify ocrIdentify : list) {
//过滤不需要的任务批次
if(ocrIdentify.getRequestId().contains("c1b1f298e7ab4ba59103081e55f9cd01")){
continue;
}
image=null; image=null;
fileList=new ArrayList<>(); fileList=new ArrayList<>();
//识别的图片路径 //识别的图片路径

@ -355,6 +355,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
@Override @Override
@Async @Async
public void updateOcrIdentifyStatus(String id, String status) { public void updateOcrIdentifyStatus(String id, String status) {
log.info("id:{}",id);
//4.更新主任务状态 //4.更新主任务状态
LambdaUpdateWrapper<OcrIdentify> updateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<OcrIdentify> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(OcrIdentify::getId, id); updateWrapper.eq(OcrIdentify::getId, id);
@ -411,7 +412,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
OcrIdentifyDTO ocrIdentifyDTO = this.findById(id); OcrIdentifyDTO ocrIdentifyDTO = this.findById(id);
//=======规则检查配置 //=======规则检查配置
OcrRuleCheckDTO ocrRuleCheckVo = ocrIdentifyDTO.getOcrRuleCheckVo(); OcrRuleCheckDTO ocrRuleCheckVo = ocrIdentifyDTO.getOcrRuleCheckVo();
Map<String, Map<String, Object>> configRuleTypeMap = ocrRuleCheckVo.getConfigRuleTypeMap(); Map<String, Map<String, String>> configRuleTypeMap = ocrRuleCheckVo.getConfigRuleTypeMap();
//=================== //===================
} }
@ -550,11 +551,27 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
* @param configRuleMap 1/0 map * @param configRuleMap 1/0 map
* @param fieldMap map * @param fieldMap map
*/ */
public Map<String, CheckSemanticModel> getCheckSemanticModelMap(Map<String, Object> configRuleMap, Map<String, String> fieldMap, List<JSONObject> sourceJsonObjects) { public Map<String, CheckSemanticModel> getCheckSemanticModelMap(Map<String, String> configRuleMap, Map<String, String> fieldMap, List<JSONObject> sourceJsonObjects) {
if (configRuleMap!=null && CollectionUtils.isNotEmpty(configRuleMap.keySet())) { if (configRuleMap!=null && CollectionUtils.isNotEmpty(configRuleMap.keySet())) {
//缩写转全称 //将 configRuleMap的 key 创建一个Set
OcrJudgmentTools.abbreviationToFullName(configRuleMap); Set<String> keySet = new HashSet<>(configRuleMap.keySet());
//循环keySet判断字段是否是缩写如果是缩写就把缩写的全称put一下
for (String s : keySet) {
String value = configRuleMap.get(s);
if ("hn".equals(s)) {
configRuleMap.put("hospitalName",value);
}else if("dn".equals(s)) {
configRuleMap.put("doctorName", value);
}else if("dmn".equals(s)) {
configRuleMap.put("departmentName", value);
}else if("tm".equals(s) || ("time".equals(s))) {
configRuleMap.put("time", value);
}else{
configRuleMap.put(s,value);
}
} }
}
Map<String, CheckSemanticModel> checkSemanticModelMap = new LinkedHashMap<>(); Map<String, CheckSemanticModel> checkSemanticModelMap = new LinkedHashMap<>();
//校验正确的值 //校验正确的值
Map<String, String> inputMap = new LinkedHashMap<>(); Map<String, String> inputMap = new LinkedHashMap<>();
@ -594,7 +611,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
copyEntity.setField(field); copyEntity.setField(field);
//1/0 //1/0
if (configRuleMap != null && configRuleMap.containsKey(field)) { if (configRuleMap != null && configRuleMap.containsKey(field)) {
configRule =String.valueOf(configRuleMap.get(field)); configRule = configRuleMap.get(field);
copyEntity.setRuleInfo(configRule); copyEntity.setRuleInfo(configRule);
//端字段含义 //端字段含义
fieldName = fieldMap.get(field); fieldName = fieldMap.get(field);
@ -719,7 +736,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
List<OcrResultDTO> ocrResultDTOList = new ArrayList<>(); List<OcrResultDTO> ocrResultDTOList = new ArrayList<>();
Date startDataCheckTime = new Date(); Date startDataCheckTime = new Date();
Map<String, Boolean> fieldRightMap = new LinkedHashMap<>();//存放 字段判断正确map Map<String, Boolean> fieldRightMap = new LinkedHashMap<>();//存放 字段判断正确map
OcrRuleCheckDTO ocrRuleCheckVo = ocrRuleCheckService.findById(simulateChecksVO.getRuleCheckId());
for (OcrIdentifyDetail ocrIdentifyDetail : identifyDetailList) { for (OcrIdentifyDetail ocrIdentifyDetail : identifyDetailList) {
i1++; i1++;
String semanticResultJson = ocrIdentifyDetail.getSemanticResult(); String semanticResultJson = ocrIdentifyDetail.getSemanticResult();
@ -791,6 +807,8 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
} }
//============================ //============================
} }
OcrRuleCheckDTO ocrRuleCheckVo = ocrRuleCheckService.findById(simulateChecksVO.getRuleCheckId());
Map<String, CheckSemanticModel> checkSemanticModelMap = getCheckSemanticModelMap(ocrRuleCheckVo.getConfigRuleMap(), ocrRuleCheckVo.getFieldMap(), sourceJson); Map<String, CheckSemanticModel> checkSemanticModelMap = getCheckSemanticModelMap(ocrRuleCheckVo.getConfigRuleMap(), ocrRuleCheckVo.getFieldMap(), sourceJson);
String text = null;//ocr 识别的文本 String text = null;//ocr 识别的文本
Double probability = 0d; Double probability = 0d;
@ -893,7 +911,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
} }
} }
if (ocrArray.size() > 0) { if (ocrArray.size() > 0) {
if(ocrRuleCheckVo.getType()==null||ocrRuleCheckVo.getType()==1){
for (JSONObject ocrItem : ocrArray) { for (JSONObject ocrItem : ocrArray) {
text = null; text = null;
text = ocrItem.getString("text");//ocr 识别的文本 text = ocrItem.getString("text");//ocr 识别的文本
@ -954,62 +971,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
} }
} }
} }
} else if (ocrRuleCheckVo.getType()!= null&&ocrRuleCheckVo.getType()==2) {
for (JSONObject ocrItem : ocrArray) {
text = null;
text = ocrItem.getString("text");//ocr 识别的文本
probability = ocrItem.getDouble("probability");//置信度
if ("101".equals(ruleInfo)) {
if (StringUtils.isBlank(text) || StringUtils.isBlank(inputText)) {
//没识别值
mapPutIfTrue(fieldRightMap, field, true);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数不判断", true, ruleInfo);
} else {
double v = StrCharUtil.similarityRatio(inputText, text);
if (text.equals(inputText)) {
mapPutIfTrue(fieldRightMap, field, true);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, "101");
} else {
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
mapPutIfTrue(fieldRightMap, field, false);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
}
}
} else {
if (StringUtils.isBlank(text)) {
//ocr识别参数为空不通过
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
mapPutIfTrue(fieldRightMap, field, false);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
} else if (StringUtils.isBlank(inputText)) {
//没有输入值.
fieldRightMap.put(field, false);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "没有输入值", false, ruleInfo);
} else if ("0".equals(ruleInfo)) {
//不必校验,有识别到就行,通过
fieldRightMap.put(field, true);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, ruleInfo);
} else if (Double.parseDouble(ruleInfo) >= 1 && Double.parseDouble(ruleInfo) <= 99) {
//在1~99之间根据精准度匹配
double v = StrCharUtil.similarityRatio(inputText, text);
//准确度 可靠
fieldRightMap.put(field, true);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
} else if ("100".equals(ruleInfo)) {
//必定验证参数,必须有值且匹配
double v = StrCharUtil.similarityRatio(inputText, text);
if (text.equals(inputText)) {
fieldRightMap.put(field, true);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
} else {
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
mapPutIfTrue(fieldRightMap, field, false);
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
}
}
}
}
}
} else { } else {
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>"); rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
mapPutIfTrue(fieldRightMap, field, false); mapPutIfTrue(fieldRightMap, field, false);
@ -1045,20 +1006,9 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
//没有匹配结果 //没有匹配结果
responseBody.put("taskResult",1); responseBody.put("taskResult",1);
}else{ }else{
if(ocrRuleCheckVo.getType()==null||ocrRuleCheckVo.getType()==1){
long count = fieldRightMap.values().stream().filter(o->!o).count(); long count = fieldRightMap.values().stream().filter(o->!o).count();
//long count = ocrResultDTOList.stream().filter(o -> !o.getRuleValidation()).count(); //long count = ocrResultDTOList.stream().filter(o -> !o.getRuleValidation()).count();
responseBody.put("taskResult",count>0?0:1);//匹配成功或失败 responseBody.put("taskResult",count>0?0:1);//匹配成功或失败
}else if(ocrRuleCheckVo.getType()!=null&&ocrRuleCheckVo.getType()==2){
log.info(ocrResultDTOList.toString());
String configRule = ocrRuleCheckVo.getConfigRule();
Map<String,Object> params=new HashMap<>();
for(OcrResultDTO ocrResultDTO:ocrResultDTOList){
params.put(ocrResultDTO.getTag(),ocrResultDTO.getTextRate());
}
Boolean rest=OcrJudgmentTools.judment(configRule,params);
responseBody.put("taskResult",rest?0:1);
}
Set<String> haveRateTagList = ocrResultDTOList.stream().filter(o -> o.getTextRate() > 0).map(OcrResultDTO::getTag).collect(Collectors.toSet()); Set<String> haveRateTagList = ocrResultDTOList.stream().filter(o -> o.getTextRate() > 0).map(OcrResultDTO::getTag).collect(Collectors.toSet());
List<OcrResultDTO> newResultDTOList=new ArrayList<>(); List<OcrResultDTO> newResultDTOList=new ArrayList<>();
//过滤掉0的值 //过滤掉0的值
@ -1530,9 +1480,13 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
List<TaskModel> waitingTaskList = taskList.stream().filter(t -> t.getTaskStatus().equals("0")).collect(Collectors.toList()); List<TaskModel> waitingTaskList = taskList.stream().filter(t -> t.getTaskStatus().equals("0")).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(waitingTaskList)) { if (CollectionUtils.isNotEmpty(waitingTaskList)) {
while (waitingTaskList.size() > 0) { while (waitingTaskList.size() > 0) {
for (int i = 0; i < 4; i++) {
if (i>waitingTaskList.size()-1){
continue;
}
//取第一个任务 //取第一个任务
TaskModel taskModel = waitingTaskList.get(0); TaskModel taskModel = waitingTaskList.get(i);
waitingTaskList.get(0).setTaskStatus("1"); waitingTaskList.get(i).setTaskStatus("1");
//刷新redis执行中 //刷新redis执行中
flushTask(taskModel.getTaskId(), 1); flushTask(taskModel.getTaskId(), 1);
//执行 //执行
@ -1543,6 +1497,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
waitingTaskList = taskList.stream().filter(t -> t.getTaskStatus().equals("0")).collect(Collectors.toList()); waitingTaskList = taskList.stream().filter(t -> t.getTaskStatus().equals("0")).collect(Collectors.toList());
} }
} }
}
log.error("任务已全部执行"); log.error("任务已全部执行");
} }

@ -18,8 +18,6 @@ import org.jeecg.modules.ocr.mapper.OcrMetadataConfigMapper;
import org.jeecg.modules.ocr.mapper.OcrRuleCheckMapper; import org.jeecg.modules.ocr.mapper.OcrRuleCheckMapper;
import org.jeecg.modules.ocr.service.IOcrRuleCheckDetailService; import org.jeecg.modules.ocr.service.IOcrRuleCheckDetailService;
import org.jeecg.modules.ocr.service.IOcrRuleCheckService; import org.jeecg.modules.ocr.service.IOcrRuleCheckService;
import org.jeecg.modules.ocr.utils.OcrJudgmentTools;
import org.jeecg.modules.ocr.utils.StrCharUtil;
import org.jeecg.modules.ocr.vo.SaveOcrRuleCheckVO; import org.jeecg.modules.ocr.vo.SaveOcrRuleCheckVO;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -41,6 +39,10 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, OcrRuleCheck> implements IOcrRuleCheckService { public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, OcrRuleCheck> implements IOcrRuleCheckService {
@Resource
IOcrRuleCheckDetailService ocrRuleCheckDetailService;
@Resource
OcrMetadataConfigMapper ocrMetadataConfigMapper;
@Resource @Resource
OcrMetadataConfigDetailMapper ocrMetadataConfigDetailMapper; OcrMetadataConfigDetailMapper ocrMetadataConfigDetailMapper;
@Override @Override
@ -60,31 +62,14 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
public void saveModelBatch(List<SaveOcrRuleCheckVO> saveOcrRuleCheckVOS) { public void saveModelBatch(List<SaveOcrRuleCheckVO> saveOcrRuleCheckVOS) {
for (SaveOcrRuleCheckVO saveOcrRuleCheckVO : saveOcrRuleCheckVOS) { for (SaveOcrRuleCheckVO saveOcrRuleCheckVO : saveOcrRuleCheckVOS) {
OcrRuleCheck ocrRuleCheck=new OcrRuleCheck(); OcrRuleCheck ocrRuleCheck=new OcrRuleCheck();
if(saveOcrRuleCheckVO.getType()==null||saveOcrRuleCheckVO.getType()==1){
if (StringUtils.isNotBlank(saveOcrRuleCheckVO.getConfigRule())) { if (StringUtils.isNotBlank(saveOcrRuleCheckVO.getConfigRule())) {
if (saveOcrRuleCheckVO.getConfigRule().contains("isrule=1") && saveOcrRuleCheckVO.getConfigRule().replace("isrule=1","").length()>0) { if (saveOcrRuleCheckVO.getConfigRule().contains("isrule=1") && saveOcrRuleCheckVO.getConfigRule().replace("isrule=1","").length()>0) {
throw new JeecgBootException("isrule=1规则只可单独使用"); throw new JeecgBootException("isrule=1规则只可单独使用");
} }
} }
saveOcrRuleCheckVO.setType(1);
}else if(saveOcrRuleCheckVO.getType()==2){
String configRule = saveOcrRuleCheckVO.getConfigRule();
String metadataConfigId = saveOcrRuleCheckVO.getMetadataConfigId();
//获取规则配置元字段
List<OcrMetadataConfigDetail> ocrMetadataConfigDetails = ocrMetadataConfigDetailMapper.selectList(new LambdaQueryWrapper<OcrMetadataConfigDetail>().eq(OcrMetadataConfigDetail::getMetadataConfigId, metadataConfigId));
Map<String,Object> params=new HashMap<>();
for(OcrMetadataConfigDetail configDetail:ocrMetadataConfigDetails){
String fieldName = configDetail.getFieldName();
params.put(fieldName,1);
}
OcrJudgmentTools.fullNameToAbbreviation(params);
//做下表达式校验,看表达式是否正确,如果不正确这个方法里面会抛出异常如果正确就继续入库
OcrJudgmentTools.judment(configRule, params);
}
ocrRuleCheck.setConfigRule(saveOcrRuleCheckVO.getConfigRule()); ocrRuleCheck.setConfigRule(saveOcrRuleCheckVO.getConfigRule());
ocrRuleCheck.setMetadataConfigId(saveOcrRuleCheckVO.getMetadataConfigId()); ocrRuleCheck.setMetadataConfigId(saveOcrRuleCheckVO.getMetadataConfigId());
ocrRuleCheck.setConfigName(saveOcrRuleCheckVO.getConfigName()); ocrRuleCheck.setConfigName(saveOcrRuleCheckVO.getConfigName());
ocrRuleCheck.setType(saveOcrRuleCheckVO.getType());
this.save(ocrRuleCheck); this.save(ocrRuleCheck);
} }
} }
@ -348,14 +333,13 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
OcrRuleCheckDTO ocrRuleCheckVo = baseMapper.findById(id); OcrRuleCheckDTO ocrRuleCheckVo = baseMapper.findById(id);
AssertUtils.notNull(ocrRuleCheckVo,id+"-规则检查配置不存在"); AssertUtils.notNull(ocrRuleCheckVo,id+"-规则检查配置不存在");
if (StringUtils.isNotBlank(ocrRuleCheckVo.getConfigRule())) { if (StringUtils.isNotBlank(ocrRuleCheckVo.getConfigRule())) {
if(ocrRuleCheckVo.getType()==null||ocrRuleCheckVo.getType()==1){
String configRule = ocrRuleCheckVo.getConfigRule(); String configRule = ocrRuleCheckVo.getConfigRule();
//TODO {key(&,||):{key(字段):value(1/0)}} //TODO {key(&,||):{key(字段):value(1/0)}}
Map<String,Map<String,Object>> configRuleTypeMap=new LinkedHashMap<>(); Map<String,Map<String,String>> configRuleTypeMap=new LinkedHashMap<>();
if (configRule.contains(OcrConstant.ruleHz)) { if (configRule.contains(OcrConstant.ruleCheckOrChar)) {
// || // ||
String[] orSplit = configRule.split(OcrConstant.ruleHz); String[] orSplit = configRule.split(OcrConstant.ruleCheckOrChar);
Map<String,Object> configRuleMap=new LinkedHashMap<>(); Map<String,String> configRuleMap=new LinkedHashMap<>();
String field=null;String fieldValue=null; String field=null;String fieldValue=null;
for (String s : orSplit) { for (String s : orSplit) {
configRuleMap=new LinkedHashMap<>(); configRuleMap=new LinkedHashMap<>();
@ -365,12 +349,12 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
} }
configRuleMap.put(split1[0],split1[1]); configRuleMap.put(split1[0],split1[1]);
} }
configRuleTypeMap.put(OcrConstant.ruleHz,configRuleMap); configRuleTypeMap.put(OcrConstant.ruleCheckOrChar,configRuleMap);
}else { }else {
//& //&
String[] split = configRule.split(OcrConstant.ruleCheckSplitChar); String[] split = configRule.split(OcrConstant.ruleCheckSplitChar);
//将 `配置规则` 转成 map //将 `配置规则` 转成 map
Map<String,Object> configRuleMap=new LinkedHashMap<>(); Map<String,String> configRuleMap=new LinkedHashMap<>();
for (String s : split) { for (String s : split) {
String[] split1 = s.split(OcrConstant.ruleCheckValueRightChar); String[] split1 = s.split(OcrConstant.ruleCheckValueRightChar);
if (split1.length<=1) { if (split1.length<=1) {
@ -382,11 +366,6 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
configRuleTypeMap.put(OcrConstant.ruleCheckSplitChar,configRuleMap); configRuleTypeMap.put(OcrConstant.ruleCheckSplitChar,configRuleMap);
} }
ocrRuleCheckVo.setConfigRuleTypeMap(configRuleTypeMap); ocrRuleCheckVo.setConfigRuleTypeMap(configRuleTypeMap);
}else if(ocrRuleCheckVo.getType()!=null||ocrRuleCheckVo.getType()==2){
String configRule = ocrRuleCheckVo.getConfigRule();
Map<String,Object> restMap= StrCharUtil.strSplits(configRule);
ocrRuleCheckVo.setConfigRuleMap(restMap);
}
} }
if (StringUtils.isNotBlank(ocrRuleCheckVo.getMetadataConfigId())) { if (StringUtils.isNotBlank(ocrRuleCheckVo.getMetadataConfigId())) {
String metadataConfigId = ocrRuleCheckVo.getMetadataConfigId(); String metadataConfigId = ocrRuleCheckVo.getMetadataConfigId();
@ -400,5 +379,4 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
return ocrRuleCheckVo; return ocrRuleCheckVo;
} }
} }

@ -101,7 +101,7 @@ public class CallBackWlyUtils {
log.error("请求无量云回调接口失败-拒绝连接 (Connection refused)"); log.error("请求无量云回调接口失败-拒绝连接 (Connection refused)");
log.error(e.getMessage()); log.error(e.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error("请求无量云回调接口失败:{}",e); log.info("请求无量云回调接口失败");
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
log.info("回调返回------------------"); log.info("回调返回------------------");
@ -109,7 +109,7 @@ public class CallBackWlyUtils {
log.info(semanticResponseJson.toJSONString()); log.info(semanticResponseJson.toJSONString());
return true; return true;
} else { } else {
log.error("回调返回-----:null"); log.info("回调返回-----:null");
return false; return false;
} }
} }

@ -1,93 +0,0 @@
package org.jeecg.modules.ocr.utils;
import org.jeecg.common.exception.JeecgBootException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @Title:
* @Description:
* @Author
* @Date 2023-10-13 17:47
* @Version V1.0
*/
public class OcrJudgmentTools {
public static void main(String[] args) {
Map<String,Object> engine =new HashMap<>();
String str="value>5&&st==\"test\"&&(state==\"正常\"||state==\"不正常\")";
engine.put("value",6);
engine.put("state","正常");
engine.put("st","test");
Boolean judment = judment(str, engine);
System.out.println(judment);
}
public static ScriptEngine getEngine(){
ScriptEngineManager manager=new ScriptEngineManager();
return manager.getEngineByName("nashorn");
}
public static Boolean judment(String expression, Map<String,Object> params){
Boolean eval=false;
ScriptEngine engine = getEngine();
for(String key:params.keySet()){
engine.put(key,params.get(key));
}
try {
eval =(Boolean) engine.eval(expression);
} catch (ScriptException e) {
throw new JeecgBootException("条件表达式配置错误请检查");
}
return eval;
}
/***
*
* @return
*/
public static void abbreviationToFullName(Map<String, Object> configRuleMap){
Set<String> keySet = new HashSet<>(configRuleMap.keySet());
//循环keySet判断字段是否是缩写如果是缩写就把缩写的全称put一下
for (String s : keySet) {
Object value = configRuleMap.get(s);
if ("hn".equals(s)) {
configRuleMap.put("hospitalName",value);
}else if("dn".equals(s)) {
configRuleMap.put("doctorName", value);
}else if("dmn".equals(s)) {
configRuleMap.put("departmentName", value);
}else if("tm".equals(s) || ("time".equals(s))) {
configRuleMap.put("time", value);
}else{
configRuleMap.put(s,value);
}
}
}
/***
*
* @return
*/
public static void fullNameToAbbreviation(Map<String, Object> configRuleMap){
Set<String> keySet = new HashSet<>(configRuleMap.keySet());
//循环keySet判断字段是否是缩写如果是缩写就把缩写的全称put一下
for (String s : keySet) {
Object value = configRuleMap.get(s);
if ("hospitalName".equals(s)) {
configRuleMap.put("hn",value);
}else if("doctorName".equals(s)) {
configRuleMap.put("dn", value);
}else if("departmentName".equals(s)) {
configRuleMap.put("dmn", value);
}else if("tm".equals(s) || ("time".equals(s))) {
configRuleMap.put("time", value);
}else{
configRuleMap.put(s,value);
}
}
}
}

@ -1,57 +0,0 @@
package org.jeecg.modules.ocr.utils;
//import org.opencv.core.Core;
//import org.opencv.core.CvType;
//import org.opencv.core.Mat;
//import org.opencv.core.Point;
//import org.opencv.imgproc.Imgproc;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* @Title:
* @Description:
* @Author
* @Date 2023-10-27 10:43
* @Version V1.0
*/
public class OcrUtils {
public static void main(String[] args) {
// 此代码示例演示如何使用预处理过滤器应用自动歪斜校正并保存校正后的图像。
// 创建 AsposeOcr 的实例
// 添加纠偏过滤器
// PreprocessingFilter filters = new PreprocessingFilter();
// filters.add(PreprocessingFilter.AutoSkew());
//
// // 将预处理后的图像保存到文件
// BufferedImage imageRes = api.PreprocessImage("C:\\Users\\郭向斌\\Desktop\\识别不出来2.jpg", filters);
// File outputSource = new File("D:\\workspace\\ocr\\data\\jiuzheng\\识别不出来2rest.jpg");
// try {
// ImageIO.write(imageRes, "png", outputSource);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// String str="C:\\Users\\郭向斌\\Desktop\\识别不出来2.jpg";
// File file=new File(str);
//
// String s = getBufferedImage().doOCR(file);
// System.out.println(s);
}
//
// private static Tesseract getBufferedImage(){
// Tesseract tesseract = new Tesseract();
// // 设置训练数据文件夹路径
// tesseract.setDatapath("D:\\workspace\\ocr\\data\\tess4j\\tessdata");
// // 设置为中文简体
// tesseract.setLanguage("chi_sim+eng+osd");
// return tesseract;
// }
}

@ -1,13 +1,8 @@
package org.jeecg.modules.ocr.utils; package org.jeecg.modules.ocr.utils;
import org.jeecg.common.constant.OcrConstant;
import org.xm.Similarity; import org.xm.Similarity;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* @Description * @Description
@ -15,67 +10,6 @@ import java.util.Map;
* @Date 2023/8/11 13:50 * @Date 2023/8/11 13:50
*/ */
public class StrCharUtil { public class StrCharUtil {
public static void main(String[] args) {
String configRule="hospitalName>=40&&(departmentName==0||doctorName==0)";
Map<String, Object> stringObjectMap = strSplits(configRule);
}
/**
*
*/
public static Map<String,Object> strSplits(String configRule){
//去除不需要的字符如 括号,叹号
configRule=configRule.replaceAll(" ","").replaceAll(OcrConstant.ruleZkh,"").replaceAll(OcrConstant.ruleYkh,"");
if(configRule.contains(OcrConstant.ruleTh+OcrConstant.ruleCheckValueRightChar)){
configRule=configRule.replaceAll(OcrConstant.ruleTh+OcrConstant.ruleCheckValueRightChar,"~"+OcrConstant.ruleCheckValueRightChar);//如果有!=那就替换为b=
}else{
configRule=configRule.replaceAll(OcrConstant.ruleTh,"");
}
if(configRule.contains(OcrConstant.ruleDyh+OcrConstant.ruleCheckValueRightChar)){
configRule=configRule.replaceAll(OcrConstant.ruleDyh+OcrConstant.ruleCheckValueRightChar,"dydy");
}
if(configRule.contains(OcrConstant.ruleDyh+OcrConstant.ruleCheckValueRightChar)){
configRule=configRule.replaceAll(OcrConstant.ruleXyh+OcrConstant.ruleCheckValueRightChar,"xydy");
}
//切割符组装 放入list中
List<String> splits=new ArrayList<>();
splits.add(OcrConstant.ruleDyh);
splits.add(OcrConstant.ruleXyh);
splits.add("xydy");
splits.add("dydy");
splits.add(OcrConstant.ruleCheckValueRightChar+OcrConstant.ruleCheckValueRightChar);
splits.add("~"+OcrConstant.ruleCheckValueRightChar);
if(configRule.contains(OcrConstant.ruleHz)){
configRule=configRule.replaceAll("\\|\\|",OcrConstant.ruleBq);
}
String[] strs = configRule.split(OcrConstant.ruleBq);
Map<String,Object> map=new HashMap<>();
for(String strss:strs){
strSplits(strss,splits,map);
}
return map;
}
public static void strSplits(String strs, List<String> splits,Map<String,Object> rest){
for(String split:splits){
if(strs.contains(split)){
String[] split1 = strs.split(split);
boolean sdf=false;
for(String s:split1){
for(String sf:splits){
if(!s.contains(sf)){
sdf=true;
}
}
}
if(sdf){
rest.put(split1[0],split1[1]);
}else{
for(String str22:split1){
strSplits(str22,splits,rest);
}
}
}
}
}
/** /**
* () * ()
@ -242,4 +176,15 @@ public class StrCharUtil {
return v;*/ return v;*/
} }
public static void main(String[] args) {
String strA = "河北唐山市协和医院";
String strB = "河北省唐山协和医院";
System.out.println(similarityRatio(strA,strB));
//System.out.println(longestCommonSubstringNoOrder(strA, strB));
//System.out.println(SimilarDegree(strA, strB));
//System.out.println(compare(strA, strB));
//System.out.println(similarityRatio(strA, strB));
}
} }

@ -37,9 +37,6 @@ public class SaveOcrRuleCheckVO implements Serializable {
@ApiModelProperty(value = "元数据配置名称") @ApiModelProperty(value = "元数据配置名称")
@Excel(name = "元数据配置名称", width = 15) @Excel(name = "元数据配置名称", width = 15)
private String metadataConfigName; private String metadataConfigName;
@ApiModelProperty(value = "并且或者组合规则,1不是2是")
@Excel(name = "是否为并且或者组合规则", width = 15)
private Integer type;
/**选择的元数据明细id*/ /**选择的元数据明细id*/
//@ApiModelProperty(value = "选择的元数据明细id") //@ApiModelProperty(value = "选择的元数据明细id")
//public List<String> metadataConfigDetailIdList=new ArrayList<>(); //public List<String> metadataConfigDetailIdList=new ArrayList<>();

@ -131,9 +131,9 @@ spring:
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource: datasource:
master: master:
url: jdbc:mysql://localhost:3306/ocr?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://47.103.213.109:3306/ocr?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root username: root
password: root password: Wang5322570..
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai # url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
# username: root # username: root
@ -148,7 +148,7 @@ spring:
#redis 配置 #redis 配置
redis: redis:
database: 3 database: 3
host: localhost host: 47.103.213.109
port: 6379 port: 6379
password: '' password: ''
#mybatis plus 设置 #mybatis plus 设置

@ -1,5 +1,5 @@
server: server:
port: 8080 port: 8020
tomcat: tomcat:
max-swallow-size: -1 max-swallow-size: -1
error: error:
@ -7,7 +7,7 @@ server:
include-stacktrace: ALWAYS include-stacktrace: ALWAYS
include-message: ALWAYS include-message: ALWAYS
servlet: servlet:
context-path: /jeecg-boot context-path: /ocr
compression: compression:
enabled: true enabled: true
min-response-size: 1024 min-response-size: 1024
@ -26,7 +26,7 @@ spring:
max-request-size: 10MB max-request-size: 10MB
mail: mail:
host: smtp.163.com host: smtp.163.com
username: ?? username: jeecgos@163.com
password: ?? password: ??
properties: properties:
mail: mail:
@ -111,14 +111,14 @@ spring:
# 初始化大小,最小,最大 # 初始化大小,最小,最大
initial-size: 5 initial-size: 5
min-idle: 5 min-idle: 5
maxActive: 1000 maxActive: 20
# 配置获取连接等待超时的时间 # 配置获取连接等待超时的时间
maxWait: 60000 maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000 timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒 # 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000 minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL validationQuery: SELECT 1
testWhileIdle: true testWhileIdle: true
testOnBorrow: false testOnBorrow: false
testOnReturn: false testOnReturn: false
@ -131,10 +131,14 @@ spring:
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource: datasource:
master: master:
url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/ocr?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root username: root
password: root password: stqpvqk/.6:H
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
# username: root
# password: root
# driver-class-name: com.mysql.cj.jdbc.Driver
# 多数据源配置 # 多数据源配置
#multi-datasource1: #multi-datasource1:
#url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
@ -143,8 +147,9 @@ spring:
#driver-class-name: com.mysql.cj.jdbc.Driver #driver-class-name: com.mysql.cj.jdbc.Driver
#redis 配置 #redis 配置
redis: redis:
database: 0 database: 3
host: 127.0.0.1 host: 127.0.0.1
# host: 47.103.213.109
port: 6379 port: 6379
password: '' password: ''
#mybatis plus 设置 #mybatis plus 设置
@ -173,31 +178,30 @@ jeecg:
signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
# 签名拦截接口 # 签名拦截接口
signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys
#local\minio\alioss #local、minio、alioss
uploadType: alioss uploadType: local
# 前端访问地址 # 前端访问地址
domainUrl: domainUrl:
pc: http://localhost:3100 pc: http://localhost:3100
app: http://localhost:8051 app: http://localhost:8051
path: path:
#文件上传根目录 设置 #文件上传根目录 设置
upload: /data/ocr/upload upload: /data/ocr/upFiles
#webapp文件路径 #webapp文件路径
webapp: /opt/jeecg-boot/webapp webapp: /opt/webapp
shiro: shiro:
excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**,/api/getUserInfo excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**
#阿里云oss存储和大鱼短信秘钥配置 #阿里云oss存储和大鱼短信秘钥配置
oss: oss:
accessKey: ?? accessKey: ??
secretKey: ?? secretKey: ??
endpoint: oss-cn-beijing.aliyuncs.com endpoint: oss-cn-beijing.aliyuncs.com
bucketName: jeecgdev bucketName: jeecgdev
staticDomain: https://static.jeecg.com # ElasticSearch 6设置
# ElasticSearch 设置
elasticsearch: elasticsearch:
cluster-name: jeecg-ES cluster-name: jeecg-ES
cluster-nodes: 127.0.0.1:9200 cluster-nodes: 127.0.0.1:9200
check-enabled: true check-enabled: false
# 在线预览文件服务器地址配置 # 在线预览文件服务器地址配置
file-view-domain: http://fileview.jeecg.com file-view-domain: http://fileview.jeecg.com
# minio文件上传 # minio文件上传
@ -208,17 +212,9 @@ jeecg:
bucketName: otatest bucketName: otatest
#大屏报表参数设置 #大屏报表参数设置
jmreport: jmreport:
mode: prod mode: dev
#数据字典是否进行saas数据隔离自己看自己的字典 #数据字典是否进行saas数据隔离自己看自己的字典
saas: false saas: false
#是否开启租户模式 Support By v1.5.5+
openTenant: false
#安全模式(敏感接口校验、saas模式下不允许使用平台数据源)
#safeMode: true
#是否需要校验token
is_verify_token: true
#必须校验方法
verify_methods: remove,delete,save,add,update
#xxl-job配置 #xxl-job配置
xxljob: xxljob:
enabled: false enabled: false
@ -250,7 +246,7 @@ knife4j:
#开启生产环境屏蔽 #开启生产环境屏蔽
production: false production: false
basic: basic:
enable: true enable: false
username: jeecg username: jeecg
password: jeecg1314 password: jeecg1314
#第三方登录 #第三方登录
@ -303,5 +299,7 @@ third-app:
agent-id: ?? agent-id: ??
system: system:
project: project:
env: customer_prod env: customer_test
fileReviewUrlPrefix: http://47.103.213.109:8072/files enableHandleTask: true
fileReviewUrlPrefix: http://localhost:8071/files
wlyCallback: https://hyycsozs.prevailcloud.com/api/task/image/ocr/callback

@ -3,4 +3,4 @@ spring:
name: jeecg-system name: jeecg-system
profiles: profiles:
# active: '@profile.name@' # active: '@profile.name@'
active: dev active: prod

@ -165,6 +165,7 @@
<artifactId>jeecg-system-biz</artifactId> <artifactId>jeecg-system-biz</artifactId>
<version>${jeecgboot.version}</version> <version>${jeecgboot.version}</version>
</dependency> </dependency>
<!-- jeecg tools --> <!-- jeecg tools -->
<dependency> <dependency>
<groupId>org.jeecgframework.boot</groupId> <groupId>org.jeecgframework.boot</groupId>

Loading…
Cancel
Save