diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java index 8f70805..e4ce858 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java @@ -11,12 +11,10 @@ import com.volvo.ai.analytic.center.constant.Constant; import com.volvo.ai.analytic.center.dto.req.ClaimVerificationFileDTO; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.dto.req.RunMaskingRuleInput; -import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; -import com.volvo.ai.analytic.center.entity.AiAnalyticBusinessConfig; -import com.volvo.ai.analytic.center.entity.AiAnalyticWarrantyAudit; -import com.volvo.ai.analytic.center.entity.DataMaskingRule; +import com.volvo.ai.analytic.center.entity.*; import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; import com.volvo.ai.analytic.center.enums.ClaimVerificationFileTypeEnums; +import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper; import com.volvo.ai.analytic.center.mapper.AiAnalyticWarrantyAuditMapper; import com.volvo.ai.analytic.center.service.DataMaskingRuleService; import org.apache.commons.lang3.StringUtils; @@ -30,6 +28,7 @@ import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import com.volvo.ai.analytic.center.utils.ObsUtil; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; @@ -76,8 +75,13 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { @Autowired private AiAnalyticWarrantyAuditMapper aiAnalyticWarrantyAuditMapper; + + @Autowired + private AiAnalysisErrorsMapper aiAnalysisErrorsMapper; + @Override public void consumerMessageByMQ(String message) { + log.info("售后索赔检核MQ message: {}", message); ClaimVerificationFileDTO claimVerificationFileAnalysisDTO = JSON.parseObject(message, ClaimVerificationFileDTO.class); if (claimVerificationFileAnalysisDTO == null) { @@ -86,161 +90,194 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { } // 生成ai分析请求id String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); - // 异步保存请求日志 - syncSaveRequestLogs(message, aiAnalysisRequestId); + JSONObject diFyObject = new JSONObject(); + try { + // 异步保存请求日志 + syncSaveRequestLogs(message, aiAnalysisRequestId); + if (claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_FILE_ANALYSIS.getCode())) { + //文件分析 + List fileObsPath = claimVerificationFileAnalysisDTO.getFileObsPath(); + List> fileIds = new ArrayList<>(); + log.info("文件分析文件ID:{}", fileObsPath); + //上传所有文件到dify + uploadFileToObs(fileObsPath, fileIds); + //根据业务线标识和文件配置分类查询配置 + List aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList( + Wrappers.lambdaQuery() + .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode()) + .eq(AiAnalyticBusinessConfig::getFileConfigCategory, claimVerificationFileAnalysisDTO.getFileType()) + .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) + .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) + ); - if(claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_FILE_ANALYSIS.getCode())){ - //文件分析 - List fileObsPath = claimVerificationFileAnalysisDTO.getFileObsPath(); - List> fileIds = new ArrayList<>(); - log.info("文件分析文件ID:{}", fileObsPath); - //上传所有文件到dify - uploadFileToObs(fileObsPath, fileIds); - //根据业务线标识和文件配置分类查询配置 - List aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList( - Wrappers.lambdaQuery() - .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode()) - .eq(AiAnalyticBusinessConfig::getFileConfigCategory, claimVerificationFileAnalysisDTO.getFileType()) - .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) - .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) - ); - - //组装文件分析workflow入参 - JSONArray files = new JSONArray(); - for (HashMap fileToDifyDTO : fileIds) { - JSONObject object = new JSONObject(); - object.put(ClaimVerificationConstant.UPLOAD_FILE_ID, fileToDifyDTO.get(ClaimVerificationConstant.ID)); - object.put(ClaimVerificationConstant.TYPE, fileToDifyDTO.get(ClaimVerificationConstant.TYPE)); - object.put(ClaimVerificationConstant.TRANSFER_METHOD, ClaimVerificationConstant.LOCAL_FILE); - files.add(object); - } - JSONObject fileToDifyDTO = new JSONObject(); - fileToDifyDTO.put("files", files); - //根据类型获取配置内容 - fileToDifyDTO.put("FileBusinessType",claimVerificationFileAnalysisDTO.getFileType()); - fileToDifyDTO.put("FileDescription", aiAnalyticBusinessConfigs - .stream() - .filter(config -> config.getConfigType().equals("FileDescription")) - .map(AiAnalyticBusinessConfig::getConfigData) - .findFirst() - .orElse(null)); - fileToDifyDTO.put("AnalysisRequirements", aiAnalyticBusinessConfigs - .stream() - .filter(config -> config.getConfigType().equals("AnalysisRequirements")) - .map(AiAnalyticBusinessConfig::getConfigData) - .findFirst() - .orElse(null)); - fileToDifyDTO.put("ReportRequirements", aiAnalyticBusinessConfigs - .stream() - .filter(config -> config.getConfigType().equals("ReportRequirements")) - .map(AiAnalyticBusinessConfig::getConfigData) - .findFirst() - .orElse(null)); - fileToDifyDTO.put("ReportTemplate", aiAnalyticBusinessConfigs - .stream() - .filter(config -> config.getConfigType().equals("ReportTemplate")) - .map(AiAnalyticBusinessConfig::getConfigData) - .findFirst() - .orElse(null)); - - DiFyReq diFyReq = new DiFyReq(); - diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); - diFyReq.setFlowId(fileToken); - diFyReq.setInputs(fileToDifyDTO); - //调用dify 工作流 - JSONObject diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq); - //处理结果并推送MQ - if (diFyObject == null) { - log.error(" 售后索赔检核文件分析dify返回结果为空"); - throw new RuntimeException(" 售后索赔检核文件分析dify返回结果为空"); - }else { - String toAfter = ""; - String textDoc = diFyObject.getString("textDoc"); - String textImage = diFyObject.getString("textImage"); - //判断字符串那个是不为空的然后进行处理 - if (StringUtils.isNotBlank(textDoc)) { - toAfter = StringEscapeUtils.unescapeJava(textDoc); - } else if (StringUtils.isNotBlank(textImage)) { - toAfter = StringEscapeUtils.unescapeJava(textImage); - } else { - throw new RuntimeException(" 售后索赔检核文件分析dify返回结果为空"); + //组装文件分析workflow入参 + JSONArray files = new JSONArray(); + for (HashMap fileToDifyDTO : fileIds) { + JSONObject object = new JSONObject(); + object.put(ClaimVerificationConstant.UPLOAD_FILE_ID, fileToDifyDTO.get(ClaimVerificationConstant.ID)); + object.put(ClaimVerificationConstant.TYPE, fileToDifyDTO.get(ClaimVerificationConstant.TYPE)); + object.put(ClaimVerificationConstant.TRANSFER_METHOD, ClaimVerificationConstant.LOCAL_FILE); + files.add(object); } - JSONObject difyToAfter = JSONObject.parseObject(toAfter); - JSONObject data = new JSONObject(); - data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId()); - data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); - data.put("fileType", claimVerificationFileAnalysisDTO.getFileType()); - data.put("fileData",difyToAfter); - data.put("aiAnalysisRequestId",aiAnalysisRequestId); - //返回结果推送到Newbie的MQ - rocketMQTemplate.syncSend(topic, data); - log.info("索赔检核文件分析发送回调MQ完成: {}", data); - } - //异步更新请求日志表的difyResponse字段 - syncUpdateDiFyResponse(diFyObject, aiAnalysisRequestId); - } else if(claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_AUDIT.getCode())){ - //审计报告 - //加载审计规则配置 - List aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList( - Wrappers.lambdaQuery() - .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode()) - .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.AUDITRULES.getCode()) - .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) - .in(AiAnalyticBusinessConfig::getVerificationMethod,methodList) - ) + //构建入参 + JSONObject fileToDifyDTO = buildFileToDifyParameter(files, claimVerificationFileAnalysisDTO, aiAnalyticBusinessConfigs); - ; - String configDataString = aiAnalyticBusinessConfigs.stream() - .map(AiAnalyticBusinessConfig::getConfigData) - .collect(Collectors.joining(" ")); - //组装审计报告workflow入参 - JSONObject audit = new JSONObject(); - audit.put("analysisRules", configDataString); - audit.put("diagnosticReport", claimVerificationFileAnalysisDTO.getDiagnosticReport().toString()); - audit.put("preCheckReport", claimVerificationFileAnalysisDTO.getPreCheckReport().toString()); - audit.put("dtcReport", claimVerificationFileAnalysisDTO.getDtcReport().toString()); - - //脱敏处理 - List maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC); - RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput(); - runMaskingRuleInput.setDataMaskingRules(maskingRuleItems); - runMaskingRuleInput.setOldStr(audit.toString()); - String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput); - JSONObject parsedAudit = JSON.parseObject(corpusChat); - - - DiFyReq diFyReq = new DiFyReq(); - diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); - diFyReq.setFlowId(verificationToken); - diFyReq.setInputs(parsedAudit); - //调用dify 工作流 - JSONObject diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq); - //处理结果并推送MQ - if (diFyObject == null) { - log.error(" 售后索赔检核审计报告dify返回结果为空"); - throw new RuntimeException(" 售后索赔检核审计报告dify返回结果为空"); - }else { - String warrantyAuditReport = diFyObject.getString("warrantyAuditReport"); - warrantyAuditReport = StringEscapeUtils.unescapeJava(warrantyAuditReport); - JSONObject audiResToAfter = JSON.parseObject(warrantyAuditReport); - JSONObject data = new JSONObject(); - data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId()); - data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); - data.put("warrantyAuditReport",audiResToAfter); - data.put("aiAnalysisRequestId",aiAnalysisRequestId); - //返回结果推送到Newbie的MQ - rocketMQTemplate.syncSend(topic, data); - log.info("索赔检核审计报告发送回调MQ完成: {}", data); + DiFyReq diFyReq = new DiFyReq(); + diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); + diFyReq.setFlowId(fileToken); + diFyReq.setInputs(fileToDifyDTO); + //调用dify 工作流 + diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq); + //处理结果并推送MQ + if (diFyObject == null) { + log.error(" 售后索赔检核文件分析dify返回结果为空"); + throw new RuntimeException(" 售后索赔检核文件分析dify返回结果为空"); + } else { + //解析dify返回结果 + JSONObject data = analyzeParameters(diFyObject, claimVerificationFileAnalysisDTO, aiAnalysisRequestId); + //返回结果推送到Newbie的MQ + rocketMQTemplate.syncSend(topic, data); + log.info("索赔检核文件分析发送回调MQ完成: {}", data); + } //异步更新请求日志表的difyResponse字段 syncUpdateDiFyResponse(diFyObject, aiAnalysisRequestId); - //审核次数记录 - saveAuditCount(claimVerificationFileAnalysisDTO); + } else if (claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_AUDIT.getCode())) { + //审计报告 + //加载审计规则配置 + List aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList( + Wrappers.lambdaQuery() + .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode()) + .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.AUDITRULES.getCode()) + .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) + .in(AiAnalyticBusinessConfig::getVerificationMethod, methodList) + ); + String configDataString = aiAnalyticBusinessConfigs.stream() + .map(AiAnalyticBusinessConfig::getConfigData) + .collect(Collectors.joining(" ")); + //组装审计报告workflow入参 + JSONObject parsedAudit = buildAuditToDify(configDataString, claimVerificationFileAnalysisDTO); + DiFyReq diFyReq = new DiFyReq(); + diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); + diFyReq.setFlowId(verificationToken); + diFyReq.setInputs(parsedAudit); + //调用dify 工作流 + diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq); + //处理结果并推送MQ + if (diFyObject == null) { + log.error(" 售后索赔检核审计报告dify返回结果为空"); + throw new RuntimeException(" 售后索赔检核审计报告dify返回结果为空"); + } else { + JSONObject data = getJsonObjectToNewBie(diFyObject, claimVerificationFileAnalysisDTO, aiAnalysisRequestId); + //返回结果推送到Newbie的MQ + rocketMQTemplate.syncSend(topic, data); + log.info("索赔检核审计报告发送回调MQ完成: {}", data); + //异步更新请求日志表的difyResponse字段 + syncUpdateDiFyResponse(diFyObject, aiAnalysisRequestId); + //审核次数记录 + saveAuditCount(claimVerificationFileAnalysisDTO); + } + } else { + throw new RuntimeException("售后索赔检核业务类型错误"); } - }else { - throw new RuntimeException("售后索赔检核业务类型错误"); + } catch (Exception e) { + log.error("售后索赔检核异常:{}", e.getMessage()); + //保存错误日志 + aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .difyResponse(diFyObject.toString()) + .aiAnalysisErrorMessage(e.getMessage()) + .aiAnalysisRequestType(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()) + .build()); + throw new RuntimeException(e); } } + private JSONObject buildAuditToDify(String configDataString, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO) { + JSONObject audit = new JSONObject(); + audit.put("analysisRules", configDataString); + audit.put("diagnosticReport", claimVerificationFileAnalysisDTO.getDiagnosticReport().toString()); + audit.put("preCheckReport", claimVerificationFileAnalysisDTO.getPreCheckReport().toString()); + audit.put("dtcReport", claimVerificationFileAnalysisDTO.getDtcReport().toString()); + + //脱敏处理 + List maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC); + RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput(); + runMaskingRuleInput.setDataMaskingRules(maskingRuleItems); + runMaskingRuleInput.setOldStr(audit.toString()); + String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput); + JSONObject parsedAudit = JSON.parseObject(corpusChat); + return parsedAudit; + } + + @NotNull + private static JSONObject getJsonObjectToNewBie(JSONObject diFyObject, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) { + String warrantyAuditReport = diFyObject.getString("warrantyAuditReport"); + warrantyAuditReport = StringEscapeUtils.unescapeJava(warrantyAuditReport); + JSONObject audiResToAfter = JSON.parseObject(warrantyAuditReport); + JSONObject data = new JSONObject(); + data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId()); + data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); + data.put("warrantyAuditReport", audiResToAfter); + data.put("aiAnalysisRequestId", aiAnalysisRequestId); + return data; + } + + @NotNull + private static JSONObject analyzeParameters(JSONObject diFyObject, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) { + String toAfter = ""; + String textDoc = diFyObject.getString("textDoc"); + String textImage = diFyObject.getString("textImage"); + //判断字符串那个是不为空的然后进行处理 + if (StringUtils.isNotBlank(textDoc)) { + toAfter = StringEscapeUtils.unescapeJava(textDoc); + } else if (StringUtils.isNotBlank(textImage)) { + toAfter = StringEscapeUtils.unescapeJava(textImage); + } else { + throw new RuntimeException(" 售后索赔检核文件分析dify返回结果为空"); + } + JSONObject difyToAfter = JSONObject.parseObject(toAfter); + JSONObject data = new JSONObject(); + data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId()); + data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); + data.put("fileType", claimVerificationFileAnalysisDTO.getFileType()); + data.put("fileData", difyToAfter); + data.put("aiAnalysisRequestId", aiAnalysisRequestId); + return data; + } + + @NotNull + private static JSONObject buildFileToDifyParameter(JSONArray files, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, List aiAnalyticBusinessConfigs) { + JSONObject fileToDifyDTO = new JSONObject(); + fileToDifyDTO.put("files", files); + //根据类型获取配置内容 + fileToDifyDTO.put("FileBusinessType", claimVerificationFileAnalysisDTO.getFileType()); + fileToDifyDTO.put("FileDescription", aiAnalyticBusinessConfigs + .stream() + .filter(config -> config.getConfigType().equals("FileDescription")) + .map(AiAnalyticBusinessConfig::getConfigData) + .findFirst() + .orElse(null)); + fileToDifyDTO.put("AnalysisRequirements", aiAnalyticBusinessConfigs + .stream() + .filter(config -> config.getConfigType().equals("AnalysisRequirements")) + .map(AiAnalyticBusinessConfig::getConfigData) + .findFirst() + .orElse(null)); + fileToDifyDTO.put("ReportRequirements", aiAnalyticBusinessConfigs + .stream() + .filter(config -> config.getConfigType().equals("ReportRequirements")) + .map(AiAnalyticBusinessConfig::getConfigData) + .findFirst() + .orElse(null)); + fileToDifyDTO.put("ReportTemplate", aiAnalyticBusinessConfigs + .stream() + .filter(config -> config.getConfigType().equals("ReportTemplate")) + .map(AiAnalyticBusinessConfig::getConfigData) + .findFirst() + .orElse(null)); + return fileToDifyDTO; + } + //异步保存审核次数 @Async protected void saveAuditCount(ClaimVerificationFileDTO claimVerificationFileAnalysisDTO) { @@ -263,15 +300,15 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { } private void uploadFileToObs(List fileObsPath, List> fileIds) { - if(fileObsPath != null && fileObsPath.size() > 0){ + if (fileObsPath != null && fileObsPath.size() > 0) { for (String filePath : fileObsPath) { - HashMap fileToDifyDTO = new HashMap<>(); + HashMap fileToDifyDTO = new HashMap<>(); ObsObject obsObject = ObsUtil.downloadFile(filePath); - InputStream inputStream = obsObject.getObjectContent(); + InputStream inputStream = obsObject.getObjectContent(); MultipartFile file = ObsUtil.getMultipartFile(inputStream, ObsUtil.getFilenameByUrl(filePath)); - log.info("索赔检核文件上传dify请求参数:{},token:{}",file,fileToken); - JSONObject fileUploadRes = diFyFeign.fileUpload("Bearer "+fileToken,file); - log.info("索赔检核文件上传dify响应结果:{}",fileUploadRes); + log.info("索赔检核文件上传dify请求参数:{},token:{}", file, fileToken); + JSONObject fileUploadRes = diFyFeign.fileUpload("Bearer " + fileToken, file); + log.info("索赔检核文件上传dify响应结果:{}", fileUploadRes); String uploadFileId = fileUploadRes.getString(ClaimVerificationConstant.ID); String extension = fileUploadRes.getString(ClaimVerificationConstant.EXTENSION); fileToDifyDTO.put(ClaimVerificationConstant.ID, uploadFileId); @@ -287,6 +324,7 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { new UpdateWrapper().set("dify_response", difResult.toJSONString()) .eq("ai_analysis_request_id", aiAnalysisRequestId)); } + @Async protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) { aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder() diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DataMaskingRuleServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DataMaskingRuleServiceImpl.java index 4673128..60b4b9b 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DataMaskingRuleServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DataMaskingRuleServiceImpl.java @@ -23,7 +23,8 @@ public class DataMaskingRuleServiceImpl extends ServiceImpl dataMaskingRuleList = this.lambdaQuery() -// .eq(DataMaskingRule::getApplicationChannel, applicationChannel) + .apply("CONCAT(',', application_channel, ',') LIKE '%," + applicationChannel + ",%'") + .eq(DataMaskingRule::getApplicationChannel, applicationChannel) .eq(DataMaskingRule::getRuleStatus, YesOrNoConstants.YES) .eq(DataMaskingRule::getIsDeleted, YesOrNoConstants.NO) .list();