From db6b7991af4b6f0f087e8664d18f3c52aea9c1de Mon Sep 17 00:00:00 2001 From: yunian <747763897@qq.com> Date: Thu, 23 Jun 2022 16:27:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC2.0=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddp-analysis/pom.xml | 21 + .../controller/AnalyseController.java | 64 + ddp-authx/pom.xml | 22 + .../controller/DictionaryController.java | 71 + .../authx/system/business/LoginBusiness.java | 5 + .../system/controller/LoginController.java | 101 + .../system/controller/SysMenuController.java | 386 ++++ .../controller/SysOrganizationController.java | 198 ++ .../system/controller/SysRoleController.java | 228 +++ .../system/controller/SysUserController.java | 238 +++ ddp-common/ddp-dao/pom.xml | 38 + .../analyse/AnalyseDecisionResultMapper.java | 8 + .../analyse/AnalyseDecisionTablesMapper.java | 11 + .../dao/analyse/AnalyseEngineCallMapper.java | 11 + .../dao/analyse/AnalyseEngineNodeMapper.java | 11 + .../analyse/AnalyseEngineSummaryMapper.java | 8 + .../common/dao/analyse/AnalyseRuleMapper.java | 11 + .../dao/analyse/AnalyseScorecardMapper.java | 11 + .../dao/approval/ApprovalConfigMapper.java | 18 + .../dao/approval/ApprovalConfigMapper.xml | 45 + .../common/dao/approval/ApprovalMapper.java | 12 + .../common/dao/approval/ApprovalMapper.xml | 73 + .../authx/dictionary/DictionaryMapper.java | 20 + .../dao/authx/dictionary/DictionaryMapper.xml | 28 + .../dao/authx/system/SysMenuMapper.java | 82 + .../common/dao/authx/system/SysMenuMapper.xml | 132 ++ .../authx/system/SysOrganizationMapper.java | 61 + .../authx/system/SysOrganizationMapper.xml | 88 + .../dao/authx/system/SysRoleMapper.java | 93 + .../common/dao/authx/system/SysRoleMapper.xml | 127 ++ .../dao/authx/system/SysUserMapper.java | 112 ++ .../common/dao/authx/system/SysUserMapper.xml | 252 +++ .../fibo/ddp/common/dao/canal/TableEnum.java | 126 ++ .../dao/cignacmb/BusinessEventLogMapper.java | 18 + .../dao/cignacmb/BusinessEventLogMapper.xml | 76 + .../dao/cignacmb/BusinessRuleLogMapper.java | 27 + .../dao/cignacmb/BusinessRuleLogMapper.xml | 85 + .../dao/cignacmb/TBusinessRuleRelMapper.java | 16 + .../dao/cignacmb/TBusinessRuleRelMapper.xml | 5 + .../message/template/AppTemplateMapper.java | 16 + .../message/template/AppTemplateMapper.xml | 5 + .../template/MessageSendRecordMapper.java | 16 + .../template/MessageSendRecordMapper.xml | 5 + .../message/template/SmsTemplateMapper.java | 16 + .../message/template/SmsTemplateMapper.xml | 5 + .../template/WebhookTemplateMapper.java | 16 + .../template/WebhookTemplateMapper.xml | 5 + .../template/WechatTemplateMapper.java | 16 + .../message/template/WechatTemplateMapper.xml | 5 + .../datax/datainterface/InterfaceMapper.java | 18 + .../datax/datainterface/InterfaceMapper.xml | 75 + .../dao/datax/datamanage/CustListMapper.java | 89 + .../dao/datax/datamanage/CustListMapper.xml | 121 ++ .../datax/datamanage/FieldCallLogMapper.java | 25 + .../datax/datamanage/FieldCallLogMapper.xml | 123 ++ .../dao/datax/datamanage/FieldCondMapper.java | 34 + .../dao/datax/datamanage/FieldCondMapper.xml | 41 + .../dao/datax/datamanage/FieldMapper.java | 170 ++ .../dao/datax/datamanage/FieldMapper.xml | 563 ++++++ .../dao/datax/datamanage/FieldTypeMapper.java | 77 + .../dao/datax/datamanage/FieldTypeMapper.xml | 131 ++ .../datax/datamanage/FieldTypeUserMapper.java | 36 + .../datax/datamanage/FieldTypeUserMapper.xml | 41 + .../dao/datax/datamanage/FieldUserMapper.java | 62 + .../dao/datax/datamanage/FieldUserMapper.xml | 87 + .../datax/datasource/DataSourceMapper.java | 9 + .../dao/datax/datasource/MqSourceMapper.java | 15 + .../dao/datax/datasource/SimpleMapper.java | 11 + .../dao/datax/datasource/SimpleMapper.xml | 12 + .../dataflow/EngineVersionContentMapper.java | 17 + .../MarketingEngineNodeDateResultMapper.java | 16 + .../MarketingEngineNodeDateResultMapper.xml | 5 + .../MarketingEngineNodeResultMapper.java | 16 + .../MarketingEngineNodeResultMapper.xml | 5 + .../MarketingEngineResultMapper.java | 16 + .../marketing/MarketingEngineResultMapper.xml | 5 + .../PersonasEngineResultDetailMapper.java | 23 + .../PersonasEngineResultDetailMapper.xml | 43 + .../personas/PersonasEngineResultMapper.java | 19 + .../common/dao/enginex/risk/EngineMapper.java | 60 + .../common/dao/enginex/risk/EngineMapper.xml | 266 +++ .../dao/enginex/risk/EngineNodeMapper.java | 51 + .../dao/enginex/risk/EngineNodeMapper.xml | 151 ++ .../enginex/risk/EngineResultSetMapper.java | 71 + .../enginex/risk/EngineResultSetMapper.xml | 218 +++ .../dao/enginex/risk/EngineVersionMapper.java | 67 + .../dao/enginex/risk/EngineVersionMapper.xml | 273 +++ .../MonitorDecisionFlowHbaseMapper.java | 76 + .../decisionflow/MonitorNodeHbaseMapper.java | 82 + .../MonitorStrategyHbaseMapper.java | 114 ++ .../decisionflow/TMonitorEngineMapper.java | 15 + .../decisionflow/TMonitorEngineMapper.xml | 5 + .../decisionflow/TMonitorNodeMapper.java | 19 + .../decisionflow/TMonitorNodeMapper.xml | 26 + .../decisionflow/TMonitorStrategyMapper.java | 23 + .../decisionflow/TMonitorStrategyMapper.xml | 73 + .../decisionflow/UserInfoHbaseMapper.java | 21 + .../dao/monitor/logger/LoggerMapper.java | 30 + .../dao/monitor/logger/loggerMapper.xml | 62 + .../aimodel/MachineLearningModelsMapper.java | 19 + .../aimodel/MachineLearningModelsMapper.xml | 18 + .../baserule/BaseRuleConditionMapper.java | 18 + .../strategyx/baserule/BaseRuleMapper.java | 18 + .../ListOperationBlockMapper.java | 11 + .../ListOperationConditionMapper.java | 11 + .../ListOperationFilterConditionMapper.java | 10 + .../collectionrule/ListOperationMapper.java | 11 + .../ListOperationOutputMapper.java | 11 + .../ListOperationVersionMapper.java | 11 + .../dataclean/DataCleanBlockMapper.java | 11 + .../dataclean/DataCleanConditionMapper.java | 11 + .../DataCleanFilterConditionMapper.java | 10 + .../strategyx/dataclean/DataCleanMapper.java | 11 + .../DataCleanOriginalDataOpMapper.java | 15 + .../dataclean/DataCleanOutputMapper.java | 11 + .../dataclean/DataCleanVersionMapper.java | 11 + .../DecisionTablesDetailConditionMapper.java | 14 + .../DecisionTablesDetailMapper.java | 14 + .../decisiontable/DecisionTablesMapper.java | 17 + .../DecisionTablesResultMapper.java | 14 + .../DecisionTablesVersionMapper.java | 11 + .../DecisionTreeDetailConditionMapper.java | 8 + .../DecisionTreeDetailMapper.java | 8 + .../decisiontree/DecisionTreeMapper.java | 8 + .../DecisionTreeVersionMapper.java | 8 + .../guiderule/RuleConditionInfoMapper.java | 14 + .../strategyx/guiderule/RuleInfoMapper.java | 26 + .../strategyx/guiderule/RuleInfoMapper.xml | 150 ++ .../guiderule/RuleLoopGroupActionMapper.java | 12 + .../guiderule/RuleVersionMapper.java | 9 + .../knowledge/KnowledgeTreeMapper.java | 38 + .../knowledge/KnowledgeTreeMapper.xml | 307 +++ .../dao/strategyx/knowledge/RuleMapper.java | 33 + .../dao/strategyx/knowledge/RuleMapper.xml | 231 +++ .../strategyx/listlibrary/ListDbMapper.java | 106 + .../strategyx/listlibrary/ListDbMapper.xml | 149 ++ .../listlibrary/ListDbVersionMapper.java | 10 + .../listlibrary/TblColumnMapper.java | 17 + .../strategyx/listlibrary/TblColumnMapper.xml | 14 + .../ScorecardDetailConditionMapper.java | 13 + .../scorecard/ScorecardDetailMapper.java | 13 + .../scorecard/ScorecardDimensionMapper.java | 9 + .../strategyx/scorecard/ScorecardMapper.java | 31 + .../strategyx/scorecard/ScorecardMapper.xml | 107 ++ .../scorecard/ScorecardVersionMapper.java | 10 + .../scriptrule/RuleScriptVersionMapper.java | 14 + .../strategyout/StrategyOutputMapper.java | 9 + .../common/dao/strategyx/tag/TagMapper.java | 18 + .../strategyx/tag/TagVersionDetailMapper.java | 18 + .../dao/strategyx/tag/TagVersionMapper.java | 19 + ddp-common/ddp-model/pom.xml | 22 + .../model/analyse/AnalyseDecisionResult.java | 48 + .../model/analyse/AnalyseDecisionTables.java | 57 + .../model/analyse/AnalyseEngineCall.java | 47 + .../model/analyse/AnalyseEngineNode.java | 51 + .../model/analyse/AnalyseEngineSummary.java | 59 + .../ddp/common/model/analyse/AnalyseRule.java | 55 + .../model/analyse/AnalyseScorecard.java | 57 + .../common/model/analyse/vo/AnalyseData.java | 22 + .../analyse/vo/AnalyseEngineSummaryVo.java | 33 + .../model/analyse/vo/AnalyseRequestParam.java | 19 + .../ddp/common/model/approval/Approval.java | 92 + .../common/model/approval/ApprovalConfig.java | 64 + .../model/authx/dictionary/Dictionary.java | 44 + .../dictionary/DictionaryCacheManager.java | 82 + .../common/model/authx/system/SysMenu.java | 38 + .../model/authx/system/SysOrganization.java | 27 + .../common/model/authx/system/SysRole.java | 26 + .../common/model/authx/system/SysUser.java | 39 + .../authx/system/request/LoginInfoParam.java | 9 + .../model/authx/system/request/MenuParam.java | 12 + .../authx/system/response/SysMenuVo.java | 41 + .../model/cignacmb/BusinessEventLog.java | 105 + .../model/cignacmb/BusinessRuleLog.java | 81 + .../model/cignacmb/TBusinessRuleRel.java | 79 + .../cignacmb/req/BusinessRuleRelReq.java | 69 + .../cignacmb/request/EventLogDetailParam.java | 18 + .../model/cignacmb/request/EventLogParam.java | 44 + .../model/cignacmb/request/RuleLogParam.java | 48 + .../response/EventLogDetailResponse.java | 45 + .../cignacmb/response/EventLogResponse.java | 81 + .../cignacmb/response/RuleLogResponse.java | 61 + .../model/cignacmb/vo/BusinessRuleRelVO.java | 66 + .../ddp/common/model/common/BasePage.java | 37 + .../ddp/common/model/common/BaseParam.java | 12 + .../ddp/common/model/common/ExcelModel.java | 16 + .../common/model/common/ExcelSheetModel.java | 16 + .../fibo/ddp/common/model/common/PageDto.java | 22 + .../model/common/ResponseEntityBuilder.java | 137 ++ .../model/common/ResponseEntityDto.java | 88 + .../model/common/enums/ErrorCodeEnum.java | 95 + .../message/template/entity/AppTemplate.java | 79 + .../template/entity/MessageSendRecord.java | 67 + .../message/template/entity/SmsTemplate.java | 75 + .../template/entity/WebhookTemplate.java | 71 + .../template/entity/WechatTemplate.java | 67 + .../message/template/vo/AppTemplateReqVo.java | 9 + .../common/requestParam/QueryListParam.java | 26 + .../common/requestParam/StatusParam.java | 22 + .../requestParam/UpdateFolderParam.java | 26 + .../requestParam/UpdateStatusParam.java | 39 + .../model/datax/common/ExcelHeader.java | 8 + .../common/model/datax/common/ExcelUtil.java | 660 +++++++ .../ddp/common/model/datax/common/Status.java | 11 + .../common/model/datax/common/ValueType.java | 17 + .../model/datax/consts/DataXCacheConst.java | 23 + .../datax/datainterface/InterfaceInfo.java | 61 + .../request/InterfaceListParam.java | 23 + .../request/InterfaceUpdateParent.java | 15 + .../request/InterfaceUpdateStatusParam.java | 16 + .../datax/datainterface/vo/InterfaceVo.java | 64 + .../model/datax/datamanage/CustList.java | 236 +++ .../common/model/datax/datamanage/Field.java | 222 +++ .../model/datax/datamanage/FieldCall.java | 8 + .../model/datax/datamanage/FieldCallLog.java | 82 + .../model/datax/datamanage/FieldCond.java | 68 + .../model/datax/datamanage/FieldType.java | 71 + .../model/datax/datamanage/FieldTypeUser.java | 50 + .../model/datax/datamanage/FieldUser.java | 59 + .../datamanage/request/FieldCallParam.java | 15 + .../datamanage/request/FieldSaveParam.java | 99 + .../datamanage/request/FieldTreeParam.java | 23 + .../datax/datamanage/vo/FieldEnumVo.java | 32 + .../datax/datamanage/vo/FieldFormulaVo.java | 89 + .../datax/datamanage/vo/FieldSubCondVo.java | 108 ++ .../model/datax/datasource/DataSource.java | 107 ++ .../model/datax/datasource/MqSource.java | 104 + .../request/DataSourceListParam.java | 16 + .../datax/datasource/vo/DataSourceVo.java | 112 ++ .../model/datax/home/BusinessCallVo.java | 13 + .../dataflow/EngineVersionContent.java | 64 + .../dataflow/vo/DataFlowEngineContentVo.java | 28 + .../enginex/dataflow/vo/DataFlowNodeVo.java | 33 + .../dataflow/vo/EngineVersionContentVo.java | 18 + .../enginex/dataflow/vo/EventDispose.java | 26 + .../marketing/dto/AudienceNodeDto.java | 26 + .../marketing/dto/TargetSettingNodeDto.java | 41 + .../marketing/dto/TouchConfigNodeDto.java | 39 + .../marketing/dto/TriggerSettingNodeDto.java | 39 + .../entity/MarketingEngineNodeDateResult.java | 80 + .../entity/MarketingEngineNodeResult.java | 75 + .../entity/MarketingEngineResult.java | 71 + .../vo/MarketingDataResultReqVo.java | 27 + .../vo/MarketingDataResultRspVo.java | 36 + .../vo/MarketingEngineContentVo.java | 33 + .../vo/MarketingListResultReqVo.java | 17 + .../vo/MarketingNodeDateResultRspVo.java | 35 + .../vo/MarketingNodeResultRspVo.java | 37 + .../personas/PersonasEngineResult.java | 67 + .../personas/PersonasEngineResultDetail.java | 79 + .../enginex/personas/vo/PersonasReport.java | 17 + .../personas/vo/PersonasReportParam.java | 37 + .../ddp/common/model/enginex/risk/Engine.java | 96 + .../common/model/enginex/risk/EngineNode.java | 85 + .../model/enginex/risk/EngineResultSet.java | 74 + .../enginex/risk/EngineResultSetDTO.java | 28 + .../common/model/enginex/risk/EngineRule.java | 21 + .../model/enginex/risk/EngineVersion.java | 94 + .../model/enginex/risk/EngineVersionVo.java | 21 + .../model/enginex/risk/ExecuteParam.java | 24 + .../enginex/risk/IndexEngineReportVo.java | 16 + .../common/model/enginex/risk/InputParam.java | 14 + .../ddp/common/model/enginex/risk/Result.java | 17 + .../enginex/risk/consts/EngineNodeConst.java | 6 + .../enginex/risk/request/EngineListParam.java | 12 + .../risk/request/KnowledgeTreeListParam.java | 16 + .../enginex/risk/request/ModelListParam.java | 12 + .../model/enginex/risk/request/NodeParam.java | 13 + .../enginex/risk/response/TestResponse.java | 17 + .../param/DecisionFlowOutputResponse.java | 18 + .../param/ListDbInfoOutputResponse.java | 24 + .../response/param/ListDbOutputResponse.java | 19 + .../risk/response/param/NodeInfoResponse.java | 37 + .../param/NodeStrategyOutputResponse.java | 24 + .../risk/response/param/NodeTypeResponse.java | 27 + .../param/RuleInfoOutputResponse.java | 29 + .../response/param/RuleOutputResponse.java | 19 + .../model/enginex/runner/ExpressionParam.java | 18 + .../common/model/enginex/runner/Sandbox.java | 13 + .../decisionflow/DecisionFlowRequestDTO.java | 35 + .../decisionflow/MonitorDecisionFlow.java | 73 + .../decisionflow/MonitorDecisionFlowDTO.java | 49 + .../monitor/decisionflow/MonitorNode.java | 81 + .../monitor/decisionflow/MonitorStrategy.java | 83 + .../monitor/decisionflow/TMonitorEngine.java | 45 + .../monitor/decisionflow/TMonitorNode.java | 50 + .../monitor/decisionflow/TMonitorNodeDTO.java | 26 + .../decisionflow/TMonitorStrategy.java | 56 + .../decisionflow/TMonitorStrategyDTO.java | 31 + .../model/monitor/decisionflow/UserInfo.java | 20 + .../common/model/monitor/logger/Logger.java | 88 + .../monitor/logger/request/LoggerParam.java | 12 + .../aimodel/MachineLearningModels.java | 65 + .../model/strategyx/baserule/BaseRule.java | 68 + .../strategyx/baserule/BaseRuleCondition.java | 105 + .../strategyx/baserule/BaseRuleTypeEnum.java | 19 + .../collectionrule/ConditionAndOutPut.java | 26 + .../collectionrule/ListOperation.java | 86 + .../collectionrule/ListOperationBlock.java | 46 + .../ListOperationCondition.java | 88 + .../ListOperationFilterCondition.java | 83 + .../collectionrule/ListOperationOutput.java | 70 + .../collectionrule/ListOperationVersion.java | 87 + .../model/strategyx/dataclean/DataClean.java | 86 + .../strategyx/dataclean/DataCleanBlock.java | 54 + .../dataclean/DataCleanCondition.java | 88 + .../DataCleanConditionAndOutPut.java | 28 + .../dataclean/DataCleanFilterCondition.java | 87 + .../dataclean/DataCleanOriginalDataOp.java | 41 + .../strategyx/dataclean/DataCleanOutput.java | 70 + .../strategyx/dataclean/DataCleanVersion.java | 90 + .../strategyx/dataclean/FilterCondEnum.java | 18 + .../dataclean/param/RunnerDataCleanParam.java | 17 + .../decisiontable/DecisionTables.java | 65 + .../decisiontable/DecisionTablesDetail.java | 63 + .../DecisionTablesDetailCondition.java | 39 + .../decisiontable/DecisionTablesResult.java | 41 + .../decisiontable/DecisionTablesVersion.java | 48 + .../request/DecisionTablesListParam.java | 23 + .../vo/DecisionTablesDetailVo.java | 48 + .../vo/DecisionTablesResultVo.java | 36 + .../vo/DecisionTablesVersionVo.java | 21 + .../decisiontable/vo/DecisionTablesVo.java | 55 + .../strategyx/decisiontree/DecisionTree.java | 51 + .../decisiontree/DecisionTreeDetail.java | 53 + .../DecisionTreeDetailCondition.java | 35 + .../decisiontree/DecisionTreeVersion.java | 50 + .../vo/DecisionTreeVersionVo.java | 16 + .../decisiontree/vo/DecisionTreeVo.java | 9 + .../guiderule/RuleConditionInfo.java | 76 + .../model/strategyx/guiderule/RuleInfo.java | 104 + .../guiderule/RuleLoopGroupAction.java | 57 + .../strategyx/guiderule/RuleVersion.java | 77 + .../param/RuleSetNodeResultParam.java | 18 + .../guiderule/request/RuleListParamV2.java | 21 + .../request/RuleUpdateStatusParam.java | 15 + .../guiderule/vo/RuleConditionVo.java | 18 + .../strategyx/guiderule/vo/RuleVersionVo.java | 20 + .../model/strategyx/guiderule/vo/RuleVo.java | 27 + .../strategyx/knowledge/KnowledgeTree.java | 89 + .../model/strategyx/knowledge/Rule.java | 157 ++ .../knowledge/request/RuleListParam.java | 29 + .../knowledge/request/RuleSaveParam.java | 37 + .../knowledge/response/UploadResponse.java | 19 + .../model/strategyx/listlibrary/ListDb.java | 121 ++ .../strategyx/listlibrary/ListDbVersion.java | 57 + .../strategyx/listlibrary/TblColumn.java | 36 + .../listlibrary/request/ListDbDataParam.java | 13 + .../model/strategyx/scorecard/Scorecard.java | 142 ++ .../strategyx/scorecard/ScorecardDetail.java | 41 + .../scorecard/ScorecardDetailCondition.java | 48 + .../scorecard/ScorecardDimension.java | 30 + .../strategyx/scorecard/ScorecardVersion.java | 73 + .../scorecard/request/ListParam.java | 27 + .../scorecard/vo/ScorecardDetailVo.java | 20 + .../scorecard/vo/ScorecardDimensionVo.java | 18 + .../scorecard/vo/ScorecardVersionVo.java | 20 + .../strategyx/scorecard/vo/ScorecardVo.java | 23 + .../scriptrule/RuleScriptVersion.java | 76 + .../strategyx/strategyout/OutCondition.java | 16 + .../strategyx/strategyout/StrategyOutput.java | 77 + .../ddp/common/model/strategyx/tag/Tag.java | 88 + .../model/strategyx/tag/TagVersion.java | 90 + .../model/strategyx/tag/TagVersionDetail.java | 84 + ddp-common/ddp-service/pom.xml | 23 + .../service/analyse/AnalyseCommonService.java | 11 + .../analyse/AnalyseDecisionResultService.java | 13 + .../analyse/AnalyseDecisionTablesService.java | 13 + .../analyse/AnalyseEngineCallService.java | 11 + .../analyse/AnalyseEngineNodeService.java | 13 + .../analyse/AnalyseEngineSummaryService.java | 16 + .../service/analyse/AnalyseRuleService.java | 13 + .../analyse/AnalyseScorecardService.java | 13 + .../service/analyse/AnalyseService.java | 9 + .../service/analyse/StatisticsService.java | 8 + .../AnalyseChartStatisticServiceImpl.java | 321 ++++ .../AnalyseDecisionResultServiceImpl.java | 50 + .../AnalyseDecisionTablesServiceImpl.java | 62 + .../impl/AnalyseEngineCallServiceImpl.java | 34 + .../impl/AnalyseEngineNodeServiceImpl.java | 51 + .../impl/AnalyseEngineSummaryServiceImpl.java | 87 + .../analyse/impl/AnalyseRuleServiceImpl.java | 50 + .../impl/AnalyseScorecardServiceImpl.java | 63 + .../analyse/impl/AnalyseServiceImpl.java | 60 + .../analyse/impl/StatisticsServiceImpl.java | 304 +++ .../approval/ApprovalConfigService.java | 21 + .../service/approval/ApprovalService.java | 21 + .../impl/ApprovalConfigServiceImpl.java | 159 ++ .../approval/impl/ApprovalServiceImpl.java | 224 +++ .../authx/dictionary/DictionaryService.java | 31 + .../impl/DictionaryServiceImpl.java | 129 ++ .../service/authx/system/SysMenuService.java | 64 + .../authx/system/SysOrganizationService.java | 61 + .../service/authx/system/SysRoleService.java | 73 + .../service/authx/system/SysUserService.java | 58 + .../authx/system/impl/SysMenuServiceImpl.java | 107 ++ .../impl/SysOrganizationServiceImpl.java | 98 + .../authx/system/impl/SysRoleServiceImpl.java | 130 ++ .../authx/system/impl/SysUserServiceImpl.java | 135 ++ .../cignacmb/BusinessEventLogService.java | 15 + .../cignacmb/BusinessRuleLogService.java | 20 + .../cignacmb/ITBusinessRuleRelService.java | 29 + .../impl/BusinessEventLogServiceImpl.java | 35 + .../impl/BusinessRuleLogServiceImpl.java | 41 + .../impl/TBusinessRuleRelServiceImpl.java | 208 ++ .../service/common/AccountSessionWrap.java | 32 + .../ddp/common/service/common/ExcelUtil.java | 305 +++ .../common/service/common/SessionManager.java | 30 + .../common/message/send/EmailService.java | 21 + .../message/send/impl/EmailServiceImpl.java | 49 + .../message/template/AppTemplateService.java | 14 + .../template/MessageSendRecordService.java | 14 + .../message/template/SmsTemplateService.java | 14 + .../template/WebhookTemplateService.java | 14 + .../template/WechatTemplateService.java | 14 + .../template/impl/AppTemplateServiceImpl.java | 18 + .../impl/MessageSendRecordServiceImpl.java | 18 + .../template/impl/SmsTemplateServiceImpl.java | 18 + .../impl/WebhookTemplateServiceImpl.java | 18 + .../impl/WechatTemplateServiceImpl.java | 18 + .../common/runner/RunnerSessionManager.java | 20 + .../service/common/runner/SessionData.java | 15 + .../datax/cache/DataXCacheService.java | 21 + .../service/datax/cache/DataXChange.java | 18 + .../datax/cache/DataXChangeAspect.java | 33 + .../service/datax/cache/Subscriber.java | 55 + .../cache/impl/DataXCacheServiceImpl.java | 128 ++ .../datax/datainterface/InterfaceService.java | 48 + .../impl/InterfaceServiceImpl.java | 345 ++++ .../datax/datamanage/FieldCallLogService.java | 26 + .../datax/datamanage/FieldService.java | 165 ++ .../datax/datamanage/FieldTypeService.java | 38 + .../imp/FieldCallLogServiceImpl.java | 62 + .../datax/datamanage/imp/FieldServiceImp.java | 1200 ++++++++++++ .../datamanage/imp/FieldTypeServiceImp.java | 78 + .../datax/datasource/DataSourceService.java | 24 + .../datax/datasource/MqSourceService.java | 28 + .../impl/DataSourceServiceImpl.java | 131 ++ .../datasource/impl/MqSourceServiceImpl.java | 124 ++ .../service/datax/home/HomeService.java | 8 + .../datax/home/impl/DataXHomeServiceImpl.java | 96 + .../service/datax/runner/CommonService.java | 27 + .../datax/runner/DataBaseReSource.java | 124 ++ .../service/datax/runner/ExecuteUtils.java | 656 +++++++ .../service/datax/runner/FieldTypeConsts.java | 10 + .../datax/runner/impl/CommonServiceImpl.java | 1014 ++++++++++ .../runner/mysql/DataSourceContextHolder.java | 17 + .../datax/runner/mysql/DynamicDataSource.java | 38 + .../runner/redis/RedisKSessionFactory.java | 60 + .../datax/runner/redis/RedisKSessionPool.java | 67 + .../enginex/dataflow/EngineNodeServiceV3.java | 19 + .../enginex/dataflow/EngineServiceV3.java | 25 + .../dataflow/EngineVersionContentService.java | 21 + .../dataflow/EngineVersionServiceV3.java | 32 + .../impl/EngineNodeServiceV3Impl.java | 48 + .../dataflow/impl/EngineServiceV3Impl.java | 138 ++ .../impl/EngineVersionContentServiceImpl.java | 362 ++++ .../impl/EngineVersionServiceV3Impl.java | 303 +++ .../MarketingEngineNodeDateResultService.java | 18 + .../MarketingEngineNodeResultService.java | 17 + .../MarketingEngineResultService.java | 21 + ...ketingEngineNodeDateResultServiceImpl.java | 32 + .../MarketingEngineNodeResultServiceImpl.java | 28 + .../MarketingEngineResultServiceImpl.java | 159 ++ .../PersonasEngineResultDetailService.java | 34 + .../personas/PersonasEngineResultService.java | 22 + ...PersonasEngineResultDetailServiceImpl.java | 101 + .../impl/PersonasEngineResultServiceImpl.java | 69 + .../enginex/risk/EngineNodeService.java | 102 + .../service/enginex/risk/EngineService.java | 79 + .../enginex/risk/EngineVersionService.java | 80 + .../risk/impl/EngineNodeServiceImpl.java | 792 ++++++++ .../enginex/risk/impl/EngineServiceImpl.java | 758 ++++++++ .../risk/impl/EngineVersionServiceImpl.java | 292 +++ .../enginex/util/EngineNodeJsonUtil.java | 63 + .../service/enginex/util/EngineNodeUtil.java | 509 +++++ .../enginex/util/EngineNodeUtilV2.java | 438 +++++ .../service/enginex/util/EngineUtil.java | 65 + .../monitor/decisionflow/IMonitorService.java | 44 + .../impl/MonitorMysqlVersionServiceImpl.java | 79 + .../decisionflow/impl/MonitorServiceImpl.java | 77 + .../service/monitor/logger/ArchivesLog.java | 18 + .../monitor/logger/ArchivesLogAspect.java | 150 ++ .../service/monitor/logger/LogService.java | 39 + .../monitor/logger/impl/LogServiceImpl.java | 39 + .../monitor/runner/IMonitorCenterService.java | 31 + .../runner/MonitorCenterFactoryRunner.java | 25 + .../monitor/runner/MonitorCommonService.java | 18 + .../runner/hbase/IFeatureRecordService.java | 15 + .../runner/hbase/IHbaseUserInfoService.java | 16 + .../runner/hbase/IMonitorDecisionFlow.java | 15 + .../monitor/runner/hbase/IMonitorNode.java | 12 + .../runner/hbase/IMonitorStrategyService.java | 12 + .../hbase/impl/HbaseUserInfoServiceImpl.java | 47 + .../hbase/impl/IFeatureRecordServiceImpl.java | 103 + .../hbase/impl/IMonitorDecisionFlowImpl.java | 85 + .../runner/hbase/impl/IMonitorNodeImpl.java | 94 + .../hbase/impl/IMonitorStrategyImpl.java | 94 + .../hbase/impl/MonitorCenterServiceImpl.java | 187 ++ .../runner/hbase/node/MonitorService.java | 18 + .../node/impl/MonitorBlackOrWhiteNode.java | 70 + .../node/impl/MonitorChildEngineNode.java | 19 + .../node/impl/MonitorCommonServiceImpl.java | 33 + .../node/impl/MonitorDecisionOptionsNode.java | 23 + .../node/impl/MonitorDecisionTablesNode.java | 76 + .../hbase/node/impl/MonitorGroupNode.java | 20 + .../hbase/node/impl/MonitorModelNode.java | 19 + .../hbase/node/impl/MonitorRuleSetNode.java | 86 + .../impl/MonitorSandboxProportionNode.java | 20 + .../hbase/node/impl/MonitorScorecardNode.java | 70 + .../runner/impl/MonitorCommonServiceImpl.java | 68 + .../impl/MonitorCenterMysqlServiceImpl.java | 171 ++ .../mysql/node/MonitorMysqlService.java | 18 + .../node/impl/MonitorCommonServiceImpl.java | 33 + .../impl/MonitorMysqlBlackOrWhiteNode.java | 75 + .../impl/MonitorMysqlChildEngineNode.java | 19 + .../impl/MonitorMysqlDecisionOptionsNode.java | 23 + .../impl/MonitorMysqlDecisionTablesNode.java | 122 ++ .../impl/MonitorMysqlDecisionTreeNode.java | 71 + .../node/impl/MonitorMysqlGroupNode.java | 20 + .../node/impl/MonitorMysqlModelNode.java | 19 + .../node/impl/MonitorMysqlRuleSetNode.java | 124 ++ .../MonitorMysqlSandboxProportionNode.java | 20 + .../node/impl/MonitorMysqlScorecardNode.java | 72 + .../common/service/redis/RedisManager.java | 864 +++++++++ .../ddp/common/service/redis/RedisUtils.java | 50 + .../strategyx/aimodel/ModelsService.java | 23 + .../aimodel/PMMLExecutor/PMMLExecutor.java | 15 + .../PMMLExecutor/impl/PMMLExecutorRFImpl.java | 98 + .../aimodel/impl/ModelsServiceImpl.java | 90 + .../baserule/BaseRuleConditionService.java | 32 + .../strategyx/baserule/BaseRuleService.java | 23 + .../impl/BaseRuleConditionServiceImpl.java | 263 +++ .../baserule/impl/BaseRuleServiceImpl.java | 106 + .../ConditionAndOutPutService.java | 16 + .../ListOperationBlockService.java | 14 + .../ListOperationConditionService.java | 16 + .../ListOperationFilterConditionService.java | 16 + .../ListOperationOutputService.java | 14 + .../collectionrule/ListOperationService.java | 23 + .../ListOperationVersionService.java | 26 + .../impl/ConditionAndOutPutServiceImpl.java | 195 ++ .../impl/ListOperationBlockServiceImpl.java | 36 + .../ListOperationConditionServiceImpl.java | 80 + ...stOperationFilterConditionServiceImpl.java | 80 + .../impl/ListOperationOutputServiceImpl.java | 33 + .../impl/ListOperationServiceImpl.java | 209 ++ .../impl/ListOperationVersionServiceImpl.java | 180 ++ .../dataclean/DataCleanBlockService.java | 14 + .../DataCleanConditionAndOutPutService.java | 16 + .../dataclean/DataCleanConditionService.java | 16 + .../DataCleanFilterConditionService.java | 17 + .../DataCleanOriginalDataOpService.java | 21 + .../dataclean/DataCleanOutputService.java | 14 + .../strategyx/dataclean/DataCleanService.java | 25 + .../dataclean/DataCleanVersionService.java | 29 + .../impl/DataCleanBlockServiceImpl.java | 36 + ...ataCleanConditionAndOutPutServiceImpl.java | 206 ++ .../impl/DataCleanConditionServiceImpl.java | 80 + .../DataCleanFilterConditionServiceImpl.java | 83 + .../DataCleanOriginalDataOpServiceImpl.java | 88 + .../impl/DataCleanOutputServiceImpl.java | 33 + .../dataclean/impl/DataCleanServiceImpl.java | 279 +++ .../impl/DataCleanVersionServiceImpl.java | 258 +++ .../DecisionTablesDetailConditionService.java | 19 + .../DecisionTablesDetailService.java | 20 + .../DecisionTablesResultService.java | 17 + .../decisiontable/DecisionTablesService.java | 36 + .../DecisionTablesVersionService.java | 30 + ...isionTablesDetailConditionServiceImpl.java | 123 ++ .../impl/DecisionTablesDetailServiceImpl.java | 338 ++++ .../impl/DecisionTablesResultServiceImpl.java | 135 ++ .../impl/DecisionTablesServiceImpl.java | 262 +++ .../DecisionTablesVersionServiceImpl.java | 278 +++ .../DecisionTreeDetailConditionService.java | 19 + .../DecisionTreeDetailService.java | 16 + .../decisiontree/DecisionTreeService.java | 35 + .../DecisionTreeVersionService.java | 31 + ...ecisionTreeDetailConditionServiceImpl.java | 104 + .../impl/DecisionTreeDetailServiceImpl.java | 213 +++ .../impl/DecisionTreeServiceImpl.java | 276 +++ .../impl/DecisionTreeVersionServiceImpl.java | 285 +++ .../guiderule/RuleConditionService.java | 34 + .../guiderule/RuleLoopGroupActionService.java | 18 + .../strategyx/guiderule/RuleService.java | 53 + .../guiderule/RuleVersionService.java | 27 + .../impl/RuleConditionServiceImpl.java | 404 ++++ .../impl/RuleLoopGroupActionServiceImpl.java | 85 + .../guiderule/impl/RuleServiceImpl.java | 318 +++ .../impl/RuleVersionServiceImpl.java | 278 +++ .../knowledge/KnowledgeTreeService.java | 57 + .../strategyx/knowledge/RuleService.java | 22 + .../impl/KnowledgeTreeServiceImpl.java | 187 ++ .../knowledge/impl/RuleServiceImpl.java | 30 + .../strategyx/listlibrary/ListDbService.java | 79 + .../listlibrary/ListDbV3Service.java | 47 + .../listlibrary/ListDbVersionService.java | 24 + .../listlibrary/impl/ListDbServiceImp.java | 361 ++++ .../listlibrary/impl/ListDbV3ServiceImp.java | 326 ++++ .../impl/ListDbVersionServiceImpl.java | 226 +++ .../ScorecardDetailConditionService.java | 15 + .../scorecard/ScorecardDetailService.java | 17 + .../scorecard/ScorecardDimensionService.java | 12 + .../strategyx/scorecard/ScorecardService.java | 40 + .../scorecard/ScorecardVersionService.java | 30 + .../ScorecardDetailConditionServiceImpl.java | 42 + .../impl/ScorecardDetailServiceImpl.java | 58 + .../impl/ScorecardDimensionServiceImpl.java | 39 + .../scorecard/impl/ScorecardServiceImpl.java | 251 +++ .../impl/ScorecardVersionServiceImpl.java | 580 ++++++ .../scriptrule/RuleScriptVersionService.java | 32 + .../impl/RuleScriptVersionServiceImpl.java | 182 ++ .../strategyout/StrategyOutputService.java | 28 + .../impl/StrategyOutputServiceImpl.java | 208 ++ .../service/strategyx/tag/TagService.java | 29 + .../tag/TagVersionDetailService.java | 20 + .../strategyx/tag/TagVersionService.java | 30 + .../strategyx/tag/impl/TagServiceImpl.java | 194 ++ .../tag/impl/TagVersionDetailServiceImpl.java | 130 ++ .../tag/impl/TagVersionServiceImpl.java | 173 ++ ddp-common/ddp-utils/pom.xml | 20 + .../com/fibo/ddp/common/utils/common/MD5.java | 91 + .../common/utils/constant/AnalyseConst.java | 13 + .../common/utils/constant/ApprovalConsts.java | 18 + .../common/utils/constant/CommonConst.java | 51 + .../ddp/common/utils/constant/Constants.java | 41 + .../common/utils/constant/OpTypeConst.java | 647 +++++++ .../ddp/common/utils/constant/OpTypeEnum.java | 387 ++++ .../utils/constant/RuleInfoConstants.java | 28 + .../utils/constant/ServiceFilterConstant.java | 24 + .../common/utils/constant/StatusConst.java | 8 + .../common/utils/constant/SysConstant.java | 94 + .../constant/enginex/CallBackTypeEnum.java | 23 + .../utils/constant/enginex/EngineConst.java | 25 + .../constant/enginex/EngineContentConst.java | 21 + .../utils/constant/enginex/EngineMsg.java | 34 + .../constant/enginex/EngineOperator.java | 153 ++ .../constant/enginex/EngineTypeConst.java | 15 + .../utils/constant/enginex/EnumConst.java | 49 + .../utils/constant/enginex/NodeTypeEnum.java | 123 ++ .../utils/constant/monitor/Constants.java | 233 +++ .../constant/monitor/MonitorStorageType.java | 9 + .../utils/constant/monitor/RowKeyUtil.java | 16 + .../utils/constant/runner/ParamTypeConst.java | 8 + .../utils/constant/strategyx/CondConst.java | 19 + .../strategyx/DecisionTablesDetailConst.java | 13 + .../strategyx/DecisionTablesRunnerConst.java | 73 + .../utils/constant/strategyx/ExcelHeader.java | 30 + .../strategyx/RuleConditionConst.java | 17 + .../utils/constant/strategyx/RuleConst.java | 42 + .../constant/strategyx/RuleRunnerConst.java | 86 + .../utils/constant/strategyx/Status.java | 35 + .../constant/strategyx/StrategyType.java | 17 + .../common/utils/constant/strategyx/Type.java | 44 + .../common/utils/exception/ApiException.java | 53 + .../ddp/common/utils/util/CollectionUtil.java | 104 + .../fibo/ddp/common/utils/util/DataHelp.java | 40 + .../ddp/common/utils/util/RequestUtil.java | 37 + .../ddp/common/utils/util/ResponseUtil.java | 16 + .../ddp/common/utils/util/SnowFlakUtil.java | 42 + .../ddp/common/utils/util/StringUtil.java | 465 +++++ .../utils/util/runner/DictVariableUtils.java | 29 + .../common/utils/util/runner/JevalUtil.java | 167 ++ .../common/utils/util/runner/NumUtils.java | 23 + .../common/utils/util/runner/StrUtils.java | 32 + .../util/runner/jeval/ArgumentTokenizer.java | 119 ++ .../runner/jeval/EvaluationConstants.java | 63 + .../runner/jeval/EvaluationException.java | 57 + .../util/runner/jeval/EvaluationHelper.java | 87 + .../util/runner/jeval/EvaluationResult.java | 177 ++ .../utils/util/runner/jeval/Evaluator.java | 1703 +++++++++++++++++ .../util/runner/jeval/ExpressionOperand.java | 62 + .../util/runner/jeval/ExpressionOperator.java | 63 + .../util/runner/jeval/ExpressionTree.java | 368 ++++ .../utils/util/runner/jeval/NextOperator.java | 62 + .../util/runner/jeval/ParsedFunction.java | 81 + .../util/runner/jeval/VariableResolver.java | 26 + .../util/runner/jeval/function/Function.java | 51 + .../jeval/function/FunctionConstants.java | 33 + .../jeval/function/FunctionException.java | 57 + .../runner/jeval/function/FunctionGroup.java | 58 + .../runner/jeval/function/FunctionHelper.java | 284 +++ .../runner/jeval/function/FunctionResult.java | 73 + .../util/runner/jeval/function/math/Abs.java | 71 + .../util/runner/jeval/function/math/Acos.java | 71 + .../util/runner/jeval/function/math/Asin.java | 72 + .../util/runner/jeval/function/math/Atan.java | 71 + .../runner/jeval/function/math/Atan2.java | 77 + .../runner/jeval/function/math/Average.java | 49 + .../util/runner/jeval/function/math/Ceil.java | 71 + .../util/runner/jeval/function/math/Cos.java | 71 + .../util/runner/jeval/function/math/Exp.java | 73 + .../runner/jeval/function/math/Floor.java | 71 + .../runner/jeval/function/math/Groovy.java | 167 ++ .../jeval/function/math/IEEEremainder.java | 79 + .../util/runner/jeval/function/math/Ln.java | 38 + .../util/runner/jeval/function/math/Log.java | 71 + .../jeval/function/math/MathFunctions.java | 118 ++ .../util/runner/jeval/function/math/Max.java | 38 + .../util/runner/jeval/function/math/Min.java | 38 + .../util/runner/jeval/function/math/Pow.java | 79 + .../runner/jeval/function/math/Python.java | 177 ++ .../runner/jeval/function/math/Random.java | 63 + .../util/runner/jeval/function/math/Rint.java | 73 + .../runner/jeval/function/math/Round.java | 71 + .../util/runner/jeval/function/math/Sin.java | 71 + .../util/runner/jeval/function/math/Sqrt.java | 71 + .../util/runner/jeval/function/math/Sum.java | 47 + .../util/runner/jeval/function/math/Tan.java | 71 + .../runner/jeval/function/math/ToDegrees.java | 72 + .../runner/jeval/function/math/ToRadians.java | 72 + .../runner/jeval/function/string/CharAt.java | 96 + .../jeval/function/string/CompareTo.java | 93 + .../function/string/CompareToIgnoreCase.java | 94 + .../runner/jeval/function/string/Concat.java | 92 + .../jeval/function/string/Contains.java | 98 + .../jeval/function/string/EndsWith.java | 98 + .../runner/jeval/function/string/Equals.java | 98 + .../function/string/EqualsIgnoreCase.java | 99 + .../runner/jeval/function/string/Eval.java | 78 + .../runner/jeval/function/string/IndexOf.java | 95 + .../jeval/function/string/LastIndexOf.java | 95 + .../runner/jeval/function/string/Length.java | 80 + .../jeval/function/string/NotContains.java | 98 + .../jeval/function/string/NotEquals.java | 98 + .../runner/jeval/function/string/Replace.java | 115 ++ .../jeval/function/string/StartsWith.java | 102 + .../function/string/StringFunctions.java | 111 ++ .../jeval/function/string/Substring.java | 93 + .../jeval/function/string/ToLowerCase.java | 80 + .../jeval/function/string/ToUpperCase.java | 80 + .../runner/jeval/function/string/Trim.java | 81 + .../jeval/operator/AbstractOperator.java | 182 ++ .../jeval/operator/AdditionOperator.java | 70 + .../jeval/operator/BooleanAndOperator.java | 46 + .../jeval/operator/BooleanNotOperator.java | 44 + .../jeval/operator/BooleanOrOperator.java | 46 + .../operator/ClosedParenthesesOperator.java | 30 + .../jeval/operator/DivisionOperator.java | 44 + .../runner/jeval/operator/EqualOperator.java | 64 + .../jeval/operator/GreaterThanOperator.java | 63 + .../operator/GreaterThanOrEqualOperator.java | 63 + .../jeval/operator/LessThanOperator.java | 64 + .../operator/LessThanOrEqualOperator.java | 64 + .../jeval/operator/ModulusOperator.java | 44 + .../operator/MultiplicationOperator.java | 44 + .../jeval/operator/NotEqualOperator.java | 64 + .../operator/OpenParenthesesOperator.java | 30 + .../util/runner/jeval/operator/Operator.java | 88 + .../jeval/operator/SubtractionOperator.java | 54 + .../util/strategyx/CustomValueUtils.java | 32 + .../utils/util/strategyx/DataCleanUtils.java | 95 + .../common/utils/util/strategyx/Section.java | 22 + .../utils/util/strategyx/SectionUtils.java | 233 +++ .../websocket/config/WebSocketConfig.java | 52 + .../websocket/constant/SendToWebConst.java | 9 + .../websocket/handler/MessageHandler.java | 35 + .../websocket/handler/MyWebSocketHandler.java | 68 + .../interceptor/H5HandshakeInterceptor.java | 48 + .../manager/MyWebSocketSessionManager.java | 132 ++ .../websocket/model/vo/SendToWebModel.java | 16 + .../websocket/service/MyWebSocketService.java | 75 + ddp-common/pom.xml | 22 + ddp-datax/dataflow-field/pom.xml | 15 + ddp-datax/offline-field/pom.xml | 15 + ddp-datax/pom.xml | 28 + ddp-datax/realtime-field/pom.xml | 14 + .../cache/DataXCacheController.java | 43 + .../datainterface/InterfaceController.java | 142 ++ .../datamanage/FieldCallController.java | 40 + .../datamanage/FieldController.java | 883 +++++++++ .../datasource/DataSourceController.java | 65 + .../datasource/MqSourceController.java | 66 + .../controller/home/DataXHomeController.java | 36 + ddp-enginex/dataflow-engine/pom.xml | 15 + .../controller/DataFlowEngineController.java | 82 + ...ataFlowEngineVersionContentController.java | 35 + .../DataFlowEngineVersionController.java | 53 + ddp-enginex/marketing-engine/pom.xml | 15 + .../controller/MarketingEngineController.java | 75 + .../MarketingEngineResultController.java | 53 + ...rketingEngineVersionContentController.java | 38 + .../MarketingEngineVersionController.java | 29 + ddp-enginex/personas-engine/pom.xml | 15 + .../controller/PersonasEngineController.java | 84 + .../PersonasEngineResultController.java | 47 + ...ersonasEngineVersionContentController.java | 35 + .../PersonasEngineVersionController.java | 53 + ddp-enginex/pom.xml | 31 + ddp-enginex/risk-engine/pom.xml | 21 + .../controller/ChildEngineNodeController.java | 81 + .../controller/DecisionFlowController.java | 633 ++++++ .../controller/EngineController.java | 517 +++++ .../controller/EngineVersionController.java | 358 ++++ .../controller/ListDbNodeController.java | 105 + .../controller/ModelNodeController.java | 77 + .../controller/RuleNodeController.java | 152 ++ .../controller/ScorecardNodeController.java | 144 ++ .../riskengine/runner/api/RiskEngineApi.java | 67 + .../runner/business/DecisionApiBizData.java | 18 + .../runner/business/DecisionApiRequest.java | 17 + .../runner/business/RiskEngineBusiness.java | 8 + .../business/impl/RiskEngineBusinessImpl.java | 606 ++++++ ddp-enginex/rule-engine/pom.xml | 15 + ddp-enginex/runner-node/pom.xml | 15 + .../enginex/runner/canal/CacheController.java | 120 ++ .../ddp/enginex/runner/canal/CanalClient.java | 254 +++ .../runner/ksession/KSessionFactory.java | 60 + .../enginex/runner/ksession/KSessionPool.java | 67 + .../enginex/runner/node/EngineRunnerNode.java | 26 + .../runner/node/impl/AggregationNode.java | 36 + .../runner/node/impl/BlackOrWhiteNode.java | 286 +++ .../node/impl/ChampionChallengeNode.java | 44 + .../runner/node/impl/ChildEngineNode.java | 82 + .../runner/node/impl/DecisionOptionsNode.java | 144 ++ .../runner/node/impl/DecisionTablesNode.java | 385 ++++ .../runner/node/impl/DecisionTreeNode.java | 215 +++ .../enginex/runner/node/impl/GroupNode.java | 107 ++ .../enginex/runner/node/impl/ListDbNode.java | 284 +++ .../enginex/runner/node/impl/ModelNode.java | 128 ++ .../runner/node/impl/ParallelNode.java | 33 + .../ddp/enginex/runner/node/impl/RpcNode.java | 59 + .../enginex/runner/node/impl/RuleSetNode.java | 769 ++++++++ .../node/impl/SandboxProportionNode.java | 114 ++ .../runner/node/impl/ScorecardNode.java | 264 +++ ddp-manager-web/pom.xml | 135 ++ .../web/JarDdpManagerWebApplication.java | 21 + .../ddp/manager/web/aop/ExceptionAop.java | 114 ++ .../web/config/ApplicationInitConfig.java | 37 + .../ddp/manager/web/config/ConfigHolder.java | 61 + .../web/config/ConfigurationContainor.java | 46 + .../manager/web/config/DataSourceConfig.java | 56 + .../web/config/RestTemplateConfig.java | 27 + .../ddp/manager/web/config/WebMvcConfig.java | 25 + .../web/controller/AppTemplateController.java | 87 + .../MessageSendRecordController.java | 21 + .../web/controller/SmsTemplateController.java | 87 + .../controller/WebhookTemplateController.java | 87 + .../controller/WechatTemplateController.java | 87 + .../web/interceptor/SessionInterceptor.java | 99 + .../main/resources/application-dev.properties | 62 + .../src/main/resources/application.properties | 1 + .../src/main/resources/logging-config.xml | 98 + ddp-modelx/pom.xml | 15 + ddp-monitor/pom.xml | 21 + .../decisionflow/MonitorCenterFactory.java | 26 + .../decisionflow/MonitorController.java | 127 ++ .../controller/logger/LoggerController.java | 106 + ddp-runner-api/pom.xml | 135 ++ .../api/JarDdpRunnerApiApplication.java | 21 + .../ddp/runner/api/config/ConfigHolder.java | 72 + .../api/config/ConfigurationContainor.java | 46 + .../runner/api/config/DataSourceConfig.java | 69 + .../runner/api/config/RestTemplateConfig.java | 52 + .../main/resources/application-dev.properties | 59 + .../src/main/resources/application.properties | 1 + .../src/main/resources/logging-config.xml | 98 + ddp-strategyx/ai-model/pom.xml | 14 + .../aimodel/controller/ModelsController.java | 245 +++ ddp-strategyx/collection-rule/pom.xml | 15 + .../controller/ListOperationController.java | 89 + .../ListOperationVersionController.java | 91 + ddp-strategyx/data-clean/pom.xml | 15 + .../controller/DataCleanController.java | 89 + .../DataCleanVersionController.java | 91 + .../dataclean/execute/api/DataCleanApi.java | 53 + .../execute/business/DataCleanBusiness.java | 9 + .../business/impl/DataCleanBusinessImpl.java | 192 ++ .../dataclean/execute/consts/ListOpConst.java | 21 + .../DataCleanFilterConditionHandler.java | 100 + .../DataCleanModifyElementHandler.java | 120 ++ .../handler/ListOpConditionHandler.java | 123 ++ ddp-strategyx/decision-table/pom.xml | 15 + .../controller/DecisionTablesController.java | 98 + .../DecisionTablesVersionController.java | 95 + ddp-strategyx/decision-tree/pom.xml | 15 + .../controller/DecisionTreeController.java | 102 + .../DecisionTreeVersionController.java | 100 + ddp-strategyx/guide-rule/pom.xml | 15 + .../controller/RuleInfoController.java | 251 +++ .../controller/RuleVersionController.java | 90 + .../approval/ApprovalConfigController.java | 47 + .../approval/ApprovalController.java | 50 + .../cignacmb/CignaCmbController.java | 89 + .../cignacmb/TBusinessRuleRelController.java | 81 + .../knowledge/KnowledgeTreeController.java | 230 +++ ddp-strategyx/list-library/pom.xml | 15 + .../controller/ListDbController.java | 362 ++++ .../controller/ListDbV3Controller.java | 240 +++ .../controller/ListDbVersionController.java | 98 + ddp-strategyx/pom.xml | 36 + ddp-strategyx/score-card/pom.xml | 15 + .../controller/ScorecardController.java | 137 ++ .../ScorecardVersionController.java | 88 + ddp-strategyx/script-rule/pom.xml | 15 + .../RuleScriptVersionController.java | 94 + ddp-strategyx/tag/pom.xml | 15 + .../fibo/ddp/strategyx/tag/TagController.java | 94 + .../strategyx/tag/TagVersionController.java | 95 + 899 files changed, 72581 insertions(+) create mode 100644 ddp-analysis/pom.xml create mode 100644 ddp-analysis/src/main/java/com/fibo/ddp/analysis/controller/AnalyseController.java create mode 100644 ddp-authx/pom.xml create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/dictionary/controller/DictionaryController.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/business/LoginBusiness.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/LoginController.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysMenuController.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysOrganizationController.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysRoleController.java create mode 100644 ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysUserController.java create mode 100644 ddp-common/ddp-dao/pom.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionTablesMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineCallMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineNodeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineSummaryMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseRuleMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseScorecardMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/canal/TableEnum.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/DataSourceMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/MqSourceMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/dataflow/EngineVersionContentMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorDecisionFlowHbaseMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorNodeHbaseMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorStrategyHbaseMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/UserInfoHbaseMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/LoggerMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/loggerMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationBlockMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationFilterConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationOutputMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanBlockMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanFilterConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOriginalDataOpMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOutputMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesResultMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleConditionInfoMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleLoopGroupActionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailConditionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDimensionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.xml create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scriptrule/RuleScriptVersionMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/strategyout/StrategyOutputMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionDetailMapper.java create mode 100644 ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionMapper.java create mode 100644 ddp-common/ddp-model/pom.xml create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionTables.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineCall.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineNode.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineSummary.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseRule.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseScorecard.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseData.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseEngineSummaryVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseRequestParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/Approval.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/ApprovalConfig.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/Dictionary.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/DictionaryCacheManager.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysMenu.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysOrganization.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysRole.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysUser.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/LoginInfoParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/MenuParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/response/SysMenuVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessEventLog.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessRuleLog.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/TBusinessRuleRel.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/req/BusinessRuleRelReq.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogDetailParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/RuleLogParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogDetailResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/RuleLogResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/vo/BusinessRuleRelVO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BasePage.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BaseParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelModel.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelSheetModel.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/PageDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityBuilder.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/enums/ErrorCodeEnum.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/AppTemplate.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/MessageSendRecord.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/SmsTemplate.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WebhookTemplate.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WechatTemplate.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/vo/AppTemplateReqVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/QueryListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/StatusParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateFolderParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateStatusParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelHeader.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelUtil.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/Status.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ValueType.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/consts/DataXCacheConst.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/InterfaceInfo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateParent.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateStatusParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/vo/InterfaceVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/CustList.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/Field.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCall.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCallLog.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCond.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldType.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldTypeUser.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldUser.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldCallParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldSaveParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldTreeParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldEnumVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldFormulaVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldSubCondVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/DataSource.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/MqSource.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/request/DataSourceListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/vo/DataSourceVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/home/BusinessCallVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/EngineVersionContent.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowEngineContentVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowNodeVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EngineVersionContentVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EventDispose.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/AudienceNodeDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TargetSettingNodeDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TouchConfigNodeDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TriggerSettingNodeDto.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeDateResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultReqVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultRspVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingEngineContentVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingListResultReqVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeDateResultRspVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeResultRspVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResultDetail.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReport.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReportParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Engine.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineNode.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSet.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSetDTO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineRule.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/ExecuteParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/IndexEngineReportVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/InputParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Result.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/consts/EngineNodeConst.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/EngineListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/KnowledgeTreeListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/ModelListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/NodeParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/TestResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/DecisionFlowOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbInfoOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeInfoResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeStrategyOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeTypeResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleInfoOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleOutputResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/ExpressionParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/Sandbox.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/DecisionFlowRequestDTO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlow.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlowDTO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorNode.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorStrategy.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorEngine.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNode.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNodeDTO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategy.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategyDTO.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/UserInfo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/Logger.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/request/LoggerParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/aimodel/MachineLearningModels.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRule.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleTypeEnum.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ConditionAndOutPut.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperation.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationBlock.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationFilterCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationOutput.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataClean.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanBlock.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanConditionAndOutPut.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanFilterCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOriginalDataOp.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOutput.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/FilterCondEnum.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/param/RunnerDataCleanParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTables.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetail.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetailCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesResult.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/request/DecisionTablesListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesDetailVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesResultVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVersionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTree.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetail.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetailCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVersionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleConditionInfo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleInfo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleLoopGroupAction.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/param/RuleSetNodeResultParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleListParamV2.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleUpdateStatusParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleConditionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVersionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/KnowledgeTree.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/Rule.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleSaveParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/response/UploadResponse.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDb.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDbVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/TblColumn.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/request/ListDbDataParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/Scorecard.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetail.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetailCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDimension.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/request/ListParam.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDetailVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDimensionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVersionVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVo.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scriptrule/RuleScriptVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/OutCondition.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/StrategyOutput.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/Tag.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersion.java create mode 100644 ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersionDetail.java create mode 100644 ddp-common/ddp-service/pom.xml create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseCommonService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionTablesService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineCallService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineNodeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineSummaryService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseRuleService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseScorecardService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/StatisticsService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseChartStatisticServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionTablesServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineCallServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineNodeServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineSummaryServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseRuleServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseScorecardServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/StatisticsServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalConfigService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalConfigServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/DictionaryService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/impl/DictionaryServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysMenuService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysOrganizationService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysRoleService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysUserService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysMenuServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysOrganizationServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysRoleServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysUserServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessEventLogService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessRuleLogService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/ITBusinessRuleRelService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessEventLogServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessRuleLogServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/TBusinessRuleRelServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/AccountSessionWrap.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/ExcelUtil.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/SessionManager.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/EmailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/impl/EmailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/AppTemplateService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/MessageSendRecordService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/SmsTemplateService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WebhookTemplateService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WechatTemplateService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/AppTemplateServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/MessageSendRecordServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/SmsTemplateServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WebhookTemplateServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WechatTemplateServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/RunnerSessionManager.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/SessionData.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXCacheService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChange.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChangeAspect.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/Subscriber.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/impl/DataXCacheServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/InterfaceService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/impl/InterfaceServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldCallLogService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldTypeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldCallLogServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldServiceImp.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldTypeServiceImp.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/DataSourceService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/MqSourceService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/DataSourceServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/MqSourceServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/HomeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/impl/DataXHomeServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/CommonService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/DataBaseReSource.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/ExecuteUtils.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/FieldTypeConsts.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/impl/CommonServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DataSourceContextHolder.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DynamicDataSource.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionFactory.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionPool.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineNodeServiceV3.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineServiceV3.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionContentService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionServiceV3.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineNodeServiceV3Impl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineServiceV3Impl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionContentServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionServiceV3Impl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeDateResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeDateResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultDetailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultDetailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineNodeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineNodeServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeJsonUtil.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtil.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtilV2.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineUtil.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/IMonitorService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorMysqlVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLog.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLogAspect.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/LogService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/impl/LogServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/IMonitorCenterService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCenterFactoryRunner.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCommonService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IFeatureRecordService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IHbaseUserInfoService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorDecisionFlow.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorStrategyService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/HbaseUserInfoServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IFeatureRecordServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorDecisionFlowImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorNodeImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorStrategyImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/MonitorCenterServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/MonitorService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorBlackOrWhiteNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorChildEngineNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorCommonServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionOptionsNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionTablesNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorGroupNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorModelNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorRuleSetNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorSandboxProportionNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorScorecardNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/impl/MonitorCommonServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/impl/MonitorCenterMysqlServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/MonitorMysqlService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorCommonServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlBlackOrWhiteNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlChildEngineNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionOptionsNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTablesNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTreeNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlGroupNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlModelNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlRuleSetNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlSandboxProportionNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlScorecardNode.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisManager.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisUtils.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/ModelsService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/PMMLExecutor.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/impl/PMMLExecutorRFImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/impl/ModelsServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ConditionAndOutPutService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationBlockService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationFilterConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationOutputService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ConditionAndOutPutServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationBlockServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationFilterConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationOutputServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanBlockService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionAndOutPutService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanFilterConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOriginalDataOpService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOutputService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanBlockServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionAndOutPutServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanFilterConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOriginalDataOpServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOutputServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesResultService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesResultServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleLoopGroupActionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleLoopGroupActionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/KnowledgeTreeService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/RuleService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/KnowledgeTreeServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/RuleServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbV3Service.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbServiceImp.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbV3ServiceImp.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDetailConditionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDetailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDimensionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailConditionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDimensionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/RuleScriptVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/impl/RuleScriptVersionServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/StrategyOutputService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/impl/StrategyOutputServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionDetailService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionService.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionDetailServiceImpl.java create mode 100644 ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionServiceImpl.java create mode 100644 ddp-common/ddp-utils/pom.xml create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/common/MD5.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/AnalyseConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ApprovalConsts.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/CommonConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/Constants.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeEnum.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/RuleInfoConstants.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ServiceFilterConstant.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/StatusConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/SysConstant.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/CallBackTypeEnum.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineContentConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineMsg.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineTypeConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EnumConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/NodeTypeEnum.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/Constants.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/MonitorStorageType.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/RowKeyUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/runner/ParamTypeConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/CondConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesDetailConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesRunnerConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/ExcelHeader.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConditionConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleRunnerConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Status.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/StrategyType.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Type.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/exception/ApiException.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/CollectionUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/DataHelp.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/RequestUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/ResponseUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/SnowFlakUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/StringUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/DictVariableUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/JevalUtil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/NumUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/StrUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ArgumentTokenizer.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationConstants.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationException.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationHelper.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationResult.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/Evaluator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperand.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionTree.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/NextOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ParsedFunction.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/VariableResolver.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/Function.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionConstants.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionException.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionGroup.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionHelper.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionResult.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Abs.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Acos.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Asin.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan2.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Average.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ceil.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Cos.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Exp.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Floor.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Groovy.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/IEEEremainder.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ln.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Log.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/MathFunctions.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Max.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Min.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Pow.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Python.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Random.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Rint.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Round.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sin.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sqrt.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sum.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Tan.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToDegrees.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToRadians.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CharAt.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareTo.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareToIgnoreCase.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Concat.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Contains.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EndsWith.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Equals.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EqualsIgnoreCase.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Eval.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/IndexOf.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/LastIndexOf.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Length.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotContains.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotEquals.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Replace.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StartsWith.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StringFunctions.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Substring.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToLowerCase.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToUpperCase.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Trim.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AbstractOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AdditionOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanAndOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanNotOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanOrOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ClosedParenthesesOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/DivisionOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/EqualOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOrEqualOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOrEqualOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ModulusOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/MultiplicationOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/NotEqualOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/OpenParenthesesOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/Operator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/SubtractionOperator.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/CustomValueUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/DataCleanUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/Section.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/SectionUtils.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/config/WebSocketConfig.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/constant/SendToWebConst.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MessageHandler.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MyWebSocketHandler.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/interceptor/H5HandshakeInterceptor.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/manager/MyWebSocketSessionManager.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/model/vo/SendToWebModel.java create mode 100644 ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/service/MyWebSocketService.java create mode 100644 ddp-common/pom.xml create mode 100644 ddp-datax/dataflow-field/pom.xml create mode 100644 ddp-datax/offline-field/pom.xml create mode 100644 ddp-datax/pom.xml create mode 100644 ddp-datax/realtime-field/pom.xml create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/cache/DataXCacheController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datainterface/InterfaceController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldCallController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/DataSourceController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/MqSourceController.java create mode 100644 ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/home/DataXHomeController.java create mode 100644 ddp-enginex/dataflow-engine/pom.xml create mode 100644 ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineController.java create mode 100644 ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionContentController.java create mode 100644 ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionController.java create mode 100644 ddp-enginex/marketing-engine/pom.xml create mode 100644 ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineController.java create mode 100644 ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineResultController.java create mode 100644 ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionContentController.java create mode 100644 ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionController.java create mode 100644 ddp-enginex/personas-engine/pom.xml create mode 100644 ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineController.java create mode 100644 ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineResultController.java create mode 100644 ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionContentController.java create mode 100644 ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionController.java create mode 100644 ddp-enginex/pom.xml create mode 100644 ddp-enginex/risk-engine/pom.xml create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ChildEngineNodeController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/DecisionFlowController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineVersionController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ListDbNodeController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ModelNodeController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/RuleNodeController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ScorecardNodeController.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/api/RiskEngineApi.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiBizData.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiRequest.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/RiskEngineBusiness.java create mode 100644 ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/impl/RiskEngineBusinessImpl.java create mode 100644 ddp-enginex/rule-engine/pom.xml create mode 100644 ddp-enginex/runner-node/pom.xml create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CacheController.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CanalClient.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionFactory.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionPool.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/EngineRunnerNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/AggregationNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/BlackOrWhiteNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChampionChallengeNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChildEngineNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionOptionsNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTablesNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTreeNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/GroupNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ListDbNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ModelNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ParallelNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RpcNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RuleSetNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/SandboxProportionNode.java create mode 100644 ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ScorecardNode.java create mode 100644 ddp-manager-web/pom.xml create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/JarDdpManagerWebApplication.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/aop/ExceptionAop.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ApplicationInitConfig.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigHolder.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigurationContainor.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/DataSourceConfig.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/RestTemplateConfig.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/WebMvcConfig.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/AppTemplateController.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/MessageSendRecordController.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/SmsTemplateController.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WebhookTemplateController.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WechatTemplateController.java create mode 100644 ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/interceptor/SessionInterceptor.java create mode 100644 ddp-manager-web/src/main/resources/application-dev.properties create mode 100644 ddp-manager-web/src/main/resources/application.properties create mode 100644 ddp-manager-web/src/main/resources/logging-config.xml create mode 100644 ddp-modelx/pom.xml create mode 100644 ddp-monitor/pom.xml create mode 100644 ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorCenterFactory.java create mode 100644 ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorController.java create mode 100644 ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/logger/LoggerController.java create mode 100644 ddp-runner-api/pom.xml create mode 100644 ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/JarDdpRunnerApiApplication.java create mode 100644 ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigHolder.java create mode 100644 ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigurationContainor.java create mode 100644 ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/DataSourceConfig.java create mode 100644 ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/RestTemplateConfig.java create mode 100644 ddp-runner-api/src/main/resources/application-dev.properties create mode 100644 ddp-runner-api/src/main/resources/application.properties create mode 100644 ddp-runner-api/src/main/resources/logging-config.xml create mode 100644 ddp-strategyx/ai-model/pom.xml create mode 100644 ddp-strategyx/ai-model/src/main/java/com/fibo/ddp/strategyx/aimodel/controller/ModelsController.java create mode 100644 ddp-strategyx/collection-rule/pom.xml create mode 100644 ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationController.java create mode 100644 ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationVersionController.java create mode 100644 ddp-strategyx/data-clean/pom.xml create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanController.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanVersionController.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/api/DataCleanApi.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/DataCleanBusiness.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/impl/DataCleanBusinessImpl.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/consts/ListOpConst.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanFilterConditionHandler.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanModifyElementHandler.java create mode 100644 ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/ListOpConditionHandler.java create mode 100644 ddp-strategyx/decision-table/pom.xml create mode 100644 ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesController.java create mode 100644 ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesVersionController.java create mode 100644 ddp-strategyx/decision-tree/pom.xml create mode 100644 ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeController.java create mode 100644 ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeVersionController.java create mode 100644 ddp-strategyx/guide-rule/pom.xml create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleInfoController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleVersionController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalConfigController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/CignaCmbController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/TBusinessRuleRelController.java create mode 100644 ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/knowledge/KnowledgeTreeController.java create mode 100644 ddp-strategyx/list-library/pom.xml create mode 100644 ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbController.java create mode 100644 ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbV3Controller.java create mode 100644 ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbVersionController.java create mode 100644 ddp-strategyx/pom.xml create mode 100644 ddp-strategyx/score-card/pom.xml create mode 100644 ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardController.java create mode 100644 ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardVersionController.java create mode 100644 ddp-strategyx/script-rule/pom.xml create mode 100644 ddp-strategyx/script-rule/src/main/java/com/fibo/ddp/strategyx/scriptrule/controller/RuleScriptVersionController.java create mode 100644 ddp-strategyx/tag/pom.xml create mode 100644 ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagController.java create mode 100644 ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagVersionController.java diff --git a/ddp-analysis/pom.xml b/ddp-analysis/pom.xml new file mode 100644 index 0000000..01eff57 --- /dev/null +++ b/ddp-analysis/pom.xml @@ -0,0 +1,21 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-analysis + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/ddp-analysis/src/main/java/com/fibo/ddp/analysis/controller/AnalyseController.java b/ddp-analysis/src/main/java/com/fibo/ddp/analysis/controller/AnalyseController.java new file mode 100644 index 0000000..8e4a13d --- /dev/null +++ b/ddp-analysis/src/main/java/com/fibo/ddp/analysis/controller/AnalyseController.java @@ -0,0 +1,64 @@ +package com.fibo.ddp.analysis.controller; + +import com.fibo.ddp.common.model.analyse.vo.AnalyseData; +import com.fibo.ddp.common.model.analyse.vo.AnalyseEngineSummaryVo; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.service.analyse.AnalyseEngineSummaryService; +import com.fibo.ddp.common.service.analyse.AnalyseService; +import com.fibo.ddp.common.service.analyse.StatisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Map; + +@RestController +@RequestMapping("v3/analyse") +public class AnalyseController { + + @Autowired + private AnalyseService analyseService; + @Resource + @Qualifier("analyseChartStatisticServiceImpl") + private StatisticsService statisticsService; + @Autowired + private AnalyseEngineSummaryService analyseEngineSummaryService; + + /** + * 分析中心-下方图表数据 + * @param param + * @return + */ + @PostMapping("/getData") + public ResponseEntityDto getAnalyseData(@RequestBody AnalyseRequestParam param){ + AnalyseData analyseData = analyseService.getAnalyseData(param); + return ResponseEntityBuilder.buildNormalResponse(analyseData); + } + + /** + * 分析中心-引擎概况数据 + * @param param + * @return + */ + @PostMapping("/getEngineSummary") + public ResponseEntityDto getEngineSummary(@RequestBody AnalyseRequestParam param){ + Map analyseData = analyseEngineSummaryService.getAnalyseData(param); + return ResponseEntityBuilder.buildNormalResponse(analyseData); + } + + /** + * 分析中心- 监控数据统计分析后入库 + * @return + */ + @PostMapping("/decision") + public ResponseEntityDto decision(){ + statisticsService.statisticData(); + return ResponseEntityBuilder.buildNormalResponse(); + } +} diff --git a/ddp-authx/pom.xml b/ddp-authx/pom.xml new file mode 100644 index 0000000..443f654 --- /dev/null +++ b/ddp-authx/pom.xml @@ -0,0 +1,22 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-authx + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/dictionary/controller/DictionaryController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/dictionary/controller/DictionaryController.java new file mode 100644 index 0000000..40d4e88 --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/dictionary/controller/DictionaryController.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.authx.dictionary.controller; + +import com.fibo.ddp.common.model.authx.dictionary.Dictionary; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.service.authx.dictionary.DictionaryService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageInfo; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * (Dictionary)表控制层 + * + * @author jgp + * @since 2021-12-15 15:08:06 + */ +@RestController +@RequestMapping("/dictionary") +public class DictionaryController { + /** + * 服务对象 + */ + @Resource + private DictionaryService dictionaryService; + + @PostMapping("/getByKey") + public ResponseEntityDto getByKey (@RequestBody Dictionary param){ + Dictionary dictionary = dictionaryService.queryByKey(param.getDictKey()); + return ResponseEntityBuilder.buildNormalResponse(dictionary); + } + @PostMapping("/getList") + public ResponseEntityDto getList (@RequestBody QueryListParam param){ + PageInfo pageInfo = dictionaryService.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/addBatch") + public ResponseEntityDto addBatch (@RequestBody Collection param){ + boolean result = dictionaryService.saveBatchDictionary(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/updateById") + public ResponseEntityDto updateById (Dictionary param){ + boolean result = dictionaryService.update(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/deleteByIds") + public ResponseEntityDto deleteByIds (@RequestBody List ids){ + if (CollectionUtils.isEmpty(ids)){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"删除字典表id不能为空"); + } + boolean result = dictionaryService.deleteByIds(ids); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/refreshCache") + public ResponseEntityDto refreshCache (){ + Map result = dictionaryService.refreshCache(); + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/business/LoginBusiness.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/business/LoginBusiness.java new file mode 100644 index 0000000..35ddc14 --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/business/LoginBusiness.java @@ -0,0 +1,5 @@ +package com.fibo.ddp.authx.system.business; + + +public class LoginBusiness { +} diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/LoginController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/LoginController.java new file mode 100644 index 0000000..167361b --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/LoginController.java @@ -0,0 +1,101 @@ + +package com.fibo.ddp.authx.system.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.authx.system.request.LoginInfoParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.authx.system.SysUserService; +import com.fibo.ddp.common.service.common.AccountSessionWrap; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @apiDefine account 1. 账户 + */ +@Controller("loginControllerV2") +@RequestMapping("/v2/login/*") +public class LoginController { + + @Autowired + private RedisManager redisManager; + @Autowired + private SysUserService sysUserService; + /** + * @api {POST} /v2/login/login 1.01. 用户登录 + * @apiGroup account + * @apiVersion 1.0.1 + * @apiParam {String} account 账号 + * @apiParam {String} password 密码 + * @apiSuccess {String} token 会话token + * @apiParamExample {json} Request: + * {"account":"admin","password":"123456"} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"token":"21fd6379df134ea590a462e4de1f6b33"}} + */ + @ResponseBody + @RequestMapping(value = "/login") + @ArchivesLog(operationType = OpTypeConst.LOGIN) + public ResponseEntityDto login(@RequestBody LoginInfoParam param) { + Map map = new HashMap<>(); + String account = param.getAccount(); + String password = param.getPassword(); + if(!("".equals(account)) && !("".equals(password))){ + + SysUser user = sysUserService.login(account.trim(), MD5.GetMD5Code(password)); + if(null != user && user.getStatus()==1){ + String token = UUID.randomUUID().toString().replaceAll("-", ""); + redisManager.set(token, JSONObject.toJSONString(user), Constants.LOGIN_TOKEN_TIME.intValue()); + map.put("token", token); + + com.fibo.ddp.common.service.common.AccountSessionWrap acsw = new AccountSessionWrap(null, null); + acsw.setSysUser(user); + SessionManager.setSession(acsw); + }else{ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.LOGIN_ERROR); + } + } + return ResponseEntityBuilder.buildNormalResponse(map); + } + + /** + * @api {POST} /v2/login/logout 1.02. 用户登出 + * @apiGroup account + * @apiVersion 1.0.1 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} Request: + * {} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":null} + */ + @ResponseBody + @RequestMapping(value = "logout", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.LOGOUT) + public ResponseEntityDto logout(HttpServletRequest request) { + String token = request.getHeader(Constants.SYSTEM_KEY_TOKEN); + if(StringUtils.isNotBlank(token)){ + redisManager.del(token); + } + return ResponseEntityBuilder.buildNormalResponse(); + } + +} + diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysMenuController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysMenuController.java new file mode 100644 index 0000000..14e37a7 --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysMenuController.java @@ -0,0 +1,386 @@ +package com.fibo.ddp.authx.system.controller; + +import com.fibo.ddp.common.model.authx.system.SysMenu; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.authx.system.request.MenuParam; +import com.fibo.ddp.common.model.authx.system.response.SysMenuVo; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.authx.system.SysMenuService; +import com.fibo.ddp.common.service.authx.system.SysUserService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@Controller("sysMenuControllerV2") +@RequestMapping("v2/sysMenu") +@ResponseBody +public class SysMenuController { + + @Autowired + private SysMenuService sysMenuService; + @Autowired + private SysUserService sysUserService; + + /** + * @api {POST} /v2/sysMenu/getMenuList 6.31. 获取资源列表 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSON} pager 分页信息 + * @apiSuccess {JSONArray} listMenu 资源列表 + * @apiSuccess (listMenu) {Long} userId 资源编号 + * @apiSuccess (listMenu) {Long} userId 分配者 + * @apiSuccess (listMenu) {String} name 资源名称 + * @apiSuccess (listMenu) {String} versionCode 资源代号 + * @apiSuccess (listMenu) {String} url 资源路径 + * @apiSuccess (listMenu) {Long} parentId 父节点 + * @apiSuccess (listMenu) {String} des 资源描述 + * @apiSuccess (listMenu) {Long} birth 创建时间 + * @apiSuccess (listMenu) {String} icon 图标 + * @apiSuccess (listMenu) {Integer} sort 顺序(值越小优先级越高) + * @apiSuccess (listMenu) {Integer} status 状态:0停用,1启用, -1删除 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":17,"pages":9,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"lastPage":8,"firstPage":1},"listMenu":[{"userId":1,"userId":0,"name":"引擎管理","versionCode":"0001","url":"sysMenu/getChildMenu","parentId":0,"des":"引擎管理","birth":1498721562000,"icon":null,"sort":0,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"hidden":false},{"userId":2,"userId":0,"name":"规则管理","versionCode":"0002","url":"sysMenu/getChildMenu","parentId":0,"des":"规则管理","birth":1498807962000,"icon":"bb","sort":5,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"hidden":false}]}} + */ + @RequestMapping(value = "getMenuList", method = RequestMethod.POST) + public ResponseEntityDto getMenuList(@RequestBody MenuParam menuParam) { + PageHelper.startPage(menuParam.getPageNo(),menuParam.getPageSize()); + // 获取所有菜单 + List listMenu = sysMenuService.getAllSysMenu(menuParam.getEntity()); + PageInfo pageInfo = new PageInfo(listMenu); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("listMenu", listMenu); + modelMap.put("pager", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/sysMenu/save 6.32. 创建资源 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {String} name 资源名称 + * @apiParam {String} versionCode 资源代号 + * @apiParam {String} url 资源路径 + * @apiParam {Long} parentId 父节点 + * @apiParam {String} des 资源描述 + * @apiParam {String} icon 图标 + * @apiParam {Integer} sort 顺序(值越小优先级越高) + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"name":"测试资源","versionCode":"0066","url":"testMenu","parentId":0,"des":"测试资源描述","icon":"el-icon-eleme","sort":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_SYS_MENU) + public ResponseEntityDto save(@RequestBody SysMenu sysMenu) { + List list = sysMenuService.validateMenuOnly(sysMenu); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_MENU_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_MENU_NAME_REPEAT.getMessage()); + } + int num = sysMenuService.createSysMenu(sysMenu); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysMenu/getMenuInfo/{userId} 6.33. 获取资源详情 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 资源编号(url参数) + * @apiSuccess {Long} userId 资源编号 + * @apiSuccess {Long} userId 分配者 + * @apiSuccess {String} name 资源名称 + * @apiSuccess {String} versionCode 资源代号 + * @apiSuccess {String} url 资源路径 + * @apiSuccess {Long} parentId 父节点 + * @apiSuccess {String} des 资源描述 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {String} icon 图标 + * @apiSuccess {Integer} sort 顺序(值越小优先级越高) + * @apiSuccess {Integer} status 状态:0停用,1启用, -1删除 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":32,"userId":135,"name":"测试资源","versionCode":"0066","url":"testMenu","parentId":0,"des":"测试资源描述","birth":1616760174000,"icon":"el-icon-eleme","sort":2,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"hidden":false}} + */ + @RequestMapping(value = "/getMenuInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getMenuInfo(@PathVariable long id) { + SysMenu sysMenu = sysMenuService.findById(id); + return ResponseEntityBuilder.buildNormalResponse(sysMenu); + } + + /** + * @api {POST} /v2/sysMenu/update 6.34. 修改资源 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 资源编号 + * @apiParam {String} name 资源名称 + * @apiParam {String} versionCode 资源代号 + * @apiParam {String} url 资源路径 + * @apiParam {Long} parentId 父节点 + * @apiParam {String} des 资源描述 + * @apiParam {String} icon 图标 + * @apiParam {Integer} sort 顺序(值越小优先级越高) + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":32,"name":"测试资源1","versionCode":"0067","url":"testMenu","parentId":0,"des":"测试资源描述","icon":"el-icon-eleme","sort":5} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_MENU) + public ResponseEntityDto update(@RequestBody SysMenu sysMenu) { + List list = sysMenuService.validateMenuOnly(sysMenu); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_MENU_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_MENU_NAME_REPEAT.getMessage()); + } + int num = sysMenuService.updateSysMenu(sysMenu); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysMenu/updateStatus 6.35. 资源删除 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} status 状态:-1删除 + * @apiParam {String} ids 资源编号,逗号分隔 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"status":-1,"ids":"26"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_MENU_STATUS) + public ResponseEntityDto updateStatus(@RequestBody Map param) { + int status = (Integer) param.get("status"); + String ids = (String)param.get("ids"); + int num = 0; + List list = new ArrayList(); + + if (ids != "") { + String[] strs = ids.split(","); + for (int i = 0; i < strs.length; i++) { + list.add(Integer.parseInt(strs[i])); + } + } + + if (list != null && list.size() > 0) { + num = sysMenuService.updateStatus(status, list); + } + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysMenu/getTreeMenu 6.36. 新增/修改资源获取父节点树 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} parentId 父节点Id + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"parentId":0} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":[{"userId":22,"userId":0,"name":"模型管理","versionCode":"0007","url":"sysMenu/getChildMenu","parentId":0,"des":"模型管理","birth":1498980762000,"icon":null,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"isHidden":false},{"userId":23,"userId":0,"name":"数据源管理","versionCode":"0008","url":"sysMenu/getChildMenu","parentId":0,"des":"数据源管理","birth":1498984362000,"icon":null,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"isHidden":false},{"userId":24,"userId":0,"name":"黑白名单库管理","versionCode":"0009","url":"sysMenu/getChildMenu","parentId":0,"des":"黑白名单库管理","birth":1498987962000,"icon":null,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"isHidden":false},{"userId":25,"userId":0,"name":"评分卡管理","versionCode":"0010","url":"sysMenu/getChildMenu","parentId":0,"des":"评分卡管理","birth":1498897962000,"icon":null,"status":1,"roleId":0,"checked":false,"chkDisabled":false,"isHidden":false}]} + */ + @RequestMapping(value = "getTreeMenu", method = RequestMethod.POST) + public ResponseEntityDto getTreeMenu(@RequestBody MenuParam menuParam){ + long parentId = menuParam.getParentId(); + List listMenu = sysMenuService.getAllValidMenu(menuParam.getEntity()); + if(listMenu!=null&&listMenu.size()>0){ + for(int i=0;i listAll = new ArrayList(); + //获取登录用户id + SysUser user = SessionManager.getLoginAccount(); + long userId = user.getUserId(); + long orgId = user.getOrganId(); + //获取登录人角色id + SysUser sysUser = sysUserService.findRoleByUserId(userId); + if(sysUser!=null){ + organRoleId = sysUser.getSysRole().getRoleId(); + } + //角色资源 + menuParam.getEntity().setRoleId(roleId); + List listRoleMenu = sysMenuService.findTreeList(menuParam.getEntity()); + if(orgId==1){ + //全部启用资源 + listAll = sysMenuService.getAllValidMenu(menuParam.getEntity()); + if(listAll!=null&&listAll.size()>0){ + for(int i=0;i 0) { + for (int j = 0; j < listRoleMenu.size(); j++) { + long id_j = listRoleMenu.get(j).getResourceId(); + if (id_j == id_i) { + listAll.get(i).setChecked(true); + } + } + } + } + } + + }else{ + //公司资源 + menuParam.getEntity().setRoleId(organRoleId); + listAll = sysMenuService.findTreeList(menuParam.getEntity()); + if(listAll!=null&&listAll.size()>0){ + for(int i=0;i 0) { + for (int j = 0; j < listRoleMenu.size(); j++) { + long id_j = listRoleMenu.get(j).getResourceId(); + if (id_j == id_i) { + listAll.get(i).setChecked(true); + } + } + } + } + } + } + return ResponseEntityBuilder.buildNormalResponse(listAll); + } + + /** + * @api {POST} /v2/sysMenu/insertRoleMenu 6.38.1. 权限分配保存 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} roleId 角色编号 + * @apiParam {String} ids 资源编号,逗号分隔 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"roleId":76,"ids":"1,18,2,15,3,16,17,4,11,12,19"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":11} + */ + @RequestMapping(value = "insertRoleMenu", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_OR_UPDATE_MENU_ROLE) + public ResponseEntityDto insertRoleMenu(@RequestBody Map param) { + long roleId = Long.valueOf(param.get("roleId").toString()); + String ids = (String)param.get("ids"); + int num = 0; + List list = new ArrayList(); + + if (ids != "") { + String[] strs = ids.split(","); + for (int i = 0; i < strs.length; i++) { + list.add(Integer.parseInt(strs[i])); + } + if (list != null && list.size() > 0) { + num = sysMenuService.insertRoleMenu(roleId, list); + } + }else{ + num = sysMenuService.deleteRoleMenu(roleId); + } + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysMenu/getMenus 6.39. 获取菜单信息 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":[{"title":"系统首页","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"引擎列表","index":"sysMenu/getChildMenu","icon":"xx","subs":[]},{"title":"引擎管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"指标管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"规则管理","index":"sysMenu/getChildMenu","icon":"bb","subs":[]},{"title":"评分卡管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"模型管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"数据源管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"黑白名单库管理","index":"sysMenu/getChildMenu","icon":null,"subs":[]},{"title":"系统管理","index":"sysMenu/getChildMenu","icon":null,"subs":[{"title":"用户管理","index":"sysUser/view","icon":null,"subs":[]},{"title":"角色管理","index":"sysRole/view","icon":"aa","subs":[]},{"title":"日志管理","index":"log/index","icon":null,"subs":[]}]}]} + */ + @RequestMapping(value = "getMenus", method = RequestMethod.POST) + public ResponseEntityDto getMenus(@RequestBody MenuParam menuParam){ + List menuList = new ArrayList<>(); + SysUser user = SessionManager.getLoginAccount(); + long orgId = user.getOrganId(); + long userId = user.getUserId(); + if(orgId==1){ + menuList = sysMenuService.getAllValidMenu(menuParam.getEntity()); + }else{ + long roleId = 0; + SysUser sysUser = sysUserService.findRoleByUserId(userId); + if(sysUser!=null){ + roleId = sysUser.getSysRole().getRoleId(); + } + menuParam.getEntity().setRoleId(roleId); + menuList = sysMenuService.findTreeList(menuParam.getEntity()); + } + + long parentId = 0; + List result = recursionMenu(menuList, parentId); + + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * 递归获取子菜单 + * @param menuList + * @param parentId + * @return + */ + private List recursionMenu(List menuList, long parentId){ + List sysMenuVoList = new ArrayList<>(); + for(SysMenu sysMenu : menuList) { + if(sysMenu.getParentId() == parentId){ + SysMenuVo sysMenuVo = new SysMenuVo(); + sysMenuVo.setTitle(sysMenu.getName()); + sysMenuVo.setIndex(StringUtils.isBlank(sysMenu.getUrl()) ? UUID.randomUUID().toString() : sysMenu.getUrl()); + sysMenuVo.setIcon(sysMenu.getIcon()); + + List sysMenuVos = recursionMenu(menuList, sysMenu.getResourceId()); + if(!sysMenuVos.isEmpty()){ + sysMenuVo.setSubs(sysMenuVos); + } + + sysMenuVoList.add(sysMenuVo); + } + } + return sysMenuVoList; + } + +} \ No newline at end of file diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysOrganizationController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysOrganizationController.java new file mode 100644 index 0000000..a316b50 --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysOrganizationController.java @@ -0,0 +1,198 @@ +package com.fibo.ddp.authx.system.controller; + +import com.fibo.ddp.common.model.authx.system.SysOrganization; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.authx.system.SysOrganizationService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller("sysOrganizationControllerV2") +@RequestMapping("v2/sysOrganization") +@ResponseBody +public class SysOrganizationController { + + @Autowired + private SysOrganizationService sysOrganizationService; + /** + * @api {POST} /v2/sysOrganization/getOrganList 6.41. 获取组织列表 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSON} pager 分页信息 + * @apiSuccess {JSONArray} listOrgan 组织列表 + * @apiSuccess (listOrgan) {Long} userId 组织编号 + * @apiSuccess (listOrgan) {String} name 组织名称 + * @apiSuccess (listOrgan) {String} versionCode 组织代号 + * @apiSuccess (listOrgan) {Integer} status 状态:0禁用,1启用 + * @apiSuccess (listOrgan) {String} author 创建者 + * @apiSuccess (listOrgan) {Long} birth 创建时间 + * @apiSuccess (listOrgan) {String} token 唯一标识 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"listOrgan":[{"userId":46,"name":"管理员","versionCode":"007","email":null,"telephone":null,"status":1,"author":"超级管理员","birth":1498722046000,"token":"4f15125c-93c0-43fb-9ed2-e0b92763fa3d"}],"pager":{"pageNum":1,"pageSize":2,"size":1,"startRow":1,"endRow":1,"total":1,"pages":1,"list":null,"prePage":0,"nextPage":0,"isFirstPage":true,"isLastPage":true,"hasPreviousPage":false,"hasNextPage":false,"navigatePages":8,"navigatepageNums":[1],"navigateFirstPage":1,"navigateLastPage":1,"lastPage":1,"firstPage":1}}} + */ + @RequestMapping(value = "getOrganList", method = RequestMethod.POST) + public ResponseEntityDto getOrganList(@RequestBody BaseParam baseParam){ + PageHelper.startPage(baseParam.getPageNo(), baseParam.getPageSize()); + List listOrgan = sysOrganizationService.getAllSysOrganization(); + PageInfo pageInfo = new PageInfo(listOrgan); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("listOrgan", listOrgan); + modelMap.put("pager", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/sysOrganization/getAllValidOrgan 6.42. 获取所有已启用组织 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiSuccess {Long} userId 组织编号 + * @apiSuccess {String} name 组织名称 + * @apiSuccess {String} versionCode 组织代号 + * @apiSuccess {Integer} status 状态:0禁用,1启用 + * @apiSuccess {String} author 创建者 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {String} token 唯一标识 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":[{"userId":46,"name":"管理员","versionCode":"007","email":null,"telephone":null,"status":1,"author":"超级管理员","birth":1498722046000,"token":"4f15125c-93c0-43fb-9ed2-e0b92763fa3d"},{"userId":1,"name":"rik","versionCode":"0001","email":"123.com ","telephone":"1234567489","status":1,"author":"超级管理员","birth":1498721562000,"token":"6a6ea35e-aabe-4e64-bd98-dae304b10a21"}]} + */ + @RequestMapping(value = "getAllValidOrgan", method = RequestMethod.POST) + public ResponseEntityDto getAllValidOrgan(){ + List list = new ArrayList<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + if(organId.longValue() == 1){ + list = sysOrganizationService.getAllValidOrgan(); + } else { + SysOrganization sysOrganization = sysOrganizationService.findById(organId); + list.add(sysOrganization); + } + return ResponseEntityBuilder.buildNormalResponse(list); + } + + /** + * @api {POST} /v2/sysOrganization/save 6.43. 创建组织 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {String} name 组织名称 + * @apiParam {String} versionCode 组织代号 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"name":"测试公司","versionCode":"666"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_ORGAN) + public ResponseEntityDto save(@RequestBody SysOrganization sysOrganization) { + //验证唯一性 + List list = sysOrganizationService.validateOrganOnly(sysOrganization); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_ORGAN_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_ORGAN_NAME_REPEAT.getMessage()); + } + int num = sysOrganizationService.createSysOrganization(sysOrganization); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysOrganization/getOrganInfo/{userId} 6.44. 获取组织详情 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 组织编号(url参数) + * @apiSuccess {Long} userId 组织编号 + * @apiSuccess {String} name 组织名称 + * @apiSuccess {String} versionCode 组织代号 + * @apiSuccess {Integer} status 状态:0禁用,1启用 + * @apiSuccess {String} author 创建者 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {String} token 唯一标识 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":46,"name":"管理员","versionCode":"007","email":null,"telephone":null,"status":1,"author":"超级管理员","birth":1498722046000,"token":"4f15125c-93c0-43fb-9ed2-e0b92763fa3d"}} + */ + @RequestMapping(value = "/getOrganInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getOrganInfo(@PathVariable long id){ + SysOrganization sysOrganization = sysOrganizationService.findById(id); + return ResponseEntityBuilder.buildNormalResponse(sysOrganization); + } + + /** + * @api {POST} /v2/sysOrganization/update 6.45. 修改组织 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 组织编号 + * @apiParam {String} name 组织名称 + * @apiParam {String} versionCode 组织代号 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":47,"name":"测试公司2","versionCode":"666"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_ORGAN) + public ResponseEntityDto update(@RequestBody SysOrganization sysOrganization) { + //验证唯一性 + List list = sysOrganizationService.validateOrganOnly(sysOrganization); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_ORGAN_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_ORGAN_NAME_REPEAT.getMessage()); + } + int num = sysOrganizationService.updateSysOrganization(sysOrganization); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysOrganization/updateStatus 6.46. 组织停用、启用、删除 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} status 状态:0停用,1启用, -1删除 + * @apiParam {String} ids 用户Id,逗号分隔 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"status":0,"ids":"46"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_ORGAN_STATUS) + public ResponseEntityDto updateStates(@RequestBody Map param){ + int status = (Integer) param.get("status"); + String ids = (String)param.get("ids"); + int num = 0; + List list = new ArrayList(); + + if(ids!=""){ + String[] strs = ids.split(","); + for(int i=0;i0){ + num = sysOrganizationService.updateStatus(status,list); + } + return ResponseEntityBuilder.buildNormalResponse(num); + } +} \ No newline at end of file diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysRoleController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysRoleController.java new file mode 100644 index 0000000..3618030 --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysRoleController.java @@ -0,0 +1,228 @@ +package com.fibo.ddp.authx.system.controller; + +import com.fibo.ddp.common.model.authx.system.SysRole; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.authx.system.SysRoleService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller("sysRoleControllerV2") +@RequestMapping("v2/sysRole") +@ResponseBody +public class SysRoleController { + @Autowired + private SysRoleService sysRoleService; + /** + * @api {POST} /v2/sysRole/getRoleList 6.21. 获取角色列表 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSON} pager 分页信息 + * @apiSuccess {JSONArray} listRole 角色列表 + * @apiSuccess (listRole) {Integer} userId 角色编号 + * @apiSuccess (listRole) {Integer} organId 组织编号 + * @apiSuccess (listRole) {String} roleName 角色名称 + * @apiSuccess (listRole) {String} author 创建者 + * @apiSuccess (listRole) {Long} birth 创建时间 + * @apiSuccess (listRole) {Integer} status 状态:0禁用,1启用 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"listRole":[{"userId":72,"organId":46,"roleName":"业务管理员","roleCode":null,"roleDesc":null,"author":"超级管理员","birth":1498725111000,"status":1},{"userId":71,"organId":46,"roleName":"引擎管理员","roleCode":null,"roleDesc":null,"author":"超级管理员","birth":1498725103000,"status":1}],"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":3,"pages":2,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2],"navigateFirstPage":1,"navigateLastPage":2,"firstPage":1,"lastPage":2}}} + */ + @RequestMapping(value = "/getRoleList", method = RequestMethod.POST) + public ResponseEntityDto getRoleList(@RequestBody BaseParam baseParam){ + List listRole = null; + //获取公司管理员所在公司 + SysUser sysUser = SessionManager.getLoginAccount(); + long organId = sysUser.getOrganId(); + PageHelper.startPage(baseParam.getPageNo(),baseParam.getPageSize()); + if(organId==1){ + //获取所有未删除角色 + listRole = sysRoleService.getAllRoles(); + }else{ + //获取本公司未删除角色 + listRole = sysRoleService.getAllSysRole(organId); + } + PageInfo pageInfo = new PageInfo(listRole); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("listRole", listRole); + modelMap.put("pager", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/sysRole/getAllValidRole 6.22. 根据公司获取所有启用角色 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} organId 组织编号 + * @apiSuccess {Integer} userId 角色编号 + * @apiSuccess {Integer} organId 组织编号 + * @apiSuccess {String} roleName 角色名称 + * @apiSuccess {String} author 创建者 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {Integer} status 状态:0禁用,1启用 + * @apiParamExample {json} 请求示例: + * {"organId":46} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":[{"userId":70,"organId":46,"roleName":"管理员","roleCode":null,"roleDesc":null,"author":"超级管理员","birth":1498724751000,"status":1},{"userId":71,"organId":46,"roleName":"引擎管理员","roleCode":null,"roleDesc":null,"author":"超级管理员","birth":1498725103000,"status":1},{"userId":72,"organId":46,"roleName":"业务管理员","roleCode":null,"roleDesc":null,"author":"超级管理员","birth":1498725111000,"status":1}]} + */ + @RequestMapping(value = "getAllValidRole", method = RequestMethod.POST) + public ResponseEntityDto getAllValidRole(@RequestBody Map param){ + String author = ""; + SysUser sysUser = SessionManager.getLoginAccount(); + Long orgId = sysUser.getOrganId(); + if(orgId==1){ + author = "超级管理员"; + } + + long organId = orgId; + if(param.get("organId") != null){ + organId = Long.valueOf(param.get("organId").toString()); + } + List list = sysRoleService.getAllValidRole(organId,author); + return ResponseEntityBuilder.buildNormalResponse(list); + } + + /** + * @api {POST} /v2/sysRole/save 6.23. 创建角色 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} organId 组织编号 + * @apiParam {String} roleName 角色名称 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"organId":1,"roleName":"浏览者"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_SYS_ROLE) + public ResponseEntityDto save(@RequestBody SysRole sysRole) { + //确保每个公司只能创建一个公司管理员 + SysUser sysUser = SessionManager.getLoginAccount(); + Long or_id = sysUser.getOrganId(); + if(or_id==1){ + sysRole.setAuthor(sysUser.getNickName()); + //查询公司管理员是否存在 + List list_role = sysRoleService.getOrganRoleByAuthor(sysRole); + if(list_role!=null&&list_role.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_ROLE_ADMIN_REPEAT.getCode(), ErrorCodeEnum.CREATE_ROLE_ADMIN_REPEAT.getMessage()); + } + }else{ + sysRole.setAuthor(sysUser.getNickName()); + } + //验证名称唯一性 + List list = sysRoleService.validateRoleOnly(sysRole); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_ROLE_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_ROLE_NAME_REPEAT.getMessage()); + } + int num = sysRoleService.createSysRole(sysRole); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysRole/getRoleInfo/{userId} 6.24. 获取角色详情 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 角色编号(url参数) + * @apiSuccess {Integer} userId 角色编号 + * @apiSuccess {Integer} organId 组织编号 + * @apiSuccess {String} roleName 角色名称 + * @apiSuccess {String} author 创建者 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {Integer} status 状态:0禁用,1启用 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":76,"organId":46,"roleName":"浏览者","roleCode":null,"roleDesc":null,"author":"管理员","birth":1563634443000,"status":1}} + */ + @RequestMapping(value = "/getRoleInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getRoleInfo(@PathVariable long id){ + SysRole sysrole = null; + //获取管理员所在公司 + SysUser sysUser = SessionManager.getLoginAccount(); + long organId = sysUser.getOrganId(); + if(organId==1){ + sysrole = sysRoleService.findByAId(id); + }else{ + sysrole = sysRoleService.findById(id,organId); + } + return ResponseEntityBuilder.buildNormalResponse(sysrole); + } + + /** + * @api {POST} /v2/sysRole/update 6.25. 修改角色 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} userId 角色编号 + * @apiParam {Integer} organId 组织编号 + * @apiParam {String} roleName 角色名称 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":77,"organId":1,"roleName":"浏览者2"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_ROLE) + public ResponseEntityDto update(@RequestBody SysRole sysRole) { + List list = sysRoleService.validateRoleOnly(sysRole); + if(list!=null&&list.size()>0){ + throw new ApiException(ErrorCodeEnum.CREATE_ROLE_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_ROLE_NAME_REPEAT.getMessage()); + } + int num = sysRoleService.updateSysRole(sysRole); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysRole/updateStatus 6.26. 角色停用、启用、删除 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} status 状态:0停用,1启用, -1删除 + * @apiParam {String} ids 用户Id,逗号分隔 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"status":0,"ids":"77"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_ROLE_STATUS) + public ResponseEntityDto updateStates(@RequestBody Map param){ + int status = (Integer) param.get("status"); + String ids = (String)param.get("ids"); + int num = 0; + List list = new ArrayList(); + + if(ids!=""){ + String[] strs = ids.split(","); + for(int i=0;i0){ + num = sysRoleService.updateStatus(status,list); + } + return ResponseEntityBuilder.buildNormalResponse(num); + } +} \ No newline at end of file diff --git a/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysUserController.java b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysUserController.java new file mode 100644 index 0000000..53accab --- /dev/null +++ b/ddp-authx/src/main/java/com/fibo/ddp/authx/system/controller/SysUserController.java @@ -0,0 +1,238 @@ +package com.fibo.ddp.authx.system.controller; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.authx.system.SysUserService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @apiDefine sysManager 6.系统管理 + */ +@Controller("sysUserControllerV2") +@RequestMapping("v2/sysUser") +@ResponseBody +public class SysUserController { + @Autowired + private SysUserService sysUserService; + /** + * @api {POST} /v2/sysUser/getUserList 6.11. 获取用户列表 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSON} pager 分页信息 + * @apiSuccess {JSONArray} listUser 用户列表 + * @apiSuccess (listUser) {Long} userId 用户Id + * @apiSuccess (listUser) {Long} organId 组织编号 + * @apiSuccess (listUser) {String} employeeId 员工编号 + * @apiSuccess (listUser) {String} account 账号 + * @apiSuccess (listUser) {String} nickName 姓名 + * @apiSuccess (listUser) {String} cellphone 手机号 + * @apiSuccess (listUser) {String} email 邮箱 + * @apiSuccess (listUser) {Integer} status 状态:0停用,1启用, -1删除 + * @apiSuccess (listUser) {String} author 创建人 + * @apiSuccess (listUser) {Long} birth 创建时间 + * @apiSuccess (listUser) {JSON} sysRole 角色信息 + * @apiSuccess (sysRole) {Long} userId 角色编号 + * @apiSuccess (sysRole) {String} roleName 角色名称 + * @apiSuccess (listUser) {JSON} sysOrgan 公司信息 + * @apiSuccess (sysOrgan) {Long} userId 组织编号 + * @apiSuccess (sysOrgan) {String} name 组织名称 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":12,"pages":6,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6],"navigateFirstPage":1,"navigateLastPage":6,"lastPage":6,"firstPage":1},"listUser":[{"userId":149,"organId":46,"employeeId":"011","account":"rong360","password":"4m774i0~4m2&5n1c4i55296#2@1j010i","nickName":"rong","email":"11@qq.com","cellphone":"15222222222","qq":null,"latestTime":null,"latestIp":null,"status":1,"birth":1613801940000,"author":"超级管理员","sysRole":{"userId":70,"organId":0,"roleName":"管理员","roleCode":null,"roleDesc":null,"author":null,"birth":null,"status":0},"sysOrgan":{"userId":46,"name":"管理员","versionCode":null,"email":null,"telephone":null,"status":0,"author":null,"birth":null,"token":null}},{"userId":148,"organId":46,"employeeId":"010","account":"yljr","password":"4m774i0~4m2&5n1c4i55296#2@1j010i","nickName":"yljr","email":"11@qq.com","cellphone":"15222222222","qq":null,"latestTime":null,"latestIp":null,"status":1,"birth":1613720093000,"author":"超级管理员","sysRole":{"userId":70,"organId":0,"roleName":"管理员","roleCode":null,"roleDesc":null,"author":null,"birth":null,"status":0},"sysOrgan":{"userId":46,"name":"管理员","versionCode":null,"email":null,"telephone":null,"status":0,"author":null,"birth":null,"token":null}}]}} + */ + @RequestMapping(value = "getUserList", method = RequestMethod.POST) + public ResponseEntityDto getUserList(@RequestBody BaseParam baseParam) { + SysUser sysUser = new SysUser(); + //获取登录人所在公司 + SysUser user = SessionManager.getLoginAccount(); + long organId = user.getOrganId(); + sysUser.setOrganId(organId); + PageHelper.startPage(baseParam.getPageNo(), baseParam.getPageSize()); + List listUser = sysUserService.getAllUsers(sysUser); + PageInfo pageInfo = new PageInfo(listUser); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("listUser", listUser); + modelMap.put("pager", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/sysUser/save 6.12. 创建用户 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} organId 组织编号 + * @apiParam {String} employeeId 员工编号 + * @apiParam {String} account 账号 + * @apiParam {String} nickName 姓名 + * @apiParam {String} cellphone 手机号 + * @apiParam {String} email 邮箱 + * @apiParam {JSON} sysRole 角色信息 + * @apiParam (sysRole) {Long} userId 角色编号 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"organId":46,"employeeId":"012","account":"testuser","nickName":"张三","email":"11@qq.com","cellphone":"15222222222","sysRole":{"userId":71}} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_SYS_USER) + public ResponseEntityDto save(@RequestBody SysUser sysUser) { + String nickName = sysUser.getNickName(); + if (nickName.equals("超级管理员")) { + throw new ApiException(ErrorCodeEnum.CREATE_USER_NAME_ERROR.getCode(), ErrorCodeEnum.CREATE_USER_NAME_ERROR.getMessage()); + } + String account = sysUser.getAccount(); + sysUser.setAccount(account); + //验证唯一性 + List list = sysUserService.validateUserOnly(sysUser); + if (list != null && list.size() > 0) { + throw new ApiException(ErrorCodeEnum.CREATE_USER_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_USER_NAME_REPEAT.getMessage()); + } + long num = sysUserService.createSysUser(sysUser); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysUser/getUserInfo/{userId} 6.13. 获取用户详情 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 用户Id(url参数) + * @apiSuccess {Long} userId 用户Id + * @apiSuccess {Long} organId 组织编号 + * @apiSuccess {String} employeeId 员工编号 + * @apiSuccess {String} account 账号 + * @apiSuccess {String} nickName 姓名 + * @apiSuccess {String} cellphone 手机号 + * @apiSuccess {String} email 邮箱 + * @apiSuccess {Integer} status 状态:0停用,1启用, -1删除 + * @apiSuccess {String} author 创建人 + * @apiSuccess {Long} birth 创建时间 + * @apiSuccess {JSON} sysRole 角色信息 + * @apiSuccess (sysRole) {Long} userId 角色编号 + * @apiSuccess (sysRole) {String} roleName 角色名称 + * @apiSuccess {JSON} sysOrgan 公司信息 + * @apiSuccess (sysOrgan) {Long} userId 组织编号 + * @apiSuccess (sysOrgan) {String} name 组织名称 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":149,"organId":46,"employeeId":"011","account":"rong360","password":"4m774i0~4m2&5n1c4i55296#2@1j010i","nickName":"rong","email":"11@qq.com","cellphone":"15222222222","qq":null,"latestTime":null,"latestIp":null,"status":1,"birth":1613801940000,"author":"超级管理员","sysRole":{"userId":70,"organId":0,"roleName":"管理员","roleCode":null,"roleDesc":null,"author":null,"birth":null,"status":0},"sysOrgan":{"userId":46,"name":null,"versionCode":null,"email":null,"telephone":null,"status":0,"author":null,"birth":null,"token":null}}} + */ + @RequestMapping(value = "/getUserInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getUserInfo(@PathVariable long id) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(id); + //获取用户所在公司 + SysUser user = SessionManager.getLoginAccount(); + long organId = user.getOrganId(); + sysUser.setOrganId(organId); + SysUser result = sysUserService.findById(sysUser); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/sysUser/update 6.14. 修改用户 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 用户Id + * @apiParam {Long} organId 组织编号 + * @apiParam {String} employeeId 员工编号 + * @apiParam {String} account 账号 + * @apiParam {String} nickName 姓名 + * @apiParam {String} cellphone 手机号 + * @apiParam {String} email 邮箱 + * @apiParam {JSON} sysRole 角色信息 + * @apiParam (sysRole) {Long} userId 角色编号 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":150,"organId":46,"employeeId":"012","account":"testuser2","nickName":"张三","email":"11@qq.com","cellphone":"15222222222","sysRole":{"userId":72}} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_USER) + public ResponseEntityDto update(@RequestBody SysUser sysUser) { + String account = sysUser.getAccount(); + sysUser.setAccount(account); + List list = sysUserService.validateUserOnly(sysUser); + if (list != null && list.size() > 0) { + throw new ApiException(ErrorCodeEnum.CREATE_USER_NAME_REPEAT.getCode(), ErrorCodeEnum.CREATE_USER_NAME_REPEAT.getMessage()); + } + int num = sysUserService.updateSysUser(sysUser); + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysUser/updateStatus 6.15. 用户停用、启用、删除 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} status 状态:0停用,1启用, -1删除 + * @apiParam {String} ids 用户Id,逗号分隔 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"status":0,"ids":"150,151"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":2} + */ + @RequestMapping(value = "updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SYS_USER_STATUS) + public ResponseEntityDto updateStatus(@RequestBody Map param) { + int status = (Integer) param.get("status"); + String ids = (String) param.get("ids"); + int num = 0; + List list = new ArrayList(); + + if (ids != "") { + String[] strs = ids.split(","); + for (int i = 0; i < strs.length; i++) { + list.add(Integer.parseInt(strs[i])); + } + } + + if (list != null && list.size() > 0) { + num = sysUserService.updateStates(status, list); + } + return ResponseEntityBuilder.buildNormalResponse(num); + } + + /** + * @api {POST} /v2/sysUser/updatePassword 6.16. 修改密码 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 用户Id + * @apiParam {String} password 新密码 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":136,"password":"654321"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":1} + */ + @RequestMapping(value = "updatePassword", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDTE_PASSWORD) + public ResponseEntityDto updatePassword(@RequestBody SysUser sysUser) { + int num = sysUserService.updatePassword(sysUser); + return ResponseEntityBuilder.buildNormalResponse(num); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/pom.xml b/ddp-common/ddp-dao/pom.xml new file mode 100644 index 0000000..792f172 --- /dev/null +++ b/ddp-common/ddp-dao/pom.xml @@ -0,0 +1,38 @@ + + + + ddp-common + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-common-dao + + + com.fibo.ddp + ddp-common-model + 1.0-SNAPSHOT + + + + + + + src/main/java + + + **/*.xml + + + + + src/main/resources + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionResultMapper.java new file mode 100644 index 0000000..8976204 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionResultMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionResult; + +public interface AnalyseDecisionResultMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionTablesMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionTablesMapper.java new file mode 100644 index 0000000..d685fbc --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseDecisionTablesMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionTables; + +/** + * (AnalyseDecisionTables)表数据库访问层 + */ +public interface AnalyseDecisionTablesMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineCallMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineCallMapper.java new file mode 100644 index 0000000..77acecb --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineCallMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineCall; + +/** + * (AnalyseEngineCall)表数据库访问层 + */ +public interface AnalyseEngineCallMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineNodeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineNodeMapper.java new file mode 100644 index 0000000..e7434ac --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineNodeMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineNode; + +/** + * (AnalyseEngineNode)表数据库访问层 + */ +public interface AnalyseEngineNodeMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineSummaryMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineSummaryMapper.java new file mode 100644 index 0000000..b68f2b5 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseEngineSummaryMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineSummary; + +public interface AnalyseEngineSummaryMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseRuleMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseRuleMapper.java new file mode 100644 index 0000000..da10e0c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseRuleMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseRule; + +/** + * (AnalyseRule)表数据库访问层 + */ +public interface AnalyseRuleMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseScorecardMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseScorecardMapper.java new file mode 100644 index 0000000..3c567ca --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/analyse/AnalyseScorecardMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.analyse; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.analyse.AnalyseScorecard; + +/** + * (AnalyseScorecard)表数据库访问层 + */ +public interface AnalyseScorecardMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.java new file mode 100644 index 0000000..3b7a7ce --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.approval; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.approval.ApprovalConfig; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * (ApprovalConfig)表数据库访问层 + */ +@Mapper +public interface ApprovalConfigMapper extends BaseMapper { + int insertOrUpdate(ApprovalConfig entity); + int insertOrUpdateBatch(@Param("entities") List entities); +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.xml new file mode 100644 index 0000000..770e298 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalConfigMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + insert into riskmanage.t_approval_config(approval_type, approval_name, approval_desc, approval_status, organ_id, create_user_id, update_user_id, create_time, update_time) + values (#{approvalType}, #{approvalName}, #{approvalDesc}, #{approvalStatus}, #{organId}, #{createUserId}, #{updateUserId}, #{createTime}, #{updateTime}) + on duplicate key update + approval_type = values(approval_type) , approval_name = values(approval_name) , approval_desc = + values(approval_desc) , approval_status = values(approval_status) , organ_id = values(organ_id) , create_user_id + = values(create_user_id) , update_user_id = values(update_user_id) , create_time = values(create_time) , + update_time = values(update_time) + + + + + insert into riskmanage.t_approval_config(approval_type, approval_name, approval_desc, approval_status, organ_id, + create_user_id, update_user_id ) + values + + (#{entity.approvalType}, #{entity.approvalName}, #{entity.approvalDesc}, #{entity.approvalStatus}, + #{entity.organId}, #{entity.createUserId}, #{entity.updateUserId}) + + on duplicate key update + approval_type = values(approval_type) , approval_name = values(approval_name) , approval_desc = + values(approval_desc) , approval_status = values(approval_status) , organ_id = values(organ_id) , + create_user_id = values(create_user_id) , update_user_id = values(update_user_id) + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.java new file mode 100644 index 0000000..ea7ea32 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.dao.approval; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.approval.Approval; + +/** + * (Approval)表数据库访问层 + */ +public interface ApprovalMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.xml new file mode 100644 index 0000000..5f182f2 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/approval/ApprovalMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + id, apply_type, create_user_id, create_user_name, update_user_id, update_user_name, organ_id, apply_status, status, approval_time, create_time, update_time, apply_detail, apply_desc + + + + + and id = #{id} + + + and apply_type = #{applyType} + + + and create_user_id = #{createUserId} + + + and create_user_name = #{createUserName} + + + and update_user_id = #{updateUserId} + + + and update_user_name = #{updateUserName} + + + and organ_id = #{organId} + + + and apply_status = #{applyStatus} + + + and status = #{status} + + + and approval_time = #{approvalTime} + + + and create_time = #{createTime} + + + and update_time = #{updateTime} + + + and apply_detail = #{applyDetail} + + + and apply_desc = #{applyDesc} + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.java new file mode 100644 index 0000000..7afa05d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.dao.authx.dictionary; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.authx.dictionary.Dictionary; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; + + +/** + * (Dictionary)表数据库访问层 + * + * @author jgp + * @since 2021-12-15 15:08:04 + */ +public interface DictionaryMapper extends BaseMapper { + + int insertOrUpdateBatch(@Param("entities") Collection entities); +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.xml new file mode 100644 index 0000000..f53993c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/dictionary/DictionaryMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + insert into t_dictionary(dict_key, dict_value) + values + + ( #{entity.dictKey}, #{entity.dictValue}) + + on duplicate key update + dict_key = values(dict_key) , dict_value = values(dict_value) + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.java new file mode 100644 index 0000000..1e42810 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.common.dao.authx.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.authx.system.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SysMenuMapper extends BaseMapper { + + /** + * 查询所有资源 + * + * @return + */ + public List getAllSysMenu(SysMenu entity); + + /** + * 查询单条资源 + * + * @param id + * @return + */ + public SysMenu findById(long id); + + /** + * 新增资源 + * + * @param sysMenu + * @return + */ + public int createSysMenu(SysMenu sysMenu); + + /** + * 修改资源 + * + * @param sysMenu + * @return + */ + public int updateSysMenu(SysMenu sysMenu); + + /** + * 修改资源状态 + * + * @param id + * @param idList + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + + + /** + * 保存角色菜单关系 + */ + public int insertRoleMenu(@Param("roleId") long roleId, @Param("list") List list); + + /** + * 删除角色菜单关系(实现修改) + */ + public int deleteRoleMenu(long roleId); + + /** + * 分配资源树 + * + * @param roleId + * @return + */ + public List findTreeList(SysMenu entity); + + /** + * 获取所有启用资源 + * + * @return + */ + public List getAllValidMenu(SysMenu entity); + + /** + * 验证唯一性 + */ + public List validateMenuOnly(SysMenu sysMenu); + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.xml new file mode 100644 index 0000000..a006fec --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysMenuMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + resource_id, user_id, name, code, url, parent_id, des,resource_system, birth, icon, sort, status + + + + + + + + + + + + + insert into t_resource (user_id, name, code, url, parent_id, des,resource_system, birth, icon, sort) + values (#{userId}, #{name}, #{code}, #{url}, #{parentId}, #{des},#{resourceSystem}, now(), #{icon}, #{sort}) + + + + + insert into t_role_resource_rel (role_id, resource_id) + values + + (#{roleId}, #{ids}) + + + + + update t_resource set name=#{name}, + url=#{url}, + + des=#{des}, + + + resource_system = #{resourceSystem}, + + + icon=#{icon}, + + + user_id=#{userId}, + + + parent_id=#{parentId}, + + + sort=#{sort}, + + code=#{code} + where resource_id = #{resourceId} + + + + delete from t_role_resource_rel where role_id = #{roleId} + + + + update t_resource set status=#{status} + + + resource_id in + #{ids} + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.java new file mode 100644 index 0000000..dfa6e13 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.java @@ -0,0 +1,61 @@ +package com.fibo.ddp.common.dao.authx.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.authx.system.SysOrganization; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SysOrganizationMapper extends BaseMapper { + /** + * 查询所有公司 + * + * @return + */ + public List getAllSysOrganization(); + + /** + * 获取所有启用公司 + * + * @return + */ + public List getAllValidOrgan(); + + /** + * 查询单个公司 + * + * @param id + * @return + */ + public SysOrganization findById(long id); + + /** + * 创建公司 + * + * @param SysOrganization + * @return + */ + public int createSysOrganization(SysOrganization SysOrganization); + + /** + * 修改组织 + * + * @param SysOrganization + * @return + */ + public int updateSysOrganization(SysOrganization SysOrganization); + + /** + * 修改公司状态(停用/启用、删除) + * + * @param states + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + + /** + * 验证唯一性 + */ + public List validateOrganOnly(SysOrganization SysOrganization); + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.xml new file mode 100644 index 0000000..c49e61e --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysOrganizationMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + organ_id, name, code, email, telephone, status, birth, author,token + + + + + + + + + + + + + insert into t_organization (name, code, email, telephone, status, author, birth, token) + values (#{name}, #{code}, #{email}, #{telephone}, 1, #{author}, now(), #{token}) + + + + update t_organization set name=#{name}, + + email=#{email}, + + + telephone=#{telephone}, + + + author=#{author}, + + code=#{code} + where organ_id=#{id} + + + + + update t_organization set status=#{status} + + + organ_id in + #{ids} + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.java new file mode 100644 index 0000000..f20903a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.java @@ -0,0 +1,93 @@ + +package com.fibo.ddp.common.dao.authx.system; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.authx.system.SysRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +public interface SysRoleMapper extends BaseMapper { + /** + * 获取本组织所有角色 + * + * @return + */ + public List getAllSysRole(long organId); + + /** + * 获取所有角色 + */ + public List getAllRoles(); + + /** + * 获取本组织启用的角色 + * + * @param organId + * @return + */ + public List getAllValidRole(@Param("organId") long organId, @Param("author") String author); + + /** + * 查询本组织的单个角色 + * + * @param id + * @return + */ + public SysRole findById(@Param("userId") long id, @Param("organId") long organId); + + /** + * 查询单个角色 + * + * @param id + * @return + */ + public SysRole findByAId(long id); + + /** + * 创建本组织角色 + * + * @param sysRole + * @return + */ + public int createSysRole(SysRole sysRole); + + /** + * 修改本公司角色 + * + * @param sysRole + * @return + */ + public int updateSysRole(SysRole sysRole); + + /** + * 修改角色状态(停用、启用、删除) + * + * @param id + * @param idList + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + + /** + * 根据角色查询角色所在公司 + */ + public long getOrganByRoleId(long roleId); + + /** + * 验证角色唯一性 + */ + public List validateRoleOnly(SysRole sysRole); + + /** + * 查询公司管理员角色id + */ + public List getOrganRoleByAuthor(SysRole sysRole); + + /** + * 删除多个公司的所有角色 + */ + public int deleteRolesByOrgans(@Param("status") Integer status, @Param("list") List list); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.xml new file mode 100644 index 0000000..881fb1b --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysRoleMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + role_id, organ_id, role_name, role_code, role_desc, author, birth, status + + + + + + + + + + + + + + + + + + + + + + insert into t_role (role_id, organ_id, role_name, role_code, role_desc, author, birth, status) + values (#{roleId}, #{organId}, #{roleName}, #{roleCode}, #{roleDesc}, #{author}, now(), 1) + + + + update t_role set + + organ_id=#{organId}, + + + role_desc=#{roleDesc}, + + + role_code=#{roleCode}, + + role_name=#{roleName} + where role_id = #{roleId} + + + + update t_role set status=#{status} + + + role_id in + #{ids} + + + + + + + update t_role set status = #{status} + + + organ_id in + #{ids} + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.java new file mode 100644 index 0000000..70eb055 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.java @@ -0,0 +1,112 @@ +package com.fibo.ddp.common.dao.authx.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysUserMapper extends BaseMapper { + /** + * 查询搜索用户 + */ + public List getAllUsers(SysUser sysUser); + + /** + * 查询本组织单个用户 + * + * @param id + * @return + */ + public SysUser findById(SysUser sysUser); + + /** + * 创建本公司用户 + * + * @param sysUser + * @return + */ + public long createSysUser(SysUser sysUser); + + /** + * 添加用户角色关系 + * + * @param userId + * @param roleId + * @return + */ + public int insertUserRole(@Param("userId") long userId, + @Param("roleId") long roleId, + @Param("organId") long organId); + + /** + * 修改本公司用户 + * + * @param sysUser + * @return + */ + public int updateSysUser(SysUser sysUser); + + /** + * 修改用户角色关系 + * + * @param sysUser + * @return + */ + public int updateUserRole(SysUser sysUser); + + /** + * 修改用户状态(停用/启用/删除) + * + * @param states + * @return + */ + public int updateStates(@Param("status") int status, @Param("list") List list); + + /** + * 通过用户id查询角色 + * + * @param userId + * @return + */ + public SysUser findRoleByUserId(long userId); + + /** + * 修改密码 + */ + public int updatePassword(SysUser sysUser); + + /** + * 本公司账号员工编号唯一性 + */ + public List validateUserOnly(SysUser sysUser); + + /** + * 删除多个公司的用户角色关系 + */ + public int deleteUserRoleByOrgan(@Param("status") Integer status, @Param("list") List list); + + + /** + * 删除角色关联的所有账号 + */ + public int deleteUsersByIds(@Param("status") Integer status, @Param("list") List list); + + /** + * 批量删除角色账号关系 + */ + public int deleteBatchUserRole(@Param("status") Integer status, @Param("list") List list); + + /** + * 批量查询角色关联的账号 + */ + public List getBatchUserIdsByRoleId(List list); + + String findNickNameById(Long userId); + + SysUser findUserById(Long userId); + + void deleteUsersByOrgans(@Param("status")Integer status, @Param("list") List list); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.xml new file mode 100644 index 0000000..37b7287 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/authx/system/SysUserMapper.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + user_id, organ_id, employee_id, account, password, nick_name, email, cellphone, qq, latest_time, latest_ip, status, birth, author + + + + + + + + + + + + + + + + + + + + + + + insert into t_user (organ_id, employee_id, account, password, nick_name, email, cellphone, qq, latest_time, latest_ip, remark,status, birth, author) + values (#{organId}, #{employeeId}, #{account}, #{password}, #{nickName}, #{email}, #{cellphone}, #{qq}, #{latestTime}, #{latestIp}, #{remark},1, now(), #{author}) + + + + + insert into t_user_role_rel (user_id, role_id,organ_id) + values (#{userId}, #{roleId},#{organId}) + + + + + update t_user set account=#{account}, + + organ_id=#{organId}, + + + password = #{password}, + + + employee_id=#{employeeId}, + + + email=#{email}, + + + cellphone=#{cellphone}, + + + qq=#{qq}, + + + latest_time=#{latestTime}, + + + latest_ip=#{latestIp}, + + + remark = #{remark}, + + + birth=#{birth}, + + + author=#{author}, + + nick_name=#{nickName} + where user_id=#{userId} + + + + + update t_user_role_rel set + + organ_id=#{organId}, + + user_id=#{userId}, role_id=#{sysRole.roleId} + where user_id=#{userId} + + + + + update t_user set status=#{status} + + + user_id in + #{ids} + + + + + + + + update t_user set password = #{password} where user_id=#{userId} + + + + update t_user set status = #{status} + + + organ_id in + #{ids} + + + + + + + update t_user_role_rel set status = #{status} + + + organ_id in + #{ids} + + + + + + + + update t_user set status = #{status} + + + user_id in + #{ids} + + + + + + + + update t_user_role_rel set status = #{status} + + + role_id in + #{ids} + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/canal/TableEnum.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/canal/TableEnum.java new file mode 100644 index 0000000..9c8aadd --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/canal/TableEnum.java @@ -0,0 +1,126 @@ +package com.fibo.ddp.common.dao.canal; + +/** + * 缓存数据同步表 + */ +public enum TableEnum { + + /** + * 引擎 + */ + T_ENGINE("t_engine", "id", ""), + T_ENGINE_VERSION("t_engine_version", "version_id", "engine_id"), + T_ENGINE_NODE("t_engine_node", "node_id", "version_id"), + + /** + * 指标 + */ + T_FIELD("t_field", "id", ""), + T_FIELD_INTERFACE("t_field_interface", "id", ""), + T_FIELD_DATA_SOURCE("t_field_data_source", "id", ""), + + /** + * 规则 + */ + T_RULE("t_rule", "id", ""), + T_RULE_VERSION("t_rule_version", "id", "rule_id"), + T_RULE_CONDITION("t_rule_condition", "id", "version_id"), + T_RULE_LOOP_GROUP_ACTION("t_rule_loop_group_action", "id", "condition_for_id"), + + /** + * 评分卡 + */ + T_SCORECARD("t_scorecard", "id", ""), + T_SCORECARD_VERSION("t_scorecard_version", "id", "scorecard_id"), + T_SCORECARD_DIMENSION("t_scorecard_dimension", "id", "version_id"), + T_SCORECARD_DETAIL("t_scorecard_detail", "id", "dimension_id"), + T_SCORECARD_DETAIL_CONDITION("t_scorecard_detail_condition", "id", "detail_id"), + + /** + * 决策表 + */ + T_DECISION_TABLES("t_decision_tables", "id", ""), + T_DECISION_TABLES_VERSION("t_decision_tables_version", "id", "decision_tables_id"), + T_DECISION_TABLES_DETAIL("t_decision_tables_detail", "id", "version_id"), + T_DECISION_TABLES_DETAIL_CONDITION("t_decision_tables_detail_condition", "id", "detail_id"), + T_DECISION_TABLES_RESULT("t_decision_tables_result", "id", "version_id"), + + /** + * 决策树 + */ + T_DECISION_TREE("t_decision_tree", "id", ""), + T_DECISION_TREE_VERSION("t_decision_tree_version", "id", "decision_tree_id"), + T_DECISION_TREE_DETAIL("t_decision_tree_detail", "id", "decision_tree_version_id"), + T_DECISION_TREE_DETAIL_CONDITION("t_decision_tree_detail_condition", "id", "detail_id"), + /** + * 模型 + */ + T_MACHINE_LEARNING_MODELS("t_machine_learning_models", "id", ""), + + /** + * 策略输出 + */ + T_STRATEGY_OUTPUT("t_strategy_output", "id", "strategy_id"), + + /** + * 集合规则 + */ + T_LIST_OPERATION("t_list_operation","id",""), + T_LIST_OPERATION_VERSION("t_list_operation_version","id","list_op_id"), + T_LIST_OPERATION_BLOCK("t_list_operation_block","id","list_op_version_id"), + T_LIST_OPERATION_CONDITION("t_list_operation_condition","id","list_op_version_id"), + T_LIST_OPERATION_FILTER_CONDITION("t_list_operation_filter_condition","id","list_op_version_id"), + T_LIST_OPERATION_OUTPUT("t_list_operation_output","id","list_op_version_id"), + /** + * 数据清洗 + */ + T_DATA_CLEAN("t_data_clean","id",""), + T_DATA_CLEAN_VERSION("t_data_clean_version","id","data_clean_id"), + T_DATA_CLEAN_ORIGINAL_DATA_OP("t_data_clean_original_data_op","id","data_clean_version_id"), + T_DATA_CLEAN_BLOCK("t_data_clean_block","id","data_clean_version_id"), + T_DATA_CLEAN_CONDITION("t_data_clean_condition","id","data_clean_version_id"), + T_DATA_CLEAN_FILTER_CONDITION("t_data_clean_filter_condition","id","data_clean_version_id"), + T_DATA_CLEAN_OUTPUT("t_data_clean_output","id","data_clean_version_id"); + private String tableName; + private String primaryId; + private String foreignId; + + TableEnum(String tableName, String primaryId, String foreignId) { + this.tableName = tableName; + this.primaryId = primaryId; + this.foreignId = foreignId; + } + + public static TableEnum getByTableName(String tableName) { + for (TableEnum tableEnum : TableEnum.values()) { + if (tableName.equals(tableEnum.getTableName())) { + return tableEnum; + } + } + return null; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getPrimaryId() { + return primaryId; + } + + public void setPrimaryId(String primaryId) { + this.primaryId = primaryId; + } + + public String getForeignId() { + return foreignId; + } + + public void setForeignId(String foreignId) { + this.foreignId = foreignId; + } +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.java new file mode 100644 index 0000000..fb07938 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.cignacmb; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.cignacmb.BusinessEventLog; +import com.fibo.ddp.common.model.cignacmb.request.EventLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogResponse; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface BusinessEventLogMapper extends BaseMapper { + + /** + * 查询指定行数据 + */ + List queryAllByLimit(EventLogParam param); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.xml new file mode 100644 index 0000000..26d52ed --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessEventLogMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.java new file mode 100644 index 0000000..4d5682b --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.dao.cignacmb; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.cignacmb.BusinessRuleLog; +import com.fibo.ddp.common.model.cignacmb.request.RuleLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogDetailResponse; +import com.fibo.ddp.common.model.cignacmb.response.RuleLogResponse; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface BusinessRuleLogMapper extends BaseMapper { + + /** + * 查询指定行数据 + */ + List queryAllByLimit(RuleLogParam param); + + /** + * 根据ids查询规则(事件规则输出详情) + * @param ruleLogIds + * @return + */ + List queryByIds(@Param("ids") List ids); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.xml new file mode 100644 index 0000000..9372328 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/BusinessRuleLogMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.java new file mode 100644 index 0000000..558f84f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.cignacmb; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.cignacmb.TBusinessRuleRel; + +/** + *

+ * 业务类型与规则关联表 Mapper 接口 + *

+ * + * @author oldRose + * @since 2021-11-10 + */ +public interface TBusinessRuleRelMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.xml new file mode 100644 index 0000000..ef59c64 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/cignacmb/TBusinessRuleRelMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.java new file mode 100644 index 0000000..0bc4650 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.common.message.template; + +import com.fibo.ddp.common.model.common.message.template.entity.AppTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * APP推送模板表(AppTemplate)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Mapper +public interface AppTemplateMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.xml new file mode 100644 index 0000000..93e40ab --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/AppTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.java new file mode 100644 index 0000000..623acf9 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.common.message.template; + +import com.fibo.ddp.common.model.common.message.template.entity.MessageSendRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 消息发送记录表(MessageSendRecord)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Mapper +public interface MessageSendRecordMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.xml new file mode 100644 index 0000000..9608f0c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/MessageSendRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.java new file mode 100644 index 0000000..d24425a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.common.message.template; + +import com.fibo.ddp.common.model.common.message.template.entity.SmsTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 短信模板表(SmsTemplate)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Mapper +public interface SmsTemplateMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.xml new file mode 100644 index 0000000..cb4428d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/SmsTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.java new file mode 100644 index 0000000..d9e730d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.common.message.template; + +import com.fibo.ddp.common.model.common.message.template.entity.WebhookTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * webhook模板表(WebhookTemplate)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:12:03 + */ +@Mapper +public interface WebhookTemplateMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.xml new file mode 100644 index 0000000..719e584 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WebhookTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.java new file mode 100644 index 0000000..e436e80 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.common.message.template; + +import com.fibo.ddp.common.model.common.message.template.entity.WechatTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 微信服务号模板表(WechatTemplate)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Mapper +public interface WechatTemplateMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.xml new file mode 100644 index 0000000..5d119f4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/common/message/template/WechatTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.java new file mode 100644 index 0000000..55c403b --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.datax.datainterface; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface InterfaceMapper extends BaseMapper { + int updateStatus(@Param(value = "ids") Long[] ids, @Param(value = "status") Integer status); + + List queryInterfaceList(InterfaceInfo interfaceInfo); + + List queryLimit(@Param(value = "start") int start, @Param(value = "size") int size); + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.xml new file mode 100644 index 0000000..c8be5c4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datainterface/InterfaceMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + update riskmanage.t_field_interface set status = #{status} + where id in + + #{interfaceId} + + + + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.java new file mode 100644 index 0000000..45204a4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.CustList; + +import java.util.List; +import java.util.Map; + +public interface CustListMapper extends BaseMapper { + + /** + * findCustList:(查找黑/白名单库的客户名单列表).
+ * @param paramMap 参数集合 + * @return + * */ + public List findCustList(Map paramMap); + + /** + * checkDupCustList:(根据输入的客户信息参数在黑(白)名单库里查找是否存在).
+ * @param paramMap 参数集合 + * @return 存在的结果 + * */ + public int checkDupCustList(Map paramMap); + + /** + * importOneCustList:(导入一条黑(白)名单客户信息数据).
+ * @param paramMap 参数集合 + * @return 存在的结果 + * */ + public int importOneCustList(CustList custList); + + /** + * findValidColumnData:(导出黑/白名单库的客户名单列表).
+ * @param paramMap 参数集合 + * @return + * */ + public List findValidColumnData(Map paramMap); + + /** + * searchTop4Column:(查找黑/白名单库的客户名单前4列数据列表).
+ * @param paramMap 参数集合 + * @return + * */ + public List searchTop4Column(Map paramMap); + + /** + * findById:(根据黑/白名单库的客户id查找客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public CustList findById(Map paramMap); + + /** + * createCustList:(新增黑/白名单的客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public boolean createCustList(Map paramMap); + + + /** + * updateCustList:(修改黑/白名单的客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public boolean updateCustList(Map paramMap); + + /** + * deleteCustList:(删除黑/白名单的客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public boolean deleteCustList(Map paramMap); + + /** + * findByQueryKey:(按照黑/白名单的查询key检索命中的客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public Integer findByQueryKey(Map paramMap); + + /** + * revFindByQueryKey:(黑/白名单模糊搜索时补充按照查询key反向检索命中的客户信息).
+ * @param paramMap 参数集合 + * @return + * */ + public Integer revFindByQueryKey(Map paramMap); + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.xml new file mode 100644 index 0000000..879351e --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/CustListMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into ${tableName} + ( t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 + , t10, t11, t12, t13, t14, t15, t16, t17, t18, t19 + , user_id, created, nick_name ) + values ( #{t0}, #{t1}, #{t2}, #{t3}, #{t4} + , #{t5}, #{t6}, #{t7}, #{t8}, #{t9} + , #{t10}, #{t11}, #{t12}, #{t13}, #{t14} + , #{t15}, #{t16}, #{t17}, #{t18}, #{t19} + , #{userId}, now(), #{nickName} ) + + + + update ${tableName} + set t0 = #{t0}, t1 = #{t1}, t2 = #{t2}, t3 = #{t3}, t4 = #{t4} + , t5 = #{t5}, t6 = #{t6}, t7 = #{t7}, t8 = #{t8}, t9 = #{t9} + , t10 = #{t10}, t11 = #{t11}, t12 = #{t12}, t13 = #{t13}, t14 = #{t14} + , t15 = #{t15}, t16 = #{t16}, t17 = #{t17}, t18 = #{t18}, t19 = #{t19} + , user_id = #{userId}, created = now() + where id = #{id} + + + + delete from ${tableName} + where id in + + #{item} + + + + + + + insert into ${tableName} + ( t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 + , t10, t11, t12, t13, t14, t15, t16, t17, t18, t19 + , user_id, created, nick_name ) + values ( #{t0}, #{t1}, #{t2}, #{t3}, #{t4} + , #{t5}, #{t6}, #{t7}, #{t8}, #{t9} + , #{t10}, #{t11}, #{t12}, #{t13}, #{t14} + , #{t15}, #{t16}, #{t17}, #{t18}, #{t19} + , #{userId}, now(), #{nickName} ) + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.java new file mode 100644 index 0000000..fd89283 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldCall; +import com.fibo.ddp.common.model.datax.datamanage.FieldCallLog; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldCallParam; + +import java.util.List; + +/** + * (FieldCallLog)表数据库访问层 + * + * @author jgp + * @since 2021-12-08 14:18:29 + */ +public interface FieldCallLogMapper extends BaseMapper { + + List findFieldCallList(FieldCallParam param); + + List findFieldCallLogList(FieldCallParam param); + + List findFieldCallCountList(FieldCallParam param); + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.xml new file mode 100644 index 0000000..95390b9 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCallLogMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.java new file mode 100644 index 0000000..e0e1eb6 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.java @@ -0,0 +1,34 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldCond; + +import java.util.List; + +public interface FieldCondMapper extends BaseMapper { + + /** + * createFieldCond:(生成条件关系).
+ * + * @param + * @return 字段列表 + */ + public boolean createFieldCond(List fieldCondVoList); + + /** + * deleteFieldCondById:(删除字段的条件设置).
+ * + * @param + * @return 是否删除成功 + */ + public boolean deleteFieldCondById(Long id); + + + /** + * getFieldCondList:(找出字段条件设置(去重)).
+ * + * @param + * @return 字段列表 + */ + public List getFieldCondList(Long fieldId); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.xml new file mode 100644 index 0000000..dd8df42 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldCondMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + insert into t_field_condition ( field_id, condition_value, content + , cond_field_id, cond_field_operator, cond_field_value, cond_field_logical + , created) + values + + ( #{fieldCond.fieldId}, #{fieldCond.conditionValue}, #{fieldCond.content} + , #{fieldCond.condFieldId}, #{fieldCond.condFieldOperator}, #{fieldCond.condFieldValue}, + #{fieldCond.condFieldLogical} + , now() ) + + + + + delete from t_field_condition where field_id = #{id} + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.java new file mode 100644 index 0000000..e304f8a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.java @@ -0,0 +1,170 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public interface FieldMapper extends BaseMapper { + + /** + * findByFieldType:(根据字段类型名找出该用户可用的字段列表).
+ * + * @param paramMap 参数集合 + * @return 字段列表 + */ + public List findByFieldType(Map paramMap); + + /** + * checkField:(查找引用该字段的所有字段).
+ * + * @param paramMap 参数集合 + * @return 字段id逗号分隔字符串 + */ + public String checkField(Map paramMap); + + /** + * getSourceField:(查找构成该字段的子字段及原生字段).
+ * + * @param paramMap 参数集合 + * @return + */ + public String getSourceField(Map paramMap); + + /** + * findFieldTypeIdsByFieldId:(在引擎里找出一批字段id对应的唯一字段类型id串).
+ * + * @param paramMap 参数集合 + * @return 字段类型id逗号分隔字符串 + */ + public String findFieldTypeIdsByFieldId(Map paramMap); + + /** + * findOrgFieldTypeIdsByIds:(在通用字段里找出一批字段id对应的唯一字段类型id串).
+ * + * @param paramMap 参数集合 + * @return 字段类型id逗号分隔字符串 + */ + public String findOrgFieldTypeIdsByIds(Map paramMap); + + /** + * findFieldByIdsForCheckField:(找出一批字段id的字段列表(包含引擎引用的通用字段,engineId为空是不加engineId=null条件)).
+ * + * @param paramMap 参数集合 + * @return 字段列表 + */ + public List findFieldByIdsForCheckField(Map paramMap); + + /** + * findByFieldName:(根据字段英文或中文名找出字段对象).
+ * + * @param paramMap 参数集合 + * @return 字段对象 + */ + public Field findByFieldName(Map paramMap); + + /** + * findByFieldCn:(根据字段中文名找出字段对象).
+ * + * @param paramMap 参数集合 + * @return 字段对象 + */ + public Field findByFieldCn(Map paramMap); + + /** + * findByUser:(找出该用户可用字段列表).
+ * + * @param paramMap 参数集合 + * @return 字段类型列表 + */ + public List findByUser(Map paramMap); + + /** + * findByFieldId:(根据字段Id查找字段对象).
+ * + * @param paramMap 参数集合 + * @return 字段对象 + */ + public Field findByFieldId(Map paramMap); + + /** + * createField:(添加字段).
+ * + * @param fieldVo 字段实体对象 + * @return 插入是否成功 + */ + public boolean createField(Field fieldVo); + + /** + * batchCreateField:(批量添加字段).
+ * + * @param fieldVoList 字段实体对象list集合 + * @return 字段类型列表 + */ + public boolean batchCreateField(List fieldVoList); + + /** + * updateField:(修改字段).
+ * + * @param paramMap 参数集合 + * @return 更新是否成功 + */ + + public boolean updateField(Map paramMap); + + /** + * isExists:(根据字段英文或中文名查找字段是否存在).
+ * + * @param paramMap 参数集合 + * @return 存在的记录条数 + */ + public int isExists(Map paramMap); + + /** + * getFieldList:(获取组织的所有字段).
+ * + * @param paramMap 参数集合 + * @return + */ + public List getFieldList(Map paramMap); + + + + public String findFieldNameById(Long fieldId); + + int updateFieldFolder(UpdateFolderParam param); + + List selectByIds(@Param("ids") Collection ids); + + List selectByEns(@Param("ens") Collection ens); + + List selectByOrganCns(@Param("cns") Collection cns, @Param("organId") Long organId); + + // runner + /** + * findFieldByIds:(找出一批字段id对应的字段列表).
+ * @param paramMap 参数集合 + * @return 字段列表 + */ + public List findFieldByIdsbyorganId(Map paramMap); + + /** + * findByFieldEn:(根据引擎和字段英文名找出引擎所用字段对象).
+ * @param paramMap 参数集合 + * @return 字段对象 + */ + public Field findByFieldEnbyorganId(Map paramMap); + + /** + * findByFieldCn:(根据字段中文名找出字段对象).
+ * @param paramMap 参数集合 + * @return 字段对象 + */ + public Field findByFieldCnbyorganId(Map paramMap); + + List selectFieldListByEns(@Param("ens")List ens); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.xml new file mode 100644 index 0000000..275ae28 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldMapper.xml @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, field_en, field_cn, field_typeid, value_type, value_scope, is_derivative, is_output, is_common, formula, formula_show, used_fieldid, orig_fieldid, author, created, is_use_sql, data_source_id, sql_statement, sql_variable, is_interface, interface_id, interface_parse_field, json_value,dict_variable, + source_type,mq_source_id + + + + + + + + + + + + + + + + + + insert into t_field ( field_en, field_cn, field_typeid + , value_type, value_scope, is_derivative + , is_output, formula, formula_show, orig_fieldid, used_fieldid + , is_common, author, created, is_use_sql, data_source_id, sql_statement, sql_variable + , is_interface, interface_id, interface_parse_field, json_value, organ_id,dict_variable,source_type,mq_source_id) + values ( #{fieldEn}, #{fieldCn}, #{fieldTypeId} + , #{valueType}, #{valueScope}, #{isDerivative} + , #{isOutput}, #{formula}, #{formulaShow}, #{origFieldId}, #{usedFieldId} + , #{isCommon}, #{author}, now(), #{isUseSql}, #{dataSourceId}, #{sqlStatement}, #{sqlVariable} + , #{isInterface}, #{interfaceId}, #{interfaceParseField}, #{jsonValue}, #{organId},#{dictVariable},#{sourceType},#{mqSourceId}) + + + + insert into t_field ( field_en, field_cn, field_typeid + , value_type, value_scope, is_derivative + , is_output, formula, formula_show, is_common, author, created, + , is_interface, interface_id, interface_parse_field, json_value,dict_variable,source_type,mq_source_id) + values + + ( + #{field.fieldEn}, #{field.fieldCn}, #{field.fieldTypeId} + , #{field.valueType}, #{field.valueScope}, #{field.isDerivative} + , #{field.isOutput}, #{field.formula}, #{field.formulaShow}, #{field.isCommon}, #{field.author}, now() + , #{isInterface}, #{interfaceId}, #{interfaceParseField}, + #{jsonValue},#{dictVariable},#{sourceType},#{mqSourceId} + ) + + + + + update t_field + set field_en = #{fieldEn}, field_cn = #{fieldCn}, field_typeid = #{fieldTypeId} + , value_type = #{valueType}, value_scope = #{valueScope}, is_derivative = #{isDerivative} + , is_output = #{isOutput}, formula = #{formula}, formula_show = #{formulaShow} + , orig_fieldid = #{origFieldId}, used_fieldid = #{usedFieldId}, is_common = #{isCommon} + , is_use_sql = #{isUseSql}, data_source_id = #{dataSourceId}, sql_statement = #{sqlStatement}, sql_variable = + #{sqlVariable} + ,is_interface = #{isInterface}, interface_id = #{interfaceId}, interface_parse_field = #{interfaceParseField}, + json_value = #{jsonValue},dict_variable = #{dictVariable} + ,source_type = #{sourceType},mq_source_id = #{mqSourceId} + where id = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + + update t_field + set field_typeid = #{folderId} + where id in + + #{id} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.java new file mode 100644 index 0000000..ecfcd9d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.java @@ -0,0 +1,77 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldType; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldTreeParam; + +import java.util.List; +import java.util.Map; + +public interface FieldTypeMapper extends BaseMapper { + + /** + * getFieldTypeList:(查找用户的字段类型列表).
+ * + * @param paramMap 参数集合 + * @return 字段类型列表 + */ + public List getFieldTypeList(Map paramMap); + + /** + * findTypeIdByParentId:(根据传入的字段类型父ID查找子类型ID).
+ * + * @param paramMap 参数集合 + * @return 子字段类型ID + */ + public String findTypeIdByParentId(Map paramMap); + + /** + * findTypeIdByParentId:(根据传入的字段类型类型ID查找父ID).
+ * + * @param paramMap 参数集合 + * @return 子字段类型ID + */ + public String findParentIdByTypeId(Map paramMap); + + /** + * createFieldType:(新增字段类型).
+ * + * @param fieldTypeVo 字段类型实体类 + * @return 插入成功 + */ + public boolean createFieldType(FieldType fieldTypeVo); + + /** + * findIdByFieldType:(新增字段类型).
+ * + * @param paramMap paramMap + * @return 字段类型编号 + */ + public long findIdByFieldType(Map paramMap); + + /** + * updateFieldType:(更新字段类型名).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + */ + public boolean updateFieldType(FieldTreeParam param); + + /** + * backFieldTypeByTypeIds:(更新字段类型状态为启用状态(1)).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + */ + public boolean backFieldTypeByTypeIds(Map paramMap); + + /** + * isExists:(查找字段名是否存在).
+ * + * @param paramMap 参数集合 + * @return 存在的记录条数 + */ + public int isExists(Map paramMap); + + List selectFieldTypeList(FieldTreeParam param); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.xml new file mode 100644 index 0000000..4206549 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + insert into t_field_type ( field_type, parent_id, is_common ,type) + values ( #{fieldType}, #{parentId}, #{isCommon} ,#{type}) + + + + update t_field_type + set field_type = #{fieldType} + where id = #{id} + + + + update t_field_type_user_rel + set status = 1 + where organ_id = ( select organ_id from t_user where user_id = #{userId} ) + and engine_id = #{engineId} + and field_typeid in + + #{item} + + and status = -1 + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.java new file mode 100644 index 0000000..18e7764 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldTypeUser; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldTreeParam; + +import java.util.Map; + +public interface FieldTypeUserMapper extends BaseMapper { + + /** + * createFieldTypeUserRel:(新增字段类型).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + */ + public boolean createFieldTypeUserRel(Map paramMap); + + /** + * batchBindEngineFieldTypeUserRel:(把一批通用字段类型id中不存在的类型id批量绑定到引擎).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + */ + public boolean batchBindEngineFieldTypeUserRel(Map paramMap); + + /** + * updateFieldTypeUserRel:(更新字段类型名).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + */ + public boolean updateFieldTypeUserRel(FieldTreeParam param); + + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.xml new file mode 100644 index 0000000..1501d94 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldTypeUserMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + insert into t_field_type_user_rel ( field_typeid, organ_id, engine_id, user_id, created ) + values ( #{fieldTypeId}, #{organId}, #{engineId}, #{userId}, now() ) + + + + insert into t_field_type_user_rel ( field_typeid, organ_id, engine_id, user_id, created ) + select field_typeid, organ_id, #{engineId}, #{userId}, now() + from t_field_type_user_rel r + where r.field_typeid in + + #{item} + + and field_typeid not in ( select field_typeid from t_field_type_user_rel where engine_id = #{engineId}) + and engine_id is null + + + + update t_field_type_user_rel + set user_id = #{userId}, created = now() + + ,status = #{status} + + where organ_id =#{organId} + and field_typeid = #{id} + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.java new file mode 100644 index 0000000..864df0f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.java @@ -0,0 +1,62 @@ +package com.fibo.ddp.common.dao.datax.datamanage; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldUser; + +import java.util.List; +import java.util.Map; + +public interface FieldUserMapper extends BaseMapper { + + /** + * createFieldUserRel:(绑定字段和用户关系).
+ * + * @param fieldUser 用户字段实体类 + * @return 插入成功 + * */ + public boolean createFieldUserRel(FieldUser fieldUserVo); + + /** + * batchCreateFieldUserRel:(批量导入字段信息后批量绑定字段和用户关系).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + * */ + public boolean batchCreateFieldUserRel(Map paramMap); + + /** + * batchBindEngineFieldUserRel:(把一批通用字段id中未绑定的字段id批量绑定到引擎).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + * */ + public boolean batchBindEngineFieldUserRel(Map paramMap); + + /** + * updateStatus:(单个或批量更新用户字段关系).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + * */ + public boolean updateStatus(Map paramMap); + + /** + * deleteFieldByIds:(批量修改字段删除状态为启用状态(1)).
+ * + * @param paramMap 参数集合 + * @return 更新是否成功 + */ + public boolean backFieldByIds(Map paramMap); + + /** + * 统计组织内指标数 + */ + int countFieldByOrganId(Map paramMap); + + /** + * + * @param paramMap + * @return + */ + List> countFieldGroupByType(Map paramMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.xml new file mode 100644 index 0000000..53090ef --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datamanage/FieldUserMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + insert into t_field_user_rel (field_id, organ_id, engine_id, user_id, status, created, updated) + values (#{fieldId}, #{organId}, #{engineId}, #{userId}, #{status}, now(), now()) + + + + insert into t_field_user_rel (field_id, organ_id, engine_id, user_id, status, created, updated) + select id, #{organId}, #{engineId}, #{userId}, #{status}, now(), now() + from t_field t + where t.author = #{author} + and not exists ( select r.field_id from t_field_user_rel r where t.id = r.field_id ) + + + + + insert into t_field_user_rel (field_id, organ_id, engine_id, user_id, status, created, updated) + select id, #{organId}, #{engineId}, #{userId}, 1, now(), now() + from t_field f + where f.id in + + #{item} + + and not exists ( select 1 + from ( select f.id,f.field_en,f.field_cn + from t_field f,t_field_user_rel fu + where f.id = fu.field_id + and fu.organ_id = ( select organ_id from t_user where user_id = #{userId} ) + and fu.engine_id = ${engineId} )y + where f.field_en = y.field_en or f.field_cn = y.field_cn or f.id = y.id + ) + + + + + update t_field_user_rel + set status=#{status} + where organ_id = ( select organ_id from t_user where user_id = #{userId} ) + + and engine_id = #{engineId} + + + and engine_id is null + + and field_id in + + #{item} + + + + + + update t_field_user_rel + set status = 1 + where organ_id = ( select organ_id from t_user where user_id = #{userId} ) + and engine_id = #{engineId} + and field_id in + + #{item} + + and status = -1 + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/DataSourceMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/DataSourceMapper.java new file mode 100644 index 0000000..9d1674f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/DataSourceMapper.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.dao.datax.datasource; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataSourceMapper extends BaseMapper { +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/MqSourceMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/MqSourceMapper.java new file mode 100644 index 0000000..096c92c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/MqSourceMapper.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.dao.datax.datasource; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.datax.datasource.MqSource; + +/** + * (MqSource)表数据库访问层 + * + * @author jgp + * @since 2021-12-20 13:31:51 + */ +public interface MqSourceMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.java new file mode 100644 index 0000000..e3d4dd8 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.datax.datasource; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public interface SimpleMapper { + + List> customSelect(Map paramsMap); + List> test(Map paramsMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.xml new file mode 100644 index 0000000..aa7bc9d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/datax/datasource/SimpleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/dataflow/EngineVersionContentMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/dataflow/EngineVersionContentMapper.java new file mode 100644 index 0000000..544962f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/dataflow/EngineVersionContentMapper.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.dao.enginex.dataflow; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import org.apache.ibatis.annotations.Mapper; + +/** + * (EngineVersionContent)表数据库访问层 + * + * @author jgp + * @since 2021-12-23 10:21:08 + */ + @Mapper +public interface EngineVersionContentMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.java new file mode 100644 index 0000000..fbaabe2 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.enginex.marketing; + +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeDateResult; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 营销引擎节点当天结果表(MarketingEngineNodeDateResult)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:13:23 + */ +@Mapper +public interface MarketingEngineNodeDateResultMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.xml new file mode 100644 index 0000000..7d7926d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeDateResultMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.java new file mode 100644 index 0000000..cdf6f92 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.enginex.marketing; + +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeResult; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 营销引擎节点结果表(MarketingEngineNodeResult)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Mapper +public interface MarketingEngineNodeResultMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.xml new file mode 100644 index 0000000..6c89f91 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineNodeResultMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.java new file mode 100644 index 0000000..274f4f1 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.dao.enginex.marketing; + +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineResult; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 营销引擎结果表(MarketingEngineResult)表数据库访问层 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Mapper +public interface MarketingEngineResultMapper extends BaseMapper{ + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.xml new file mode 100644 index 0000000..e274b2a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/marketing/MarketingEngineResultMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.java new file mode 100644 index 0000000..85a75f4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.dao.enginex.personas; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResultDetail; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReport; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReportParam; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +/** + * (PersonasEngineResultDetail)表数据库访问层 + * + * @author jgp + * @since 2022-01-06 14:24:57 + */ +@Mapper +public interface PersonasEngineResultDetailMapper extends BaseMapper { + + List selectReportList(PersonasReportParam param); +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.xml new file mode 100644 index 0000000..d3b2d34 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultDetailMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultMapper.java new file mode 100644 index 0000000..11c085f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/personas/PersonasEngineResultMapper.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.dao.enginex.personas; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResult; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (PersonasEngineResult)表数据库访问层 + * + * @author jgp + * @since 2022-01-06 14:23:09 + */ + @Mapper +public interface PersonasEngineResultMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.java new file mode 100644 index 0000000..02bb513 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.java @@ -0,0 +1,60 @@ +package com.fibo.ddp.common.dao.enginex.risk; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.IndexEngineReportVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EngineMapper extends BaseMapper { + + List getEngineByList(Engine engineVo); + + Engine getEngineById(Engine engineVo); + + int updateEngine(Engine engineVo); + + /** + * 创建引擎并返回ID + * @param engine + * @return + */ + int insertEngineAndReturnId(Engine engine); + + /** + * 查询本公司引擎 + */ + public List getEngineList(@Param("organId") long organId, + @Param("searchString") String searchString, + @Param("list") List list); + + /** + * 查询首页引擎基本信息 + * @param paramMap + * @return + */ + Map getIndexEngineBaseInfo(Map paramMap); + + /** + * 查询首页最近几天引擎使用情况 + * @param paramMap + * @return + */ + List getIndexRecentDayEngineUseInfo(Map paramMap); + + /** + * 查询首页最近几个月引擎使用情况 + * @param paramMap + * @return + */ + List getIndexRecentMonthEngineUseInfo(Map paramMap); + + /** + * 查询首页引擎使用占比 + * @param paramMap + * @return + */ + List> getIndexEngineUseRatio(Map paramMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.xml new file mode 100644 index 0000000..9752d05 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineMapper.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO + t_engine + + + code, + + + name, + + + description, + + + creator, + + + user_id, + + + organ_id, + + + status, + + + callback_type, + + + callback_url, + + + exception_callback_url, + + create_datetime,update_datetime + + values + + + #{code}, + + + #{name}, + + + #{description}, + + + #{creator}, + + + #{userId}, + + + #{organId}, + + + #{status}, + + + #{callbackType}, + + + #{callbackUrl}, + + + #{exceptionCallbackUrl}, + + now(),now() + + + + + UPDATE t_engine + + + code = #{code}, + + + name = #{name}, + + + description = #{description}, + + + status = #{status}, + + + creator = #{creator}, + + + user_id = #{userId}, + + + callback_type = #{callbackType}, + + + callback_url = #{callbackUrl}, + + + exception_callback_url = #{exceptionCallbackUrl}, + + + WHERE + organ_id= #{organId} + and id = #{id} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.java new file mode 100644 index 0000000..0cae5ac --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.java @@ -0,0 +1,51 @@ +package com.fibo.ddp.common.dao.enginex.risk; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EngineNodeMapper extends BaseMapper { + + /** + * getEngineNodeListByEngineVersionId:(根据版本id获取版本下的所有节点) + * + * @param engineVersionId 引擎版本id + * @return 节点集合 + * + */ + List getEngineNodeListByEngineVersionId(@Param("engineVersionId") Long engineVersionId); + + int insertNodeAndReturnId(EngineNode engineNode); + + // V2 + int insertNodeAndReturnIdV2(EngineNode engineNode); + + int updateNodeForNextOrderAndParams(List eList); + + int getMaxNodeOrder(@Param("versionId") Long versionId); + + int renameNode(Map param); + + int updateSnapshot(Map param); + + int updateNextNodes(EngineNode engineNode); + + int deleteNodesByNodeIds(@Param("commons") List commons); + + List getEngineTypedNodeListByEngineVersionId(@Param("versionId") Long versionId, @Param("types") List types); + + int updateParentIdByNodeId(Map map); + + int updateNodePosition(EngineNode engineNode); + + // runner + /** + * 根据版本id获取版本下的所有节点 + * @param engineVersionId + * @return + */ + List getEngineNodeListByVersionId(@Param("engineVersionId") Long engineVersionId); +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.xml new file mode 100644 index 0000000..2082d8c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineNodeMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + node_id, parent_id, version_id, node_name, node_code, node_order, node_type, node_x, node_y,node_json,node_script,next_nodes,params + + + + + + + + #{item} + + + + + insert into t_engine_node (node_id, parent_id,version_id, node_name, + node_code, node_order, node_type, + node_x, node_y, node_json, + node_script, next_nodes, params + ) + values (#{nodeId,jdbcType=INTEGER},#{parentId,jdbcType=INTEGER}, #{versionId,jdbcType=INTEGER}, #{nodeName,jdbcType=VARCHAR}, + #{nodeCode,jdbcType=VARCHAR}, #{nodeOrder,jdbcType=INTEGER}, #{nodeType,jdbcType=INTEGER}, + #{nodeX,jdbcType=DECIMAL}, #{nodeY,jdbcType=DECIMAL}, #{nodeJson,jdbcType=LONGVARCHAR}, + #{nodeScript,jdbcType=LONGVARCHAR}, #{nextNodes,jdbcType=LONGVARCHAR}, #{params,jdbcType=LONGVARCHAR} + ) + + + + insert into t_engine_node (version_id,parent_id, node_name, + node_code, node_order, node_type, + node_x, node_y, node_json, + node_script, next_nodes, params + ) + values (#{versionId,jdbcType=INTEGER},#{parentId,jdbcType=INTEGER}, #{nodeName,jdbcType=VARCHAR}, + #{nodeCode,jdbcType=VARCHAR}, #{nodeOrder,jdbcType=INTEGER}, #{nodeType,jdbcType=INTEGER}, + #{nodeX,jdbcType=DECIMAL}, #{nodeY,jdbcType=DECIMAL}, #{nodeJson,jdbcType=LONGVARCHAR}, + #{nodeScript,jdbcType=LONGVARCHAR}, #{nextNodes,jdbcType=LONGVARCHAR}, #{params,jdbcType=LONGVARCHAR} + ) + + + + insert into t_engine_node (version_id,parent_id, node_name, + node_code, node_order, node_type, + node_x, node_y, node_json, + node_script, next_nodes, params + ) + values (#{versionId,jdbcType=INTEGER},#{parentId,jdbcType=INTEGER}, #{nodeName,jdbcType=VARCHAR}, + #{nodeCode,jdbcType=VARCHAR}, #{nodeOrder,jdbcType=INTEGER}, #{nodeType,jdbcType=INTEGER}, + #{nodeX,jdbcType=DECIMAL}, #{nodeY,jdbcType=DECIMAL}, #{nodeJson,jdbcType=LONGVARCHAR}, + #{nodeScript,jdbcType=LONGVARCHAR}, #{nextNodes,jdbcType=LONGVARCHAR}, #{params,jdbcType=LONGVARCHAR} + ) + + + + update t_engine_node + set node_x = #{nodeX,jdbcType=DECIMAL}, + node_y = #{nodeY,jdbcType=DECIMAL} + where node_id = #{nodeId,jdbcType=INTEGER} + + + + update t_engine_node + set next_nodes = #{nextNodes} + where node_id = #{nodeId} + + + + update t_engine_node + set parent_id = #{parentId} + where node_id = #{nodeId} + + + + + update t_engine_node + set node_name = #{nodeName,jdbcType=VARCHAR} + where node_id = #{nodeId,jdbcType=INTEGER} + + + + + update t_engine_node + set snapshot = #{snapshot,jdbcType=VARCHAR} + where node_id = #{nodeId,jdbcType=INTEGER} + + + + + + + + + update t_engine_node set + + next_nodes = #{item.nextNodes}, + + + params = #{item.params}, + + + node_json = #{item.nodeJson}, + + parent_id = #{item.parentId } + where node_id = #{item.nodeId} + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.java new file mode 100644 index 0000000..9acb155 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.common.dao.enginex.risk; + +import com.fibo.ddp.common.model.analyse.AnalyseDecisionResult; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EngineResultSetMapper { + /** + * + * 增加结果集 + * @param resultSet 结果集对象 + * @return 返回结果 + * @see + */ + int insertResultSet(EngineResultSet resultSet); + /** + * + * 查询结果集列表 + * @param resultSet 查询对象 + * @return 返回结果集 + * @see + */ + List getResultSetByList(EngineResultSet resultSet); + + /** + * 根据引擎编号和时间段获取结果集数据 + * @param map + * @return + */ + List getEngineResultSetBySegment(Map map); + + /** + * + * 通过主键编号得到 + * @param resultSet 对象 + * @return 返回对象 + * @see + */ + EngineResultSet getResultSetById(EngineResultSet resultSet); + + List getResultSetDetailsById(long resultSetId); + + /** + * 查找引擎id的批量测试结果 + * yuanlinfeng + * @param resultSetId + * @return + */ + List getBatchTestResultSetByEngineId(Map paramMap); + + /** + * 查找引擎批量测试批次号的所有测试结果 + * yuanlinfeng + * @param resultSetId + * @return + */ + List getBatchTestResultSetByBatchNo(Map paramMap); + + /** + * 更新结果出参 + * @param resultSet + */ + void updateResultOutput(EngineResultSet resultSet); + + List countDecisionCallNum(); + + void updateResultById(@Param("resultId") Integer resultId, @Param("rowKeyStr") String rowKeyStr); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.xml new file mode 100644 index 0000000..6654104 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineResultSetMapper.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO + t_resultset + + + uid, + + + pid, + + + input, + + + output, + + + result, + + + engine_id, + + + uuid, + + + engine_version, + + + engine_name, + + + engine_code, + + + type, + + + sub_version, + + + scorecardscore, + + + batch_no, + + + datilResult, + + + values + + + #{uid}, + + + #{pid}, + + + #{input}, + + + #{output}, + + + #{result}, + + + #{engineId}, + + + #{uuid}, + + + #{engineVersion}, + + + #{engineName}, + + + #{engineCode}, + + + #{type}, + + + #{subVersion}, + + + #{scorecardscore}, + + + #{batchNo}, + + + #{datilResult}, + + + + + + + + + + + + + + + update t_resultset t set t.`output` = #{output} where t.`id` = #{id} + + + + + + UPDATE t_resultset + set hbase_row_key = #{rowKeyStr} + where id = #{resultId} + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.java new file mode 100644 index 0000000..e8cf27a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.common.dao.enginex.risk; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSetDTO; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EngineVersionMapper extends BaseMapper { + + int insertOne(EngineVersion record); + + EngineVersion selectByPrimaryKey(long versionId); + + int updateByPrimaryKeySelective(EngineVersion record); + + int updateByPrimaryKey(EngineVersion record); + + int undeployVersion(long engineId); + + int updateBootState(@Param("versionId") long versionId, @Param("bootState") int bootState); + + /** + * getEngineVersionListByEngineId:(根据引擎id获取引擎下的所有版本) + * + * @param engineId 引擎id + * @return 版本集合 + * */ + List getEngineVersionListByEngineId(long engineId); + + // 新增的V2 + List getEngineVersionListByEngineIdV2(long engineId); + + int insertEngineVersionAndReturnId(EngineVersion engineVersion); + + EngineVersion getLatestEngineVersion(EngineVersion engineVersion); + + EngineVersion getLatestEngineSubVersion(EngineVersion engineVersion); + + /** + * 清除所有此版本下的小版本(除过0版本) + * @param map + * @return + */ + int cleanSubVersionByVersion(Map map); + + /** + * 获取引擎对应的版本及引擎名信息 + * yuanlinfeng + * @param paramMap + * @return + */ + public List getEngineVersionByEngineId(Map paramMap); + + List selectAll(); + + List countDecisionResult(); + + /** + * 获取引擎正在运行中的版本 + * @param engineId + * @return + */ + EngineVersion getRunningVersion(@Param("engineId") Long engineId); +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.xml new file mode 100644 index 0000000..bad765d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/enginex/risk/EngineVersionMapper.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + version_id, engine_id, version, boot_state, status, layout, user_id, create_time, + latest_user, latest_time, sub_version + + + + + + + + + + delete from t_engine_version + where engine_id = #{engineId,jdbcType=INTEGER} + and version = #{version,jdbcType=INTEGER} + and sub_version != 0 + + + + insert into t_engine_version (version_id, engine_id, version, + sub_version, boot_state, status, layout, user_id, + create_time, latest_user, latest_time + ) + values (#{versionId,jdbcType=INTEGER}, #{engineId,jdbcType=INTEGER}, #{version,jdbcType=INTEGER}, + #{subVersion,jdbcType=INTEGER},#{bootState,jdbcType=BIT}, #{status,jdbcType=BIT}, #{layout,jdbcType=BIT}, + #{userId,jdbcType=INTEGER}, #{createTime,jdbcType=VARCHAR}, #{latestUser,jdbcType=INTEGER}, + #{latestTime,jdbcType=VARCHAR} + ) + + + + insert into t_engine_version + + + engine_id, + + + version, + + + sub_version, + + + boot_state, + + + status, + + + layout, + + + user_id, + + + create_time, + + + latest_user, + + + latest_time, + + + + + #{engineId,jdbcType=INTEGER}, + + + #{version,jdbcType=INTEGER}, + + + #{subVersion,jdbcType=INTEGER}, + + + #{bootState,jdbcType=BIT}, + + + #{status,jdbcType=BIT}, + + + #{layout,jdbcType=BIT}, + + + #{userId,jdbcType=INTEGER}, + + + #{createTime,jdbcType=VARCHAR}, + + + #{latestUser,jdbcType=INTEGER}, + + + #{latestTime,jdbcType=VARCHAR}, + + + + + + update t_engine_version + + + engine_id = #{engineId,jdbcType=INTEGER}, + + + version = #{version,jdbcType=INTEGER}, + + + sub_version = #{subVersion,jdbcType=INTEGER}, + + + boot_state = #{bootState,jdbcType=BIT}, + + + status = #{status,jdbcType=BIT}, + + + layout = #{layout,jdbcType=BIT}, + + + user_id = #{userId,jdbcType=INTEGER}, + + + create_time = #{createTime,jdbcType=VARCHAR}, + + + latest_user = #{latestUser,jdbcType=INTEGER}, + + + latest_time = #{latestTime,jdbcType=VARCHAR}, + + + where version_id = #{versionId,jdbcType=INTEGER} + + + + update t_engine_version + set boot_state = 0 + where engine_id = #{engineId,jdbcType=INTEGER} + + + update t_engine_version + set boot_state = #{bootState} + where version_id = #{versionId} + + + + update t_engine_version + set engine_id = #{engineId,jdbcType=INTEGER}, + version = #{version,jdbcType=INTEGER}, + sub_version = #{subVersion,jdbcType=INTEGER}, + boot_state = #{bootState,jdbcType=BIT}, + status = #{status,jdbcType=BIT}, + layout = #{layout,jdbcType=BIT}, + user_id = #{userId,jdbcType=INTEGER}, + create_time = #{createTime,jdbcType=VARCHAR}, + latest_user = #{latestUser,jdbcType=INTEGER}, + latest_time = #{latestTime,jdbcType=VARCHAR} + where version_id = #{versionId,jdbcType=INTEGER} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorDecisionFlowHbaseMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorDecisionFlowHbaseMapper.java new file mode 100644 index 0000000..ddb1188 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorDecisionFlowHbaseMapper.java @@ -0,0 +1,76 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorDecisionFlow; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.RowMapper; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.util.Bytes; + +public class MonitorDecisionFlowHbaseMapper implements RowMapper{ + + @Override + public MonitorDecisionFlow mapRow(Result result, int i) throws Exception { + MonitorDecisionFlow monitorDecisionFlow = new MonitorDecisionFlow(); + MonitorDecisionFlow.BaseInfo baseInfo = new MonitorDecisionFlow.BaseInfo(); + MonitorDecisionFlow.MonitorInfo monitorInfo = new MonitorDecisionFlow.MonitorInfo(); + monitorDecisionFlow.setRowKey(Bytes.toString(result.getRow())); + baseInfo.setBusinessId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.BUSINESS_ID) + ) + ) + ); + baseInfo.setEngineName( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.ENGINE_NAME) + ) + ) + ); + baseInfo.setEngineVersionId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.ENGINE_VERSION_ID) + ) + ) + ); + monitorDecisionFlow.setBaseInfo(baseInfo); + monitorInfo.setParams( + JSONObject.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.PARAMS) + ) + ))); + monitorInfo.setProcess( + JSONArray.parseArray( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.PROCESS) + ) + ) + , String.class + )); + monitorInfo.setSnapshot( + JSONArray.parseArray( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.SNAPSHOT) + ) + ) + , EngineNode.class + )); + monitorDecisionFlow.setMonitorInfo(monitorInfo); + return monitorDecisionFlow; + } +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorNodeHbaseMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorNodeHbaseMapper.java new file mode 100644 index 0000000..9a8b302 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorNodeHbaseMapper.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.RowMapper; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.util.Bytes; + +public class MonitorNodeHbaseMapper implements RowMapper { + @Override + public MonitorNode mapRow(Result result, int i) throws Exception { + MonitorNode monitorNode = new MonitorNode(); + MonitorNode.BaseInfo baseInfo = new MonitorNode.BaseInfo(); + MonitorNode.MonitorInfo monitorInfo = new MonitorNode.MonitorInfo(); + monitorNode.setRowKey(Bytes.toString(result.getRow())); + baseInfo.setBusinessId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.BUSINESS_ID) + ) + ) + ); + baseInfo.setNodeId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_ID) + ) + ) + ); + baseInfo.setNodeName( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_NAME) + ) + ) + ); + baseInfo.setNodeType( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_TYPE) + ) + ) + ); + monitorNode.setBaseInfo(baseInfo); + monitorInfo.setParams( + JSONObject.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.PARAMS) + ) + ))); + monitorInfo.setResult( + JSON.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.RESULT) + ) + ) + ) + ); + monitorInfo.setSnapshot( + JSON.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.SNAPSHOT) + ) + ) + ) + ); + monitorNode.setMonitorInfo(monitorInfo); + return monitorNode; + } +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorStrategyHbaseMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorStrategyHbaseMapper.java new file mode 100644 index 0000000..5a41587 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/MonitorStrategyHbaseMapper.java @@ -0,0 +1,114 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.RowMapper; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.util.Bytes; + +public class MonitorStrategyHbaseMapper implements RowMapper { + + @Override + public MonitorStrategy mapRow(Result result, int i) throws Exception { + MonitorStrategy monitorStrategy = new MonitorStrategy(); + MonitorStrategy.BaseInfo baseInfo = new MonitorStrategy.BaseInfo(); + MonitorStrategy.MonitorInfo monitorInfo = new MonitorStrategy.MonitorInfo(); + monitorStrategy.setRowKey(Bytes.toString(result.getRow())); + //业务id + baseInfo.setBusinessId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.BUSINESS_ID) + ) + ) + ); + //策略id + baseInfo.setStrategyId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_ID) + ) + ) + ); + //策略类型 + baseInfo.setStrategyType( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_TYPE) + ) + ) + ); + //策略名称 + baseInfo.setStrategyName( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_NAME) + ) + ) + ); + //节点id + baseInfo.setNodeId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.NODE_ID) + ) + ) + ); + //节点类型 + baseInfo.setNodeType( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.NODE_TYPE) + ) + ) + ); + //引擎版本Id + baseInfo.setEngineVersionId( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.ENGINE_VERSION_ID) + ) + ) + ); + monitorStrategy.setBaseInfo(baseInfo); + monitorInfo.setParams( + JSONObject.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.PARAMS) + ) + ))); + monitorInfo.setResult( + JSON.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.RESULT) + ) + ) + ) + ); + monitorInfo.setSnapshot( + JSON.parseObject( + Bytes.toString( + result.getValue( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.SNAPSHOT) + ) + ) + ) + ); + monitorStrategy.setMonitorInfo(monitorInfo); + return monitorStrategy; + } +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.java new file mode 100644 index 0000000..a2438b8 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorEngine; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 决策流监控 Mapper 接口 + *

+ */ +@Mapper +public interface TMonitorEngineMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.xml new file mode 100644 index 0000000..3f9f0c3 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorEngineMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.java new file mode 100644 index 0000000..51baa7d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNodeDTO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * 决策流节点层面监控 Mapper 接口 + *

+ */ +@Mapper +public interface TMonitorNodeMapper extends BaseMapper { + + List countNodeHit(); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.xml new file mode 100644 index 0000000..a08fba8 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorNodeMapper.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.java new file mode 100644 index 0000000..f97c196 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategyDTO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * 决策流策略层面监控 Mapper 接口 + *

+ */ +@Mapper +public interface TMonitorStrategyMapper extends BaseMapper { + + List countRule(); + + List countScorecardHit(); + + List countDecisionTables(); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.xml new file mode 100644 index 0000000..77ead14 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/TMonitorStrategyMapper.xml @@ -0,0 +1,73 @@ + + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/UserInfoHbaseMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/UserInfoHbaseMapper.java new file mode 100644 index 0000000..1f7b6e7 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/decisionflow/UserInfoHbaseMapper.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.dao.monitor.decisionflow; + +import com.fibo.ddp.common.model.monitor.decisionflow.UserInfo; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.RowMapper; +import org.apache.hadoop.hbase.util.Bytes; + +public class UserInfoHbaseMapper implements RowMapper { + private static byte[] NAME = Constants.UserInfoTable.TABLE_NAME.getBytes(); + private static byte[] FAMILY_BASE_INFO = Constants.UserInfoTable.FAMILY_BASE_INFO.getBytes(); + private static byte[] BASEINFO = Constants.UserInfoTable.BASEINFO.getBytes(); + + @Override + public UserInfo mapRow(org.apache.hadoop.hbase.client.Result result, int i) throws Exception { + UserInfo.BaseInfo baseInfo = new UserInfo.BaseInfo( + Bytes.toString(result.getValue(FAMILY_BASE_INFO,NAME)) + ); + + return new UserInfo(baseInfo); + } +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/LoggerMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/LoggerMapper.java new file mode 100644 index 0000000..a87f0d9 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/LoggerMapper.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.dao.monitor.logger; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.monitor.logger.Logger; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * ClassName:LoggerMapper
+ * Description:日志mapper + * */ +public interface LoggerMapper extends BaseMapper { + + /** + * getLogList :(获取日志集合) + * + * @param param 参数集合 + * @return + * */ + public List getLogList(Map param); + + /** + * 查询最后登录时间 + * @param userId + * @return + */ + public List getLastLoginInfo(Long userId); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/loggerMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/loggerMapper.xml new file mode 100644 index 0000000..d14c3c8 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/monitor/logger/loggerMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + l.id, + l.op_type, + l.op_name, + l.op_user_id, + u.nick_name, + o.name as organ_name, + l.organ_id, + l.method, + l.request_path, + l.request_param, + l.response_param, + l.ip, + l.start_time, + l.end_time + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.java new file mode 100644 index 0000000..47fcb3c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.dao.strategyx.aimodel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface MachineLearningModelsMapper extends BaseMapper { + + /** + * 获取组织下所有模型信息 + * @param organId + * @return + */ + List getModelsListByOrganId(@Param("organId") Integer organId, @Param("searchString") String searchString); +} \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.xml new file mode 100644 index 0000000..5dff40f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/aimodel/MachineLearningModelsMapper.xml @@ -0,0 +1,18 @@ + + + + + id, model_name, description, model_type, file_name, file_path, model_field, mapping_field, + status, creator, modifier, organ_id, create_time, update_time, result_field_en + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleConditionMapper.java new file mode 100644 index 0000000..06a58b1 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleConditionMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.strategyx.baserule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleCondition; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (BaseRuleCondition)表数据库访问层 + * + * @author jgp + * @since 2021-12-27 09:46:43 + */ + @Mapper +public interface BaseRuleConditionMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleMapper.java new file mode 100644 index 0000000..ee68a90 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/baserule/BaseRuleMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.strategyx.baserule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (BaseRule)表数据库访问层 + * + * @author jgp + * @since 2021-12-27 09:46:39 + */ + @Mapper +public interface BaseRuleMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationBlockMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationBlockMapper.java new file mode 100644 index 0000000..b57928a --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationBlockMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationBlock; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationBlockMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationConditionMapper.java new file mode 100644 index 0000000..a13f290 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationConditionMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationCondition; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationConditionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationFilterConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationFilterConditionMapper.java new file mode 100644 index 0000000..c10b7ff --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationFilterConditionMapper.java @@ -0,0 +1,10 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationFilterCondition; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationFilterConditionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationMapper.java new file mode 100644 index 0000000..18e360d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperation; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationOutputMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationOutputMapper.java new file mode 100644 index 0000000..edd6528 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationOutputMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationOutput; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationOutputMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationVersionMapper.java new file mode 100644 index 0000000..d7a3a29 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/collectionrule/ListOperationVersionMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.collectionrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListOperationVersionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanBlockMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanBlockMapper.java new file mode 100644 index 0000000..aec63c3 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanBlockMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanBlock; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanBlockMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanConditionMapper.java new file mode 100644 index 0000000..ec11769 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanConditionMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanCondition; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanConditionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanFilterConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanFilterConditionMapper.java new file mode 100644 index 0000000..ab54f1c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanFilterConditionMapper.java @@ -0,0 +1,10 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanFilterConditionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanMapper.java new file mode 100644 index 0000000..c4c274f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataClean; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOriginalDataOpMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOriginalDataOpMapper.java new file mode 100644 index 0000000..f35ae3f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOriginalDataOpMapper.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOriginalDataOp; + +/** + * (DataCleanOriginalDataOp)表数据库访问层 + * + * @author makejava + * @since 2022-03-21 11:14:57 + */ +public interface DataCleanOriginalDataOpMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOutputMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOutputMapper.java new file mode 100644 index 0000000..56950d3 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanOutputMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOutput; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanOutputMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanVersionMapper.java new file mode 100644 index 0000000..9d3e56d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/dataclean/DataCleanVersionMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.dataclean; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCleanVersionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailConditionMapper.java new file mode 100644 index 0000000..56d17b0 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailConditionMapper.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontable; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetailCondition; +import org.apache.ibatis.annotations.Mapper; + +/** + * (DecisionTablesDetailCondition)表数据库访问层 + */ +@Mapper +public interface DecisionTablesDetailConditionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailMapper.java new file mode 100644 index 0000000..8e1d70e --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesDetailMapper.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontable; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetail; +import org.apache.ibatis.annotations.Mapper; + +/** + * (DecisionTablesDetail)表数据库访问层 + */ +@Mapper +public interface DecisionTablesDetailMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesMapper.java new file mode 100644 index 0000000..2666b9c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesMapper.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontable; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import org.apache.ibatis.annotations.Mapper; + +/** + * (DecisionTables)表数据库访问层 + * + * @author jgp + * @since 2021-04-12 17:54:48 + */ +@Mapper +public interface DecisionTablesMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesResultMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesResultMapper.java new file mode 100644 index 0000000..db90151 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesResultMapper.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontable; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesResult; +import org.apache.ibatis.annotations.Mapper; + +/** + * (DecisionTablesResult)表数据库访问层 + */ +@Mapper +public interface DecisionTablesResultMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesVersionMapper.java new file mode 100644 index 0000000..88911d4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontable/DecisionTablesVersionMapper.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontable; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesVersion; + +/** + * (DecisionTablesVersion)表数据库访问层 + */ +public interface DecisionTablesVersionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailConditionMapper.java new file mode 100644 index 0000000..3e9acdc --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailConditionMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetailCondition; + +public interface DecisionTreeDetailConditionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailMapper.java new file mode 100644 index 0000000..3eb0706 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeDetailMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetail; + +public interface DecisionTreeDetailMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeMapper.java new file mode 100644 index 0000000..d9fc268 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTree; + +public interface DecisionTreeMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeVersionMapper.java new file mode 100644 index 0000000..af47e3c --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/decisiontree/DecisionTreeVersionMapper.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.dao.strategyx.decisiontree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeVersion; + +public interface DecisionTreeVersionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleConditionInfoMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleConditionInfoMapper.java new file mode 100644 index 0000000..b3513c5 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleConditionInfoMapper.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.dao.strategyx.guiderule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; +import org.apache.ibatis.annotations.Mapper; + +/** + * (RuleConditionInfo)表数据库访问层 + */ +@Mapper +public interface RuleConditionInfoMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.java new file mode 100644 index 0000000..76c44e1 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.dao.strategyx.guiderule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Rule表数据库访问层 + */ +@Mapper +public interface RuleInfoMapper extends BaseMapper { + + RuleInfo queryById(Integer id); + + List queryRuleList(RuleInfo ruleInfo); + + int updateStatus(@Param(value = "ids") Long[] ids, @Param(value = "status") Integer status); + + int updateParent(@Param(value = "ids") Long[] ids, @Param(value = "parentId") Long parentId); + + List getRuleList(@Param("ruleIds")List ruleIds); +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.xml new file mode 100644 index 0000000..a9388b3 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleInfoMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, name, code, description, priority, parent_id, author, user_id, organ_id, engine_id, status, type, is_non, content, created, updated, rule_type, rule_audit, score, last_logical,difficulty,script_type,result_field_en,score_field_en + + + + + + + + update t_rule set status = #{status} + where id in + + #{ruleId} + + + + update t_rule set parent_id = #{parentId} + where id in + + #{ruleId} + + + + + + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleLoopGroupActionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleLoopGroupActionMapper.java new file mode 100644 index 0000000..98156bc --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleLoopGroupActionMapper.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.dao.strategyx.guiderule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; + +/** + * (RuleLoopGroupAction)表数据库访问层 + */ +public interface RuleLoopGroupActionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleVersionMapper.java new file mode 100644 index 0000000..83e6031 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/guiderule/RuleVersionMapper.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.dao.strategyx.guiderule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleVersionMapper extends BaseMapper { +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.java new file mode 100644 index 0000000..2efe920 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.dao.strategyx.knowledge; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.enginex.risk.request.KnowledgeTreeListParam; +import com.fibo.ddp.common.model.strategyx.knowledge.KnowledgeTree; + +import java.util.List; +import java.util.Map; + +/** + * ClassName:KnowledgeTreeMapper
+ * Description:知识库目录mapper + * @see + * + * */ +public interface KnowledgeTreeMapper extends BaseMapper { + + /** + * getTreeList:(根据父节点id和组织id,查询其下的所有子节点) + * + * @param paramMap 参数集合 + * @return 父节点下的所有子节点 + * */ + public List getTreeList(Map paramMap); + public List getTreeListV2(Map paramMap); + + /** + * getTreeList:(根据父节点id和组织id,查询其下的所有子节点,若节点下规则,则过滤掉) + * + * @param paramMap 参数集合 + * @return 父节点下的所有子节点 + * */ + public List getTreeDataForEngine(Map paramMap); + + public List getTreeDataForEngineV2(Map paramMap); + + List selectFolderList(KnowledgeTreeListParam param); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.xml new file mode 100644 index 0000000..593b88d --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/KnowledgeTreeMapper.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + id, + name, + parent_id, + user_id, + organ_id, + engine_id, + status, + type, + tree_type, + created, + updated + + + + k.id, + k.name, + k.parent_id, + k.user_id, + k.organ_id, + k.engine_id, + k.status, + k.type, + k.tree_type, + k.created, + k.updated + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.java new file mode 100644 index 0000000..acd4fd9 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.dao.strategyx.knowledge; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.knowledge.Rule; + +import java.util.List; +import java.util.Map; + +/** + * ClassName:OrganRuleMapper
+ * Description:规则mapper + * @see + * */ +public interface RuleMapper extends BaseMapper { + + /** + * getRuleList:(获取规则集合) + * + * @param paramMap 参数集合 + * @return 规则集合 + * */ + public List getRuleList(Map paramMap); + + /** + * getRuleList:(查找引用了某些字段的规则集合) + * + * @param paramMap 参数集合 + * @return 规则集合 + * */ + public List checkByField(Map paramMap); + + List getAllCodeNameParentId(); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.xml new file mode 100644 index 0000000..e386850 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/knowledge/RuleMapper.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + r.id, + r.name, + r.code, + r.description, + r.priority, + r.parent_id, + r.user_id, + r.author, + u.nick_name as nick_name, + r.organ_id, + r.engine_id, + r.status, + r.rule_audit, + r.type, + r.score, + r.last_logical, + r.is_non, + r.created, + r.updated, + r.rule_type, + r.difficulty + + + + r.id, + r.name, + r.code, + r.description, + r.priority, + r.parent_id, + r.user_id, + r.author, + u.nick_name, + r.organ_id, + r.engine_id, + (CASE r.STATUS + WHEN r.id IN ( + SELECT + rule_id + FROM + t_engine_rule_rel td + WHERE + engine_id =#{engineId} + ) THEN + 1 + ELSE + 0 + END) AS status, + r.rule_audit, + r.type, + r.score, + r.last_logical, + r.is_non, + r.created, + r.updated, + r.rule_type + + + + r.id, + r.name, + r.code, + r.description, + r.engine_id, + r.priority, + r.parent_id, + r.user_id, + r.author, + r.organ_id, + r.engine_id, + r.status, + r.type, + r.is_non, + r.rule_audit, + r.score, + r.last_logical, + r.created, + r.updated, + r.rule_type + + + + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.java new file mode 100644 index 0000000..4a05a09 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.java @@ -0,0 +1,106 @@ +package com.fibo.ddp.common.dao.strategyx.listlibrary; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import org.apache.ibatis.annotations.Param; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public interface ListDbMapper extends BaseMapper { + + /** + * findByUser:(查找用户黑/白名单库列表).
+ * + * @param paramMap 参数集合 + * @return + * */ + public List findByUser(Map paramMap); + + /** + * checkByField:(检索字段被哪个黑/白名单库使用).
+ * + * @param paramMap 参数集合 + * @return + * */ + public String checkByField(Map paramMap); + + /** + * isExists:(检索黑(白)名单名称是否存在).
+ * + * @param paramMap 参数集合 + * @return + * */ + public Integer isExists(Map paramMap); + + /** + * updateStatus:(单个或批量更新名单状态).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + * */ + public boolean updateStatus(Map paramMap); + + /** + * createListDb:(建黑、白名单库).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean createListDb(ListDb listDb); + + /** + * createTable:(建黑、白名单库存放的表).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean createTable(Map paramMap); + + /** + * createIndex:(建黑、白名单库存放的表索引).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean createIndex(Map paramMap); + + /** + * findById:(按编号查找名单库实体对象).
+ * + * @param paramMap 参数集合 + * @return + * */ + public ListDb findById(Map paramMap); + + /** + * updateListDb:(修改黑白名单).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean updateListDb(Map paramMap); + + /** + * findListDbById:(按编号查找名单类型\查询主键).
+ * + * @param paramMap 参数集合 + * @return + * */ + public List findListDbByIds(Map paramMap); + + /** + * findFieldsDbByIds:(找出一批黑(白)名单库id所用到一级字段id,有重复、逗号分隔).
+ * + * @param paramMap 参数集合 + * @return + * */ + public String findFieldsByListDbIds(Map paramMap); + + String selectFieldIdsByListDbId(@Param("userId") Long id); + + int customInsert(Map paramMap); + + List> customSelect(Map paramMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.xml new file mode 100644 index 0000000..ea8acf4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbMapper.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update t_list_db + set status = #{status}, user_id = #{userId}, created = now() + where organ_id = ( select organ_id from t_user where user_id = #{userId} ) + and id in + + #{item} + + + + + insert into t_list_db ( list_type, list_name, data_source, list_attr, list_desc, table_column, match_type + , query_type, query_field, organ_id, status, user_id, created,result_field_en) + values ( #{listType}, #{listName}, #{dataSource}, #{listAttr}, #{listDesc}, #{tableColumn}, #{matchType} + , #{queryType}, #{queryField}, #{organId}, #{status}, #{userId}, now() ,#{resultFieldEn}) + + + + ${sqlStr} + + + + ${indexSql} + + + + + + + + + + update t_list_db + set list_type = #{listType}, list_name = #{listName}, data_source = #{dataSource}, list_attr = #{listAttr}, list_desc = #{listDesc}, table_column = #{tableColumn} + , match_type = #{matchType}, query_type = #{queryType}, query_field = #{queryField} + , user_id = #{userId}, created = now(),result_field_en = #{resultFieldEn} + where id = #{id} + and organ_id = ( select organ_id from t_user where user_id = #{userId} ) + + + + + + + ${sqlStr} + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbVersionMapper.java new file mode 100644 index 0000000..320d0b4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/ListDbVersionMapper.java @@ -0,0 +1,10 @@ +package com.fibo.ddp.common.dao.strategyx.listlibrary; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ListDbVersionMapper extends BaseMapper { + +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.java new file mode 100644 index 0000000..9a34820 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.dao.strategyx.listlibrary; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.listlibrary.TblColumn; + +import java.util.List; +import java.util.Map; + +public interface TblColumnMapper extends BaseMapper { + + /** + * getColumnList:(查找用户黑/白名单库字段列表).
+ * @param paramMap 参数集合 + * @return + * */ + public List getColumnList(Map paramMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.xml new file mode 100644 index 0000000..65f80fe --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/listlibrary/TblColumnMapper.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailConditionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailConditionMapper.java new file mode 100644 index 0000000..7e37154 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailConditionMapper.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.dao.strategyx.scorecard; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetailCondition; +import org.apache.ibatis.annotations.Mapper; + +/** + * 评分卡明细表的condition表(ScorecardDetailCondition)表数据库访问层 + */ +@Mapper +public interface ScorecardDetailConditionMapper extends BaseMapper { +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailMapper.java new file mode 100644 index 0000000..cb1a026 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDetailMapper.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.dao.strategyx.scorecard; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; +import org.apache.ibatis.annotations.Mapper; + +/** + * 评分卡明细表(ScorecardDetail)表数据库访问层 + */ +@Mapper +public interface ScorecardDetailMapper extends BaseMapper { +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDimensionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDimensionMapper.java new file mode 100644 index 0000000..aca7d9f --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardDimensionMapper.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.dao.strategyx.scorecard; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ScorecardDimensionMapper extends BaseMapper { +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.java new file mode 100644 index 0000000..00daef7 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.java @@ -0,0 +1,31 @@ +package com.fibo.ddp.common.dao.strategyx.scorecard; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; + +import java.util.List; +import java.util.Map; + +/** + * ClassName:ScordcardMapper
+ * Description:评分卡mapper + * @see + * */ +public interface ScorecardMapper extends BaseMapper { + + /** + * getScorecardList:(获取评分卡集合) + * + * @param paramMap 参数集合 + * @return 评分卡集合 + * */ + public List getScorecardList(Map paramMap); + + /** + * checkByField:(查找引用了某些字段的评分卡集合) + * + * @param paramMap 参数集合 + * @return 评分卡集合 + * */ + public List checkByField(Map paramMap); +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.xml b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.xml new file mode 100644 index 0000000..5527d38 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s.id, + s.name, + s.code, + s.description, + s.version, + s.parent_id, + s.user_id, + s.author, + u.nick_name as author_name, + s.organ_id, + s.engine_id, + s.status, + s.type, + s.score, + s.pd, + s.odds, + score_calculate_type, + result_field_en, + s.created, + s.updated + + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardVersionMapper.java new file mode 100644 index 0000000..6331e61 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scorecard/ScorecardVersionMapper.java @@ -0,0 +1,10 @@ +package com.fibo.ddp.common.dao.strategyx.scorecard; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardVersion; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ScorecardVersionMapper extends BaseMapper { +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scriptrule/RuleScriptVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scriptrule/RuleScriptVersionMapper.java new file mode 100644 index 0000000..73782c8 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/scriptrule/RuleScriptVersionMapper.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.dao.strategyx.scriptrule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import org.apache.ibatis.annotations.Mapper; + +/** + * (RuleScriptVersion)表数据库访问层 + */ +@Mapper +public interface RuleScriptVersionMapper extends BaseMapper { + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/strategyout/StrategyOutputMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/strategyout/StrategyOutputMapper.java new file mode 100644 index 0000000..b1518ec --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/strategyout/StrategyOutputMapper.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.dao.strategyx.strategyout; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StrategyOutputMapper extends BaseMapper { +} diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagMapper.java new file mode 100644 index 0000000..a35faa4 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.strategyx.tag; + +import com.fibo.ddp.common.model.strategyx.tag.Tag; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (Tag)表数据库访问层 + * + * @author jgp + * @since 2021-12-31 13:30:19 + */ + @Mapper +public interface TagMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionDetailMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionDetailMapper.java new file mode 100644 index 0000000..857a2a0 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionDetailMapper.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.dao.strategyx.tag; + +import com.fibo.ddp.common.model.strategyx.tag.TagVersionDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (TagVersionDetail)表数据库访问层 + * + * @author jgp + * @since 2021-12-31 13:30:19 + */ + @Mapper +public interface TagVersionDetailMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionMapper.java b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionMapper.java new file mode 100644 index 0000000..c0d4f27 --- /dev/null +++ b/ddp-common/ddp-dao/src/main/java/com/fibo/ddp/common/dao/strategyx/tag/TagVersionMapper.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.dao.strategyx.tag; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fibo.ddp.common.model.strategyx.tag.TagVersion; +import org.apache.ibatis.annotations.Mapper; + + +/** + * (TagVersion)表数据库访问层 + * + * @author jgp + * @since 2021-12-31 13:30:19 + */ + @Mapper +public interface TagVersionMapper extends BaseMapper{ + +} + diff --git a/ddp-common/ddp-model/pom.xml b/ddp-common/ddp-model/pom.xml new file mode 100644 index 0000000..c6d80b1 --- /dev/null +++ b/ddp-common/ddp-model/pom.xml @@ -0,0 +1,22 @@ + + + + ddp-common + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-common-model + + + + com.fibo.ddp + ddp-common-utils + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionResult.java new file mode 100644 index 0000000..b5ee281 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionResult.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_decision_result") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseDecisionResult extends Model { + private static final long serialVersionUID = 6325269697026738836L; + //主键id + @TableId(type= IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //结果 + private String result; + //次数 + private Long resultCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionTables.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionTables.java new file mode 100644 index 0000000..20dce36 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseDecisionTables.java @@ -0,0 +1,57 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_decision_tables") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseDecisionTables extends Model { + private static final long serialVersionUID = 4429199843501593792L; + //主键id + @TableId(type= IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //决策表id + private Long decisonTablesId; + //决策表名 + private String decisonTablesName; + //决策表版本id + private Long decisonTablesVersionId; + //决策表版本code + private String decisonTablesVersionCode; + //结果 + private String result; + //次数 + private Long resultCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineCall.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineCall.java new file mode 100644 index 0000000..54eca7e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineCall.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_engine_call") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseEngineCall extends Model { + private static final long serialVersionUID = -3102832011497003819L; + //引擎调用表主键id + @TableId(type = IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //调用次数 + private Long callCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineNode.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineNode.java new file mode 100644 index 0000000..4390bc7 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineNode.java @@ -0,0 +1,51 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_engine_node") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseEngineNode extends Model { + private static final long serialVersionUID = -4356487824076243721L; + //主键id + @TableId(type= IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //节点id + private Long nodeId; + //节点名 + private String nodeName; + //经过次数 + private Long passCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineSummary.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineSummary.java new file mode 100644 index 0000000..53cd2a3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseEngineSummary.java @@ -0,0 +1,59 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * t_analyse_engine_summary + */ +@Data +@TableName("t_analyse_engine_summary") +public class AnalyseEngineSummary implements Serializable { + /** + * 引擎概况主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 引擎版本id + */ + private Long engineVersionId; + + /** + * 引擎名称 + */ + private String engineName; + + /** + * 统计维度(1.调用次数 engine_call,2.决策结果 decision_result,3规则命中 rule_hit 4.评分卡 scorecard 5.决策表 decision_tables6.名单库 list_db) + */ + private String statisticsDimension; + + /** + * 统计数量(截至创建日期的当天的总数) + */ + private Long statisticsCount; + + /** + * 组织id + */ + private Long organId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseRule.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseRule.java new file mode 100644 index 0000000..655853f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseRule.java @@ -0,0 +1,55 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_rule") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseRule extends Model { + private static final long serialVersionUID = -3167163273701099335L; + //主键id + @TableId(type= IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //规则id + private Long ruleId; + //规则名 + private String ruleName; + //规则版本id + private Long ruleVersionId; + //规则版本code + private String ruleVersionCode; + //命中次数 + private Long hitCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseScorecard.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseScorecard.java new file mode 100644 index 0000000..96f6f41 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/AnalyseScorecard.java @@ -0,0 +1,57 @@ +package com.fibo.ddp.common.model.analyse; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("t_analyse_scorecard") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseScorecard extends Model { + private static final long serialVersionUID = 5482147204283754208L; + //主键id + @TableId(type= IdType.AUTO) + private Long id; + //调用时间 + private Date callDate; + //引擎id + private Long engineId; + //引擎名 + private String engineName; + //引擎表述 + private String engineDescription; + //引擎版本id + private Long versionId; + //引擎版本code + private String versionCode; + //评分卡id + private Long scorecardId; + //评分卡名 + private String scorecardName; + //评分卡版本id + private Long scorecardVersionId; + //评分卡版本code + private String scorecardVersionCode; + //结果 + private String result; + //次数 + private Long resultCount; + //组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建日期 + private Date createTime; + //修改日期 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseData.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseData.java new file mode 100644 index 0000000..a862692 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseData.java @@ -0,0 +1,22 @@ +package com.fibo.ddp.common.model.analyse.vo; + +import com.fibo.ddp.common.model.analyse.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseData { + private List callCountList; + private List> ruleList; + private List>> scorecardList; + private List>> decisionTablesList; + private List> decisionResultList; + private List> engineNodeList; + private Map engineSummary; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseEngineSummaryVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseEngineSummaryVo.java new file mode 100644 index 0000000..3672396 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseEngineSummaryVo.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.model.analyse.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.text.DecimalFormat; + +@Data +@NoArgsConstructor +public class AnalyseEngineSummaryVo { + //昨天数据 + private Long yesterdayData; + //今天数据 + private Long todayData; + //今天预测数据 + private Long predictData; + //增长率 + private Float growthRate; + + public AnalyseEngineSummaryVo( long todayData, long lastData,long yesterdayData) { + this.yesterdayData = yesterdayData; + this.todayData = todayData; + if (lastData!=0L){ + DecimalFormat df = new DecimalFormat("0.00"); + this.growthRate = Float.valueOf(df.format((float)todayData/lastData)); + this.predictData = new Float(yesterdayData*growthRate).longValue(); + }else { + this.growthRate = Float.valueOf(0); + this.predictData = 0L; + } + + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseRequestParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseRequestParam.java new file mode 100644 index 0000000..488424d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/analyse/vo/AnalyseRequestParam.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.model.analyse.vo; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnalyseRequestParam { + private Date start; + private Date end; + private Long engineId; + private Long versionId; + private SysUser user; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/Approval.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/Approval.java new file mode 100644 index 0000000..6dd133c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/Approval.java @@ -0,0 +1,92 @@ +package com.fibo.ddp.common.model.approval; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (Approval)实体类 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_approval") +public class Approval implements Serializable { + private static final long serialVersionUID = 132808868864524091L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + private String applyType; + /** + * 创建人id + */ + private Long createUserId; + /** + * 创建人名称 + */ + private String createUserName; + /** + * 修改人id + */ + private Long updateUserId; + /** + * 修改人名称 + */ + private String updateUserName; + /** + * 组织id + */ + private Long organId; + /** + * 申请单的状态:(-1取消申请。 0 待审批,1 审批通过,2 审批不通过) + */ + private Integer applyStatus; + /** + * 状态:0冻结 -1 删除 1正常 + */ + private Integer status; + + /** + * 审批人id + */ + private Long approvalUserId; + /** + * 审批人名称 + */ + private String approvalUserName; + /** + * 审批时间 + */ + private Date approvalTime; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 申请详情 + */ + private String applyDetail; + /** + * 申请描述 + */ + private String applyDesc; + + @TableField(exist = false) + private Date queryStartTime; + @TableField(exist = false) + private Date queryEndTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/ApprovalConfig.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/ApprovalConfig.java new file mode 100644 index 0000000..a9ceb92 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/approval/ApprovalConfig.java @@ -0,0 +1,64 @@ +package com.fibo.ddp.common.model.approval; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (ApprovalConfig)实体类 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_approval_config") +public class ApprovalConfig implements Serializable { + private static final long serialVersionUID = -66040749788313604L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 审批类型 + */ + private String approvalType; + /** + * 审批名称 + */ + private String approvalName; + /** + * 描述 + */ + private String approvalDesc; + /** + * 审批状态(1开启,0关闭,-1删除) + */ + private Integer approvalStatus; + /** + * 创建人id + */ + private Long createUserId; + /** + * 创建人id + */ + private Long organId; + /** + * 修改人id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/Dictionary.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/Dictionary.java new file mode 100644 index 0000000..4b1619a --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/Dictionary.java @@ -0,0 +1,44 @@ +package com.fibo.ddp.common.model.authx.dictionary; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * (Dictionary)实体类 + * + * @author jgp + * @since 2021-12-15 15:08:04 + */ +@Data +@TableName("t_dictionary") +public class Dictionary implements Serializable { + private static final long serialVersionUID = 958209037339913842L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 字典key + */ + private String dictKey; + /** + * 字典value + */ + private String dictValue; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/DictionaryCacheManager.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/DictionaryCacheManager.java new file mode 100644 index 0000000..4c082e8 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/dictionary/DictionaryCacheManager.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.common.model.authx.dictionary; + +import com.github.pagehelper.PageInfo; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Component +public class DictionaryCacheManager { + + private final static Map CACHE_KEY_MAP = new TreeMap<>(); + private final static Map CACHE_ID_MAP = new TreeMap<>(); + + public synchronized static void clearCache() { + CACHE_KEY_MAP.clear(); + CACHE_ID_MAP.clear(); + } + + public synchronized static void addCache(Collection collection) { + Map temp = new HashMap<>(); + Map idTemp = new HashMap<>(); + if (CollectionUtils.isNotEmpty(collection)) { + for (Dictionary dictionary : collection) { + if (dictionary.getId() != null && StringUtils.isNotBlank(dictionary.getDictKey())) { + temp.put(dictionary.getDictKey(), dictionary); + idTemp.put(dictionary.getId(), dictionary); + } + } + CACHE_KEY_MAP.putAll(temp); + CACHE_ID_MAP.putAll(idTemp); + } + } + + public synchronized static void deleteCacheByIds(Collection ids) { + if (CollectionUtils.isNotEmpty(ids)) { + for (Long key : ids) { + Dictionary remove = CACHE_ID_MAP.remove(key); + CACHE_KEY_MAP.remove(remove.getDictKey()); + } + } + } + + public synchronized static void updateOrAddCache(Dictionary dictionary) { + Dictionary remove = CACHE_ID_MAP.put(dictionary.getId(), dictionary); + if (remove != null) { + CACHE_KEY_MAP.remove(remove.getDictKey()); + } + CACHE_KEY_MAP.put(dictionary.getDictKey(), dictionary); + } + + public synchronized static Map getAllCache() { + return CACHE_KEY_MAP; + } + + public synchronized static PageInfo getByPage(int pageSize, int pageNum) { + PageInfo pageInfo = new PageInfo<>(); + int size = CACHE_ID_MAP.values().size(); + int start = 0; + int end = size; + if (pageSize > 0 && pageNum > 0) { + start = pageSize * (pageNum - 1); + end = start + pageSize; + if (end >= size) { + end = size; + } + } + List dictionaries = new ArrayList<>(CACHE_ID_MAP.values()).subList(start, end); + pageInfo.setList(dictionaries); + pageInfo.setTotal(size); + pageInfo.setPageNum(pageNum); + pageInfo.setPageSize(pageSize); + pageInfo.setStartRow(start + 1); + pageInfo.setEndRow(end + 1); + return pageInfo; + } + + public synchronized static Dictionary getByKey(String key) { + return CACHE_KEY_MAP.get(key); + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysMenu.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysMenu.java new file mode 100644 index 0000000..7367749 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysMenu.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.model.authx.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_resource") +public class SysMenu implements Serializable { + + private static final long serialVersionUID = -1L; + @TableId(value = "resource_id",type = IdType.AUTO) + private Long resourceId; + private Long userId;//分配者 + private String name; //资源名称 + private String code;//资源代号 + private String url;//路径 + private Long parentId;//父节点 + private String des; + private String resourceSystem; + private Date birth;//创建时间 + private String icon;//图标 + private Integer sort; // 菜单顺序 + private Integer status;//状态 + private Long roleId;//角色id + private Boolean checked;//菜单默认选中 + private Boolean chkDisabled;//节点是否禁用 + private Boolean hidden;//节点是否隐藏 + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysOrganization.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysOrganization.java new file mode 100644 index 0000000..bacd684 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysOrganization.java @@ -0,0 +1,27 @@ + +package com.fibo.ddp.common.model.authx.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_organization") +public class SysOrganization implements Serializable { + + private static final long serialVersionUID = -1L; + @TableId(value = "organ_id",type = IdType.AUTO) + private Long organId;//组织编号 + private String name;//组织名称 + private String code;//组织代号 + private String email; + private String telephone; + private Integer status;//0禁用1启用 + private String author;//创建者 + private Date birth;//创建时间 + private String token;//唯一标识 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysRole.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysRole.java new file mode 100644 index 0000000..ef77036 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysRole.java @@ -0,0 +1,26 @@ + +package com.fibo.ddp.common.model.authx.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_role") +public class SysRole implements Serializable { + + private static final long serialVersionUID = -1L; + @TableId(value = "role_id",type = IdType.AUTO) + private Long roleId; + private Long organId; + private String roleName; + private String roleCode;//角色代号 + private String roleDesc; + private String author;//创建者 + private Date birth;//创建时间 + private Integer status; //状态0禁用1启用 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysUser.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysUser.java new file mode 100644 index 0000000..16a09a2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/SysUser.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.model.authx.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +@Data +@ToString +@TableName("t_user") +public class SysUser implements Serializable { + + private static final long serialVersionUID = -1L; + @TableId(value = "user_id",type = IdType.AUTO) + private Long userId;//用户(主键) + private Long organId;//组织编号 + private String employeeId;//员工编号 + private String account;//账户 + private String password; + private String nickName;//昵称 + private String email; + private String cellphone; + private String qq; + private String latestTime; + private String latestIp; + private String remark; + private Integer status; + private Date birth;//创建时间 + private String author;//创建人 + @TableField(exist = false) + private SysRole sysRole;//角色对象 + @TableField(exist = false) + private SysOrganization sysOrgan;//公司对象 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/LoginInfoParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/LoginInfoParam.java new file mode 100644 index 0000000..1847d22 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/LoginInfoParam.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.model.authx.system.request; + +import lombok.Data; + +@Data +public class LoginInfoParam { + private String account;// 账号 + private String password;// 密码 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/MenuParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/MenuParam.java new file mode 100644 index 0000000..547408e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/request/MenuParam.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.model.authx.system.request; + +import com.fibo.ddp.common.model.authx.system.SysMenu; +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +@Data +public class MenuParam extends BaseParam { + private SysMenu entity = new SysMenu();//查询实体条件 + private Long roleId;//角色id + private Long parentId;//父id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/response/SysMenuVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/response/SysMenuVo.java new file mode 100644 index 0000000..2e1aa8f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/authx/system/response/SysMenuVo.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.model.authx.system.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; +import java.util.List; + +/** + * 系统菜单返回对象 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ToString(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class SysMenuVo implements Serializable { + private static final long serialVersionUID = 621966254529550199L; + + /** + * 菜单名称 + */ + private String title; + + /** + * 菜单地址 + */ + private String index; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 子菜单 + */ + private List subs; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessEventLog.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessEventLog.java new file mode 100644 index 0000000..d51b021 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessEventLog.java @@ -0,0 +1,105 @@ +package com.fibo.ddp.common.model.cignacmb; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 事件调用记录(BusinessEventLog)实体类 + */ +@Data +@TableName("t_business_event_log") +public class BusinessEventLog implements Serializable { + private static final long serialVersionUID = 766848314346971098L; + /** + * 主键 + */ + private Long id; + /** + * 批次号 + */ + private String batchNo; + /** + * 事件流水id + */ + private String eventRequestId; + /** + * 事件ID + */ + private String eventId; + /** + * 事件名称 + */ + private String eventName; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务类型编码 + */ + private String businessCode; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 业务子类型编码 + */ + private String businessChildCode; + /** + * 模板ID + */ + private String templateId; + /** + * 模板名称 + */ + private String templateName; + /** + * 客户姓名 + */ + private String customerName; + /** + * 客户手机号 + */ + private String customerMobile; + /** + * 保单号 + */ + private String policyNo; + /** + * 发送平台 + */ + private String sendPlatform; + /** + * 规则执行开始时间 + */ + private Date callStartTime; + /** + * 规则执行结束时间 + */ + private Date callEndTime; + /** + * 耗时(批次耗时),单位毫秒 + */ + private Integer callTime; + /** + * 执行结果 1:成功,0:失败 + */ + private Integer callStatus; + /** + * 规则执行记录表ids + */ + private String ruleLogIds; + /** + * 企业编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessRuleLog.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessRuleLog.java new file mode 100644 index 0000000..3f4b308 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/BusinessRuleLog.java @@ -0,0 +1,81 @@ +package com.fibo.ddp.common.model.cignacmb; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 规则执行记录(BusinessRuleLog)实体类 + */ +@Data +@TableName("t_business_rule_log") +public class BusinessRuleLog implements Serializable { + private static final long serialVersionUID = -63243451024796542L; + /** + * 主键 + */ + private Long id; + /** + * 批次号 + */ + private String batchNo; + /** + * 规则名称 + */ + private String ruleName; + /** + * 规则编号 + */ + private String ruleCode; + /** + * 规则类型 + */ + private String ruleType; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务类型编码 + */ + private String businessCode; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 业务子类型编码 + */ + private String businessChildCode; + /** + * 规则输出结果 + */ + private String ruleResult; + /** + * 规则描述 + */ + private String ruleDescription; + /** + * 执行开关 1:开启,0:关闭 + */ + private Integer executeSwitch; + /** + * 执行有效期,开始时间 + */ + private Date validStartTime; + /** + * 执行有效期,结束时间 + */ + private Date validEndTime; + /** + * 企业编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/TBusinessRuleRel.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/TBusinessRuleRel.java new file mode 100644 index 0000000..b700140 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/TBusinessRuleRel.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.model.cignacmb; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 业务类型与规则关联表 + *

+ * + * @author oldRose + * @since 2021-11-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="TBusinessRuleRel对象", description="业务类型与规则关联表") +public class TBusinessRuleRel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "业务类型名称") + private String businessName; + + @ApiModelProperty(value = "业务类型编码") + private String businessCode; + + @ApiModelProperty(value = "业务子类型名称") + private String businessChildName; + + @ApiModelProperty(value = "业务子类型编码") + private String businessChildCode; + + @ApiModelProperty(value = "发送方式:自动/手动") + private String sendType; + + @ApiModelProperty(value = "是否取消订阅") + private String isUnsubscribe; + + @ApiModelProperty(value = "事件类型:通知/待办/系统类") + private String eventType; + + @ApiModelProperty(value = "待办任务") + private String backlog; + + @ApiModelProperty(value = "是否需人工干预") + private String isManualIntervention; + + @ApiModelProperty(value = "5大类规则信息") + private String ruleInfo; + + @ApiModelProperty(value = "状态 0:无效,1:有效") + private Integer status; + + @ApiModelProperty(value = "创建人") + private Long creator; + + @ApiModelProperty(value = "修改人") + private Long modifier; + + @ApiModelProperty(value = "企业编号") + private Long organId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/req/BusinessRuleRelReq.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/req/BusinessRuleRelReq.java new file mode 100644 index 0000000..a6d5255 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/req/BusinessRuleRelReq.java @@ -0,0 +1,69 @@ +package com.fibo.ddp.common.model.cignacmb.req; + +import com.alibaba.fastjson.JSONArray; +import com.fibo.ddp.common.model.common.BaseParam; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Created by niuge on 2021/11/10. + */ +@Data +public class BusinessRuleRelReq extends BaseParam { + //业务类型和规则关系 + private Long id; + + @ApiModelProperty(value = "业务类型名称") + private String businessName; + + @ApiModelProperty(value = "业务类型编码") + private String businessCode; + + @ApiModelProperty(value = "业务子类型名称") + private String businessChildName; + + @ApiModelProperty(value = "业务子类型编码") + private String businessChildCode; + + @ApiModelProperty(value = "发送方式:自动/手动") + private String sendType; + + @ApiModelProperty(value = "是否取消订阅") + private String isUnsubscribe; + + @ApiModelProperty(value = "事件类型:通知/待办/系统类") + private String eventType; + + @ApiModelProperty(value = "待办任务") + private String backlog; + + @ApiModelProperty(value = "是否需人工干预") + private String isManualIntervention; + + @ApiModelProperty(value = "5大类规则信息") + private String ruleInfo; + /** + * {"blacklist":[1,2],"threshold":[5,6],"mutex":[7,8],"merge":[10,20],"intercept":[30,40]} + */ + /** + * 黑名单 + */ + private JSONArray blacklist; + /** + * 阈值规则 + */ + private JSONArray threshold; + /** + * 互斥规则 + */ + private JSONArray mutex; + /** + * 合并规则 + */ + private JSONArray merge; + /** + * 拦截规则 + */ + private JSONArray intercept; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogDetailParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogDetailParam.java new file mode 100644 index 0000000..74f71b3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogDetailParam.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.cignacmb.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EventLogDetailParam implements Serializable { + private static final long serialVersionUID = 6175292951569720477L; + /** + * 规则执行记录表ids + */ + private String ruleLogIds; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogParam.java new file mode 100644 index 0000000..6718366 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/EventLogParam.java @@ -0,0 +1,44 @@ +package com.fibo.ddp.common.model.cignacmb.request; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EventLogParam extends BaseParam implements Serializable { + private static final long serialVersionUID = -5236456602152208690L; + /** + * 事件流水id + */ + private String eventRequestId; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 模板ID + */ + private String templateId; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 组织id + */ + Long organId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/RuleLogParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/RuleLogParam.java new file mode 100644 index 0000000..2fe7b87 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/request/RuleLogParam.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.model.cignacmb.request; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuleLogParam extends BaseParam implements Serializable { + private static final long serialVersionUID = 1302021068405380361L; + /** + * 规则名称 + */ + private String ruleName; + /** + * 规则编号 + */ + private String ruleCode; + /** + * 规则类型 + */ + private String ruleType; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 规则执行开始时间 + */ + private Date startTime; + /** + * 规则执行结束时间 + */ + private Date endTime; + /** + * 组织id + */ + private Long organId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogDetailResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogDetailResponse.java new file mode 100644 index 0000000..0375050 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogDetailResponse.java @@ -0,0 +1,45 @@ +package com.fibo.ddp.common.model.cignacmb.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EventLogDetailResponse { + /** + * 规则名称 + */ + private String ruleName; + /** + * 规则编号 + */ + private String ruleCode; + /** + * 规则类型 + */ + private String ruleType; + /** + * 规则描述 + */ + private String ruleDescription; + /** + * 执行开关 1:开启,0:关闭 + */ + private Integer executeSwitch; + /** + * 执行有效期,开始时间 + */ + private Date validStartTime; + /** + * 执行有效期,结束时间 + */ + private Date validEndTime; + /** + * 规则输出结果 + */ + private String ruleResult; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogResponse.java new file mode 100644 index 0000000..b8c1dd6 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/EventLogResponse.java @@ -0,0 +1,81 @@ +package com.fibo.ddp.common.model.cignacmb.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EventLogResponse { + /** + * 主键 + */ + private Long id; + /** + * 批次号 + */ + private String batchNo; + /** + * 事件流水id + */ + private String eventRequestId; + /** + * 事件ID + */ + private String eventId; + /** + * 事件名称 + */ + private String eventName; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 模板ID + */ + private String templateId; + /** + * 模板名称 + */ + private String templateName; + /** + * 客户姓名 + */ + private String customerName; + /** + * 客户手机号 + */ + private String customerMobile; + /** + * 保单号 + */ + private String policyNo; + /** + * 发送平台 + */ + private String sendPlatform; + /** + * 规则执行开始时间 + */ + private Date callStartTime; + /** + * 耗时(批次耗时),单位毫秒 + */ + private Integer callTime; + /** + * 执行结果 1:成功,0:失败 + */ + private Integer callStatus; + /** + * 规则执行记录表ids + */ + private String ruleLogIds; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/RuleLogResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/RuleLogResponse.java new file mode 100644 index 0000000..f8fc616 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/response/RuleLogResponse.java @@ -0,0 +1,61 @@ +package com.fibo.ddp.common.model.cignacmb.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuleLogResponse { + /** + * 执行次数 + */ + private Integer executeNum; + /** + * 规则名称 + */ + private String ruleName; + /** + * 规则编号 + */ + private String ruleCode; + /** + * 规则类型 + */ + private String ruleType; + /** + * 业务类型名称 + */ + private String businessName; + /** + * 业务类型编码 + */ + private String businessCode; + /** + * 业务子类型名称 + */ + private String businessChildName; + /** + * 业务子类型编码 + */ + private String businessChildCode; + /** + * 规则描述 + */ + private String ruleDescription; + /** + * 执行开关 1:开启,0:关闭 + */ + private Integer executeSwitch; + /** + * 执行有效期,开始时间 + */ + private Date validStartTime; + /** + * 执行有效期,结束时间 + */ + private Date validEndTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/vo/BusinessRuleRelVO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/vo/BusinessRuleRelVO.java new file mode 100644 index 0000000..6fb3762 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/cignacmb/vo/BusinessRuleRelVO.java @@ -0,0 +1,66 @@ +package com.fibo.ddp.common.model.cignacmb.vo; + +import com.alibaba.fastjson.JSONArray; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Created by niuge on 2021/11/11. + */ +@Data +public class BusinessRuleRelVO { + private Long id; + + @ApiModelProperty(value = "业务类型名称") + private String businessName; + + @ApiModelProperty(value = "业务类型编码") + private String businessCode; + + @ApiModelProperty(value = "业务子类型名称") + private String businessChildName; + + @ApiModelProperty(value = "业务子类型编码") + private String businessChildCode; + + @ApiModelProperty(value = "发送方式:自动/手动") + private String sendType; + + @ApiModelProperty(value = "是否取消订阅") + private String isUnsubscribe; + + @ApiModelProperty(value = "事件类型:通知/待办/系统类") + private String eventType; + + @ApiModelProperty(value = "待办任务") + private String backlog; + + @ApiModelProperty(value = "是否需人工干预") + private String isManualIntervention; + + @ApiModelProperty(value = "5大类规则信息") + private String ruleInfo; + /** + * {"blacklist":[1,2],"threshold":[5,6],"mutex":[7,8],"merge":[10,20],"intercept":[30,40]} + */ + /** + * 黑名单 + */ + private JSONArray blackList; + /** + * 阈值规则 + */ + private JSONArray thresholdList; + /** + * 互斥规则 + */ + private JSONArray mutexList; + /** + * 合并规则 + */ + private JSONArray mergeList; + /** + * 拦截规则 + */ + private JSONArray interceptList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BasePage.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BasePage.java new file mode 100644 index 0000000..d8c6dda --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BasePage.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.model.common; + +import lombok.Data; + +/** + * + * @ClassName: BasePageVo
+ * @Description: 分页公共基础bean.
+ */ +@Data +public class BasePage { + + /** + * 当前页数 + */ + private int page; + + /** + * 每页显示的行数 + */ + private int rows; + + /** + * 开始行数 + */ + private Integer curRow; + + /** + * 结束行数 + */ + private Integer endRow; + + /** + * 总行数 + */ + private Integer total; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BaseParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BaseParam.java new file mode 100644 index 0000000..72b4680 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/BaseParam.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.model.common; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class BaseParam extends PageDto { + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelModel.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelModel.java new file mode 100644 index 0000000..a3d03e2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelModel.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.common; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExcelModel { + private String name;//excel文件名 + private String type;//类型:xlsx,xls + private List sheets;//工作簿 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelSheetModel.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelSheetModel.java new file mode 100644 index 0000000..5bfe2ff --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ExcelSheetModel.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.common; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ExcelSheetModel { + private String sheetName;//sheet名 + private List headers;//sheet中第一行内容 + private List data;//sheet数据 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/PageDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/PageDto.java new file mode 100644 index 0000000..1823a41 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/PageDto.java @@ -0,0 +1,22 @@ +package com.fibo.ddp.common.model.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PageDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer pageNo = 1; + + private Integer pageSize = 10; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityBuilder.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityBuilder.java new file mode 100644 index 0000000..9aa4372 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityBuilder.java @@ -0,0 +1,137 @@ +package com.fibo.ddp.common.model.common; + +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; + +public final class ResponseEntityBuilder { + /** + * 返回成功. + */ + public static final String RESPONSE_OK = "1"; + /** + * 返回失败. + */ + public static final String RESPONSE_FAIL = "0"; + + /** + * 构造一个失败响应.
+ * 用于构造一个比较用见或是常用的失败响应。
+ * + * @param enums + * 常见错误枚举类的一个实例.
+ * @return + */ + public static ResponseEntityDto buildErrorResponse(ErrorCodeEnum enums) { + ResponseEntityDto entity = new ResponseEntityDto<>(); + entity.setStatus(RESPONSE_FAIL); + entity.setError(String.valueOf(enums.getCode())); + entity.setMsg(enums.getMessage()); + return entity; + } + +// /** +// * 构造一个失败响应.
+// * +// * @inputParam enums +// * @return +// */ +// @Deprecated +// public static ResponseEntity buildErrorResponse(ErrorCodeEnum enums) { +// ResponseEntity model = new ResponseEntity(); +// model.setStatus(RESPONSE_FAIL); +// model.setError(String.valueOf(enums.getVersionCode())); +// model.setMsg(enums.getMessage()); +// return model; +// } + + /** + * 构造一个失败响应.
+ * + * @param error + * 失败错误编码.
+ * @param message + * 失败错误说明.
+ * @return + * + */ + public static ResponseEntityDto buildErrorResponse(String error, String message) { + ResponseEntityDto entity = new ResponseEntityDto<>(); + entity.setStatus(RESPONSE_FAIL); + if(StringUtils.isBlank(error) || !StringUtils.isNumeric(error)){ + error = "401"; + } + entity.setError(error); + entity.setMsg(message); + return entity; + } + + /** + * 构造一个正常响应.
+ * + * 响应数据.
+ * @return + */ + public static ResponseEntityDto buildNormalResponse() { + //规范:所有正常请求(status="1",error="01000000"),code与pageCount属性被废弃. + return new ResponseEntityDto(RESPONSE_OK, "00000000"); + } + + /** + * 构造一个正常响应.
+ * + * @param data + * 响应数据.
+ * @return + */ + public static ResponseEntityDto buildNormalResponse(T data) { + ResponseEntityDto entity = buildNormalResponse(); + entity.setData(data); + return entity; + } + /** + * 构造一个错误响应.
+ * + * @param data + * 响应数据.
+ * @return + */ + public static ResponseEntityDto buildUnNormalResponse(T data,ErrorCodeEnum enums) { + ResponseEntityDto entity = buildErrorResponse(enums); + entity.setData(data); + return entity; + } +// public static ResponseEntityDto> buildNormalResponse(String dictKey,T data) { +// Map result = new HashMap<>(); +// result.put(dictKey, data); +// +// ResponseEntityDto> model = buildNormalResponse(); +// model.setData(result); +// return model; +// } + + public static Boolean isSuccess(ResponseEntityDto entity){ + return entity.getStatus().equals(RESPONSE_OK); + } + + public static Boolean isSuccess2(ResponseEntityDto entity){ + return entity.getStatus().equals(RESPONSE_OK) && entity.getError().equals("00000000"); + } + + /** + * 适用于接口返回data为null时业务不成功的场景 + */ + public static Boolean isSuccess3(ResponseEntityDto entity){ + return entity.getStatus().equals(RESPONSE_OK) && entity.getError().equals("200") && entity.getData() != null; + } + + public static T getEntity(ResponseEntityDto entity){ + if(isSuccess(entity)){ + return (T) entity.getData(); + + } + return null; + } + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityDto.java new file mode 100644 index 0000000..cadd6c5 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/ResponseEntityDto.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.model.common; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; + +@Data +@ToString(callSuper = true) +@ApiModel("返回对象统一封装") +public class ResponseEntityDto implements Serializable { + + private static final long serialVersionUID = -720807478055084231L; + + @ApiModelProperty("状态:1成功, 0失败") + private String status; + @ApiModelProperty("错误码") + private String error; + @ApiModelProperty("错误消息") + private String msg; + @ApiModelProperty("返回数据") + private T data; + + public ResponseEntityDto() { + + } + + public ResponseEntityDto(String status) { + this.status = status; + } + + public ResponseEntityDto(String status, String error) { + this.status = status; + this.error = error; + } + + public ResponseEntityDto(String status, T data) { + this.status = status; + this.data = data; + } + + public ResponseEntityDto(String status, String error, String msg, T data) { + this.status = status; + this.error = error; + this.msg = msg; + this.data = data; + } + + public String getStatus() { + return status; + } + + public ResponseEntityDto setStatus(String status) { + this.status = status; + return this; + } + + public String getError() { + return error; + } + + public ResponseEntityDto setError(String error) { + this.error = error; + return this; + } + + public String getMsg() { + return msg; + } + + public ResponseEntityDto setMsg(String msg) { + this.msg = msg; + return this; + } + + public T getData() { + return data; + } + + public ResponseEntityDto setData(T data) { + this.data = data; + return this; + } + + +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/enums/ErrorCodeEnum.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/enums/ErrorCodeEnum.java new file mode 100644 index 0000000..7a0e00b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/enums/ErrorCodeEnum.java @@ -0,0 +1,95 @@ +package com.fibo.ddp.common.model.common.enums; + +public enum ErrorCodeEnum { + + SERVER_ERROR(ErrorCodeEnum.ERROR_CODE + 101, "服务繁忙,请稍后再试!"), + LOGIN_ERROR(ErrorCodeEnum.ERROR_CODE + 102, "登录失败"), + ERROR_TOKEN_EXPIRE(ErrorCodeEnum.ERROR_CODE + 103, "登录授权码已过期"), + FIELD_TYPE_REPEAT(ErrorCodeEnum.ERROR_CODE + 104, "字段类型已存在"), + FIELD_EN_REPEAT(ErrorCodeEnum.ERROR_CODE + 105, "字段英文名已存在"), + FIELD_CN_REPEAT(ErrorCodeEnum.ERROR_CODE + 106, "字段中文名已存在"), + FIELD_BE_USERD(ErrorCodeEnum.ERROR_CODE + 107, "字段被使用,无法修改"), + LIST_DB_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 108, "黑白名单名称已存在"), + RULE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 109, "规则名称已存在"), + RULE_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 110, "规则代码已存在"), + SCORECARD_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 111, "评分卡名称已存在"), + SCORECARD_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 112, "评分卡代码已存在"), + UN_PERMISSION(ErrorCodeEnum.ERROR_CODE + 113, "没有访问权限"), + CREATE_USER_NAME_ERROR(ErrorCodeEnum.ERROR_CODE + 114, "姓名不能为超级管理员"), + CREATE_USER_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 115, "账号或员工编号已存在"), + CREATE_ROLE_ADMIN_REPEAT(ErrorCodeEnum.ERROR_CODE + 116, "每个公司只能创建一个公司管理员"), + CREATE_ROLE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 117, "角色名已存在"), + CREATE_MENU_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 118, "名称或编号已存在"), + CREATE_ORGAN_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 119, "名称或编号已存在"), + + UPDATE_RULE_ERROR(ErrorCodeEnum.ERROR_CODE+120,"修改规则内容失败"), + RULE_CONDITION_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE+121,"规则条件类型错误"), + RULE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE+122,"规则保存失败"), + + RULE_UPLOAD_ERROR(ErrorCodeEnum.ERROR_CODE+123,"规则导入失败"), + DECISION_TABLES_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 124, "决策表代码已存在"), + DECISION_TABLES_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE+125,"决策表保存失败"), + DECISION_TABLES_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE+126,"决策表修改状态失败"), + DECISION_TABLES_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 127, "决策表名称已存在"), + DECISION_TREE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE+130,"决策树保存失败"), + DECISION_TREE_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE+131,"决策树修改状态失败"), + LIST_OPERATION_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE+132,"集合操作名称重复"), + LIST_OPERATION_Code_REPEAT(ErrorCodeEnum.ERROR_CODE+133,"集合操作代码重复"), + TAG_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE+134,"标签保存失败"), + TAG_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE+135,"标签修改状态失败"), + + + PARAMS_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 555, "参数异常"), + CLASS_CAST_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 556, "类型转换异常"), + JSON_CAST_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 557, "JSON转换异常"), + NULL_POINT_EREXCEPTION(ErrorCodeEnum.ERROR_CODE + 558, "NPE问题,请联系管理员"), + DATA_IS_NOT_EXIST(ErrorCodeEnum.ERROR_CODE + 559, "数据不存在"), + SECTION_ERROR(ErrorCodeEnum.ERROR_CODE + 560, "区间有误"), + + SCORECARD_NOT_SESECT(ErrorCodeEnum.ERROR_CODE + 561, "在本条路径上,评分卡节点有空值"), + NODECHILD_NOT_SESECT(ErrorCodeEnum.ERROR_CODE + 562, "在本条路径上,子引擎节点有空值"), + DECISION_TABLES_NOT_SELECT(ErrorCodeEnum.ERROR_CODE + 563, "在本条路径上,决策表节点有空值"), + FOLDER_NOT_EXIST(ErrorCodeEnum.ERROR_CODE+564,"文件夹不存在"), + + UPDATE_INTERFACE_ERROR(ErrorCodeEnum.ERROR_CODE+565,"修改接口内容失败"), + INTERFACE_CONDITION_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE+566,"接口条件类型错误"), + INTERFACE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE+567,"接口保存失败"), + INTERFACE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 568, "接口名称已存在"), + FAIL_IN_LINK(ErrorCodeEnum.ERROR_CODE+600,"失败"), + SQL_FIELD_HAVE_RISK(ErrorCodeEnum.ERROR_CODE+601,"存在有风险sql关键词" ), + + FILE_UPLOAD_ERROR(ErrorCodeEnum.ERROR_CODE+602,"导入失败"), + + + + // runner + SUCCESS("00000000", "执行成功"), + GET_REDIS_SOURCE_ERROR(ErrorCodeEnum.ERROR_CODE + 401, "获取Redis数据源失败"), + GET_DATABASE_FIELD_ERROR(ErrorCodeEnum.ERROR_CODE + 402, "获取数据库指标失败"), + RUNNER_CUSTOM_ERROR(ErrorCodeEnum.ERROR_CODE + 403, "执行自定义失败"), + GET_INTERFACE_FIELD_ERROR(ErrorCodeEnum.ERROR_CODE + 410, "获取接口指标错误") + ; + + /** + * 默认ERROR_CODE.
+ * 按公司要求8位长度,前两位产品。 + */ + public static final String ERROR_CODE = "01000"; + + private String code; + private String message; + + private ErrorCodeEnum(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/AppTemplate.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/AppTemplate.java new file mode 100644 index 0000000..3fefe96 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/AppTemplate.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.model.common.message.template.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * APP推送模板表(AppTemplate)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_app_template") +public class AppTemplate implements Serializable { + private static final long serialVersionUID = -45372445008267253L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 模板名称 + */ + private String templateName; + /** + * 模板编码 + */ + private String templateCode; + /** + * 推送标题 + */ + private String pushSubject; + /** + * 推送内容 + */ + private String pushContent; + /** + * 点击推送后动作 1:唤醒应用,2:打开指定链接,3:自定义跳转 + */ + private Integer clickAction; + /** + * 点击推送后跳转地址 + */ + private String jumpUrl; + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + /** + * 创建人 + */ + private Integer creator; + /** + * 修改人 + */ + private Integer modifier; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/MessageSendRecord.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/MessageSendRecord.java new file mode 100644 index 0000000..eeac26f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/MessageSendRecord.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.common.model.common.message.template.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * 消息发送记录表(MessageSendRecord)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_message_send_record") +public class MessageSendRecord implements Serializable { + private static final long serialVersionUID = -61995719748090236L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 触达方式 Sms、App、WebHook、WeChat + */ + private String touchType; + /** + * 触达用户id + */ + private Integer userId; + /** + * 模板名称 + */ + private String templateName; + /** + * 模板编码 + */ + private String templateCode; + /** + * 发送状态 0:未处理,1:已发送,2:发送成功,-1:发送失败 + */ + private Integer sendStatus; + /** + * 发送内容 + */ + private String sendContent; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/SmsTemplate.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/SmsTemplate.java new file mode 100644 index 0000000..d626a69 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/SmsTemplate.java @@ -0,0 +1,75 @@ +package com.fibo.ddp.common.model.common.message.template.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * 短信模板表(SmsTemplate)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_sms_template") +public class SmsTemplate implements Serializable { + private static final long serialVersionUID = 598560753825752798L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 模板名称 + */ + private String templateName; + /** + * 模板编码 + */ + private String templateCode; + /** + * 短信类型 + */ + private String smsType; + /** + * 短信签名 + */ + private String smsSign; + /** + * 模板内容 + */ + private String templateContent; + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + /** + * 创建人 + */ + private Integer creator; + /** + * 修改人 + */ + private Integer modifier; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WebhookTemplate.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WebhookTemplate.java new file mode 100644 index 0000000..d27fea3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WebhookTemplate.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.common.model.common.message.template.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * webhook模板表(WebhookTemplate)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:12:03 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_webhook_template") +public class WebhookTemplate implements Serializable { + private static final long serialVersionUID = 995549116937541459L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 模板名称 + */ + private String templateName; + /** + * 模板编码 + */ + private String templateCode; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 请求参数(json格式) + */ + private String requestParams; + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + /** + * 创建人 + */ + private Integer creator; + /** + * 修改人 + */ + private Integer modifier; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WechatTemplate.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WechatTemplate.java new file mode 100644 index 0000000..f6d22cc --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/entity/WechatTemplate.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.common.model.common.message.template.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * 微信服务号模板表(WechatTemplate)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_wechat_template") +public class WechatTemplate implements Serializable { + private static final long serialVersionUID = 958482371535782917L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 模板名称 + */ + private String templateName; + /** + * 模板编码 + */ + private String templateCode; + /** + * 模板内容 + */ + private String templateContent; + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + /** + * 创建人 + */ + private Integer creator; + /** + * 修改人 + */ + private Integer modifier; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/vo/AppTemplateReqVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/vo/AppTemplateReqVo.java new file mode 100644 index 0000000..f8867d6 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/message/template/vo/AppTemplateReqVo.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.model.common.message.template.vo; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +@Data +public class AppTemplateReqVo extends BaseParam { + private static final long serialVersionUID = 8763922600627529473L; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/QueryListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/QueryListParam.java new file mode 100644 index 0000000..2ab9bda --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/QueryListParam.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.common.requestParam; + +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.utils.exception.ApiException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class QueryListParam { + private Integer pageNum = 1; // 第几页 + private Integer pageSize = 10; // 每页的数量 + private T entity;//查询实体对象 + + public static boolean checkIsPage(QueryListParam param) { + if (param == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "分页查询参数异常"); + } + if (param.getPageNum() != null && param.getPageSize() != null && param.getPageSize() > 0 && param.getPageNum() > 0){ + return true; + } + return false; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/StatusParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/StatusParam.java new file mode 100644 index 0000000..e3a379f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/StatusParam.java @@ -0,0 +1,22 @@ +package com.fibo.ddp.common.model.common.requestParam; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StatusParam { + private static final long serialVersionUID = 8131487634836541557L; + + private Integer status;//状态 + + private List ids;//主键id + + private Long strategyId;//相关策略id + + private List list;//针对需要指定类型的需要传入实体类 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateFolderParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateFolderParam.java new file mode 100644 index 0000000..cd4f560 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateFolderParam.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.common.requestParam; + +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.utils.exception.ApiException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors +public class UpdateFolderParam { + private List ids;//规则id + private Long folderId;//文件夹id + + public static boolean checkNotNull(UpdateFolderParam param){ + if (param==null||param.ids==null||param.ids.isEmpty()||param.folderId==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"id或者文件夹id为空"); + } + return true; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateStatusParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateStatusParam.java new file mode 100644 index 0000000..95848cb --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/common/requestParam/UpdateStatusParam.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.model.common.requestParam; + +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.utils.exception.ApiException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class UpdateStatusParam { + private String ids; + private Integer status; + private List list; + + public static boolean checkParam(UpdateStatusParam param) { + try { + String[] split = param.getIds().split(","); + Integer status = param.getStatus(); + if (split == null || split.length == 0 || status == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + param.list = new ArrayList<>(); + for (String s : split) { + param.list.add(Long.valueOf(s)); + } + } catch (Exception e) { + e.printStackTrace(); + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + return true; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelHeader.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelHeader.java new file mode 100644 index 0000000..fc72802 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelHeader.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.model.datax.common; + +public class ExcelHeader { + + public static final String[] fieldExcelHeader = { "字段编号", "字段名", "字段中文名", "字段类型", "字段值类型", "字段值范围", "是否衍生", "是否输出", "创建人" }; + + public static final String[] fieldExcelClass = { "userId", "fieldEn", "fieldCn", "fieldType", "valueTypeName", "valueScope", "isDerivativeName", "isOutputName", "nickName" }; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelUtil.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelUtil.java new file mode 100644 index 0000000..e30dc35 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ExcelUtil.java @@ -0,0 +1,660 @@ +package com.fibo.ddp.common.model.datax.common; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +public class ExcelUtil { + + public static void exportFieldExcel(OutputStream out ,String exlType,String[] headers,String[] classNames, List list ) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ + Workbook workbook; + if (exlType.equalsIgnoreCase("xlsx")) { + // 2007以上 + workbook = new SXSSFWorkbook(200); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + Sheet sheet = workbook.createSheet("title"); + sheet.setColumnWidth((short)0, 10* 256); + sheet.setColumnWidth((short)1, 20* 256); + sheet.setColumnWidth((short)2, 20* 256); + sheet.setColumnWidth((short)3, 10* 256); + sheet.setColumnWidth((short)4, 10* 256); + sheet.setColumnWidth((short)5, 75* 256); +// sheet.setColumnWidth((short)6, 75* 256); + + + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(headers[i]); + } + Iterator it = list.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + row.setHeight((short) 400); + T t = it.next(); + if(null!=t){ + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + Field field = t.getClass().getDeclaredField(classNames[j]); + field.setAccessible(true); + Class valType = field.getType(); + cell.setCellStyle(cellStyle1); + //数据转类型 + if("java.lang.String".equalsIgnoreCase( valType.getName())){ + cell.setCellValue((String) field.get(t)); + }else if("java.lang.Integer".equalsIgnoreCase(valType.getName())||"int".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Integer) field.get(t)); + }else if("java.lang.Double".equalsIgnoreCase(valType.getName())||"double".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Double) field.get(t)==null?0:(Double) field.get(t)); + }else if("java.lang.Long".equalsIgnoreCase(valType.getName())||"long".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Long) field.get(t)==null?0:(Long) field.get(t)); + }else if("java.util.Date".equalsIgnoreCase(valType.getName())) { + if(null==field.get(t)){ + cell.setCellValue(""); + }else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + cell.setCellValue(sdf.format((Date) field.get(t))); + } + } + field.setAccessible(false); + } + } + } + try { + workbook.write(out); + out.flush(); + out.close(); + out = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 导出黑白名单库里的客户列表到excel(兼容黑白名单库的导入模版) + * + * @param sheet + * @param row + * @param column + * @return + */ + public static void exportCustListExcel(OutputStream out ,String exlType,String[] headers,String[] classNames, List list ) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ + Workbook workbook; + if (exlType.equalsIgnoreCase("xlsx")) { + // 2007以上 + workbook = new SXSSFWorkbook(200); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + Sheet sheet = workbook.createSheet("title"); + //默认20列 + sheet.setColumnWidth((short)0, 10* 256); + sheet.setColumnWidth((short)1, 10* 256); + sheet.setColumnWidth((short)2, 10* 256); + sheet.setColumnWidth((short)3, 10* 256); + sheet.setColumnWidth((short)4, 10* 256); + sheet.setColumnWidth((short)5, 10* 256); + sheet.setColumnWidth((short)6, 10* 256); + sheet.setColumnWidth((short)7, 10* 256); + sheet.setColumnWidth((short)8, 10* 256); + sheet.setColumnWidth((short)9, 10* 256); + sheet.setColumnWidth((short)10, 10* 256); + sheet.setColumnWidth((short)11, 10* 256); + sheet.setColumnWidth((short)12, 10* 256); + sheet.setColumnWidth((short)13, 10* 256); + sheet.setColumnWidth((short)14, 10* 256); + sheet.setColumnWidth((short)15, 10* 256); + sheet.setColumnWidth((short)16, 10* 256); + sheet.setColumnWidth((short)17, 10* 256); + sheet.setColumnWidth((short)18, 10* 256); + sheet.setColumnWidth((short)19, 10* 256); + + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(headers[i]); + } + Iterator it = list.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + row.setHeight((short) 400); + T t = it.next(); + if(null!=t){ + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + Field field = t.getClass().getDeclaredField(classNames[j]); + field.setAccessible(true); + Class valType = field.getType(); + cell.setCellStyle(cellStyle1); + //数据转类型 + if("java.lang.String".equalsIgnoreCase( valType.getName())){ + cell.setCellValue((String) field.get(t)); + }else if("java.lang.Integer".equalsIgnoreCase(valType.getName())||"int".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Integer) field.get(t)); + }else if("java.lang.Double".equalsIgnoreCase(valType.getName())||"double".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Double) field.get(t)==null?0:(Double) field.get(t)); + }else if("java.lang.Long".equalsIgnoreCase(valType.getName())||"long".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Long) field.get(t)==null?0:(Long) field.get(t)); + }else if("java.util.Date".equalsIgnoreCase(valType.getName())) { + if(null==field.get(t)){ + cell.setCellValue(""); + }else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + cell.setCellValue(sdf.format((Date) field.get(t))); + } + } + field.setAccessible(false); + } + } + } + try { + workbook.write(out); + out.flush(); + out.close(); + out = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 导出黑白名单库里的客户列表到excel(兼容黑白名单库的导入模版) + * + * @param sheet + * @param row + * @param column + * @return + */ + public static void createCustListExcel(String path, String exlType,String[] headers,String[] classNames, List list ) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ + Workbook workbook; + if (exlType.equalsIgnoreCase("xlsx")) { + // 2007以上 + workbook = new SXSSFWorkbook(200); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + Sheet sheet = workbook.createSheet("title"); + //默认20列 + sheet.setColumnWidth((short)0, 10* 256); + sheet.setColumnWidth((short)1, 10* 256); + sheet.setColumnWidth((short)2, 10* 256); + sheet.setColumnWidth((short)3, 10* 256); + sheet.setColumnWidth((short)4, 10* 256); + sheet.setColumnWidth((short)5, 10* 256); + sheet.setColumnWidth((short)6, 10* 256); + sheet.setColumnWidth((short)7, 10* 256); + sheet.setColumnWidth((short)8, 10* 256); + sheet.setColumnWidth((short)9, 10* 256); + sheet.setColumnWidth((short)10, 10* 256); + sheet.setColumnWidth((short)11, 10* 256); + sheet.setColumnWidth((short)12, 10* 256); + sheet.setColumnWidth((short)13, 10* 256); + sheet.setColumnWidth((short)14, 10* 256); + sheet.setColumnWidth((short)15, 10* 256); + sheet.setColumnWidth((short)16, 10* 256); + sheet.setColumnWidth((short)17, 10* 256); + sheet.setColumnWidth((short)18, 10* 256); + sheet.setColumnWidth((short)19, 10* 256); + + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(headers[i]); + } + Iterator it = list.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + row.setHeight((short) 400); + T t = it.next(); + if(null!=t){ + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + Field field = t.getClass().getDeclaredField(classNames[j]); + field.setAccessible(true); + Class valType = field.getType(); + cell.setCellStyle(cellStyle1); + //数据转类型 + if("java.lang.String".equalsIgnoreCase( valType.getName())){ + cell.setCellValue((String) field.get(t)); + }else if("java.lang.Integer".equalsIgnoreCase(valType.getName())||"int".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Integer) field.get(t)); + }else if("java.lang.Double".equalsIgnoreCase(valType.getName())||"double".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Double) field.get(t)==null?0:(Double) field.get(t)); + }else if("java.lang.Long".equalsIgnoreCase(valType.getName())||"long".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Long) field.get(t)==null?0:(Long) field.get(t)); + }else if("java.util.Date".equalsIgnoreCase(valType.getName())) { + if(null==field.get(t)){ + cell.setCellValue(""); + }else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + cell.setCellValue(sdf.format((Date) field.get(t))); + } + } + field.setAccessible(false); + } + } + } + try { + FileOutputStream output=new FileOutputStream(path); + workbook.write(output); + output.close(); + output = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + } + } + + /** + * 导出引擎批量测试结果到excel + * + * @param sheet + * @param row + * @param column + * @return + */ + public static void exportEngineTestResultExcel(OutputStream out ,String exlType,String[] headers,String[] classNames, List list ) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ + Workbook workbook; + if (exlType.equalsIgnoreCase("xlsx")) { + // 2007以上 + workbook = new SXSSFWorkbook(200); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + Sheet sheet = workbook.createSheet("title"); + + sheet.setColumnWidth((short)0, 10* 256); + sheet.setColumnWidth((short)1, 15* 256); + sheet.setColumnWidth((short)2, 15* 256); + sheet.setColumnWidth((short)3, 15* 256); + sheet.setColumnWidth((short)4, 15* 256); + sheet.setColumnWidth((short)5, 15* 256); + sheet.setColumnWidth((short)6, 20* 256); + sheet.setColumnWidth((short)7, 20* 256); + + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(headers[i]); + } + Iterator it = list.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + row.setHeight((short) 400); + T t = it.next(); + if(null!=t){ + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + Field field = t.getClass().getDeclaredField(classNames[j]); + field.setAccessible(true); + Class valType = field.getType(); + cell.setCellStyle(cellStyle1); + //数据转类型 + if("java.lang.String".equalsIgnoreCase( valType.getName())){ + cell.setCellValue((String) field.get(t)); + }else if("java.lang.Integer".equalsIgnoreCase(valType.getName())||"int".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Integer) field.get(t)); + }else if("java.lang.Double".equalsIgnoreCase(valType.getName())||"double".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Double) field.get(t)==null?0:(Double) field.get(t)); + }else if("java.lang.Long".equalsIgnoreCase(valType.getName())||"long".equalsIgnoreCase(valType.getName())){ + cell.setCellValue((Long) field.get(t)==null?0:(Long) field.get(t)); + }else if("java.util.Date".equalsIgnoreCase(valType.getName())) { + if(null==field.get(t)){ + cell.setCellValue(""); + }else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + cell.setCellValue(sdf.format((Date) field.get(t))); + } + } + field.setAccessible(false); + } + } + } + try { + workbook.write(out); + out.flush(); + out.close(); + out = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 获取合并单元格的值 + * + * @param sheet + * @param row + * @param column + * @return + */ + public static String getMergedRegionValue(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress ca = sheet.getMergedRegion(i); + int firstColumn = ca.getFirstColumn(); + int lastColumn = ca.getLastColumn(); + int firstRow = ca.getFirstRow(); + int lastRow = ca.getLastRow(); + + if (row >= firstRow && row <= lastRow) { + + if (column >= firstColumn && column <= lastColumn) { + Row fRow = sheet.getRow(firstRow); + Cell fCell = fRow.getCell(firstColumn); + return getCellValue(fCell); + } + } + } + + return null; + } + + /** + * 判断合并行 + * + * @param sheet + * @param row + * @param column + * @return + */ + public static boolean isMergedRow(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress range = sheet.getMergedRegion(i); + int firstColumn = range.getFirstColumn(); + int lastColumn = range.getLastColumn(); + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + if (row == firstRow && row == lastRow) { + if (column >= firstColumn && column <= lastColumn) { + return true; + } + } + } + return false; + } + + /** + * 判断合并列 + * + * @param sheet + * @param row + * @param column + * @return + */ + public static boolean isMergedCol(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress range = sheet.getMergedRegion(i); + int firstColumn = range.getFirstColumn(); + int lastColumn = range.getLastColumn(); + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + if(column== firstColumn && column==lastColumn){ + if (row>=firstRow&& row<=lastRow){ + return true; + } + } + } + return false; + } + + /** + * 判断指定的单元格是否是合并单元格 + * + * @param sheet + * @param row + * 行下标 + * @param column + * 列下标 + * @return + */ + public static boolean isMergedRegion(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress range = sheet.getMergedRegion(i); + int firstColumn = range.getFirstColumn(); + int lastColumn = range.getLastColumn(); + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + if (row >= firstRow && row <= lastRow) { + if (column >= firstColumn && column <= lastColumn) { + return true; + } + } + } + return false; + } + + /** + * 获取单元格的值 + * + * @param cell + * @return + */ + public static String getCellValue(Cell cell) { + + if (cell == null) + return ""; + + if (cell.getCellType() == Cell.CELL_TYPE_STRING) { + + return cell.getStringCellValue(); + + } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { + + return String.valueOf(cell.getBooleanCellValue()); + + } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { + + return cell.getCellFormula(); + + } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { + + return String.valueOf(cell.getNumericCellValue()); + + } + return ""; + } + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/Status.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/Status.java new file mode 100644 index 0000000..90a6e16 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/Status.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.model.datax.common; + +public enum Status { + + enable(1), disable(0), delete(-1), yes(1), no(0); + public final int value; + + private Status(int value) { + this.value = value; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ValueType.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ValueType.java new file mode 100644 index 0000000..b980b6a --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/common/ValueType.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.datax.common; + +public enum ValueType { + + // 待选:0, 数值型:1, 字符型:2, 枚举型:3, 小数型:4, 数组型:5 + Unknown(0), Num(1), Char(2), Enum(3), Dec(4), Array(5); + + public final int value; + + private ValueType(int value) { + this.value = value; + } + + public int getValue(){ + return value; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/consts/DataXCacheConst.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/consts/DataXCacheConst.java new file mode 100644 index 0000000..66afe27 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/consts/DataXCacheConst.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.model.datax.consts; + + +public class DataXCacheConst { + //web端需要的缓存更新时间信息 + public static final String DATAX_WEB_CACHE_REDIS_KEY = "DATAX:WEB:CACHE"; + //发布订阅的key + public static final String DATAX_PUBSUB_CACHE_REDIS_CHANNEL = "DATAX:PUBSUB:CACHE"; + //返回给前端的改变列表名 + public static final String DATAX_CACHE_CHANGE_LIST_KEY = "changeList"; + //返回给前端的缓存信息 + public static final String DATAX_CACHE_INFO_KEY = "cacheInfo"; + + public static class Type{ + public static final String[] TYPE_LIST= new String[]{Type.DATA_SOURCE, Type.MQ_SOURCE, Type.FIELD, Type.INTERFACE}; + public static final String DATA_SOURCE = "data_source"; + public static final String MQ_SOURCE = "mq_source"; + public static final String FIELD = "field"; + public static final String INTERFACE = "interface"; + + } + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/InterfaceInfo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/InterfaceInfo.java new file mode 100644 index 0000000..236a693 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/InterfaceInfo.java @@ -0,0 +1,61 @@ +package com.fibo.ddp.common.model.datax.datainterface; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName("t_field_interface") +public class InterfaceInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Integer id; //接口id + + private String name; //接口名称 + + private String url; //请求地址 + + private String method; //请求方法 + + private String requestHeaders; //请求体类型 + + private String requestBody; //请求参数体 + + private String bindParam; //绑定参数 + + private String responseBody; //请求响应体 + + private Long creator; //创建者 + + private Long modifier; //修改者 + + private Long organId; //企业编号 + + private Integer status; //请求状态 + + private Date createTime; //创建时间 + + private Date updateTime; //更新时间 + + private String requestType; + + @TableField(exist = false) + private String username; //用户名 + + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceListParam.java new file mode 100644 index 0000000..7fcf57e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceListParam.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.model.datax.datainterface.request; + + +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InterfaceListParam { + protected Integer pageNo = 1; // 第几页 + protected Integer pageSize = 10; // 每页的数量 + + +// protected Boolean search = false; // 是否搜索 + + protected InterfaceInfo interfaceInfo;//查询实体对象 + +// protected Integer parentId = 0; // 文件夹的id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateParent.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateParent.java new file mode 100644 index 0000000..a8b6cc3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateParent.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.model.datax.datainterface.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors +public class InterfaceUpdateParent { + private Long[] ids;//规则id + private Long parentId;//文件夹id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateStatusParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateStatusParam.java new file mode 100644 index 0000000..e968baa --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/request/InterfaceUpdateStatusParam.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.datax.datainterface.request; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors +public class InterfaceUpdateStatusParam { + private Long[] ids;//userId + private Integer status;//状态 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/vo/InterfaceVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/vo/InterfaceVo.java new file mode 100644 index 0000000..10b68c4 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datainterface/vo/InterfaceVo.java @@ -0,0 +1,64 @@ +package com.fibo.ddp.common.model.datax.datainterface.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors +@TableName("t_field_interface") +public class InterfaceVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; //接口id + + private String name; //接口名称 + + private String url; //请求地址 + + private String method; //请求方法 + + private String requestHeaders; //请求体类型 + + private String requestBody; //请求参数体 + + private String bindParam; //绑定参数 + + private String responseBody; //请求响应体 + + private Long creator; //创建者 + + private Long modifier; //修改者 + + private Long organId; //企业编号 + + private Long status; //请求状态 + + private Date createTime; //创建时间 + + private Date updateTime; //更新时间 + + private String requestType; + + @TableField(exist = false) + private String username; //用户名 + + @TableField(exist = false) + private String creatorName; //创建者姓名 + + @TableField(exist = false) + private String modifierName; //修改者姓名 + + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/CustList.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/CustList.java new file mode 100644 index 0000000..c2d7b3c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/CustList.java @@ -0,0 +1,236 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.fibo.ddp.common.model.common.BasePage; + +import java.io.Serializable; +import java.util.Date; + +public class CustList extends BasePage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + * */ + private Long id; + + /** + * 以下20个t开头为匿名字段 + * */ + private String t0; + private String t1; + private String t2; + private String t3; + private String t4; + private String t5; + private String t6; + private String t7; + private String t8; + private String t9; + private String t10; + private String t11; + private String t12; + private String t13; + private String t14; + private String t15; + private String t16; + private String t17; + private String t18; + private String t19; + + /** + * 创建人编号 + * */ + private Long userId; + + /** + * 创建人昵称 + * */ + private String nickName; + + /** + * 创建时间 + * */ + private Date created; + + /** + * 检索客户信息是否存在的定制条件 + */ + private String checkCol; + + /** + * 检索名单库的表名称 + */ + private String tableName; + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getT0() { + return t0; + } + public void setT0(String t0) { + this.t0 = t0; + } + public String getT1() { + return t1; + } + public void setT1(String t1) { + this.t1 = t1; + } + public String getT2() { + return t2; + } + public void setT2(String t2) { + this.t2 = t2; + } + public String getT3() { + return t3; + } + public void setT3(String t3) { + this.t3 = t3; + } + public String getT4() { + return t4; + } + public void setT4(String t4) { + this.t4 = t4; + } + public String getT5() { + return t5; + } + public void setT5(String t5) { + this.t5 = t5; + } + public String getT6() { + return t6; + } + public void setT6(String t6) { + this.t6 = t6; + } + public String getT7() { + return t7; + } + public void setT7(String t7) { + this.t7 = t7; + } + public String getT8() { + return t8; + } + public void setT8(String t8) { + this.t8 = t8; + } + public String getT9() { + return t9; + } + public void setT9(String t9) { + this.t9 = t9; + } + public String getT10() { + return t10; + } + public void setT10(String t10) { + this.t10 = t10; + } + public String getT11() { + return t11; + } + public void setT11(String t11) { + this.t11 = t11; + } + public String getT12() { + return t12; + } + public void setT12(String t12) { + this.t12 = t12; + } + public String getT13() { + return t13; + } + public void setT13(String t13) { + this.t13 = t13; + } + public String getT14() { + return t14; + } + public void setT14(String t14) { + this.t14 = t14; + } + public String getT15() { + return t15; + } + public void setT15(String t15) { + this.t15 = t15; + } + public String getT16() { + return t16; + } + public void setT16(String t16) { + this.t16 = t16; + } + public String getT17() { + return t17; + } + public void setT17(String t17) { + this.t17 = t17; + } + public String getT18() { + return t18; + } + public void setT18(String t18) { + this.t18 = t18; + } + public String getT19() { + return t19; + } + public void setT19(String t19) { + this.t19 = t19; + } + public Long getUserId() { + return userId; + } + public void setUserId(Long userId) { + this.userId = userId; + } + public Date getCreated() { + return created; + } + public void setCreated(Date created) { + this.created = created; + } + public String getNickName() { + return nickName; + } + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getCheckCol() { + return checkCol; + } + public void setCheckCol(String checkCol) { + this.checkCol = checkCol; + } + public String getTableName() { + return tableName; + } + public void setTableName(String tableName) { + this.tableName = tableName; + } + @Override + public String toString() { + return "CustList [userId=" + id + ", t0=" + t0 + ", t1=" + t1 + ", t2=" + t2 + + ", t3=" + t3 + ", t4=" + t4 + ", t5=" + t5 + ", t6=" + t6 + + ", t7=" + t7 + ", t8=" + t8 + ", t9=" + t9 + ", t10=" + t10 + + ", t11=" + t11 + ", t12=" + t12 + ", t13=" + t13 + ", t14=" + + t14 + ", t15=" + t15 + ", t16=" + t16 + ", t17=" + t17 + + ", t18=" + t18 + ", t19=" + t19 + ", userId=" + userId + + ", nickName=" + nickName + ", created=" + created + + ", checkCol=" + checkCol + ", tableName=" + tableName + "]"; + } + + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/Field.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/Field.java new file mode 100644 index 0000000..1e1516f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/Field.java @@ -0,0 +1,222 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.common.BasePage; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@TableName("t_field") +public class Field extends BasePage implements Serializable { + private static final long serialVersionUID = 7113453776727511877L; + + /** + * 主键 + * */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 字段英文名 + * */ + private String fieldEn; + + /** + * 字段中文名 + * */ + private String fieldCn; + + /** + * 字段类型编号 + * */ + @TableField("field_typeid") + private Long fieldTypeId; + + /** + * 字段类型名 + * */ + @TableField(exist = false) + private String fieldType; + + /** + * 字段存值类型 + * */ + private Integer valueType; + + /** + * 字段存值类型中文 + * */ + @TableField(exist = false) + private String valueTypeName; + + /** + * 字段约束范围 + * */ + private String valueScope; + + /** + * 是否衍生字段 + * */ + private Integer isDerivative; + + /** + * 是否衍生字段 + * */ + @TableField(exist = false) + private String isDerivativeName; + + /** + * 是否输出字段 + * */ + private Integer isOutput; + + /** + * 是否输出字段 + * */ + @TableField(exist = false) + private String isOutputName; + + /** + * 是否组织定义的通用字段 + * */ + private Integer isCommon; + + /** + * 衍生字段公式 + * */ + private String formula; + + /** + * 衍生字段公式回显信息 + * */ + private String formulaShow; + + /** + * 衍生字段引用的字段id + * */ + @TableField("used_fieldid") + private String usedFieldId; + + /** + * 衍生字段引用的原生字段id + * */ + @TableField("orig_fieldid") + private String origFieldId; + + /** + * 创建人 + * */ + private Long author; + + /** + * 创建人昵称 + * */ + @TableField(exist = false) + private String nickName; + + /** + * 创建时间 + * */ + private Date created; + + /** + * 归属的引擎ID + * */ + @TableField(exist = false) + private Long engineId; + + /** + * 归属的引擎名称 + * */ + @TableField(exist = false) + private String engineName; + + /** + * 字段状态(启用、停用、删除、未知) + * */ + @TableField(exist = false) + private String status; + + /** + * 字段条件设置集合 + * */ + @TableField(exist = false) + private List fieldCondList; + + /** + * 字段用户关系编号 + * */ + @TableField(exist = false) + private Long fieldRelId; + + /** + * 是否使用sql获取指标 + */ + private Boolean isUseSql; + + /** + * 使用sql获取指标时对应的数据源 + */ + private Integer dataSourceId; + + /** + * 使用sql获取指标时对应的sql语句 + */ + private String sqlStatement; + + /** + * sql变量配置 + */ + private String sqlVariable; + + /** + * 是否使用接口 + */ + private Boolean isInterface; + + /** + * 接口id + */ + private Integer interfaceId; + + /** + * 接口解析指标 + */ + private String interfaceParseField; + + /** + * json类型对应的json值 + */ + private String jsonValue; + /** + * 字典变量例如 日期:date + */ + private String dictVariable; + + /** + * 该字段归属的组织编号 + * */ + private Long organId; + + /** + * 指标类型 + */ + @TableField(exist = false) + private Integer type; + + /** + * 指标源类型 + */ + private Integer sourceType; + + /** + * 消息队列源id + */ + private Long mqSourceId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCall.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCall.java new file mode 100644 index 0000000..a931562 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCall.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import lombok.Data; + +@Data +public class FieldCall extends Field { + private Long callCount; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCallLog.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCallLog.java new file mode 100644 index 0000000..b0e9627 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCallLog.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * (FieldCallLog)实体类 + * + * @author jgp + * @since 2021-12-08 14:18:29 + */ +@Data +@TableName("t_field_call_log") +public class FieldCallLog implements Serializable { + private static final long serialVersionUID = -22326067411898498L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 指标id + */ + private Long fieldId; + /** + * 指标类型 + */ + private String fieldType; + /** + * 数据源类型 + */ + private String sourceType; + /** + * 数据源或者接口源的id + */ + private Long sourceId; + /** + * 入参 + */ + private String inputParam; + /** + * 获取到的指标值 + */ + private String fieldValue; + /** + * 组织id + */ + @TableField(exist = false) + private Long organId; + /** + * 消耗时长,单位:毫秒 + */ + private Long duration; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + public FieldCallLog(Long fieldId, String fieldType,String sourceType,Long sourceId, String inputParam, String fieldValue, Long duration, Long organId) { + this.fieldId = fieldId; + this.fieldType = fieldType; + this.sourceType = sourceType; + this.sourceId = sourceId; + this.inputParam = inputParam; + this.fieldValue = fieldValue; + this.duration = duration; + this.organId = organId; + this.createTime = new Date(); + this.updateTime = new Date(); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCond.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCond.java new file mode 100644 index 0000000..d9ae2f0 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldCond.java @@ -0,0 +1,68 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.common.BasePage; +import com.fibo.ddp.common.model.datax.datamanage.vo.FieldSubCondVo; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@TableName("t_field_condition") +public class FieldCond extends BasePage implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 条件编号 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 字段编号 + */ + private Long fieldId; + + /** + * 字段条件值 + */ + private String conditionValue; + + /** + * 字段条件区域设置json格式 + */ + private String content; + + /** + * 条件字段编号 + */ + private Long condFieldId; + + /** + * 条件字段的运算符 + */ + private String condFieldOperator; + + /** + * 条件字段的条件设置值 + */ + private String condFieldValue; + + /** + * 条件字段间的逻辑符 + */ + private String condFieldLogical; + + /** + * 创建时间 + */ + private Date created; + @TableField(exist = false) + private List fieldSubCond; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldType.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldType.java new file mode 100644 index 0000000..1222e54 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldType.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.common.BasePage; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("t_field_type") +public class FieldType extends BasePage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 字段类型名 + */ + private String fieldType; + + /** + * 父节点编号 + */ + private Integer parentId; + + /** + * 是否组织定义的通用字段类型 + */ + private Integer isCommon; + + private Integer type; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + /** + * 字段类型的子类集合 + */ + private FieldType[] children; + + /** + * 是否为父类 + */ + private String isParent = "true"; + + /** + * 引擎编号 + */ + @TableField(exist = false) + private Integer engineId; + + /** + * 文件夹图片路径 + */ + private String icon; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldTypeUser.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldTypeUser.java new file mode 100644 index 0000000..fd5b3a5 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldTypeUser.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.common.BasePage; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_field_type_user_rel") +public class FieldTypeUser extends BasePage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + * */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 字段类型编号(表主键) + * */ + private Long fieldTypeId; + + /** + * 该字段类型归属的组织编号 + * */ + private Long organId; + + /** + * 该字段类型归属的引擎id(表主键) + * */ + private Long engineId; + + /** + * 创建或修改该字段的用户编号 + * */ + private Long userId; + + /** + * 创建时间 + * */ + private Date created; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldUser.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldUser.java new file mode 100644 index 0000000..9e37a4c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/FieldUser.java @@ -0,0 +1,59 @@ +package com.fibo.ddp.common.model.datax.datamanage; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.common.BasePage; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_field_user_rel") +public class FieldUser extends BasePage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + * */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 字段编号(表主键) + * */ + private Long fieldId; + + /** + * 该字段归属的组织编号 + * */ + private Long organId; + + /** + * 该字段归属的引擎id(表主键) + * */ + private Long engineId; + + /** + * 创建或修改该字段的用户编号 + * */ + private Long userId; + + /** + * 启用停用删除标志 + * */ + private Integer status; + + /** + * 创建时间 + * */ + private Date created; + + /** + * 更新时间 + * */ + private Date updated; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldCallParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldCallParam.java new file mode 100644 index 0000000..f27b731 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldCallParam.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.model.datax.datamanage.request; + +import lombok.Data; + +import java.util.Date; + +@Data +public class FieldCallParam { + private Long organId; + private Date queryTimeStart; + private Date queryTimeEnd; + private Integer fieldType; + private String searchKey; + private Long fieldId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldSaveParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldSaveParam.java new file mode 100644 index 0000000..e3e225f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldSaveParam.java @@ -0,0 +1,99 @@ +package com.fibo.ddp.common.model.datax.datamanage.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FieldSaveParam implements Serializable { + + private static final long serialVersionUID = 1L; + + // http://47.102.125.25/apidoc/index.html#api-field-PostV2DatamanageFieldSave + + private String searchKey; // + private Long id; + private String formula; + private String formulaShow; + private Long engineId; + private String fieldEn; + private String fieldCn; + private Long fieldTypeId; + private Integer valueType; + private Integer isDerivative; + private Integer isOutput; + private String valueScope; + private String fieldCondList; // + private String formulaHidden; // + private Boolean isUseSql; + private Integer dataSourceId; + private String sqlStatement; + private String sqlVariable; + private Boolean isInterface; + private Integer interfaceId; + private String interfaceParseField; + private String jsonValue; + private String dictVariable; + private Integer sourceType; + private Long mqSourceId; + +// +// public Field toField() { +// Field datamanage = new Field(); +// +// datamanage.setUserId(this.getUserId()); +// datamanage.setFormula(this.getFormula()); +// datamanage.setFormulaShow(this.getFormulaShow()); +// datamanage.setEngineId(this.getEngineId()); +// datamanage.setFieldEn(this.getFieldEn()); +// datamanage.setFieldCn(this.getFieldCn()); +// datamanage.setFieldTypeId(this.getFieldTypeId()); +// datamanage.setValueType(this.getValueType()); +// datamanage.setIsDerivative(this.getIsDerivative()); +// datamanage.setIsOutput(this.getIsOutput()); +// datamanage.setValueScope(this.getValueScope()); +// +// datamanage.setUseSql(this.getIsUseSql()); +// datamanage.setDataSourceId(this.getDataSourceId()); +// datamanage.setSqlStatement(this.getSqlStatement()); +// +// return datamanage; +// } +// +// public Map toMap() { +// HashMap hashMap = new HashMap<>(); +// hashMap.put("searchKey", this.getSearchKey()); +// hashMap.put("userId", this.getUserId()); +// hashMap.put("formula", this.getFormula()); +// hashMap.put("formulaShow", this.getFormulaShow()); +// hashMap.put("engineId", this.getEngineId()); +// hashMap.put("formulaFields", this.getFormulaFields()); +// hashMap.put("fieldEn", this.getFieldEn()); +// hashMap.put("fieldCn", this.getFieldCn()); +// hashMap.put("fieldTypeId", this.getFieldId()); +// hashMap.put("valueType", this.getValueType()); +// hashMap.put("isDerivative", this.getIsDerivative()); +// hashMap.put("isOutput", this.getIsOutput()); +// hashMap.put("valueScope", this.getValueScope()); +// hashMap.put("fieldContent", this.getFieldContent()); +// hashMap.put("formulaHidden", this.getFormulaHidden()); +// hashMap.put("derType", this.getDerType()); +// hashMap.put("fieldContent2", this.getFieldContent2()); +// hashMap.put("conditionValue", this.getConditionValue()); +// hashMap.put("fieldId", this.getFieldId()); +// hashMap.put("operator", this.getOperator()); +// hashMap.put("fieldValue", this.getFieldValue()); +// hashMap.put("idx", this.getIdx()); +// +// hashMap.put("isUseSql", this.getIsUseSql()); +// hashMap.put("dataSourceId", this.getDataSourceId()); +// hashMap.put("sqlStatement", this.getSqlStatement()); +// +// return hashMap; +// } +// +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldTreeParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldTreeParam.java new file mode 100644 index 0000000..ce185c1 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/request/FieldTreeParam.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.model.datax.datamanage.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FieldTreeParam { + //获取需要 + private Integer type;//指标类型 1. 基础指标 2. sql指标 3.衍生指标 4.接口指标 + //删除需要 + private Long id;//文件夹的id + private String fieldType;//文件夹名字 + private Integer status;//状态 -1 删除 + //新建时需要 + private String parentId;//上层文件夹id + private Integer isCommon;// + + private Long organId;//指标相关的组织id + private Long userId;//用户id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldEnumVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldEnumVo.java new file mode 100644 index 0000000..68fe28e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldEnumVo.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.model.datax.datamanage.vo; + +import com.fibo.ddp.common.model.datax.datamanage.Field; + +import java.util.List; + +/** + * 字段枚举包装类 + * 主要用于决策选项中,选择字段要加载字段对应的枚举值(如果字段是枚举的话) + */ +public class FieldEnumVo { + + private Field field; + + private List enums; + + public Field getField() { + return field; + } + + public void setField(Field field) { + this.field = field; + } + + public List getEnums() { + return enums; + } + + public void setEnums(List enums) { + this.enums = enums; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldFormulaVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldFormulaVo.java new file mode 100644 index 0000000..e2da17e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldFormulaVo.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.common.model.datax.datamanage.vo; + +import java.io.Serializable; + +public class FieldFormulaVo implements Serializable { + + private static final long serialVersionUID = 1L; + + // [{fvalue: "0",formula: "a",farr: [{fieldCN:"引擎字段1-1",fieldCond:[{"inputOne":"c","inputThree":"5"},{"inputOne":"b","inputThree":"12"}]},{fieldCN:"通用字段2贷前",fieldCond:[{"inputOne":"(30,40]","inputThree":"5"},{"inputOne":"[45,51)","inputThree":"12"}]}]}]; + + /** + * 衍生字段公式设置对应的值 + * */ + private String fvalue; + + /** + * 衍生字段公式 + * */ + private String formula; + + /** + * 衍生字段公式里字段的条件区域设置 + * */ + private Integer idx; + + /** + * 衍生字段公式里字段的条件区域设置 + * */ + private String farr; + + /** + * 衍生字段公式里条件区域设置的某个字段中文名 + * */ + private String fieldCN; + + /** + * 衍生字段公式里条件区域设置的某个字段的具体设置 + * */ + private String fieldCond; + + public String getFvalue() { + return fvalue; + } + + public void setFvalue(String fvalue) { + this.fvalue = fvalue; + } + + public String getFormula() { + return formula; + } + + public void setFormula(String formula) { + this.formula = formula; + } + + public Integer getIdx() { + return idx; + } + + public void setIdx(Integer idx) { + this.idx = idx; + } + + public String getFarr() { + return farr; + } + + public void setFarr(String farr) { + this.farr = farr; + } + + public String getFieldCN() { + return fieldCN; + } + + public void setFieldCN(String fieldCN) { + this.fieldCN = fieldCN; + } + + public String getFieldCond() { + return fieldCond; + } + + public void setFieldCond(String fieldCond) { + this.fieldCond = fieldCond; + } + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldSubCondVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldSubCondVo.java new file mode 100644 index 0000000..c61e8f2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datamanage/vo/FieldSubCondVo.java @@ -0,0 +1,108 @@ +package com.fibo.ddp.common.model.datax.datamanage.vo; + +import java.io.Serializable; + +public class FieldSubCondVo implements Serializable{ + + private static final long serialVersionUID = 1L; + + //[{"fieldId":"43","operator":"in","fieldValue":"b","logical":"and"}] + + /** + * 条件字段编号 + * */ + private Integer fieldId; + + /** + * 条件字段的运算符 + * */ + private String operator; + + /** + * 条件字段的条件设置值 + * */ + private String fieldValue; + + /** + * 条件字段间的逻辑符 + * */ + private String logical; + + /** + * 条件字段的值类型 + * */ + private Integer valueType; + + /** + * 条件字段的取值范围 + * */ + private String valueScope; + + /** + * 条件字段的取值范围拆解后的数组 + * */ + private String[] values; + + /** + * 条件字段的字段名 + */ + private String fieldCn; + + + public Integer getFieldId() { + return fieldId; + } + public void setFieldId(Integer fieldId) { + this.fieldId = fieldId; + } + public String getOperator() { + return operator; + } + public void setOperator(String operator) { + this.operator = operator; + } + public String getFieldValue() { + return fieldValue; + } + public void setFieldValue(String fieldValue) { + this.fieldValue = fieldValue; + } + public String getLogical() { + return logical; + } + public void setLogical(String logical) { + this.logical = logical; + } + public Integer getValueType() { + return valueType; + } + public void setValueType(Integer valueType) { + this.valueType = valueType; + } + public String getValueScope() { + return valueScope; + } + public void setValueScope(String valueScope) { + this.valueScope = valueScope; + } + public String[] getValues() { + if(valueType == 3){ + values = valueScope.split(","); + }else{ + values = new String[]{valueScope}; + } + return values; + } + public void setValues(String[] values) { + this.values = values; + } + public String getFieldCn() { + return fieldCn; + } + public void setFieldCn(String fieldCn) { + this.fieldCn = fieldCn; + } + + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/DataSource.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/DataSource.java new file mode 100644 index 0000000..5bd3b4c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/DataSource.java @@ -0,0 +1,107 @@ +package com.fibo.ddp.common.model.datax.datasource; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_field_data_source") +public class DataSource implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 连接名称 + */ + private String name; + + /** + * 数据源类型:MySQL、Oracle、SQLServer、Hive、Spark、Redis + */ + private String type; + + /** + * 主机地址 + */ + private String host; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String password; + + /** + * 端口 + */ + private String port; + + /** + * 数据库名称 + */ + private String dbName; + + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + + /** + * 创建人 + */ + private Long creator; + + /** + * 修改人 + */ + private Long modifier; + + /** + * 企业编号 + */ + private Long organId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 连接地址 + */ + private String url; + + /** + * spark路径 + */ + private String sparkHome; + + /** + * spark应用程序的名称 + */ + private String appName; + + /** + * spark地址 + */ + private String masterUrl; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/MqSource.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/MqSource.java new file mode 100644 index 0000000..1439a0e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/MqSource.java @@ -0,0 +1,104 @@ +package com.fibo.ddp.common.model.datax.datasource; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * (MqSource)实体类 + * + * @author jgp + * @since 2021-12-20 13:31:51 + */ +@Data +@TableName("t_field_mq_source") +public class MqSource implements Serializable { + private static final long serialVersionUID = 775853739970128659L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 消息队列连接名称 + */ + private String name; + /** + * 消息队列类型:kafka + */ + private String type; + /** + * 连接地址 + */ + private String serverAddrs; + /** + * 数据库地址 + */ + private String topic; + /** + * 用户名 + */ + private String groupId; + /** + * offset设置:earliest,latest,none + */ + private String autoOffsetReset; + /** + * 自动提交0:false 1:true + */ + private Boolean enableAutoCommit; + /** + * 超时时间 + */ + private Long timeout; + /** + * 自动提交延时 + */ + private Long autoCommitInterval; + /** + * 消费线程数 + */ + private Integer concurrency; + /** + * key解析器默认:StringDeserializer + */ + private String keyDeserializer; + /** + * value解码器默认:StringDeserializer + */ + private String valueDeserializer; + /** + * 消息体 + */ + private String messageBody; + /** + * 状态 0:无效,1:有效,-1删除 + */ + private Integer status; + /** + * 创建人 + */ + private Long creator; + /** + * 修改人 + */ + private Long modifier; + /** + * 企业编号 + */ + private Long organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/request/DataSourceListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/request/DataSourceListParam.java new file mode 100644 index 0000000..3f6f91d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/request/DataSourceListParam.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.datax.datasource.request; + + +import com.fibo.ddp.common.model.common.PageDto; +import lombok.Data; + +import java.util.List; + +@Data +public class DataSourceListParam extends PageDto { + + /** + * 数据源类型 + */ + private List typeList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/vo/DataSourceVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/vo/DataSourceVo.java new file mode 100644 index 0000000..7308d31 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/datasource/vo/DataSourceVo.java @@ -0,0 +1,112 @@ +package com.fibo.ddp.common.model.datax.datasource.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class DataSourceVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + private Integer id; + + /** + * 连接名称 + */ + private String name; + + /** + * 数据源类型:MySQL、Oracle、SQLServer、Hive、Spark、Redis + */ + private String type; + + /** + * 主机地址 + */ + private String host; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String password; + + /** + * 端口 + */ + private String port; + + /** + * 数据库名称 + */ + private String dbName; + + /** + * 状态 0:无效,1:有效 + */ + private Integer status; + + /** + * 创建人 + */ + private Integer creator; + + /** + * 创建人名称 + */ + private String creatorName; + + /** + * 修改人 + */ + private Integer modifier; + + /** + * 修改人名称 + */ + private String modifierName; + + /** + * 企业编号 + */ + private Integer organId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 连接地址 + */ + private String url; + + /** + * spark路径 + */ + private String sparkHome; + + /** + * spark应用程序的名称 + */ + private String appName; + + /** + * spark地址 + */ + private String masterUrl; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/home/BusinessCallVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/home/BusinessCallVo.java new file mode 100644 index 0000000..174acea --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/datax/home/BusinessCallVo.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.model.datax.home; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BusinessCallVo { + private String dayTime; + private Integer useNum; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/EngineVersionContent.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/EngineVersionContent.java new file mode 100644 index 0000000..b996602 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/EngineVersionContent.java @@ -0,0 +1,64 @@ +package com.fibo.ddp.common.model.enginex.dataflow; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (EngineVersionContent)实体类 + * + * @author jgp + * @since 2021-12-23 10:21:07 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_engine_version_content") +public class EngineVersionContent implements Serializable { + + private static final long serialVersionUID = 501475813219875839L; + + /** + * 引擎版本id + */ + @TableId(type = IdType.INPUT) + private Long engineVersionId; + /** + * 引擎类型 + */ + private String engineType; + /** + * 引擎内容 + */ + private String engineContent; + /** + * 引擎执行内容 + */ + private String engineScript; + + /** + * 创建人id + */ + private Long createUserId; + + /** + * 修改人id + */ + private Long updateUserId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowEngineContentVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowEngineContentVo.java new file mode 100644 index 0000000..642f6b5 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowEngineContentVo.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.model.enginex.dataflow.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.checkerframework.checker.units.qual.A; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DataFlowEngineContentVo { + /** + * 资源id + */ + private Long sourceId = 0L; + /** + * 节点列表 + */ + private List nodeList = new ArrayList<>(); + /** + * 事件匹配处理 + */ + private EventDispose eventDispose = new EventDispose("","",new HashMap<>()); +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowNodeVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowNodeVo.java new file mode 100644 index 0000000..dab1148 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/DataFlowNodeVo.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.model.enginex.dataflow.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import lombok.Data; + +@Data +public class DataFlowNodeVo { + /** + * 节点名 + */ + private String nodeName; + /** + * + */ + private String nodeType; + /** + * 规则部分 + */ + private BaseRule baseRule; + + @JsonSerialize(using = ToStringSerializer.class) + private Long baseRuleId; + /** + * 时间值 + */ + private Long fixedValue; + /** + * 时间单位 + */ + private String timeUnit; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EngineVersionContentVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EngineVersionContentVo.java new file mode 100644 index 0000000..3a515d1 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EngineVersionContentVo.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.enginex.dataflow.vo; + +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingEngineContentVo; +import lombok.Data; + +@Data +public class EngineVersionContentVo extends EngineVersionContent { + /** + * 数据流引擎参数 + */ + private DataFlowEngineContentVo dataFlowEngineContentVo; + + /** + * 营销引擎参数 + */ + private MarketingEngineContentVo marketingEngineContentVo; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EventDispose.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EventDispose.java new file mode 100644 index 0000000..28c8d89 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/dataflow/vo/EventDispose.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.enginex.dataflow.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EventDispose { + /** + * 触达方式 Sms、App、WebHook、WeChat + */ + private String touchType ; + /** + * 模板编码 + */ + private String templateCode; + /** + * 变量配置 + */ + private Map params ; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/AudienceNodeDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/AudienceNodeDto.java new file mode 100644 index 0000000..50c5987 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/AudienceNodeDto.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.enginex.marketing.dto; + +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import lombok.Data; + +import java.io.Serializable; + +/** + * 受众用户节点dto + */ +@Data +public class AudienceNodeDto implements Serializable { + private static final long serialVersionUID = 1546466126108481180L; + /** + * 节点id + */ + private Long nodeId; + /** + * 受众用户需要满足的条件 + */ + private BaseRule baseRule; + /** + * 条件id + */ + private Long baseRuleId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TargetSettingNodeDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TargetSettingNodeDto.java new file mode 100644 index 0000000..14eeff2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TargetSettingNodeDto.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.model.enginex.marketing.dto; + +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import lombok.Data; + +import java.io.Serializable; + +/** + * 目标设置节点dto + */ +@Data +public class TargetSettingNodeDto implements Serializable { + private static final long serialVersionUID = -2245329320399100660L; + /** + * 节点id + */ + private Long nodeId; + /** + * 首要目标 + */ + // 目标时间 + private int primaryTime; + // 目标时间对应的单位(分钟、小时、天) + private String primaryTimeUnit; + // 目标对应的条件 + private BaseRule primaryRule; + // 条件id + private Long primaryRuleId; + + /** + * 次要目标(选填) + */ + // 目标时间 + private int secondaryTime; + // 目标时间对应的单位(分钟、小时、天) + private String secondaryTimeUnit; + // 目标对应的条件 + private BaseRule secondaryRule; + // 条件id + private Long secondaryRuleId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TouchConfigNodeDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TouchConfigNodeDto.java new file mode 100644 index 0000000..81b2fc2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TouchConfigNodeDto.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.model.enginex.marketing.dto; + +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * 触达配置节点dto + */ +@Data +public class TouchConfigNodeDto implements Serializable { + private static final long serialVersionUID = -3512433227550450679L; + /** + * 节点id + */ + private Long nodeId; + /** + * 用户筛选规则 + */ + private BaseRule userSelectRule; + /** + * 条件id + */ + private Long userSelectRuleId; + /** + * 触达方式 Sms、App、WebHook、WeChat + */ + private String touchType; + /** + * 模板编码 + */ + private String templateCode; + /** + * 变量配置 + */ + private Map params; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TriggerSettingNodeDto.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TriggerSettingNodeDto.java new file mode 100644 index 0000000..af39b53 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/dto/TriggerSettingNodeDto.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.model.enginex.marketing.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 触发设置节点dto + */ +@Data +public class TriggerSettingNodeDto implements Serializable { + private static final long serialVersionUID = 1025007759237888120L; + + /** + * 节点id + */ + private Long nodeId; + /** + * 触发时间单位(每天、每周、每月) + */ + private String triggerUnit; + /** + * 触发时间,精确到时分 + */ + private String triggerTime; + /** + * 开始时间 + */ + private Date startDate; + /** + * 结束时间 + */ + private Date endDate; + /** + * 参与类型 1:参与一次,2:参与多次 + */ + private int joinType; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeDateResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeDateResult.java new file mode 100644 index 0000000..354d265 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeDateResult.java @@ -0,0 +1,80 @@ +package com.fibo.ddp.common.model.enginex.marketing.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 营销引擎节点当天结果表(MarketingEngineNodeDateResult)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_marketing_engine_node_date_result") +public class MarketingEngineNodeDateResult implements Serializable { + private static final long serialVersionUID = -26970339169147139L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 引擎id + */ + private Integer engineId; + /** + * 引擎版本id + */ + private Integer engineVersionId; + /** + * 引擎名称 + */ + private String engineName; + /** + * 节点id + */ + private Integer nodeId; + /** + * 当前日期 + */ + private Date currentDate; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeResult.java new file mode 100644 index 0000000..3eb5859 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineNodeResult.java @@ -0,0 +1,75 @@ +package com.fibo.ddp.common.model.enginex.marketing.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * 营销引擎节点结果表(MarketingEngineNodeResult)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_marketing_engine_node_result") +public class MarketingEngineNodeResult implements Serializable { + private static final long serialVersionUID = -78375198011828784L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 引擎id + */ + private Integer engineId; + /** + * 引擎版本id + */ + private Integer engineVersionId; + /** + * 引擎名称 + */ + private String engineName; + /** + * 节点id + */ + private Integer nodeId; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineResult.java new file mode 100644 index 0000000..a7a3edb --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/entity/MarketingEngineResult.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.common.model.enginex.marketing.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import java.io.Serializable; + +/** + * 营销引擎结果表(MarketingEngineResult)实体类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +@TableName("t_marketing_engine_result") +public class MarketingEngineResult implements Serializable { + private static final long serialVersionUID = -51516273891374154L; + + @TableId(type = IdType.AUTO) + /** + * 主键 + */ + private Integer id; + /** + * 引擎id + */ + private Integer engineId; + /** + * 引擎版本id + */ + private Integer engineVersionId; + /** + * 引擎名称 + */ + private String engineName; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; + /** + * 组织编号 + */ + private Integer organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultReqVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultReqVo.java new file mode 100644 index 0000000..bc058d1 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultReqVo.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +import java.util.Date; + +/** + * 营销引擎数据详情请求VO + */ +@Data +public class MarketingDataResultReqVo extends BaseParam { + private static final long serialVersionUID = -221159747546752923L; + // 详情页 + /** + * 引擎版本id + */ + private Integer engineVersionId; + /** + * 搜索开始时间 + */ + private Date startDate; + /** + * 搜索结束时间 + */ + private Date endDate; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultRspVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultRspVo.java new file mode 100644 index 0000000..9c25e71 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingDataResultRspVo.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 营销引擎数据详情响应VO + */ +@Data +public class MarketingDataResultRspVo implements Serializable { + private static final long serialVersionUID = -221159747546752923L; + /** + * 引擎版本id + */ + private Integer engineVersionId; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; + + List nodeResultRspVoList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingEngineContentVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingEngineContentVo.java new file mode 100644 index 0000000..953cf86 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingEngineContentVo.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import com.fibo.ddp.common.model.enginex.marketing.dto.AudienceNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.dto.TargetSettingNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.dto.TouchConfigNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.dto.TriggerSettingNodeDto; +import lombok.Data; + +import java.util.List; + +/** + * 营销引擎节点配置VO + */ +@Data +public class MarketingEngineContentVo { + + /** + * 触发设置节点 + */ + private TriggerSettingNodeDto triggerSettingNodeDto; + /** + * 受众用户节点 + */ + private AudienceNodeDto audienceNodeDto; + /** + * 触达配置节点(暂时只支持多个触达节点串行方式) + */ + private List touchConfigNodeDtoList; + /** + * 目标设置节点 + */ + private TargetSettingNodeDto targetSettingNodeDto; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingListResultReqVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingListResultReqVo.java new file mode 100644 index 0000000..3766dca --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingListResultReqVo.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +/** + * 营销引擎结果列表请求VO + */ +@Data +public class MarketingListResultReqVo extends BaseParam { + private static final long serialVersionUID = -221159747546752923L; + // 列表页 + /** + * 搜索关键字(引擎id或者引擎名称) + */ + private String searchKey; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeDateResultRspVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeDateResultRspVo.java new file mode 100644 index 0000000..430456d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeDateResultRspVo.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 营销引擎节点当天结果VO + */ +@Data +public class MarketingNodeDateResultRspVo implements Serializable { + private static final long serialVersionUID = 1874380391698401062L; + /** + * 当前日期 + */ + private Date currentDate; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeResultRspVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeResultRspVo.java new file mode 100644 index 0000000..5d006fb --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/marketing/vo/MarketingNodeResultRspVo.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.model.enginex.marketing.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 营销引擎节点结果VO + */ +@Data +public class MarketingNodeResultRspVo implements Serializable { + private static final long serialVersionUID = -4870605020047702174L; + /** + * 节点id + */ + private Integer nodeId; + /** + * 累计进入数 + */ + private Integer enterNum; + /** + * 累计触发数 + */ + private Integer touchNum; + /** + * 累计目标完成数 + */ + private Integer completeNum; + /** + * 目标完成率 + */ + private Float completeRate; + + List nodeDateResultRspVoList; +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResult.java new file mode 100644 index 0000000..4227240 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResult.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.common.model.enginex.personas; + +import java.util.Date; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * (PersonasEngineResult)实体类 + * + * @author jgp + * @since 2022-01-06 14:23:07 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_personas_engine_result") +public class PersonasEngineResult implements Serializable { + + private static final long serialVersionUID = -31398229059101813L; + + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 引擎id + */ + private Long engineId; + + /** + * 引擎版本id + */ + private Long engineVersionId; + + /** + * 引擎名称 + */ + private String engineName; + + /** + * 批次号 + */ + private Long batchNo; + + /** + * 批次数据量 + */ + private Long batchNum; + + /** + * 创建时间 + */ + private Date createTime; + @TableField(exist = false) + private Date queryStartTime; + @TableField(exist = false) + private Date queryEndTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResultDetail.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResultDetail.java new file mode 100644 index 0000000..6dbb5d5 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/PersonasEngineResultDetail.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.model.enginex.personas; + +import java.util.Date; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * (PersonasEngineResultDetail)实体类 + * + * @author jgp + * @since 2022-01-06 14:24:57 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_personas_engine_result_detail") +public class PersonasEngineResultDetail implements Serializable { + + private static final long serialVersionUID = 921135339454407581L; + + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 引擎id + + + */ + private Long engineId; + + /** + * 引擎版本id + + */ + private Long engineVersionId; + + /** + * 批次号 + */ + private Long batchNo; + + /** + * 用户id + */ + private Long userId; + + /** + * 标签id + */ + private Long tagId; + /** + * 标签版本id + * + */ + private Long tagVersionId; + + /** + * 标签值 + */ + private String tagValue; + + /** + * 创建时间 + */ + private Date createTime; + @TableField(exist = false) + private Date queryStartTime; + @TableField(exist = false) + private Date queryEndTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReport.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReport.java new file mode 100644 index 0000000..6b93ead --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReport.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.enginex.personas.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PersonasReport { + private String tagName; + private String tagVersionCode; + private Long tagId; + private Long tagVersionId; + private String tagValue; + private int hitCount; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReportParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReportParam.java new file mode 100644 index 0000000..e415933 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/personas/vo/PersonasReportParam.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.model.enginex.personas.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PersonasReportParam { + + /** + * 引擎id + */ + private Long engineId; + + /** + * 引擎版本id + */ + private Long engineVersionId; + + /** + * 批次号 + */ + private Long batchNo; + /** + * 查询起点时间 + */ + private Date queryStartTime; + /** + * 查询终点时间 + */ + private Date queryEndTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Engine.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Engine.java new file mode 100644 index 0000000..e986db6 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Engine.java @@ -0,0 +1,96 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@TableName("t_engine") +public class Engine implements Serializable { + private static final long serialVersionUID = -6611916471057697499L; + + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 编号 + */ + private String code; + /** + * 名称 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 引擎类型: + */ + private String engineType; + /** + * 状态:0被删除1正常使用 + */ + private Integer status; + /** + * 创建时间 + */ + private Date createDatetime; + /** + * 修改时间 + */ + private Date updateDatetime; + /** + * 创建者 + */ + private Long creator; + /** + * 企业编号 + */ + private Long organId; + /** + * 修改人 + */ + private Long userId; + /** + * 调用方式 1:同步,2:异步 + */ + private Integer callbackType; + /** + * 回调地址 + */ + private String callbackUrl; + /** + * 异常回调地址 + */ + private String exceptionCallbackUrl; + + @TableField(exist = false) + private Integer runStatus = 0; + + /** + * 引擎版本集合 + * */ + @TableField(exist = false) + private List engineVersionList; + + /** + * 运行状态 + */ + @TableField(exist = false) + private int runState; + + /** + * 是否被选中 + */ + @TableField(exist = false) + private boolean checked; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineNode.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineNode.java new file mode 100644 index 0000000..7808d49 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineNode.java @@ -0,0 +1,85 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("t_engine_node") +public class EngineNode implements Serializable{ + + private static final long serialVersionUID = -1867357850853531748L; + /** + * 节点信息编号 + */ + @TableId(type = IdType.AUTO) + private Long nodeId; + + /** + * 版本编号 + */ + private Long versionId; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点代号 + */ + private String nodeCode; + + /** + * 节点顺序 + */ + private Integer nodeOrder; + + /** + * 节点类型 + */ + private Integer nodeType; + + /** + * 节点信息 + */ + private String nodeJson; + + /** + * 节点横坐标 + */ + private Double nodeX; + + /** + * 节点纵坐标 + */ + private Double nodeY; + + /** + * 节点脚本 + */ + private String nodeScript; + + /** + * 下个节点(可能是多个) + */ + private String nextNodes; + + /** + * 节点用到的参数列表 + */ + private String params; + + /** + * 上一个节点的id,多个节点逗号分隔 + */ + private String parentId; + + /** + * 节点配置快照 + */ + private String snapshot; +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSet.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSet.java new file mode 100644 index 0000000..10c9942 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSet.java @@ -0,0 +1,74 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EngineResultSet { + + private Integer id; + private String uid; + private String pid; + private String input; + private String output; + private Date createDatetime; + + private String result; + + private Long engineId; + + private Integer engineVersion; + + private String uuid; + + private String engineName; + + private String engineCode; + + private Date startDate; + + private Date endDate; + + private Integer type; + + private Integer subVersion; + + private String scorecardscore; + + private String datilResult; + + /** + *决策表结果 + */ + private String decisionTablesResult; + + /** + *决策树结果 + */ + private String decisionTreeResult; + + /** + * 批量测试批次号 + */ + private String batchNo; + + /** + * 批量测试每批测试开始时间 + */ + private Date startTime; + + /** + * 批量测试每批次花费时间 + */ + private String costTime; + + /** + * hbase行键 + */ + private String hbaseRowKey; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSetDTO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSetDTO.java new file mode 100644 index 0000000..82de947 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineResultSetDTO.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.util.Date; + +/** + * Created by niuge on 2021/11/15. + */ +@Data +public class EngineResultSetDTO { + + private Date callDate; + + private String result; + + private Long engineId; + + private Long engineVersion; + + private String engineName; + + private String engineCode; + + private Long organId; + + private Long total; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineRule.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineRule.java new file mode 100644 index 0000000..0d070b8 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineRule.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.util.Map; + +@Data +public class EngineRule { + + private String refused; + + private String code ; + + private String policyName; + + private String desc; + + private String Strtus; + + private Mapfields; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersion.java new file mode 100644 index 0000000..72f8343 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersion.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@TableName("t_engine_version") +public class EngineVersion implements Comparable, Serializable { + + private static final long serialVersionUID = 2923432053414979455L; + + /** + * 版本编号 + */ + @TableId(type = IdType.AUTO) + private Long versionId; + + /** + * 引擎编号 + */ + private Long engineId; + /** + * 引擎类型 + */ + private String engineType; + + /** + * 版本 + */ + private Integer version; + + /** + * 子版本 + */ + private Integer subVersion; + + /** + * 是否部署(0:未部署1:正在运行,2申请部署) + */ + private Integer bootState; + + /** + * 是否删除(0:在回收站中,可恢复,1:正常,2彻底删除) + */ + private Integer status; + + /** + * 布局方式(1,2,预留通用布局方式,0自定义布局) + */ + private Integer layout; + + /** + * 创建者 + */ + private Long userId; + + /** + * 创建时间 + */ + private String createTime; + + /** + * 最新修改者 + */ + private Long latestUser; + + /** + * 最后修改时间 + */ + private String latestTime; + + @TableField(exist = false) + private List engineNodeList; + @TableField(exist = false) + private EngineVersionContent engineVersionContent; + + @Override + public int compareTo(EngineVersion o) { + if(version!=o.getVersion()){ + return version-o.getVersion(); + }else if(!(subVersion == o.getSubVersion())){ + return subVersion - o.getSubVersion(); + }else { + return version-o.getVersion(); + } + } +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersionVo.java new file mode 100644 index 0000000..203f2ce --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/EngineVersionVo.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.util.List; + +@Data +public class EngineVersionVo implements Comparable{ + + private EngineVersion engineVersion; + + private List subEngineVersionList; + + @Override + public int compareTo(EngineVersionVo o) { + if(engineVersion.getVersion()!=o.getEngineVersion().getVersion()){ + return engineVersion.getVersion()-o.getEngineVersion().getVersion(); + } + return -1; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/ExecuteParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/ExecuteParam.java new file mode 100644 index 0000000..776e466 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/ExecuteParam.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExecuteParam { + private Long engineId;//引擎id + + private Long organId;//组织id + + private String biz_enc = "0";//加解密 + + private Long timestamp ;//时间戳 + + private String businessId;//业务id + + private Map fields;//指标 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/IndexEngineReportVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/IndexEngineReportVo.java new file mode 100644 index 0000000..680da72 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/IndexEngineReportVo.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IndexEngineReportVo implements Serializable { + + private static final long serialVersionUID = -1274492726714567316L; + private String dayTime; + private String monthTime; + private Integer engineId; + private String engineName; + private Integer useNum; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/InputParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/InputParam.java new file mode 100644 index 0000000..19994e0 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/InputParam.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class InputParam { + + private Map inputParam; + + private List result; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Result.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Result.java new file mode 100644 index 0000000..95d7199 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/Result.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.enginex.risk; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class Result { + private String resultType;//规则1代表加减法,2拒绝规则 + private Integer id;//规则编号 + private String code;//规则code + private String name; + private String value; + private Map map;//评分 + private List list; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/consts/EngineNodeConst.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/consts/EngineNodeConst.java new file mode 100644 index 0000000..a292e2b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/consts/EngineNodeConst.java @@ -0,0 +1,6 @@ +package com.fibo.ddp.common.model.enginex.risk.consts; + +public class EngineNodeConst { + + public static final String REMOVE_LINK_PARENT_ID = "-1";//删除线时为下一个节点的parentId设置标识 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/EngineListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/EngineListParam.java new file mode 100644 index 0000000..848d818 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/EngineListParam.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.model.enginex.risk.request; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +@Data +public class EngineListParam extends BaseParam { + + private Long nodeId; + private Long engineId; + private String searchString; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/KnowledgeTreeListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/KnowledgeTreeListParam.java new file mode 100644 index 0000000..e9839d5 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/KnowledgeTreeListParam.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.enginex.risk.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KnowledgeTreeListParam { + private String treeType;//树形分类:0:基础规则树 1:评分卡的树 2:回收站的树 3:决策表树,4:复杂规则树(逗号分割) + private Long organId;//组织id + private Long userId;//用户id + private Integer status;//状态 -1删除 + private Integer type;//1组织通用 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/ModelListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/ModelListParam.java new file mode 100644 index 0000000..4fd4527 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/ModelListParam.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.model.enginex.risk.request; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +@Data +public class ModelListParam extends BaseParam { + + private Long nodeId; + private Long engineId; + private String searchString; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/NodeParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/NodeParam.java new file mode 100644 index 0000000..659c974 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/request/NodeParam.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.model.enginex.risk.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NodeParam { + private Long currentNodeId;//当前节点id + private String preNodeId;//前一个节点id,逗号分隔 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/TestResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/TestResponse.java new file mode 100644 index 0000000..1aad689 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/TestResponse.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.enginex.risk.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TestResponse { + private Map success;//成功数据 key为结果。value为对应结果条数,空结果key为空字符串 + private Integer successNum;//成功条数 + private Integer failNum;//失败条数 + private Integer total;//总数 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/DecisionFlowOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/DecisionFlowOutputResponse.java new file mode 100644 index 0000000..925d874 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/DecisionFlowOutputResponse.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +/** + * 决策流输出内容 (节点类型-》节点列表-》节点输出字段) + * + */ +@Data +public class DecisionFlowOutputResponse { + + /** + * 节点类型集合 + */ + private List nodeTypeList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbInfoOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbInfoOutputResponse.java new file mode 100644 index 0000000..089f6dd --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbInfoOutputResponse.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class ListDbInfoOutputResponse { + + /** + * 名单库id + */ + private Long id; + + /** + * 名单库名称 + */ + private String listName; + + /** + * 节点策略输出字段集合 + */ + private List listDbOutputList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbOutputResponse.java new file mode 100644 index 0000000..e4fc23a --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/ListDbOutputResponse.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class ListDbOutputResponse { + + /** + * 名单库的统计信息 + */ + private List statisticsOutputList; + + /** + * 名单库信息 + */ + private List listDbInfoOutput; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeInfoResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeInfoResponse.java new file mode 100644 index 0000000..e5a891c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeInfoResponse.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +/** + * 节点信息 + */ +@Data +public class NodeInfoResponse { + + /** + * 节点编号 + */ + private Long nodeId; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点策略输出字段集合 + */ + private List strategyOutputList; + + /** + * 规则集输出信息 + */ + private RuleOutputResponse ruleOutput; + + /** + * 名单库输出信息 + */ + private ListDbOutputResponse listDbOutput; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeStrategyOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeStrategyOutputResponse.java new file mode 100644 index 0000000..ae8193a --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeStrategyOutputResponse.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +/** + * 节点策略输出字段 + */ +@Data +public class NodeStrategyOutputResponse { + + /** + * 字段英文名 + * */ + private String fieldEn; + + /** + * 字段中文名 + * */ + private String fieldCn; + /** + * 字段类型 1数字,2字符串,6json + */ + private Integer valueType; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeTypeResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeTypeResponse.java new file mode 100644 index 0000000..9947fb2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/NodeTypeResponse.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +/** + * 节点类型 + */ +@Data +public class NodeTypeResponse { + + /** + * 节点类型 + */ + private Integer nodeType; + + /** + * 节点类型名称 + */ + private String nodeTypeName; + + /** + * 节点信息集合 + */ + private List nodeInfoList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleInfoOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleInfoOutputResponse.java new file mode 100644 index 0000000..64396cc --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleInfoOutputResponse.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class RuleInfoOutputResponse { + + /** + * 规则id + */ + private Long id; + + /** + * 名称 + * */ + private String name; + + /** + * 代码 + * */ + private String code; + + /** + * 节点策略输出字段集合 + */ + private List ruleOutputList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleOutputResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleOutputResponse.java new file mode 100644 index 0000000..0364ec4 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/risk/response/param/RuleOutputResponse.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.model.enginex.risk.response.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class RuleOutputResponse { + + /** + * 规则的统计信息 + */ + private List statisticsOutputList; + + /** + * 规则信息 + */ + private List ruleInfoList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/ExpressionParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/ExpressionParam.java new file mode 100644 index 0000000..52e4645 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/ExpressionParam.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.enginex.runner; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +//表达式的参数实体类 +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ExpressionParam { + private String fieldEn;//表达式中key字段en + private String operator;//表达式的操作符 + private Integer variableType;//表达式中value类型,1常量 2变量,3自定义 + private String fieldValue;//表达式中对应常量value值或者变量key + private String executionLogic;//执行逻辑 + private Integer conditionType;//规则节点的类型:1-关系节点,2-表达式节点 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/Sandbox.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/Sandbox.java new file mode 100644 index 0000000..9631514 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/enginex/runner/Sandbox.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.model.enginex.runner; + +import lombok.Data; + +@Data +public class Sandbox { + private Integer sandbox;//沙盒组编号 + private Integer proportion;//沙盒占用比例 + private String nextNode;//下个节点序号 + private Integer sum;//分母 + private Integer startNumber;//起始值 + private Integer endNumberl;//终止值 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/DecisionFlowRequestDTO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/DecisionFlowRequestDTO.java new file mode 100644 index 0000000..af17c74 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/DecisionFlowRequestDTO.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 决策流监控请求参数 数据抽象类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DecisionFlowRequestDTO { + /** + * hbase中 monitor_decision_flow 对应的RowKey + * t_resultset 表中字段hbase_row_key + */ + private String hbaseRowKey; + /** + * 监控Mysql版本实现 决策流执行结果 记录id + */ + private String resultId; + /** + * 监控上一层级记录id + */ + private String monitorParentId; + /** + * 节点id + */ + private String nodeId; + /** + * 策略id + */ + private String strategyId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlow.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlow.java new file mode 100644 index 0000000..8e95cf2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlow.java @@ -0,0 +1,73 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * 决策流监控 业务抽象 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorDecisionFlow { + private String rowKey; + /** + * 决策流监控信息 + */ + private MonitorInfo monitorInfo; + + /** + * 决策流基本信息 + */ + private BaseInfo baseInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class MonitorInfo{ + /** + * 入参 + */ + private Map params; + /** + * 快照 (所有包含节点) + */ + private List snapshot; + /** + * 执行过程 (执行节点id) + */ + private List process; + + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class BaseInfo{ + /** + * 业务ID + */ + private String businessId; + /** + * 决策流名称 + */ + private String engineName; + /** + * 决策流版本id + */ + private String engineVersionId; + /** + * 执行引擎相关版本信息 + */ + private EngineVersion engineInfo; + + } + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlowDTO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlowDTO.java new file mode 100644 index 0000000..1f28815 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorDecisionFlowDTO.java @@ -0,0 +1,49 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * 决策流监控信息 数据转换抽象 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorDecisionFlowDTO { + /** + * 入参 + */ + private Map params; + /** + * 快照 (所有包含节点) + */ + private List snapshot; + /** + * 执行过程 (执行节点id) + */ + private List process; + + + + /** + * 业务ID + */ + private String businessId; + /** + * 决策流名称 + */ + private String engineName; + /** + * 决策流版本id + */ + private String engineVersionId; + /** + * 执行引擎相关版本信息 + */ +// private EngineVersionV3 engineInfo; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorNode.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorNode.java new file mode 100644 index 0000000..ca1c0d6 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorNode.java @@ -0,0 +1,81 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorNode { + /** + * 行键 + */ + private String rowKey; + /** + * 节点监控信息 + */ + private MonitorInfo monitorInfo; + + /** + * 节点基本信息 + */ + private BaseInfo baseInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class MonitorInfo{ + /** + * 入参 + */ + private Map params; + /** + * 快照 (节点下对应的配置信息) + */ + private JSONObject snapshot; + /** + * 节点的输出结果 (根据节点类型去获取需要记录的结果) + */ + private JSONObject result; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class BaseInfo{ + /** + * 业务ID + */ + private String businessId; + /** + * 节点id + */ + private String nodeId; + /** + * 节点名称 + */ + private String nodeName; + /** + * 节点类型 + */ + private String nodeType; + /** + * 节点基本信息 + */ + private String nodeInfo; + /** + * 引擎版本id + */ + private String engineVersionId; + /** + * 所属引擎相关版本信息 + */ + private EngineVersion engineInfo; + + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorStrategy.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorStrategy.java new file mode 100644 index 0000000..50ec905 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/MonitorStrategy.java @@ -0,0 +1,83 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * 监控中心-- 策略层面 业务模型 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorStrategy { + /** + * 行键 + */ + private String rowKey; + /** + * 节点监控信息 + */ + private MonitorStrategy.MonitorInfo monitorInfo; + + /** + * 节点基本信息 + */ + private MonitorStrategy.BaseInfo baseInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class MonitorInfo{ + /** + * 入参 + */ + private Map params; + /** + * 快照 (策略下对应的配置) + */ + private JSONObject snapshot; + /** + * 策略的输出部分 + */ + private JSONObject result; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class BaseInfo{ + /** + * 业务ID + */ + private String businessId; + /** + * 策略id + */ + private String strategyId; + /** + * 策略名称 + */ + private String strategyName; + /** + * 策略类型 + */ + private String strategyType; + /** + *所属节点id + */ + private String nodeId; + /** + *节点类型 + */ + public String nodeType; + + /** + * 引擎版本id + */ + private String engineVersionId; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorEngine.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorEngine.java new file mode 100644 index 0000000..06a177f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorEngine.java @@ -0,0 +1,45 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 决策流监控 + *

+ */ +@Data +@EqualsAndHashCode() +public class TMonitorEngine { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String businessId; + + private String monitorParentId; + + private Long engineId; + + private String engineName; + + private Long organId; + + private Long engineVersionId; + + private String process; + + private String snapshot; + + private String input; + + private String output; + private Date createTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNode.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNode.java new file mode 100644 index 0000000..b0ffd0d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNode.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 决策流节点层面监控 + *

+ */ +@Data +@EqualsAndHashCode(callSuper = false) +public class TMonitorNode implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String businessId; + + private String monitorParentId; + + private Long engineId; + + private Long organId; + + private Long engineVersionId; + + private Long nodeId; + + private String nodeName; + + private String nodeType; + + private String snapshot; + + private String input; + + private String output; + + private LocalDateTime createTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNodeDTO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNodeDTO.java new file mode 100644 index 0000000..97a0143 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorNodeDTO.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import lombok.Data; + +import java.util.Date; + +/** + * Created by niuge on 2021/11/19. + */ +@Data +public class TMonitorNodeDTO { + + private Date callDate; + + private Long engineId; + + private Long organId; + + private Long engineVersionId; + + private Long nodeId; + + private String nodeName; + + private Long total; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategy.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategy.java new file mode 100644 index 0000000..93be201 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategy.java @@ -0,0 +1,56 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 决策流策略层面监控 + *

+ */ +@Data +@EqualsAndHashCode(callSuper = false) +public class TMonitorStrategy implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String businessId; + + private String monitorParentId; + + private Long engineId; + + private Long organId; + + private Long engineVersionId; + + private Long nodeId; + + private String nodeType; + + private Long strategyId; + + private String strategyName; + + private String strategyType; + + private String snapshot; + + private String input; + + private String result; + + private String output; + + private LocalDateTime createTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategyDTO.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategyDTO.java new file mode 100644 index 0000000..055a31e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/TMonitorStrategyDTO.java @@ -0,0 +1,31 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import lombok.Data; + +import java.util.Date; + +/** + * Created by niuge on 2021/11/16. + */ +@Data +public class TMonitorStrategyDTO { + private Date callDate; + + private String result; + + private Long engineId; + + private Long engineVersionId; + + private String engineName; + + private String engineCode; + + private Long organId; + + private Long strategyId; + + private String strategyName; + + private Long total; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/UserInfo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/UserInfo.java new file mode 100644 index 0000000..43df057 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/decisionflow/UserInfo.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.model.monitor.decisionflow; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UserInfo { + + /** + *基本信息 + */ + private BaseInfo baseInfo; + + @Data + @AllArgsConstructor + public static class BaseInfo{ + private String baseInfo; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/Logger.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/Logger.java new file mode 100644 index 0000000..f48aedb --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/Logger.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.model.monitor.logger; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * ClassName:Logger
+ * Description: 日志实体类.
+ */ +@Data +@TableName("t_logger") +public class Logger { + + /** + * 主键 + * */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 操作类型 + * */ + private String opType; + + + /** + * 公司名称 + * */ + private String organName; + + /** + * 操作名称 + * */ + private String opName; + + /** + * 操作人员id + * */ + private Long opUserId; + + /** + * 操作人员id + * */ + private String opUserName; + + /** + * 组织id + * */ + private Long organId; + + /** + * 方法名 + * */ + private String method; + + /** + * 请求地址 + * */ + private String requestPath; + + /** + * 请求参数 + * */ + private String requestParam; + + /** + * 响应参数 + * */ + private String responseParam; + + /** + * 请求ip + * */ + private String ip; + + /** + * 开始时间 + * */ + private Date startTime; + /** + * 结束时间 + * */ + private Date endTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/request/LoggerParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/request/LoggerParam.java new file mode 100644 index 0000000..97acbc3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/monitor/logger/request/LoggerParam.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.model.monitor.logger.request; + +import com.fibo.ddp.common.model.common.BaseParam; +import lombok.Data; + +@Data +public class LoggerParam extends BaseParam { + + private String searchKey; + private String startDate; + private String endDate; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/aimodel/MachineLearningModels.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/aimodel/MachineLearningModels.java new file mode 100644 index 0000000..05b0b2a --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/aimodel/MachineLearningModels.java @@ -0,0 +1,65 @@ +package com.fibo.ddp.common.model.strategyx.aimodel; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +@TableName("t_machine_learning_models") +public class MachineLearningModels { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String modelName; + + private String description; + + private String modelType; + + private String fileName; + + private String filePath; + + private String modelField; + + private String mappingField; + + private Integer status; + + private Integer creator; + + private Integer modifier; + + private Integer organId; + + private Date createTime; + + private Date updateTime; + + private String resultFieldEn; + + @TableField(exist = false) + private List strategyOutputList; + + /** + * 模型编辑页面传值使用 + */ + @TableField(exist = false) + private List modelFieldArr; + + @TableField(exist = false) + private List mappingFieldArr; + + /** + * 是否被选中(决策流页面使用) + */ + @TableField(exist = false) + private boolean checked; +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRule.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRule.java new file mode 100644 index 0000000..e96ed04 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRule.java @@ -0,0 +1,68 @@ +package com.fibo.ddp.common.model.strategyx.baserule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (BaseRule)实体类 + * + * @author jgp + * @since 2021-12-27 09:46:38 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_base_rule") +public class BaseRule implements Serializable { + + private static final long serialVersionUID = -12797674823526324L; + + /** + * 主键id + */ + @JsonSerialize(using = ToStringSerializer.class) + @TableId(type = IdType.INPUT) + private Long id; + + /** + * 规则类型: + */ + private String ruleType; + + /** + * 组织id + */ + private Long organId; + + /** + * 创建人id + */ + private Long createUserId; + + /** + * 修改人id + */ + private Long updateUserId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + @TableField(exist = false) + private BaseRuleCondition conditionTree; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleCondition.java new file mode 100644 index 0000000..48a720c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleCondition.java @@ -0,0 +1,105 @@ +package com.fibo.ddp.common.model.strategyx.baserule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * (BaseRuleCondition)实体类 + * + * @author jgp + * @since 2021-12-27 09:46:43 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_base_rule_condition") +public class BaseRuleCondition implements Serializable { + + private static final long serialVersionUID = -29775390870188271L; + + /** + * 自增主键 + */ + @JsonSerialize(using = ToStringSerializer.class) + @TableId(type = IdType.INPUT) + private Long id; + + /** + * 规则id + */ + private Long ruleId; + + /** + * 规则节点的类型:1-关系节点,2-表达式节点 3-for表达式 4-for的结果项 5条件组 6条件组的结果条件 + */ + private Integer condType; + + /** + * 逻辑符号:leaf、&&、||、for、condGroup + */ + private String logic; + + /** + * 条件左边值的类型 + */ + private Integer leftType; + + /** + * 左边条件引用的指标id + */ + private Long leftId; + + /** + * 左边的值 + */ + private String leftValue; + + /** + * 操作符 + */ + private String operator; + + /** + * 右边值类型 + */ + private Integer rightType; + + /** + * 右边值引用的指标id + */ + private Long rightId; + + /** + * 右边的值 + */ + private String rightValue; + + /** + * 父id + */ + private Long parentId; + + @TableField(exist = false) + //子条件 + private List children; + + @TableField(exist = false) + private List loopGroupActions = new ArrayList<>();//循环组对应的条件 + + @TableField(exist = false) + private BaseRuleCondition loopResultCondition;//for对应的结果条件的计算条件树 + @TableField(exist = false) + private BaseRuleCondition condGroupResultCondition;//条件组对应的结果计算条件树 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleTypeEnum.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleTypeEnum.java new file mode 100644 index 0000000..aa8e761 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/baserule/BaseRuleTypeEnum.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.model.strategyx.baserule; + +import lombok.Getter; + +@Getter +public enum BaseRuleTypeEnum { + + STRATEGY_TAG_CONDITION("strategy_tag_condition","策略--标签的条件"), + DATA_FLOW_ENGINE("data_flow_engine","数据流引擎--节点的条件"), + MARKETING_ENGINE("marketing_engine","营销引擎--节点的条件"); + + private String type; + private String desc; + + BaseRuleTypeEnum(String type, String desc) { + this.type = type; + this.desc = desc; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ConditionAndOutPut.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ConditionAndOutPut.java new file mode 100644 index 0000000..0758398 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ConditionAndOutPut.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ConditionAndOutPut { + + //过滤条件 + private ListOperationFilterCondition filterCondition; + //条件 + private ListOperationCondition condition; + //块信息 + private ListOperationBlock listOperationBlock; + //条件成功时的输出 + private List successOutput = new ArrayList<>(); + private List defaultOutput= new ArrayList<>(); + //条件执行失败时候的输出 + private List failOutput= new ArrayList<>(); +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperation.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperation.java new file mode 100644 index 0000000..3b3471f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperation.java @@ -0,0 +1,86 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation") +public class ListOperation implements Serializable { + private static final long serialVersionUID = -56400943441634265L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 集合操作名称 + */ + private String name; + /** + * 集合操作代码 + */ + private String code; + /** + * 集合操作描述 + */ + private String description; + /** + * 集合操作类型:1 集合规则,2 集合处理 + */ + private Integer opType; + /** + * 文件夹id + */ + private Long folderId; + /** + * 状态:0 停用 1 启用 -1删除(默认启用) + */ + private Integer status; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 组织id + */ + private Long organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 版本id + */ + @TableField(exist = false) + private List versionList; + @TableField(exist = false) + private String createUserName; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationBlock.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationBlock.java new file mode 100644 index 0000000..e30e744 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationBlock.java @@ -0,0 +1,46 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation_block") +public class ListOperationBlock implements Serializable { + private static final long serialVersionUID = 176027842247885853L; + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 版本id + */ + private Long listOpVersionId; + /** + * 条件区域名称 + */ + private String name; + /** + * 分组指标列表,逗号分割的en列表 + */ + private String groupFields; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationCondition.java new file mode 100644 index 0000000..3e4091b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationCondition.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation_condition") +public class ListOperationCondition implements Serializable { + private static final long serialVersionUID = 763036874769503399L; + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作的id + */ + private Long listOpId; + /** + * 列表操作版本的id + */ + private Long listOpVersionId; + /** + * 列表操作块id + */ + private Long listOpBlockId; + /** + * 关系节点的逻辑符号:&&(并关系),||(或关系) + */ + private String logical; + /** + * 计算维度:1 count 2count(去重) 3 max 4min 5avg + */ + private String opType; + /** + * 计算的参数key + */ + private String opKey; + /** + * 表达式节点的操作符 + */ + private String operator; + /** + * 变量类型,1常量,2变量 + */ + private Integer variableType; + /** + * 表达式节点对应字段的限定值 + */ + private String variableValue; + /** + * 父节点的id 此项为0的是根节点 + */ + private Long parentId; + /** + * 规则节点的类型:1-关系节点,2-表达式节点 + */ + private Integer conditionType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 子条件列表 + */ + @TableField(exist = false) + private List children; +// @TableField(exist = false) +// private String insertTempId;//插入临时id +// +// @TableField(exist = false) +// private String tempParentId;//插入临时父id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationFilterCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationFilterCondition.java new file mode 100644 index 0000000..07a1845 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationFilterCondition.java @@ -0,0 +1,83 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation_filter_condition") +public class ListOperationFilterCondition implements Serializable { + private static final long serialVersionUID = -32041863158292677L; + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作的id + */ + private Long listOpId; + /** + * 列表操作版本的id + */ + private Long listOpVersionId; + /** + * 列表操作块id + */ + private Long listOpBlockId; + /** + * 关系节点的逻辑符号:&&(并关系),||(或关系) + */ + private String logical; + /** + * 计算维度:1 count 2count(去重) 3 max 4min 5avg + */ + private String opType; + /** + * 计算的参数key + */ + private String opKey; + /** + * 表达式节点的操作符 in 、 not in + */ + private String operator; + /** + * 变量类型,1常量,2变量 + */ + private Integer variableType; + /** + * 表达式节点对应字段的限定值 + */ + private String variableValue; + /** + * 父节点的id 此项为0的是根节点 + */ + private Long parentId; + /** + * 规则节点的类型:1-关系节点,2-表达式节点 + */ + private Integer conditionType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 子条件列表 + */ + @TableField(exist = false) + private List children; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationOutput.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationOutput.java new file mode 100644 index 0000000..11b5135 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationOutput.java @@ -0,0 +1,70 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation_output") +public class ListOperationOutput implements Serializable { + private static final long serialVersionUID = 360159112010885143L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作版本id + */ + private Long listOpVersionId; + /** + * 列表操作条件根节点id + */ + private Long listOpConditionId; + /** + * 列表操作块id + */ + private Long listOpBlockId; + /** + * 输出类型:1 命中输出,2未命中输出 + */ + private Integer outputType; + /** + * 输出的key + */ + private String outputKey; + /** + * 输出操作:1 count 2count 去重 3 max 4min 5avg ,6 list + */ + private String outputOp; + /** + * 输出操作对象的key + */ + private String outputOpKey; + /** + * 输出的值 + */ + private String outputValue; + /** + * 输出类型: 1.常量 2.变量 3.自定义 + */ + private Integer variableType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationVersion.java new file mode 100644 index 0000000..0d4daf2 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/collectionrule/ListOperationVersion.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.common.model.strategyx.collectionrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_list_operation_version") +public class ListOperationVersion implements Serializable { + private static final long serialVersionUID = -32462005941219848L; + /** + * 集合操作版本表id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 集合操作id + */ + private Long listOpId; + /** + * 版本code + */ + private String versionCode; + /** + * 版本描述 + */ + private String description; + /** + * 数据源数组或者map的en + */ + private String inputFieldEn; + /** + * 数据源类型:map、list + */ + private String inputFieldType; + /** + * 分组指标列表,逗号分割的en列表 + */ + private String groupFields; + /** + * 状态:-1删除 ,1启用,0停用 + */ + private Integer status; + /** + * 存放执行结果的变量 + */ + private String resultFieldEn; + /** + * 所属组织id + */ + private Long organId; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 集合操作版本配置快照 + */ + private String snapshot; + /** + * 条件和对应输出组合 + */ + @TableField(exist = false) + private List conditionAndOutPutList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataClean.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataClean.java new file mode 100644 index 0000000..5d3a807 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataClean.java @@ -0,0 +1,86 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean") +public class DataClean implements Serializable { + private static final long serialVersionUID = -56400943441634265L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 集合操作名称 + */ + private String name; + /** + * 集合操作代码 + */ + private String code; + /** + * 集合操作描述 + */ + private String description; + /** + * 集合操作类型:1 集合规则,2 集合处理 + */ + private Integer opType; + /** + * 文件夹id + */ + private Long folderId; + /** + * 状态:0 停用 1 启用 -1删除(默认启用) + */ + private Integer status; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 组织id + */ + private Long organId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 版本id + */ + @TableField(exist = false) + private List versionList; + @TableField(exist = false) + private String createUserName; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanBlock.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanBlock.java new file mode 100644 index 0000000..9e4fc6b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanBlock.java @@ -0,0 +1,54 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_block") +public class DataCleanBlock implements Serializable { + private static final long serialVersionUID = 176027842247885853L; + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 版本id + */ + private Long dataCleanVersionId; + /** + * 条件区域名称 + */ + private String name; + /** + * 选择来源:original原数据,data_op原数据操作,handle_collection选择集合 + */ + private String opType; + /** + * 处理集合 + */ + private String handleCollection; + /** + * 分组指标列表,逗号分割的en列表 + */ + private String groupFields; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanCondition.java new file mode 100644 index 0000000..6b4ebf8 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanCondition.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_condition") +public class DataCleanCondition implements Serializable { + private static final long serialVersionUID = 763036874769503399L; + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作的id + */ + private Long dataCleanId; + /** + * 列表操作版本的id + */ + private Long dataCleanVersionId; + /** + * 列表操作块id + */ + private Long dataCleanBlockId; + /** + * 关系节点的逻辑符号:&&(并关系),||(或关系) + */ + private String logical; + /** + * 选择来源:original原数据,data_op原数据操作,handle_collection选择集合 + */ + private String opType; + /** + * 计算的参数key + */ + private String opKey; + /** + * 表达式节点的操作符 + */ + private String operator; + /** + * 变量类型,1常量,2变量 + */ + private Integer variableType; + /** + * 表达式节点对应字段的限定值 + */ + private String variableValue; + /** + * 父节点的id 此项为0的是根节点 + */ + private Long parentId; + /** + * 规则节点的类型:1-关系节点,2-表达式节点 + */ + private Integer conditionType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 子条件列表 + */ + @TableField(exist = false) + private List children; +// @TableField(exist = false) +// private String insertTempId;//插入临时id +// +// @TableField(exist = false) +// private String tempParentId;//插入临时父id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanConditionAndOutPut.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanConditionAndOutPut.java new file mode 100644 index 0000000..1564b29 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanConditionAndOutPut.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DataCleanConditionAndOutPut { + + //选择集合时的过滤条件 + private DataCleanFilterCondition inputFilterCondition; + //输出结果过滤条件 + private DataCleanFilterCondition resultFilterCondition; + //条件 + private DataCleanCondition condition; + //块信息 + private DataCleanBlock dataCleanBlock; + //条件成功时的输出 + private List successOutput = new ArrayList<>(); + private List defaultOutput= new ArrayList<>(); + //条件执行失败时候的输出 + private List failOutput= new ArrayList<>(); +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanFilterCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanFilterCondition.java new file mode 100644 index 0000000..1f770ff --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanFilterCondition.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_filter_condition") +public class DataCleanFilterCondition implements Serializable { + private static final long serialVersionUID = -32041863158292677L; + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作的id + */ + private Long dataCleanId; + /** + * 列表操作版本的id + */ + private Long dataCleanVersionId; + /** + * 列表操作块id + */ + private Long dataCleanBlockId; + /** + *过滤类型:input/result + */ + private String filterType; + /** + * 关系节点的逻辑符号:&&(并关系),||(或关系) + */ + private String logical; + /** + * 计算维度:1 count 2count(去重) 3 max 4min 5avg + */ + private String opType; + /** + * 计算的参数key + */ + private String opKey; + /** + * 表达式节点的操作符 in 、 not in + */ + private String operator; + /** + * 变量类型,1常量,2变量 + */ + private Integer variableType; + /** + * 表达式节点对应字段的限定值 + */ + private String variableValue; + /** + * 父节点的id 此项为0的是根节点 + */ + private Long parentId; + /** + * 规则节点的类型:1-关系节点,2-表达式节点 + */ + private Integer conditionType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 子条件列表 + */ + @TableField(exist = false) + private List children; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOriginalDataOp.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOriginalDataOp.java new file mode 100644 index 0000000..aaac62b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOriginalDataOp.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * (DataCleanOriginalDataOp)表实体类 + * + * @author makejava + * @since 2022-03-21 11:15:01 + */ +@SuppressWarnings("serial") +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_original_data_op") +public class DataCleanOriginalDataOp { + //主键 + @TableId(type = IdType.AUTO) + private Long id; + //数据清洗的版本id + private Long dataCleanVersionId; + //操作类型:1.首元素:first_element,2.尾元素:last_element,3.迭代处理:iteration + private String opType; + //操作字段:此字段为数据清洗版本中存储的源数据指标内部字段 + private String opField; + //父id + private Long parentId; + @TableField(exist = false) + private DataCleanOriginalDataOp child; + + } + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOutput.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOutput.java new file mode 100644 index 0000000..958b6ad --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanOutput.java @@ -0,0 +1,70 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_output") +public class DataCleanOutput implements Serializable { + private static final long serialVersionUID = 360159112010885143L; + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 列表操作版本id + */ + private Long dataCleanVersionId; + /** + * 列表操作条件根节点id + */ + private Long dataCleanConditionId; + /** + * 列表操作块id + */ + private Long dataCleanBlockId; + /** + * 输出类型:1 命中输出,2未命中输出3默认输出 + */ + private Integer outputType; + /** + * 输出的key + */ + private String outputKey; + /** + * 选择来源:original原数据,data_op原数据操作,handle_collection选择集合 + */ + private String opType; +// /** +// * 输出操作对象的key +// */ +// private String outputOpKey; + /** + * 输出的值 + */ + private String outputValue; + /** + * 输出类型: 1.常量 2.变量 3.自定义 + */ + private Integer variableType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanVersion.java new file mode 100644 index 0000000..fc33357 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/DataCleanVersion.java @@ -0,0 +1,90 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_data_clean_version") +public class DataCleanVersion implements Serializable { + private static final long serialVersionUID = -32462005941219848L; + /** + * 数据清洗版本表id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 数据清洗id + */ + private Long dataCleanId; + /** + * 版本code + */ + private String versionCode; + /** + * 版本描述 + */ + private String description; + /** + * 数据源数组或者map的en + */ + private String inputFieldEn; + /** + * 数据源类型:map、list + */ + private String inputFieldType; +// /** +// * 分组指标列表,逗号分割的en列表 +// */ +// private String groupFields; + /** + * 状态:-1删除 ,1启用,0停用 + */ + private Integer status; + /** + * 存放执行结果的变量 + */ + private String resultFieldEn; + /** + * 所属组织id + */ + private Long organId; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 集合操作版本配置快照 + */ + private String snapshot; + /** + * 条件和对应输出组合 + */ + @TableField(exist = false) + private List conditionAndOutPutList; + + @TableField(exist = false) + private DataCleanOriginalDataOp originalDataOp; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/FilterCondEnum.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/FilterCondEnum.java new file mode 100644 index 0000000..e7d9758 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/FilterCondEnum.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.strategyx.dataclean; + +import lombok.Getter; + +@Getter +public enum FilterCondEnum { + + INPUT_FILTER("input","策略--标签的条件"), + RESULT_FILTER("result","策略--标签的条件"); + + private String code; + private String desc; + + FilterCondEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/param/RunnerDataCleanParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/param/RunnerDataCleanParam.java new file mode 100644 index 0000000..20f7f2f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/dataclean/param/RunnerDataCleanParam.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.model.strategyx.dataclean.param; + +import lombok.Data; + +import java.util.Map; + +@Data +public class RunnerDataCleanParam { + //需要执行的集合操作id +// private Long id; +// private Long versionId; + private String dataCleanCode; + private String versionCode; + private Long organId; + + private Map param; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTables.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTables.java new file mode 100644 index 0000000..b53d0f9 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTables.java @@ -0,0 +1,65 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * (DecisionTables)实体类 + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName(value = "t_decision_tables") +public class DecisionTables implements Serializable { + private static final long serialVersionUID = -98465498462309886L; + + @TableId(type = IdType.AUTO) + private Long id;//决策表id + + private String name;//决策表名称 + + private String code;//决策表代码(英文) + + private String description;//决策表描述 + + private String version;//决策表版本 + + private Integer status;//决策表状态:0 停用 1 启用 -1删除(默认启用) + + private Long creator;//决策表创建者 + + @TableField(exist = false) + private String creatorName;//创建者名称 + + private Long modifier;//决策表修改者 + + private Long organId;//所属组织id + + private Date createTime;//创建时间 + + private Date updateTime;//修改时间 + + private Long parentId;//文件id + + private String resultFieldEn;//存放执行结果的变量 + + @TableField(exist = false) + private List parentIds;//文件id集合 + @TableField(exist = false) + private List decisionTablesVersionList; + @TableField(exist = false) + private DecisionTablesVersionVo executeVersion; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetail.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetail.java new file mode 100644 index 0000000..354eb73 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetail.java @@ -0,0 +1,63 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * (DecisionTablesDetail)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName(value = "t_decision_tables_detail") +public class DecisionTablesDetail implements Serializable { + + private static final long serialVersionUID = 6082556987380982292L; + @TableId(type = IdType.AUTO) + private Long id;//详情节点id + + private Long decisionTablesId;//决策表id + + private Long versionId;//决策表版本id + + private Integer dimensionality;//条件维度(1-左侧,2-顶部) + + private Long fieldId;//字段id + + private String fieldEn;//字段en + + private Long parentId;//父节点id + + private String logical;//逻辑关系,如(&&,||) + + private Integer type;//节点类型:1-普通节点,2-叶子节点 + + private Integer indexValue;//所在维度的值,不能为负数 + + private String content;//执行串 + + private Date createTime;//创建时间 + + private Date updateTime;//修改时间 + @TableField(exist = false) + private Integer valueType;//值类型 + @TableField(exist = false) + private String insertTempId;//插入临时id + + @TableField(exist = false) + private String tempParentId;//插入临时父id + + @TableField(exist = false) + private List conditionList;//条件列表 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetailCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetailCondition.java new file mode 100644 index 0000000..054bacb --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesDetailCondition.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * (DecisionTablesDetailCondition)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName(value = "t_decision_tables_detail_condition") +public class DecisionTablesDetailCondition implements Serializable { + private static final long serialVersionUID = -90235511839223545L; + + @TableId(type = IdType.AUTO) + private Long id;//决策表详情条件id + + private Long detailId;//详情id + + private String operator;//操作符 + + private Integer variableType;//变量类型:1常量,2变量 + + private String fieldValue;//字段值 + + private Date createTime;//创建时间 + + private Date updateTime;//修改时间 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesResult.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesResult.java new file mode 100644 index 0000000..9054af3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesResult.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * (DecisionTablesResult)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName(value = "t_decision_tables_result") +public class DecisionTablesResult implements Serializable { + private static final long serialVersionUID = -37103405087760345L; + + @TableId(type = IdType.AUTO) + private Long id;//决策表结果集id + + private Long decisionTablesId;//决策表id + + private Long versionId;//决策表版本id + + private Integer rows;//行数 + + private Integer columns;//列数 + + private String resultValue;//结果集二维数组 + + private Date createTime;//创建时间 + + private Date updateTime;//修改时间 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesVersion.java new file mode 100644 index 0000000..550f2e7 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/DecisionTablesVersion.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * (DecisionTablesVersion)表实体类 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuppressWarnings("serial") +@TableName("t_decision_tables_version") +public class DecisionTablesVersion extends Model { + //版本主鍵id + @TableId( type = IdType.AUTO) + private Long id; + //决策表id + private Long decisionTablesId; + //版本号 + private String versionCode; + //版本描述 + private String description; + //状态:-1删除 ,1启用,0停用 + private Integer status; + //存放执行结果的变量 + private String resultFieldEn; + //所属组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + //决策表版本配置快照 + private String snapshot; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/request/DecisionTablesListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/request/DecisionTablesListParam.java new file mode 100644 index 0000000..b78aeff --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/request/DecisionTablesListParam.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable.request; + +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DecisionTablesListParam { + + protected Integer pageNum = 1; // 第几页 + protected Integer pageSize = 10; // 每页的数量 + + +// protected Boolean search = false; // 是否搜索 + + protected DecisionTables decisionTables;//查询实体对象 + +// protected Integer parentId = 0; // 文件夹的id +} + diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesDetailVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesDetailVo.java new file mode 100644 index 0000000..d3f7cf1 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesDetailVo.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable.vo; + +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetail; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class DecisionTablesDetailVo extends DecisionTablesDetail implements Serializable { + + private static final long serialVersionUID = -8530979508995118093L; +// private Long userId;//详情节点id +// +// private Long decisionTablesId;//决策表id +// +// private Integer dimensionality;//条件维度(1-左侧,2-顶部) +// +// private Long fieldId;//字段id +// +// private String fieldEn;//字段en +// +// private Long parentId;//父节点id +// +// private String logical;//逻辑关系,如(&&,||) +// +// private Integer type;//节点类型:1-普通节点,2-叶子节点 +// +// private Integer indexValue;//所在维度的值,不能为负数 +// +// private String content; +// private Date createTime;//创建时间 +// +// private Date updateTime;//修改时间 +// private Integer valueType;//值类型 +// private String insertTempId; +// private String tempParentId; +// +// private List conditionList;//条件列表 + + private List children;//子节点 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesResultVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesResultVo.java new file mode 100644 index 0000000..e52dbf3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesResultVo.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable.vo; + +import com.alibaba.fastjson.JSONArray; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesResult; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class DecisionTablesResultVo extends DecisionTablesResult implements Serializable { + private static final long serialVersionUID = -37103405087760345L; + +// private Long userId;//决策表结果集id +// +// private Long decisionTablesId;//决策表id +// +// private Integer rows;//行数 +// +// private Integer columns;//列数 + + + +// private String resultValue;//结果集 +// +// private Date createTime;//创建时间 +// +// private Date updateTime;//修改时间 + + private JSONArray resultList;//结果集二维数组 +} \ No newline at end of file diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVersionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVersionVo.java new file mode 100644 index 0000000..ed13d25 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVersionVo.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable.vo; + +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTablesVersionVo extends DecisionTablesVersion { + private List leftDetailVo;//左侧决策表详情 + + private List topDetailVo;//顶部决策表详情 + + private DecisionTablesResultVo resultSet;//结果集(二维数组表) + private List strategyOutputList;//输出字段 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVo.java new file mode 100644 index 0000000..7f84a31 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontable/vo/DecisionTablesVo.java @@ -0,0 +1,55 @@ +package com.fibo.ddp.common.model.strategyx.decisiontable.vo; + +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class DecisionTablesVo extends DecisionTables implements Serializable{ + + private static final long serialVersionUID = 3661484767794532544L; +// private Long userId;//决策表id +// +// private String name;//决策表名称 +// +// private String versionCode;//决策表代码(英文) +// +// private String description;//决策表描述 +// +// private String version;//决策表版本 +// +// private Integer status;//决策表状态:0 停用 1 启用 -1删除(默认启用) +// +// private Long creator;//决策表创建者 +// +// private String createUserName;//创建者名称 +// +// private Long modifier;//决策表修改者 +// +// private Long organId;//所属组织id +// +// private Long parentId;//文件id +// +// private List parentIds;//文件id集合 +// +// private Date createTime;//创建时间 +// +// private Date updateTime;//修改时间 +// private String resultFieldEn;//存放执行结果的变量 +// private List leftDetailVo;//左侧决策表详情 +// +// private List topDetailVo;//顶部决策表详情 +// +// private DecisionTablesResultVo resultSet;//结果集(二维数组表) +// private List strategyOutputList;//输出字段 + + private List decisionTablesVersionList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTree.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTree.java new file mode 100644 index 0000000..5e6d5c4 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTree.java @@ -0,0 +1,51 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@SuppressWarnings("serial") +@TableName("t_decision_tree") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTree extends Model { + //决策树主表id + @TableId(type = IdType.AUTO) + private Long id; + //决策树code + private String code; + //决策树名称 + private String name; + //决策树描述 + private String description; + //文件夹id + private Long folderId; + //状态:0 停用 1 启用 -1删除(默认启用) + private Integer status; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //组织id + private Long organId; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + + @TableField(exist = false) + private String creatorName; + //版本列表 + @TableField(exist = false) + private List versionList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetail.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetail.java new file mode 100644 index 0000000..ef745f0 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetail.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@SuppressWarnings("serial") +@TableName("t_decision_tree_detail") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTreeDetail extends Model { + //决策树详情id + @TableId(type = IdType.AUTO) + private Long id; + //决策表id + private Long decisionTreeVersionId; + //字段id + private Long fieldId; + //字段en + private String fieldEn; + //父节点id + private Long parentId; + //逻辑关系,如(&&,||) + private String logical; + //节点类型:1-普通节点,2-叶子节点 + private Integer nodeType; + //叶子节点对应决策结果值 + private String resultValue; + //结果类型:1常量 2变量 3自定义 + private Integer variableType; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + //决策树详情列表 + @TableField(exist = false) + private List conditionList; + @TableField(exist = false) + private List children; + @TableField(exist = false) + private String insertTempId;//插入临时id + @TableField(exist = false) + private String tempParentId;//插入临时父id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetailCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetailCondition.java new file mode 100644 index 0000000..c4d04f3 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeDetailCondition.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@SuppressWarnings("serial") +@TableName("t_decision_tree_detail_condition") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTreeDetailCondition extends Model { + //决策树详情条件id + @TableId(type = IdType.AUTO) + private Long id; + //详情id + private Long detailId; + //操作符 + private String operator; + //变量类型:1常量,2变量 + private Integer variableType; + //变量值(常量为值,变量为字段en) + private String fieldValue; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeVersion.java new file mode 100644 index 0000000..ea613f1 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/DecisionTreeVersion.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@SuppressWarnings("serial") +@TableName("t_decision_tree_version") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTreeVersion extends Model { + //决策树版本表id + @TableId(type = IdType.AUTO) + private Long id; + //决策树id + private Long decisionTreeId; + //版本code + private String versionCode; + //版本描述 + private String description; + //状态:-1删除 ,1启用,0停用 + private Integer status; + //存放执行结果的变量 + private String resultFieldEn; + //所属组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + //决策树版本配置快照 + private String snapshot; + //决策树详情列表 + @TableField(exist = false) + private List detailList; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVersionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVersionVo.java new file mode 100644 index 0000000..a1ff863 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVersionVo.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree.vo; + +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecisionTreeVersionVo extends DecisionTreeVersion { + private List strategyOutputList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVo.java new file mode 100644 index 0000000..3610ee9 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/decisiontree/vo/DecisionTreeVo.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.model.strategyx.decisiontree.vo; + +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTree; +import lombok.Data; + +@Data +public class DecisionTreeVo extends DecisionTree { + private DecisionTreeVersionVo executeVersion; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleConditionInfo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleConditionInfo.java new file mode 100644 index 0000000..3afe544 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleConditionInfo.java @@ -0,0 +1,76 @@ +package com.fibo.ddp.common.model.strategyx.guiderule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 规则条件表(t_rule_condition)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName("`t_rule_condition`") +public class RuleConditionInfo + implements Serializable { + private static final long serialVersionUID = -55937038829167862L; + + @TableId(type = IdType.AUTO) + private Long id;//主键ID + + private String logical;//关系节点的逻辑符号:&&(并关系),||(或关系) + + private Long fieldId;//表达式节点对应的字段id + + private String fieldEn;//字段的en或者json类型的key + private Integer fieldType;//字段的类型:1中间变量 2 入参 + + private String operator;//表达式节点的操作符 + + private Integer variableType;//变量类型 + + private String fieldValue;//表达式节点对应字段的限定值 + + private String executionLogic;//表达式执行逻辑 + + private Long ruleId;//规则表的id + + private Long versionId;//规则版本的id + + private Long parentId;//父节点的id + + private Integer conditionType;//规则节点的类型:1-关系节点,2-表达式节点 + + private Date createTime;//创建时间 + + private Date updateTime;//修改时间 + + @TableField(exist = false) + private String insertTempId;//插入时临时id + + @TableField(exist = false) + private String TempParentId;//插入时临时父id + + @TableField(exist = false) + private Integer valueType;//字段值类型 + + @TableField(exist = false) + private List loopGroupActions = new ArrayList<>();//循环组对应的条件 + + @TableField(exist = false) + private RuleConditionVo loopResultCondition;//for对应的结果条件的计算条件树 + @TableField(exist = false) + private RuleConditionVo condGroupResultCondition;//条件组对应的结果计算条件树 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleInfo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleInfo.java new file mode 100644 index 0000000..d5011cd --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleInfo.java @@ -0,0 +1,104 @@ +package com.fibo.ddp.common.model.strategyx.guiderule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.beans.BeanUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +@TableName("t_rule") +public class RuleInfo implements Serializable { + private static final long serialVersionUID = -13354133324148507L; + @TableId(type = IdType.AUTO) + private Long id;//主键 + + private String name;//规则名称 + + private String code;//规则代码 + + private String description;//规则描述 + + private Integer priority;//规则优先级 + + private Long parentId;//父节点id + + private Long author;//创建人id + + private Long userId;//修改人id + + private Long organId;//组织id + + private Integer engineId; + + private Integer status;//状态 0 :停用 ,1 : 启用,-1:删除 + + private Integer type;//规则类型 0 : 系统的规则 1:组织的规则 2: 引擎的规则 + + private Integer isNon;//逻辑关系“非”,0:否 ,1:是 + + private String content;//规则具体内容 + + private Date created; + + private Date updated; + + private Integer ruleType;//0硬性拒绝规则1加减分规则 + + private Integer ruleAudit; + + private Integer score;//得分 + + private String lastLogical;//逻辑关系符 + + private Integer difficulty;//规则难度:1-简单规则,2复杂规则 + + private String scriptType;//脚本类型python,js,groovy + + private String resultFieldEn;//存放是否命中的字段 + + private String scoreFieldEn;//存放得分的字段en + @TableField(exist = false) + private String authorName;//创建人名称,需要去其他表查询 + @TableField(exist = false) + private List parentIds; + + @TableField(exist = false) + private Long versionId;//执行版本的id + @TableField(exist = false) + private RuleVersionVo version; + @TableField(exist = false) + private List ruleScriptVersionList; + @TableField(exist = false) + private RuleScriptVersion scriptVersion; + + @TableField(exist = false) + private List ruleVersionList; + + public void setRuleScriptVersionList(List ruleScriptVersionList) { + this.ruleScriptVersionList = ruleScriptVersionList; + List ruleVersionList = new ArrayList<>(); + if (ruleScriptVersionList!=null&&!ruleScriptVersionList.isEmpty()){ + for (RuleScriptVersion ruleScriptVersion : ruleScriptVersionList) { + RuleVersionVo ruleVersionVo = new RuleVersionVo(); + BeanUtils.copyProperties(ruleScriptVersion,ruleVersionVo); + ruleVersionList.add(ruleVersionVo); + } + } + this.ruleVersionList = ruleVersionList; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleLoopGroupAction.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleLoopGroupAction.java new file mode 100644 index 0000000..84b1061 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleLoopGroupAction.java @@ -0,0 +1,57 @@ +package com.fibo.ddp.common.model.strategyx.guiderule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (RuleLoopGroupAction)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("t_rule_loop_group_action") +public class RuleLoopGroupAction implements Serializable { + private static final long serialVersionUID = -47370055295043749L; + /** + * 循环组动作表主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 对应条件表中for的id + */ + private Long conditionForId; + /** + * 对应条件表中条件id + */ + private Long conditionGroupId; + /** + * 动作类型 1-求和,2-赋值,3-输出输出变量,4-输出常量 + */ + private Integer actionType; + /** + * 动作的key + */ + private String actionKey; + /** + * 动作的value + */ + private String actionValue; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleVersion.java new file mode 100644 index 0000000..9d0f463 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/RuleVersion.java @@ -0,0 +1,77 @@ +package com.fibo.ddp.common.model.strategyx.guiderule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_rule_version`") +public class RuleVersion implements Serializable { + private static final long serialVersionUID = -1850194333747447612L; + /** + * 规则版本主键id + */ + @TableId( type = IdType.AUTO) + private Long id; + /** + * 规则id + */ + private Long ruleId; + /** + * 规则版本号 + */ + private String versionCode; + /** + * 描述信息 + */ + private String description; + /** + * 状态:-1 删除 0停用 1启用 + */ + private Integer status; + /** + * 规则结果en(命中情况) + */ + private String resultFieldEn; + /** + * 规则得分 + */ + private Integer score; + /** + * 规则得分的en + */ + private String scoreFieldEn; + /** + * 组织id + */ + private Long organId; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 快照信息 + */ + private String snapshot; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/param/RuleSetNodeResultParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/param/RuleSetNodeResultParam.java new file mode 100644 index 0000000..dcb8f5c --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/param/RuleSetNodeResultParam.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.param; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RuleSetNodeResultParam { + private Long id;//规则的id + private Integer difficulty;//标识:1基础规则,2复杂规则,3脚本规则 + private Long versionId;//版本id + private String resultEn; + private String scoreEn; + private String code; + private String name; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleListParamV2.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleListParamV2.java new file mode 100644 index 0000000..4e3fc3b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleListParamV2.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.request; + +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuleListParamV2 { + protected Integer pageNum = 1; // 第几页 + protected Integer pageSize = 10; // 每页的数量 + + +// protected Boolean search = false; // 是否搜索 + + protected RuleInfo ruleInfo;//查询实体对象 + +// protected Integer parentId = 0; // 文件夹的id +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleUpdateStatusParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleUpdateStatusParam.java new file mode 100644 index 0000000..68cbd22 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/request/RuleUpdateStatusParam.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors +public class RuleUpdateStatusParam { + private String ids;//userId + private Integer status;//状态 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleConditionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleConditionVo.java new file mode 100644 index 0000000..f60ae9e --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleConditionVo.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.vo; + +import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class RuleConditionVo extends RuleConditionInfo { + + private List children;//规则子节点 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVersionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVersionVo.java new file mode 100644 index 0000000..792d7be --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVersionVo.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.vo; + +import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RuleVersionVo extends RuleVersion { + private RuleConditionVo ruleConditionVo;//规则对应的结点树 + + private List strategyOutputList;//输出字段 + + private List failOutputList;//失败输出字段 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVo.java new file mode 100644 index 0000000..956fe98 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/guiderule/vo/RuleVo.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.model.strategyx.guiderule.vo; + +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors +public class RuleVo extends RuleInfo { + + private RuleConditionVo ruleConditionVo;//规则对应的结点树 + + private List strategyOutputList;//输出字段 + + private List ruleVersionList;//规则版本列表 +// private List ruleVersionList;//规则版本列表 + + private List ruleScriptVersionList;//脚本规则集的版本列表 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/KnowledgeTree.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/KnowledgeTree.java new file mode 100644 index 0000000..4606c02 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/KnowledgeTree.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.common.model.strategyx.knowledge; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * ClassName:KnowledgeTreeVo
+ * Description: 知识库树形菜单实体类.
+ */ +@Data +@TableName("t_knowledge_tree") +public class KnowledgeTree implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** + * 主键 + * */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 目录名称 + * */ + private String name; + + /** + * 父节点id + * */ + private Long parentId; + + /** + * 创建人id + * */ + private Long userId; + + /** + * 组织id + * */ + private Long organId; + + /** + * 引擎id + * */ + private Long engineId; + + /** + * 状态 0 :停用 ,1 : 启用,-1:删除 + * */ + private Integer status; + + /** + * 目录类型 0 : 系统的目录 1:组织的目录 2: 引擎的目录 + * */ + private Integer type; + + /** + * 树形分类:0:规则树 1:评分卡的树 2:回收站的树 + * */ + private Integer treeType; + + /** + * 创建日期 + * */ + private Date created; + + /** + * 修改日期 + * */ + private Date updated; + + /** + * 子类集合 + * */ + @TableField(exist = false) + private KnowledgeTree[] children; + + /** + * 是否为父类 + * */ + @TableField(exist = false) + private String isParent = "true"; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/Rule.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/Rule.java new file mode 100644 index 0000000..014cc32 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/Rule.java @@ -0,0 +1,157 @@ +package com.fibo.ddp.common.model.strategyx.knowledge; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * ClassName:OrganRuleVo
+ * Description: 规则实体类.
+ * @see + */ +@Data +public class Rule implements Serializable,Cloneable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + * */ + private Long id; + + /** + * 名称 + * */ + private String name; + + /** + * 代码 + * */ + private String code; + + /** + * 描述 + * */ + private String description; + + /** + * 优先级 + * */ + private Integer priority; + + /** + * 父节点id + * */ + private Long parentId; + + /** + *修改人id + * */ + private Long userId; + + /** + *创建人id + * */ + private Long author; + + /** + *创建人名称 + * */ + private String authorName; + + /** + * 组织id + * */ + private Long organId; + + /** + * 引擎id + * */ + private Long engineId; + + /** + * 规则类型 0 : 系统的规则 1:组织的规则 2: 引擎的规则 + * */ + private Integer type; + + /** + * 逻辑关系"非" 0:不是非 1:是非 + * */ + private Integer isNon; + + /** + * 状态 0 :停用 ,1 : 启用,-1:删除 + * */ + private Integer status; + /** + * 审批规则 5 :通过 ,2 : 拒绝,3:人工审批 4:简化流程 + */ + public int ruleAudit; + + /** + * 创建日期 + * */ + private Date created; + + /** + * 修改日期 + * */ + private Date updated; + + /** + * 规则具体内容 + * */ + public String content; + + /** + * 0硬性拒绝规则1加减分规则 + */ + private Integer ruleType; + + /** + *得分 + */ + private Integer score; + + /** + *逻辑关系符,存储条件区域最后一个逻辑符号,值有')'、'))'、'-1' + */ + private String lastLogical; + + /** + * 引擎名 + * */ + private String engineName; + + /** + * 规则节点名称 + * */ + private String engineNodeName; + + /** + * 规则节点名称 + * */ + private Long engineNodeId; + + /** + * 区分规则集和规则 + * */ + private int showType = 0; + + private Integer difficulty;//规则难度:1-简单规则,2复杂规则 + + private String resultFieldEn;//存放是否命中的字段 + + private String scoreFieldEn;//存放得分的字段en + + public Integer getRuleType() { + if(ruleAudit == 2) { + ruleType = 0; + }else{ + ruleType = 1; + } + return ruleType; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleListParam.java new file mode 100644 index 0000000..0498827 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleListParam.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.model.strategyx.knowledge.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuleListParam implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer pageNo = 1; + private Integer pageSize = 10; + + private String status; + private Integer engineId; + + private Integer parentId; + private String parentIds; + + private String key; + private String value; + private Boolean isSearch = false; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleSaveParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleSaveParam.java new file mode 100644 index 0000000..01d26e7 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/request/RuleSaveParam.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.model.strategyx.knowledge.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuleSaveParam implements Serializable { + + private static final long serialVersionUID = 1L; + + private String code; // 代码 + private String name; // 名称 + private Integer priority; // 优先级 + private String description; // 描述 + private String fieldContent; + private String outcontent; + private Long engineId; // 引擎id + private String content; // 规则具体内容 + private Integer score; // 得分 + private String lastLogical; //逻辑关系符,存储条件区域最后一个逻辑符号,值有')'、'))'、'-1' + private Integer ruleAudit; // 审批规则 5 :通过 ,2 : 拒绝,3:人工审批 4:简化流程 + private Long parentId; // 父节点id + private String parentIds; + private String logical; + private String fieldId; + private String operator; +// private String fieldId ; +// private String ruleAudit ; +// private String fieldId ; + + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/response/UploadResponse.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/response/UploadResponse.java new file mode 100644 index 0000000..e007d70 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/knowledge/response/UploadResponse.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.model.strategyx.knowledge.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UploadResponse { + private Integer existRows;//已存在行数 + private Integer sucRows;//成功条数 + private Integer repeatRows;//重复条数 + private Integer failRows;//失败条数 + private Integer total; + private Map result;//执行结果 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDb.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDb.java new file mode 100644 index 0000000..6384bf6 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDb.java @@ -0,0 +1,121 @@ +package com.fibo.ddp.common.model.strategyx.listlibrary; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("t_list_db") +public class ListDb implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 黑、白名单库编号主键 + */ + private Long id; + /** + * 名单库code + */ + private String listCode; + /** + * 黑、白名单库类型 + */ + private String listType; + /** + * 黑、白名单库名称 + */ + private String listName; + /** + * 黑、白名单库数据来源 + */ + private Integer dataSource; + /** + * 黑、白名单库类型属性 + */ + private String listAttr; + /** + * 黑、白名单库描述 + */ + private String listDesc; + /** + * 黑、白名单库表字段 + */ + private String tableColumn; + /** + * 黑、白名单库检索匹配类型 + */ + private Integer matchType; + /** + * 黑、白名单库检索查询字段间逻辑 + */ + private Integer queryType; + /** + * 黑、白名单库检索查询主键 + */ + private String queryField; + /** + * 黑、白名单库检索查询主键 + */ + @TableField(exist = false) + private String queryFieldCn; + /** + * 黑、白名单库归属的组织编号 + */ + private Long organId; + /** + * 黑、白名单库状态 + */ + private Integer status; + /** + * 黑、白名单库创建人 + */ + private Long userId; + /** + * 黑、白名单库创建时间 + */ + private Date created; + /** + * 黑、白名单库创建人昵称 + */ + @TableField(exist = false) + private String nickName; + /** + *是否命中的字段 + */ + private String resultFieldEn; + /** + * 输出字段 + */ + @TableField(exist = false) + private List strategyOutputList; + + /** + * 版本列表 + */ + @TableField(exist = false) + private List versionList; + /** + * 文件夹id + */ + private Long folderId; + + /** + * 如果是节点查询此字段不为空为"1" + */ + @TableField(exist = false) + private String nodeQuery; + private Object snapshot; + + @TableField(exist = false) + private ListDbVersion executeVersion; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDbVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDbVersion.java new file mode 100644 index 0000000..48fc65b --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/ListDbVersion.java @@ -0,0 +1,57 @@ +package com.fibo.ddp.common.model.strategyx.listlibrary; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@SuppressWarnings("serial") +@TableName("t_list_db_version") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ListDbVersion extends Model { + //名单库版本表id + @TableId(type = IdType.AUTO) + private Long id; + //名单库id + private Long listDbId; + //版本号 + private String versionCode; + //版本描述 + private String description; + //固定输出的指标en + private String resultFieldEn; + //状态:-1删除 ,1启用,0停用 + private Integer status; + //名单库表中列字段,字段id逗号分隔 + private String tableColumn; + //检索匹配类型,精确匹配(1),模糊匹配(0) + private Integer matchType; + //查询字段间逻辑,and(1),or(0) + private Integer queryType; + //查询主键,字段编号逗号分割 + private String queryField; + //所属组织id + private Long organId; + //创建者id + private Long createUserId; + //修改者id + private Long updateUserId; + //创建时间 + private Date createTime; + //修改时间 + private Date updateTime; + //名单库版本配置快照 + private Object snapshot; + @TableField(exist = false) + private List strategyOutputList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/TblColumn.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/TblColumn.java new file mode 100644 index 0000000..ca5fa35 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/TblColumn.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.model.strategyx.listlibrary; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TblColumn implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 黑、白名单库匿名字段编号 + */ + private String colName; + + /** + * 黑、白名单库字段名 + */ + private String fieldCn; + + /** + * 黑、白名单库里存值 + */ + private String fieldValue; + + /** + * 黑、白名单库注释(字段编号) + */ + private String colComment; + + /** + * 黑、白名单库匿名字段展示顺序 + */ + private String colOrder; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/request/ListDbDataParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/request/ListDbDataParam.java new file mode 100644 index 0000000..1fb9255 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/listlibrary/request/ListDbDataParam.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.model.strategyx.listlibrary.request; + +import com.fibo.ddp.common.model.common.PageDto; +import lombok.Data; + +@Data +public class ListDbDataParam extends PageDto { + + /** + * 名单库id + */ + private Long id; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/Scorecard.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/Scorecard.java new file mode 100644 index 0000000..6829cc4 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/Scorecard.java @@ -0,0 +1,142 @@ +package com.fibo.ddp.common.model.strategyx.scorecard; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * ClassName:ScorecardVo
+ * Description: 评分卡实体类.
+ */ +@TableName("t_scorecard") +@Data +public class Scorecard implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 代码 + */ + private String code; + + /** + * 描述 + */ + private String description; + + /** + * 版本号 + */ + private String version; + + /** + * 父节点id + */ + private Long parentId; + + /** + * 修改人id + */ + private Long userId; + + /** + * 创建人id + */ + private Long author; + + /** + * 创建人姓名 + */ + @TableField(exist = false) + private String authorName; + + /** + * 引擎id + */ + private Long engineId; + + /** + * 组织id + */ + private Long OrganId; + + /** + * 评分卡类型 0 : 系统的评分卡 1:组织的评分卡 2: 引擎的评分卡 + */ + private Integer type; + + /** + * 状态 0 :停用 ,1 : 启用,-1:删除 + */ + private Integer status; + + /** + * 创建日期 + */ + private Date created; + + /** + * 修改日期 + */ + private Date updated; + + /** + * 是否被选中 + */ + @TableField(exist = false) + private boolean checked; + + /** + * 得分 + */ + private String score; + + /** + * pd + */ + private String pd; + + /** + * odds + */ + private String odds; + + /** + * engineName + */ + @TableField(exist = false) + private String engineName; + + /** + * 得分计算方式 + */ + private Integer scoreCalculateType; + + /** + * 接收评分卡结果的字段en + */ + private String resultFieldEn; + + /** + * 当前执行的版本信息 + */ + @TableField(exist = false) + private ScorecardVersionVo executeVersion; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetail.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetail.java new file mode 100644 index 0000000..bf22500 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetail.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.model.strategyx.scorecard; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 评分卡明细表(ScorecardDetail)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_scorecard_detail`") +public class ScorecardDetail implements Serializable { + + private static final long serialVersionUID = -2740621861057988333L; + + @TableId(type = IdType.AUTO) + private Integer id ; // int(11) + private Integer dimensionId ; // int(11) + private Integer fieldId ; // int(11) + private Integer parentId ; // int(11) + private Integer type ; // int(11) + private Double score ; // decimal(10,0) + private Double coefficient ; // decimal(10,0) + private String custom ; //自定义文本 + private Integer calculateType ; // int(11) + private String logical ; // varchar(50) + private Date createTime ; // datetime + private Date updateTime ; // datetime + + @TableField(exist = false) + private String fieldEn; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetailCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetailCondition.java new file mode 100644 index 0000000..8027e6d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDetailCondition.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.model.strategyx.scorecard; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 评分卡明细表的condition表(ScorecardDetailCondition)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_scorecard_detail_condition`") +public class ScorecardDetailCondition implements Serializable { + + private static final long serialVersionUID = 821432514853102997L; + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Integer id; + /** + * 内容id + */ + private Integer detailId; + /** + * 关系运算符 + */ + private String operator; + /** + * 指标的值(实参) + */ + private String fieldValue; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDimension.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDimension.java new file mode 100644 index 0000000..23e99a4 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardDimension.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.model.strategyx.scorecard; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_scorecard_dimension`") +public class ScorecardDimension implements Serializable { + + private static final long serialVersionUID = 8131487634836541557L; + + @TableId(type = IdType.AUTO) + private Integer id; // int(11) + private Integer cardId; // int(11) + private Long versionId;//版本id + private String dimensionName; // varchar(30) + private Double weight; // decimal(7,2) + private String executeType; // varchar(30) + private Date createTime; // datetime + private Date updateTime; // datetime +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardVersion.java new file mode 100644 index 0000000..306104d --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/ScorecardVersion.java @@ -0,0 +1,73 @@ +package com.fibo.ddp.common.model.strategyx.scorecard; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_scorecard_version`") +public class ScorecardVersion implements Serializable { + private static final long serialVersionUID = -1850194333747447612L; + /** + * 评分卡版本主键id + */ + @TableId( type = IdType.AUTO) + private Long id; + /** + * 评分卡id + */ + private Long scorecardId; + /** + * 评分卡版本号 + */ + private String versionCode; + /** + * 描述信息 + */ + private String description; + /** + * 状态:-1 删除 0停用 1启用 + */ + private Integer status; + /** + * 计算方式1,求和,2,甲醛求和 + */ + private Integer scoreCalculateType; + /** + * 评分卡结果en + */ + private String resultFieldEn; + /** + * 组织id + */ + private Long organId; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 快照信息 + */ + private String snapshot; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/request/ListParam.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/request/ListParam.java new file mode 100644 index 0000000..00545ca --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/request/ListParam.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.model.strategyx.scorecard.request; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ListParam implements Serializable { + + private static final long serialVersionUID = 8131487634836541557L; + + protected Integer pageNum = 1; // 第几页 + protected Integer pageSize = 10; // 每页的数量 + + protected List status; // 状态:1、-1 + + protected Boolean search = false; // 是否搜索 + protected String key; // + protected String value; // 用户输入的搜索词 + + protected Integer parentId = 0; // 文件夹的id + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDetailVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDetailVo.java new file mode 100644 index 0000000..9d0fe5f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDetailVo.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.model.strategyx.scorecard.vo; + +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ScorecardDetailVo extends ScorecardDetail implements Serializable { + private static final long serialVersionUID = 4920595561931964004L; + + private String fieldName; + private String condition; // condition表 + private List children; // 树 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDimensionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDimensionVo.java new file mode 100644 index 0000000..c6afad7 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardDimensionVo.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.model.strategyx.scorecard.vo; + +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ScorecardDimensionVo extends ScorecardDimension implements Serializable { + private static final long serialVersionUID = 4920595561931964004L; + + private List children; // 明细 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVersionVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVersionVo.java new file mode 100644 index 0000000..10dc337 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVersionVo.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.model.strategyx.scorecard.vo; + +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ScorecardVersionVo extends ScorecardVersion implements Serializable { + private static final long serialVersionUID = -213821397529963731L; + + private List scorecardDimension; // 维度 + private List strategyOutputList;//自定义输出字段 +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVo.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVo.java new file mode 100644 index 0000000..19b2a35 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scorecard/vo/ScorecardVo.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.model.strategyx.scorecard.vo; + +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ScorecardVo extends Scorecard implements Serializable { + private static final long serialVersionUID = 4920595561931964004L; + + private List scorecardDimension; // 维度 + private List strategyOutputList;//自定义输出字段 + private List versionList;//版本列表 + private List versionIdList;//版本id列表 + private Long checkedId; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scriptrule/RuleScriptVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scriptrule/RuleScriptVersion.java new file mode 100644 index 0000000..f468445 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/scriptrule/RuleScriptVersion.java @@ -0,0 +1,76 @@ +package com.fibo.ddp.common.model.strategyx.scriptrule; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * (RuleScriptVersion)实体类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("`t_rule_script_version`") +public class RuleScriptVersion implements Serializable { + private static final long serialVersionUID = -78864192587533951L; + /** + * 主键:规则版本id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 规则id + */ + private Long ruleId; + /** + * 版本号 + */ + private String versionCode; + /** + * 版本描述 + */ + private String description; + /** + * 状态:-1删除 ,1启用,0停用 + */ + private Integer status; + /** + * 脚本类型:groovy,python,js + */ + private String scriptType; + /** + * 脚本规则集内容json,包含脚本内容和脚本所用字段两个值 + */ + private String scriptContent; + /** + * 组织id + */ + private Long organId; + /** + * 创建者id + */ + private Long createUserId; + /** + * 修改者id + */ + private Long updateUserId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 规则版本配置快照 + */ + private String snapshot; + +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/OutCondition.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/OutCondition.java new file mode 100644 index 0000000..d85ecef --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/OutCondition.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.model.strategyx.strategyout; + +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OutCondition { + private String logical; + private List conditionList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/StrategyOutput.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/StrategyOutput.java new file mode 100644 index 0000000..119c65f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/strategyout/StrategyOutput.java @@ -0,0 +1,77 @@ +package com.fibo.ddp.common.model.strategyx.strategyout; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("t_strategy_output") +public class StrategyOutput implements Serializable { + @TableField(exist = false) + private static final long serialVersionUID = 699491471584300246L; + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 字段id + */ + private Long fieldId; + /** + * 字段的en + */ + private String fieldEn; + /** + * 字段值 + */ + private String fieldValue; + /** + * 字段值的类型:1 常量、2 变量,3.自定义 + */ + private Integer variableType; + /** + * 关联的策略id + */ + private Long strategyId; + /** + * 关联的策略类型 base_rule.基础规则 scorecard.评分卡 decision_tables.决策表 decision_tree.决策树 complex_rule.复杂规则 list_db.名单库 models.机器学习模型 + */ + private String strategyType; + /** + * 输出条件 + */ + private String outCondition; + /** + * 输出类型:success为成功时候输出,fail为失败时候的输出 + */ + private String outType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + public StrategyOutput(Long strategyId, String strategyType) { + this.strategyId = strategyId; + this.strategyType = strategyType; + } + + public StrategyOutput(Long strategyId, String strategyType, String outType) { + this.strategyId = strategyId; + this.strategyType = strategyType; + this.outType = outType; + } +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/Tag.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/Tag.java new file mode 100644 index 0000000..09aa874 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/Tag.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.model.strategyx.tag; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * (Tag)实体类 + * + * @author jgp + * @since 2021-12-31 13:25:32 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_tag") +public class Tag implements Serializable { + + private static final long serialVersionUID = -25028602999121820L; + + /** + * 自增主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 标签代码 + */ + private String tagCode; + + /** + * 标签名称 + */ + private String tagName; + + /** + * 标签描述 + */ + private String tagDesc; + /** + * 标签描述 + */ + private Long folderId; + + /** + * 状态:1正常,-1删除 0停用 + */ + private Integer status; + + /** + * 组织id + */ + private Long organId; + + /** + * 创建人id + */ + private Long createUserId; + + /** + * 修改人id + */ + private Long updateUserId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + @TableField(exist = false) + private String createUserName; + @TableField(exist = false) + private List versionList; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersion.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersion.java new file mode 100644 index 0000000..b5c735f --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersion.java @@ -0,0 +1,90 @@ +package com.fibo.ddp.common.model.strategyx.tag; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * (TagVersion)实体类 + * + * @author jgp + * @since 2021-12-31 13:25:33 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_tag_version") +public class TagVersion implements Serializable { + + private static final long serialVersionUID = -85947920439078454L; + + /** + * 版本主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 标签id + */ + private Long tagId; + + /** + * 版本code + */ + private String versionCode; + + /** + * 版本名称 + */ + private String versionName; + + /** + * 版本描述 + */ + private String description; + + /** + * 状态:1正常,-1删除 0停用 + */ + private Integer status; + + /** + * 组织id + */ + private Long organId; + + /** + * 创建人id + */ + private Long createUserId; + /** + * 修改人id + */ + private Long updateUserId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + @TableField(exist = false) + private List detailList; + /** + * 快照 + */ + private String snapshot; +} diff --git a/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersionDetail.java b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersionDetail.java new file mode 100644 index 0000000..f1a5703 --- /dev/null +++ b/ddp-common/ddp-model/src/main/java/com/fibo/ddp/common/model/strategyx/tag/TagVersionDetail.java @@ -0,0 +1,84 @@ +package com.fibo.ddp.common.model.strategyx.tag; + +import java.util.Date; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * (TagVersionDetail)实体类 + * + * @author jgp + * @since 2021-12-31 13:25:33 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("t_tag_version_detail") +public class TagVersionDetail implements Serializable { + + private static final long serialVersionUID = -78415296218468622L; + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 版本主表id + */ + private Long tagVersionId; + + /** + * 标签值 + */ + private String tagValue; + + /** + * 标签值描述 + */ + private String tagValueDesc; + + /** + * 条件块id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long tagRuleId; + + /** + * 组织id + */ + private Long organId; + + /** + * 创建人id + */ + private Long createUserId; + + /** + * 修改人id + */ + private Long updateUserId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + @TableField(exist = false) + private BaseRule rule; +} diff --git a/ddp-common/ddp-service/pom.xml b/ddp-common/ddp-service/pom.xml new file mode 100644 index 0000000..19cf108 --- /dev/null +++ b/ddp-common/ddp-service/pom.xml @@ -0,0 +1,23 @@ + + + + ddp-common + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-common-service + + + + com.fibo.ddp + ddp-common-dao + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseCommonService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseCommonService.java new file mode 100644 index 0000000..c5c95b6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseCommonService.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.service.analyse; + +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; + +import java.util.List; + + +public interface AnalyseCommonService { + + List getAnalyseData(AnalyseRequestParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionResultService.java new file mode 100644 index 0000000..d87638e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionResultService.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionResult; + +import java.util.List; + +/** + * (AnalyseDecisionResult)表服务接口 + */ +public interface AnalyseDecisionResultService extends IService,AnalyseCommonService> { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionTablesService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionTablesService.java new file mode 100644 index 0000000..e57ccd2 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseDecisionTablesService.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionTables; + +import java.util.List; + +/** + * (AnalyseDecisionTables)表服务接口 + */ +public interface AnalyseDecisionTablesService extends IService ,AnalyseCommonService>>{ + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineCallService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineCallService.java new file mode 100644 index 0000000..9007da3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineCallService.java @@ -0,0 +1,11 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseEngineCall; + +/** + * (AnalyseEngineCall)表服务接口 + */ +public interface AnalyseEngineCallService extends IService ,AnalyseCommonService{ + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineNodeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineNodeService.java new file mode 100644 index 0000000..a9e7989 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineNodeService.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseEngineNode; + +import java.util.List; + +/** + * (AnalyseEngineNode)表服务接口 + */ +public interface AnalyseEngineNodeService extends IService ,AnalyseCommonService>{ + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineSummaryService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineSummaryService.java new file mode 100644 index 0000000..3acb8b0 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseEngineSummaryService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseEngineSummary; +import com.fibo.ddp.common.model.analyse.vo.AnalyseEngineSummaryVo; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; + +import java.util.Map; + +/** + * (TAnalyseEngineSummary)表服务接口 + */ +public interface AnalyseEngineSummaryService extends IService { + + MapgetAnalyseData(AnalyseRequestParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseRuleService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseRuleService.java new file mode 100644 index 0000000..fc440de --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseRuleService.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseRule; + +import java.util.List; + +/** + * (AnalyseRule)表服务接口 + */ +public interface AnalyseRuleService extends IService ,AnalyseCommonService>{ + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseScorecardService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseScorecardService.java new file mode 100644 index 0000000..7f26f22 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseScorecardService.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.service.analyse; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.analyse.AnalyseScorecard; + +import java.util.List; + +/** + * (AnalyseScorecard)表服务接口 + */ +public interface AnalyseScorecardService extends IService,AnalyseCommonService>> { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseService.java new file mode 100644 index 0000000..3458589 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/AnalyseService.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.service.analyse; + +import com.fibo.ddp.common.model.analyse.vo.AnalyseData; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; + +public interface AnalyseService{ + + AnalyseData getAnalyseData(AnalyseRequestParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/StatisticsService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/StatisticsService.java new file mode 100644 index 0000000..19709b0 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/StatisticsService.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.service.analyse; + +/** + * 不同统计入库 + */ +public interface StatisticsService { + public void statisticData(); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseChartStatisticServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseChartStatisticServiceImpl.java new file mode 100644 index 0000000..0aa3164 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseChartStatisticServiceImpl.java @@ -0,0 +1,321 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineVersionMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorEngineMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorNodeMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.analyse.*; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSetDTO; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorEngine; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNodeDTO; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategyDTO; +import com.fibo.ddp.common.service.analyse.*; +import org.apache.commons.lang.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Created by niuge on 2021/11/5. + */ +@Service +public class AnalyseChartStatisticServiceImpl implements StatisticsService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private EngineVersionMapper engineVersionMapper; + @Autowired + private EngineMapper engineMapper; + @Autowired + private AnalyseEngineCallService analyseEngineCallService; + @Autowired + private TMonitorEngineMapper monitorEngineMapper; + @Autowired + private TMonitorNodeMapper monitorNodeMapper; + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + @Autowired + private AnalyseDecisionResultService analyseDecisionResultService; + @Autowired + private AnalyseRuleService analyseRuleService; + @Autowired + private AnalyseScorecardService analyseScorecardService; + @Autowired + private AnalyseDecisionTablesService analyseDecisionTablesService; + @Autowired + private AnalyseEngineNodeService analyseEngineNodeService; + + @Override + public void statisticData() { + //图表数据统计 + AnalyseChartEngineCallCount(); + //决策引擎执行结果 统计 + AnalyseDecisionResultCount(); + //决策引擎规则命中次数 统计 + AnalyseRuleCount(); + //决策引擎规则评分卡命中次数 统计 + AnalyseScorecardCount(); + //决策引擎 决策表命中次数 统计 + AnalyseDecisionTablesCount(); + //决策引擎 节点层面 + AnalyseNodeCount(); + } + + /** + * 表格 节点命中次数 统计(一天统计 一次) + */ + private void AnalyseNodeCount() { + //节点命中次数 统计(一天统计 一次) + List monitorNodeDTOS = monitorNodeMapper.countNodeHit(); + List analyseEngineNodes = new ArrayList<>(); + for (int i = 0; i < monitorNodeDTOS.size(); i++) { + TMonitorNodeDTO tMonitorNodeDTO = monitorNodeDTOS.get(i); + buildNode(tMonitorNodeDTO,analyseEngineNodes); + } + analyseEngineNodeService.saveBatch(analyseEngineNodes); + } + + private void buildNode(TMonitorNodeDTO tMonitorNodeDTO, List analyseEngineNodes) { + AnalyseEngineNode analyseEngineNode = new AnalyseEngineNode(); + analyseEngineNode.setCallDate(tMonitorNodeDTO.getCallDate()); + //引擎id + analyseEngineNode.setEngineId(tMonitorNodeDTO.getEngineId()); + //引擎版本id + analyseEngineNode.setVersionId(tMonitorNodeDTO.getEngineVersionId()); + analyseEngineNode.setVersionCode(null); + analyseEngineNode.setEngineName(null); + analyseEngineNode.setEngineDescription(null); + analyseEngineNode.setOrganId(tMonitorNodeDTO.getOrganId()); + analyseEngineNode.setNodeName(tMonitorNodeDTO.getNodeName()); + analyseEngineNode.setNodeId(tMonitorNodeDTO.getNodeId()); + analyseEngineNode.setPassCount(tMonitorNodeDTO.getTotal()); + analyseEngineNode.setCreateTime(new Date()); + analyseEngineNode.setCreateUserId(Long.valueOf(1)); + analyseEngineNode.setUpdateUserId(Long.valueOf(1)); + analyseEngineNode.setUpdateTime(new Date()); + analyseEngineNodes.add(analyseEngineNode); + } + + /** + * 表格 决策表调用次数 统计(一天统计 一次) + */ + private void AnalyseDecisionTablesCount() { + List monitorStrategyDTOS = monitorStrategyMapper.countDecisionTables(); + List analyseDecisionTables = new ArrayList<>(); + for (int i = 0; i < monitorStrategyDTOS.size(); i++) { + TMonitorStrategyDTO tMonitorStrategyDTO = monitorStrategyDTOS.get(i); + buildDecisionTables(tMonitorStrategyDTO,analyseDecisionTables); + } + analyseDecisionTablesService.saveBatch(analyseDecisionTables); + } + + private void buildDecisionTables(TMonitorStrategyDTO tMonitorStrategyDTO, List analyseDecisionTables) { + AnalyseDecisionTables decisionTables = new AnalyseDecisionTables(); + decisionTables.setCallDate(tMonitorStrategyDTO.getCallDate()); + //引擎id + decisionTables.setEngineId(tMonitorStrategyDTO.getEngineId()); + decisionTables.setEngineName(null); + decisionTables.setEngineDescription(null); + //引擎版本id + decisionTables.setVersionId(tMonitorStrategyDTO.getEngineVersionId()); + //组织id + decisionTables.setOrganId(tMonitorStrategyDTO.getOrganId()); + decisionTables.setDecisonTablesId(tMonitorStrategyDTO.getStrategyId()); + decisionTables.setDecisonTablesName(tMonitorStrategyDTO.getStrategyName()); + decisionTables.setDecisonTablesVersionCode(null); + decisionTables.setDecisonTablesVersionId(null); + decisionTables.setResultCount(tMonitorStrategyDTO.getTotal()); + //执行结果 + decisionTables.setResult(tMonitorStrategyDTO.getResult()); + + decisionTables.setCreateTime(new Date()); + decisionTables.setCreateUserId(Long.valueOf(1)); + decisionTables.setUpdateUserId(Long.valueOf(1)); + decisionTables.setUpdateTime(new Date()); + analyseDecisionTables.add(decisionTables); + } + + /** + * 表格 评分卡调用次数 统计(一天统计 一次) + */ + private void AnalyseScorecardCount() { + List monitorStrategyDTOS = monitorStrategyMapper.countScorecardHit(); + List analyseScorecards = new ArrayList<>(); + for (int i = 0; i < monitorStrategyDTOS.size(); i++) { + TMonitorStrategyDTO tMonitorStrategyDTO = monitorStrategyDTOS.get(i); + buildScorecard(tMonitorStrategyDTO,analyseScorecards); + } + analyseScorecardService.saveBatch(analyseScorecards); + } + + private void buildScorecard(TMonitorStrategyDTO tMonitorStrategyDTO, List analyseScorecards) { + AnalyseScorecard analyseScorecard = new AnalyseScorecard(); + analyseScorecard.setCallDate(tMonitorStrategyDTO.getCallDate()); + //引擎id + analyseScorecard.setEngineId(tMonitorStrategyDTO.getEngineId()); + analyseScorecard.setEngineName(null); + analyseScorecard.setEngineDescription(null); + //引擎版本id + analyseScorecard.setVersionId(tMonitorStrategyDTO.getEngineVersionId()); + analyseScorecard.setOrganId(tMonitorStrategyDTO.getOrganId()); + analyseScorecard.setScorecardId(tMonitorStrategyDTO.getStrategyId()); + analyseScorecard.setScorecardName(tMonitorStrategyDTO.getStrategyName()); + analyseScorecard.setScorecardVersionCode(null); + analyseScorecard.setScorecardVersionId(null); + //评分卡执行输出结果 + analyseScorecard.setResult(tMonitorStrategyDTO.getResult()); + analyseScorecard.setResultCount(tMonitorStrategyDTO.getTotal()); + analyseScorecard.setCreateTime(new Date()); + analyseScorecard.setCreateUserId(Long.valueOf(1)); + analyseScorecard.setUpdateUserId(Long.valueOf(1)); + analyseScorecard.setUpdateTime(new Date()); + analyseScorecards.add(analyseScorecard); + } + + /** + * 表格 规则调用次数 统计(一天统计 一次) + */ + private void AnalyseRuleCount() { + //一天统计一次 按照时间统计 + List monitorStrategyDTOS = monitorStrategyMapper.countRule(); + List analyseRules = new ArrayList<>(); + for (int i = 0; i < monitorStrategyDTOS.size(); i++) { + TMonitorStrategyDTO tMonitorStrategyDTO = monitorStrategyDTOS.get(i); + buildRules(tMonitorStrategyDTO,analyseRules); + } + analyseRuleService.saveBatch(analyseRules); + + } + + private void buildRules(TMonitorStrategyDTO tMonitorStrategyDTO, List analyseRules) { + AnalyseRule analyseRule = new AnalyseRule(); + analyseRule.setCallDate(tMonitorStrategyDTO.getCallDate()); + //引擎id + analyseRule.setEngineId(tMonitorStrategyDTO.getEngineId()); + //引擎版本id + analyseRule.setVersionId(tMonitorStrategyDTO.getEngineVersionId()); + analyseRule.setEngineName(null); + analyseRule.setEngineDescription(null); + analyseRule.setOrganId(tMonitorStrategyDTO.getOrganId()); + analyseRule.setRuleId(tMonitorStrategyDTO.getStrategyId()); + analyseRule.setRuleName(tMonitorStrategyDTO.getStrategyName()); + analyseRule.setRuleVersionCode(null); + analyseRule.setRuleVersionId(null); + analyseRule.setHitCount(tMonitorStrategyDTO.getTotal()); + analyseRule.setCreateTime(new Date()); + analyseRule.setCreateUserId(Long.valueOf(1)); + analyseRule.setUpdateUserId(Long.valueOf(1)); + analyseRule.setUpdateTime(new Date()); + analyseRules.add(analyseRule); + } + + /** + * 表格引擎调用 统计(一天统计一次) + */ + private void AnalyseChartEngineCallCount() { + //查引擎版本表 按 引擎id ,引擎版本Id,组织id 来进行分组 + List engineVersions = engineVersionMapper.selectAll(); + //循环统计 统计结果放数组中里 + List engineCalls = new ArrayList<>(); + for (int i = 0; i < engineVersions.size(); i++) { + EngineVersion engineVersion = engineVersions.get(i); + Long engineId = engineVersion.getEngineId(); + Long versionId = engineVersion.getVersionId(); + Engine engine1 = engineMapper.selectById(engineId); + if(engine1==null){ + continue; + } + if(i%20==0){ + try { + TimeUnit.SECONDS.sleep(Long.valueOf("5"));//等待时 + } catch (InterruptedException e) { + logger.info("==============================睡眠100s"); + } + } + //决策引擎调用次数每天趋势 按天统计次数 + QueryWrapper monitorEngineQueryWrapper = new QueryWrapper<>(); + monitorEngineQueryWrapper.eq("engine_version_id",versionId); + //统计今天 + monitorEngineQueryWrapper.le("create_time", new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.addDays(new Date(),1))); + monitorEngineQueryWrapper.ge("create_time", new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.addDays(new Date(),0))); + Integer countNum = monitorEngineMapper.selectCount(monitorEngineQueryWrapper); + buildModels(engine1,versionId,engineCalls,Long.valueOf(countNum)); + } + insertIntoDB(engineCalls); + } + + /** + * 表格 引擎调用执行结果 统计 + */ + private void AnalyseDecisionResultCount() { + //决策引擎调用次数每天趋势 按天统计次数 + //统计今天 + List analyseDecisionResults = new ArrayList<>(); + List engineResultSetList = engineVersionMapper.countDecisionResult(); + for (int i = 0; i < engineResultSetList.size(); i++) { + EngineResultSetDTO engineResultSet = engineResultSetList.get(i); + buildEngineResultModels(engineResultSet,analyseDecisionResults); + } + analyseDecisionResultService.saveBatch(analyseDecisionResults); + } + + private void buildEngineResultModels(EngineResultSetDTO decisionResult, List analyseDecisionResults) { + AnalyseDecisionResult analyseDecisionResult = new AnalyseDecisionResult(); + analyseDecisionResult.setCallDate(decisionResult.getCallDate()); + analyseDecisionResult.setResult(decisionResult.getResult()); + //引擎id + analyseDecisionResult.setEngineId(decisionResult.getEngineId()); + analyseDecisionResult.setEngineName(decisionResult.getEngineName()); + analyseDecisionResult.setEngineDescription(null); + //引擎版本id + analyseDecisionResult.setVersionId(decisionResult.getEngineVersion()); + analyseDecisionResult.setOrganId(decisionResult.getOrganId()); + analyseDecisionResult.setCreateUserId(Long.valueOf(1)); + analyseDecisionResult.setUpdateUserId(Long.valueOf(1)); + analyseDecisionResult.setCreateTime(new Date()); + analyseDecisionResult.setUpdateTime(new Date()); + //引擎执行结果 + analyseDecisionResult.setResult(decisionResult.getResult()); + analyseDecisionResult.setResultCount(decisionResult.getTotal()); + analyseDecisionResults.add(analyseDecisionResult); + } + + public void insertIntoDB( List engineCalls){ +// CompletableFuture.runAsync(()->{ + analyseEngineCallService.saveBatch(engineCalls); +// },threadPoolTaskExecutor); + } + /** + * 根据业务类型 组装业务对象 + * @param engineCalls + * @param num + */ + private void buildModels(Engine engine1, Long versionId, List engineCalls, Long num) { + //组装统计信息数组 + AnalyseEngineCall analyseEngineCall = new AnalyseEngineCall(); + analyseEngineCall.setEngineId(engine1.getId()); + analyseEngineCall.setEngineName(engine1.getName()); + analyseEngineCall.setEngineDescription(engine1.getDescription()); + analyseEngineCall.setVersionId(versionId); + analyseEngineCall.setVersionCode(null); + analyseEngineCall.setCallCount(num); + analyseEngineCall.setOrganId(engine1.getOrganId()); + analyseEngineCall.setCreateUserId(Long.valueOf(1)); + analyseEngineCall.setUpdateUserId(Long.valueOf(1)); + analyseEngineCall.setCreateTime(new Date()); + analyseEngineCall.setUpdateTime(new Date()); + analyseEngineCall.setCallDate(new Date()); + engineCalls.add(analyseEngineCall); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionResultServiceImpl.java new file mode 100644 index 0000000..29c47ba --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionResultServiceImpl.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseDecisionResultMapper; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionResult; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseDecisionResultService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * (AnalyseDecisionResult)表服务实现类 + */ +@Service("analyseDecisionResultService") +public class AnalyseDecisionResultServiceImpl extends ServiceImpl implements AnalyseDecisionResultService { + + @Autowired + private AnalyseDecisionResultMapper mapper; + @Override + public List> getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseDecisionResult::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseDecisionResult::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseDecisionResult::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseDecisionResult::getCallDate,param.getStart()); + wrapper.lt(AnalyseDecisionResult::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseDecisionResult::getCallDate); + List analyseDecisionResults = mapper.selectList(wrapper); + Map> map = new HashMap<>(); + for (AnalyseDecisionResult item : analyseDecisionResults) { + List list = null; + String key = item.getResult(); + if (map.containsKey(key)){ + list = map.get(key); + }else { + list= new ArrayList<>(); + } + list.add(item); + map.put(key,list); + } + List> result = new ArrayList<>(map.values()); + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionTablesServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionTablesServiceImpl.java new file mode 100644 index 0000000..43ab4ff --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseDecisionTablesServiceImpl.java @@ -0,0 +1,62 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseDecisionTablesMapper; +import com.fibo.ddp.common.model.analyse.AnalyseDecisionTables; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseDecisionTablesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * (AnalyseDecisionTables)表服务实现类 + */ +@Service("analyseDecisonTablesService") +public class AnalyseDecisionTablesServiceImpl extends ServiceImpl implements AnalyseDecisionTablesService { + @Autowired + private AnalyseDecisionTablesMapper mapper; + + @Override + public List>> getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseDecisionTables::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseDecisionTables::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseDecisionTables::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseDecisionTables::getCallDate,param.getStart()); + wrapper.lt(AnalyseDecisionTables::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseDecisionTables::getCallDate); + List analyseDecisionTables = mapper.selectList(wrapper); + Map>> map = new HashMap<>(); + + for (AnalyseDecisionTables item : analyseDecisionTables) { + List list = null; + String versionKey = String.valueOf(item.getDecisonTablesId())+"|"+String.valueOf(item.getDecisonTablesVersionId()); + String resultKey = item.getResult(); + Map> temp =null; + if (map.containsKey(versionKey)){ + temp = map.get(versionKey); + }else { + temp = new HashMap<>(); + } + if (temp.containsKey(resultKey)){ + list = temp.get(resultKey); + }else { + list = new ArrayList<>(); + } + list.add(item); + temp.put(resultKey,list); + map.put(versionKey,temp); + } + List>> result = new ArrayList<>(); + for (Map> value : map.values()) { + result.add(new ArrayList<>(value.values())); + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineCallServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineCallServiceImpl.java new file mode 100644 index 0000000..a9a50e3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineCallServiceImpl.java @@ -0,0 +1,34 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseEngineCallMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineCall; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseEngineCallService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * (AnalyseEngineCall)表服务实现类 + */ +@Service("analyseEngineCallService") +public class AnalyseEngineCallServiceImpl extends ServiceImpl implements AnalyseEngineCallService { + + @Autowired + private AnalyseEngineCallMapper mapper; + @Override + public List getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseEngineCall::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseEngineCall::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseEngineCall::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseEngineCall::getCallDate,param.getStart()); + wrapper.lt(AnalyseEngineCall::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseEngineCall::getCallDate); + List result = mapper.selectList(wrapper); + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineNodeServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineNodeServiceImpl.java new file mode 100644 index 0000000..d8e34d2 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineNodeServiceImpl.java @@ -0,0 +1,51 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseEngineNodeMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineNode; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseEngineNodeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * (AnalyseEngineNode)表服务实现类 + */ +@Service("analyseEngineNodeService") +public class AnalyseEngineNodeServiceImpl extends ServiceImpl implements AnalyseEngineNodeService { + + @Autowired + private AnalyseEngineNodeMapper mapper; + @Override + public List> getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseEngineNode::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseEngineNode::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseEngineNode::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseEngineNode::getCallDate,param.getStart()); + wrapper.lt(AnalyseEngineNode::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseEngineNode::getCallDate); + List AnalyseEngineNodes = mapper.selectList(wrapper); + Map> map = new HashMap<>(); + for (AnalyseEngineNode item : AnalyseEngineNodes) { + List list = null; + String key = String.valueOf(item.getNodeId()); + if (map.containsKey(key)){ + list = map.get(key); + }else { + list= new ArrayList<>(); + } + list.add(item); + map.put(key,list); + } + List> result = map.values().stream().collect(Collectors.toList()); + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineSummaryServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineSummaryServiceImpl.java new file mode 100644 index 0000000..c1f7608 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseEngineSummaryServiceImpl.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseEngineSummaryMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineSummary; +import com.fibo.ddp.common.model.analyse.vo.AnalyseEngineSummaryVo; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseEngineSummaryService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.constant.AnalyseConst; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; + +/** + * (TAnalyseEngineSummary)表服务实现类 + */ +@Service("tAnalyseEngineSummaryService") +public class AnalyseEngineSummaryServiceImpl extends ServiceImpl implements AnalyseEngineSummaryService { + + @Autowired + private AnalyseEngineSummaryMapper summaryMapper; + + @Override + public Map getAnalyseData(AnalyseRequestParam param) { + Map result = new HashMap<>(); + Date now = new Date(); + Date yesterday = this.dateAdd(now,-1); + for (String key : AnalyseConst.KEYS) { + AnalyseEngineSummary curData = this.getDataByEndDate(param.getVersionId(), key, now, false); + long curCount = 0L; + if (curData!=null){ + curCount = curData.getStatisticsCount(); + } + AnalyseEngineSummary lastData = this.getDataByEndDate(param.getVersionId(), key, yesterday, false); + long lastCount = 0L; + if (lastData!=null&&lastData.getStatisticsCount()!=null){ + lastCount = lastData.getStatisticsCount(); + } + AnalyseEngineSummary lastTotalData = this.getDataByEndDate(param.getVersionId(), key, yesterday, true); + long lastTatol = 0L; + if (lastTotalData!=null){ + lastTatol = lastTotalData.getStatisticsCount(); + } + result.put(key,new AnalyseEngineSummaryVo(curCount, lastCount,lastTatol)); + } + return result; + } + //获取指定时间所在日期的指定类型数据 + private AnalyseEngineSummary getDataByEndDate(Long versionId,String dimension, Date end,boolean istotal){ + LambdaQueryWrapper wrapper = this.createWrapper(versionId, dimension, end); + if (istotal){ + wrapper.lt(AnalyseEngineSummary::getCreateTime,this.clearTime(this.dateAdd(end,1))); + }else { + wrapper.le(AnalyseEngineSummary::getCreateTime,end); + } + wrapper.orderByDesc(AnalyseEngineSummary::getCreateTime); + return this.getOne(wrapper,false); + } + //构造查询wrapper + private LambdaQueryWrapper createWrapper(Long versionId,String dimension, Date end){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseEngineSummary::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.eq(AnalyseEngineSummary::getStatisticsDimension,dimension); + wrapper.eq(AnalyseEngineSummary::getEngineVersionId, versionId); + Date start = this.clearTime(end); + wrapper.ge(AnalyseEngineSummary::getCreateTime,start); + return wrapper; + } + //清除时间信息 + private Date clearTime(Date date){ + LocalDate localDate=date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Date result=java.sql.Date.valueOf(localDate); + return result; + } + //增加日期 + private Date dateAdd(Date date,Integer integer){ + Calendar c =new GregorianCalendar(); + c.setTime(date); + c.add(Calendar.DATE,integer); + return c.getTime(); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseRuleServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseRuleServiceImpl.java new file mode 100644 index 0000000..c3890bc --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseRuleServiceImpl.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseRuleMapper; +import com.fibo.ddp.common.model.analyse.AnalyseRule; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * (AnalyseRule)表服务实现类 + */ +@Service("analyseRuleService") +public class AnalyseRuleServiceImpl extends ServiceImpl implements AnalyseRuleService { + + @Autowired + private AnalyseRuleMapper mapper; + @Override + public List> getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseRule::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseRule::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseRule::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseRule::getCallDate,param.getStart()); + wrapper.lt(AnalyseRule::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseRule::getCallDate); + List AnalyseRules = mapper.selectList(wrapper); + Map> map = new HashMap<>(); + for (AnalyseRule item : AnalyseRules) { + List list = null; + String key = String.valueOf(item.getRuleId())+"|"+String.valueOf(item.getRuleVersionId()); + if (map.containsKey(key)){ + list = map.get(key); + }else { + list= new ArrayList<>(); + } + list.add(item); + map.put(key,list); + } + List> result = new ArrayList<>(map.values()); + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseScorecardServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseScorecardServiceImpl.java new file mode 100644 index 0000000..14a64ce --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseScorecardServiceImpl.java @@ -0,0 +1,63 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.analyse.AnalyseScorecardMapper; +import com.fibo.ddp.common.model.analyse.AnalyseScorecard; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.service.analyse.AnalyseScorecardService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * (AnalyseScorecard)表服务实现类 + */ +@Service("tAnalyseScorecardService") +public class AnalyseScorecardServiceImpl extends ServiceImpl implements AnalyseScorecardService { + + @Autowired + private AnalyseScorecardMapper mapper; + + @Override + public List>> getAnalyseData(AnalyseRequestParam param) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AnalyseScorecard::getEngineId,param.getEngineId()); + wrapper.eq(AnalyseScorecard::getVersionId,param.getVersionId()); + wrapper.eq(AnalyseScorecard::getOrganId,param.getUser().getOrganId()); + wrapper.ge(AnalyseScorecard::getCallDate,param.getStart()); + wrapper.lt(AnalyseScorecard::getCallDate,param.getEnd()); + wrapper.orderByAsc(AnalyseScorecard::getCallDate); + List AnalyseScorecard = mapper.selectList(wrapper); + Map>> map = new HashMap<>(); + + for (AnalyseScorecard item : AnalyseScorecard) { + List list = null; + String versionKey = String.valueOf(item.getScorecardId())+"|"+String.valueOf(item.getScorecardVersionId()); + String resultKey = item.getResult(); + Map> temp =null; + if (map.containsKey(versionKey)){ + temp = map.get(versionKey); + }else { + temp = new HashMap<>(); + } + if (temp.containsKey(resultKey)){ + list = temp.get(resultKey); + }else { + list = new ArrayList<>(); + } + list.add(item); + temp.put(resultKey,list); + map.put(versionKey,temp); + } + List>> result = new ArrayList<>(); + for (Map> value : map.values()) { + result.add(new ArrayList<>(value.values())); + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseServiceImpl.java new file mode 100644 index 0000000..c383911 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/AnalyseServiceImpl.java @@ -0,0 +1,60 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.fibo.ddp.common.model.analyse.vo.AnalyseData; +import com.fibo.ddp.common.model.analyse.vo.AnalyseRequestParam; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.analyse.*; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.exception.ApiException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +@Service +public class AnalyseServiceImpl implements AnalyseService { + @Autowired + private AnalyseDecisionResultService decisionResultService; + @Autowired + private AnalyseDecisionTablesService analyseDecisionTablesService; + @Autowired + private AnalyseEngineCallService engineCallService; + @Autowired + private AnalyseEngineNodeService engineNodeService; + @Autowired + private AnalyseRuleService analyseRuleService; + @Autowired + private AnalyseScorecardService analyseScorecardService; +// @Autowired +// private AnalyseEngineSummaryService analyseEngineSummaryService; + @Override + public AnalyseData getAnalyseData(AnalyseRequestParam param) { + param = initParam(param); + AnalyseData analyseData = new AnalyseData(); + analyseData.setDecisionResultList(decisionResultService.getAnalyseData(param)); + analyseData.setDecisionTablesList(analyseDecisionTablesService.getAnalyseData(param)); + analyseData.setCallCountList(engineCallService.getAnalyseData(param)); + analyseData.setEngineNodeList(engineNodeService.getAnalyseData(param)); + analyseData.setRuleList(analyseRuleService.getAnalyseData(param)); + analyseData.setScorecardList(analyseScorecardService.getAnalyseData(param)); +// analyseData.setEngineSummary(analyseEngineSummaryService.getAnalyseData(inputParam)); + return analyseData; + } + private AnalyseRequestParam initParam(AnalyseRequestParam param){ + if (param==null + ||param.getEngineId()==null + ||param.getVersionId()==null + ||param.getStart()==null + ||param.getEnd()==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + param.setUser(SessionManager.getLoginAccount()); + Calendar c =new GregorianCalendar(); + c.setTime(param.getEnd()); + c.add(Calendar.DATE,1); + param.setEnd(c.getTime()); + return param; + + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/StatisticsServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/StatisticsServiceImpl.java new file mode 100644 index 0000000..7be1ee3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/analyse/impl/StatisticsServiceImpl.java @@ -0,0 +1,304 @@ +package com.fibo.ddp.common.service.analyse.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fibo.ddp.common.dao.analyse.AnalyseEngineCallMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineVersionMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorEngineMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorNodeMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.analyse.AnalyseEngineSummary; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorEngine; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.analyse.AnalyseEngineCallService; +import com.fibo.ddp.common.service.analyse.AnalyseEngineNodeService; +import com.fibo.ddp.common.service.analyse.AnalyseEngineSummaryService; +import com.fibo.ddp.common.service.analyse.StatisticsService; +import com.fibo.ddp.common.utils.constant.AnalyseConst; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.commons.lang3.time.StopWatch; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.client.coprocessor.AggregationClient; +import org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter; +import org.apache.hadoop.hbase.filter.CompareFilter; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.FilterList; +import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Service +public class StatisticsServiceImpl implements StatisticsService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private EngineVersionMapper engineVersionMapper; + @Autowired + private EngineMapper engineMapper; + @Autowired + private AnalyseEngineCallMapper analyseEngineCallMapper; + @Autowired + private AnalyseEngineCallService analyseEngineCallService; + @Autowired + private AnalyseEngineSummaryService analyseEngineSummaryService; + @Autowired + private AnalyseEngineNodeService analyseEngineNodeService; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private TMonitorEngineMapper monitorEngineMapper; + @Autowired + private TMonitorNodeMapper monitorNodeMapper; + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + @Autowired + private HbaseTemplate hbaseTemplate; + private final String MONITOR_DECISION_FLOW = "monitor_decision_flow"; + private final String MONITOR_NODE = "monitor_node"; + private final String BASE_INFO = "base_info"; + private final String ENGINE_VERSION_ID = "engine_version_id"; + private final String NODE_TYPE = "node_type"; + + @Override + public void statisticData() { +// AnalyseEngineSummaryCountHBase(); + //引擎概况 + AnalyseEngineSummaryCountMysql(); + return; + } + /** + * 决策引擎调用次数统计 + */ + private void AnalyseEngineSummaryCountHBase() { + //查引擎版本表 按 引擎id ,引擎版本Id,组织id 来进行分组 + List engineVersions = engineVersionMapper.selectAll(); + //循环统计 统计结果放数组中里 + List engineCalls = new ArrayList<>(); + for (int i = 0; i < engineVersions.size(); i++) { + EngineVersion engineVersion = engineVersions.get(i); + Long engineId = engineVersion.getEngineId(); + Long versionId = engineVersion.getVersionId(); + Engine engine1 = engineMapper.selectById(engineId); + if(engine1==null){ + continue; + } + if(i%20==0){ + try { + TimeUnit.SECONDS.sleep(Long.valueOf("5"));//等待时 + } catch (InterruptedException e) { + logger.info("==============================睡眠100s"); + } + } + //引擎调用 + Long countNum = rowCount(BASE_INFO,ENGINE_VERSION_ID,MONITOR_DECISION_FLOW,versionId+"",""); + buildModels(engine1,versionId,engineCalls,countNum, AnalyseConst.ENGINE_CALL); + //节点命中 + Long countNumNode = rowCount(BASE_INFO,ENGINE_VERSION_ID,MONITOR_NODE,versionId+"",""); + buildModels(engine1,versionId,engineCalls,countNumNode,AnalyseConst.NODE_HIT); + //评分卡命中 + Long scoredNodeNum = rowCount(BASE_INFO,ENGINE_VERSION_ID,MONITOR_NODE,versionId+"",AnalyseConst.SCORECARD); + buildModels(engine1,versionId,engineCalls,scoredNodeNum,AnalyseConst.SCORECARD); + //决策表命中 + Long decisionTableNum = rowCount(BASE_INFO,ENGINE_VERSION_ID,MONITOR_NODE,versionId+"",AnalyseConst.DECISION_TABLES); + buildModels(engine1,versionId,engineCalls,decisionTableNum,AnalyseConst.DECISION_TABLES); + //规则集合下的规则?命中 + Long ruleNum = rowCount(BASE_INFO,ENGINE_VERSION_ID,MONITOR_NODE,versionId+"",AnalyseConst.RULE_HIT); + buildModels(engine1,versionId,engineCalls,ruleNum,AnalyseConst.RULE_HIT); + System.out.println("===========================decisionCallCount:版本号 "+versionId+" 计数 "+countNum); + } + insertIntoDB(engineCalls); + logger.info("=======================================>需要插入:{}行",engineCalls.size()); +// if(CollectionUtil.isNotNullOrEmpty(engineCalls)){ +// //分批入库,每批500个吧 +// for (int i = 0; i < engineCalls.size(); i++) { +// if(i!=0 && (i%500==0)){ +// insertIntoDB(engineCalls.subList((i/500-1)*500,i-1)); +// } +// //处理 不足五百的情况 +// if(engineCalls.size()%500>0 && i==engineCalls.size()-1){ +// //最后一批不足五百 +// if(engineCalls.size()/500>0){ +// insertIntoDB(engineCalls.subList((engineCalls.size()/500-1)*500,engineCalls.size()-1)); +// //第一批就不足五百 +// }else if(engineCalls.size()/500==0){ +// insertIntoDB(engineCalls.subList(0,engineCalls.size()-1)); +// } +// } +// } +// } + return; + } + + /** + * 根据业务类型 组装业务对象 + * @param engineCalls + * @param countNumNode + * @param type + */ + private void buildModels(Engine engine1,Long versionId,List engineCalls, Long countNumNode,String type) { + //组装统计信息数组 + AnalyseEngineSummary engineSummary = new AnalyseEngineSummary(); + engineSummary.setEngineVersionId(versionId); + engineSummary.setEngineName(engine1.getName()); + engineSummary.setStatisticsDimension(type); + engineSummary.setStatisticsCount(countNumNode); + engineSummary.setOrganId(engine1.getOrganId()); + engineSummary.setCreateTime(new Date()); + engineSummary.setUpdateTime(new Date()); + engineCalls.add(engineSummary); + } + + public void insertIntoDB( List engineCalls){ +// CompletableFuture.runAsync(()->{ + analyseEngineSummaryService.saveBatch(engineCalls); + +// },threadPoolTaskExecutor); + } + + + public Configuration getConfiguration() { + return hbaseTemplate.getConfiguration(); + } + + public long rowCount(String family,String column,String tableName,String versionId,String flag) { + long rowCount = 0; + Configuration conf = getConfiguration(); + Scan scan = new Scan(); +// scan.addColumn("base_info".getBytes(),"engine_version_id".getBytes()); + Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column), CompareFilter.CompareOp.EQUAL, JSON.toJSONString(versionId).getBytes()); + FilterList filterList = new FilterList(); + if(flag.equals(AnalyseConst.SCORECARD)){ + Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(NODE_TYPE), CompareFilter.CompareOp.EQUAL, JSON.toJSONString("4").getBytes()); + filterList.addFilter(filter2); + } + if(flag.equals(AnalyseConst.DECISION_TABLES)){ + Filter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(NODE_TYPE), CompareFilter.CompareOp.EQUAL, JSON.toJSONString("16").getBytes()); + filterList.addFilter(filter); + } + if(flag.equals(AnalyseConst.RULE_HIT)){ + Filter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(NODE_TYPE), CompareFilter.CompareOp.EQUAL, JSON.toJSONString("2").getBytes()); + filterList.addFilter(filter); + } + filterList.addFilter(filter1); + scan.setFilter(filterList); + + //以下的方式可用 +// ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(JSON.toJSONString("507").getBytes())); +// scan.setFilter(valueFilter); + //提高RPC通信时长 + conf.setLong("hbase.rpc.timeout", 600000); + //设置Scan缓存 + conf.setLong("hbase.client.scanner.caching", 1000); + Configuration configuration = HBaseConfiguration.create(conf); + AggregationClient aggregationClient = new AggregationClient(configuration); + try + { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + rowCount = aggregationClient.rowCount(TableName.valueOf(tableName), new LongColumnInterpreter(), scan); + System.out.println("RowCount: " + rowCount); + stopWatch.stop(); + System.out.println("统计耗时:" +stopWatch.getTime()/1000 +"s"); + } + catch (Throwable e) + { + logger.info("==========decisionCallCount 统计出错",e); + } + + return rowCount; + } + + + /** + * 决策引擎概况 统计 + */ + private void AnalyseEngineSummaryCountMysql() { + //查引擎版本表 按 引擎id ,引擎版本Id,组织id 来进行分组 + List engineVersions = engineVersionMapper.selectAll(); + //循环统计 统计结果放数组中里 + List engineCalls = new ArrayList<>(); + for (int i = 0; i < engineVersions.size(); i++) { + EngineVersion engineVersion = engineVersions.get(i); + Long engineId = engineVersion.getEngineId(); + Long versionId = engineVersion.getVersionId(); + Engine engine1 = engineMapper.selectById(engineId); + if(engine1==null){ + continue; + } + if(i%20==0){ + try { + TimeUnit.SECONDS.sleep(Long.valueOf("5"));//等待时 + } catch (InterruptedException e) { + logger.info("==============================睡眠100s"); + } + } + //引擎调用(查询Mysql 表 t_monitor_engine 统计该版本id 对应的监控记录条数) + QueryWrapper monitorEngineQueryWrapper = new QueryWrapper<>(); + monitorEngineQueryWrapper.eq("engine_version_id",versionId); + Integer countNum = monitorEngineMapper.selectCount(monitorEngineQueryWrapper); + buildModels(engine1,versionId,engineCalls,Long.valueOf(countNum),AnalyseConst.ENGINE_CALL); + //节点命中 + QueryWrapper monitorNodeQueryWrapper = new QueryWrapper<>(); + monitorNodeQueryWrapper.eq("engine_version_id",versionId); + Integer countNumNode = monitorNodeMapper.selectCount(monitorNodeQueryWrapper); + buildModels(engine1,versionId,engineCalls,Long.valueOf(countNumNode),AnalyseConst.NODE_HIT); + //评分卡命中 + QueryWrapper monitorNodeQueryWrapper1 = new QueryWrapper<>(); + monitorNodeQueryWrapper1.eq("engine_version_id",versionId); + monitorNodeQueryWrapper1.eq("node_type",4); + Integer scoredNodeNum = monitorNodeMapper.selectCount(monitorNodeQueryWrapper1); + buildModels(engine1,versionId,engineCalls,Long.valueOf(scoredNodeNum),AnalyseConst.SCORECARD); + //决策表命中 + QueryWrapper monitorNodeQueryWrapper2 = new QueryWrapper<>(); + monitorNodeQueryWrapper2.eq("engine_version_id",versionId); + monitorNodeQueryWrapper2.eq("node_type",16); + Integer decisionTableNum = monitorNodeMapper.selectCount(monitorNodeQueryWrapper2); + buildModels(engine1,versionId,engineCalls,Long.valueOf(decisionTableNum),AnalyseConst.DECISION_TABLES); + //规则集合下的规则?命中 + QueryWrapper monitorNodeQueryWrapper3 = new QueryWrapper<>(); + monitorNodeQueryWrapper3.eq("engine_version_id",versionId); + monitorNodeQueryWrapper3.eq("node_type",2); + Integer ruleNum = monitorNodeMapper.selectCount(monitorNodeQueryWrapper3); + buildModels(engine1,versionId,engineCalls,Long.valueOf(ruleNum),AnalyseConst.RULE_HIT); + System.out.println("===========================decisionCallCount:版本号 "+versionId+" 计数 "+countNum); + } + insertIntoDB(engineCalls); + logger.info("=======================================>需要插入:{}行",engineCalls.size()); +// if(CollectionUtil.isNotNullOrEmpty(engineCalls)){ +// //分批入库,每批500个吧 +// for (int i = 0; i < engineCalls.size(); i++) { +// if(i!=0 && (i%500==0)){ +// insertIntoDB(engineCalls.subList((i/500-1)*500,i-1)); +// } +// //处理 不足五百的情况 +// if(engineCalls.size()%500>0 && i==engineCalls.size()-1){ +// //最后一批不足五百 +// if(engineCalls.size()/500>0){ +// insertIntoDB(engineCalls.subList((engineCalls.size()/500-1)*500,engineCalls.size()-1)); +// //第一批就不足五百 +// }else if(engineCalls.size()/500==0){ +// insertIntoDB(engineCalls.subList(0,engineCalls.size()-1)); +// } +// } +// } +// } + return; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalConfigService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalConfigService.java new file mode 100644 index 0000000..4305d78 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalConfigService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.approval; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.approval.ApprovalConfig; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.github.pagehelper.PageInfo; + +/** + * (ApprovalConfig)表服务接口 + */ +public interface ApprovalConfigService extends IService { + + boolean addApprovalConfig(ApprovalConfig entity); + + PageInfo queryList(QueryListParam param); + + boolean updateApprovalStatus(StatusParam statusParam); + //校验是否需要审批 + boolean checkApproval(String approvalType); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalService.java new file mode 100644 index 0000000..33d6f5c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/ApprovalService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.approval; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.approval.Approval; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.github.pagehelper.PageInfo; + +/** + * (Approval)表服务接口 + */ +public interface ApprovalService extends IService { + + boolean addApproval(Approval entity); + + PageInfo queryList(QueryListParam param); + + boolean updateApplyStatus(StatusParam statusParam); + + boolean updateStatus(StatusParam statusParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalConfigServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalConfigServiceImpl.java new file mode 100644 index 0000000..0ee8e7f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalConfigServiceImpl.java @@ -0,0 +1,159 @@ +package com.fibo.ddp.common.service.approval.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.approval.ApprovalConfigMapper; +import com.fibo.ddp.common.model.approval.ApprovalConfig; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.service.approval.ApprovalConfigService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.constant.ApprovalConsts; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * (ApprovalConfig)表服务实现类 + */ +@Service("approvalConfigService") +public class ApprovalConfigServiceImpl extends ServiceImpl implements ApprovalConfigService { + @Resource + private ApprovalConfigMapper approvalConfigMapper; + + + @Override + public boolean addApprovalConfig(ApprovalConfig entity) { + if (entity == null) { + return false; + } + this.initEntity(entity, 0); + boolean insert = this.saveOrUpdate(entity); + return insert; + } + + private void initEntity(ApprovalConfig entity, int type) { + SysUser loginAccount = SessionManager.getLoginAccount(); + + switch (type) { + //新增 + case 0: + if (entity.getApprovalStatus() == null) { + entity.setApprovalStatus(ApprovalConsts.ApprovalStatus.OFF); + } + if (loginAccount != null) { + if (entity.getCreateUserId() == null) { + entity.setCreateUserId(loginAccount.getUserId()); + } + if (entity.getOrganId() == null) { + entity.setOrganId(loginAccount.getOrganId()); + } + } + break; + //修改 + case 1: + if (loginAccount != null) { + if (entity.getCreateUserId() == null) { + entity.setCreateUserId(loginAccount.getUserId()); + } + if (entity.getUpdateUserId() == null) { + entity.setUpdateUserId(loginAccount.getUserId()); + } + } + break; + } + + + } + + @Override + public PageInfo queryList(QueryListParam param) { + int pageNum = param.getPageNum(); + int pageSize = param.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = this.createWrapper(param.getEntity()); + List list = this.list(wrapper); + PageInfo pageInfo = new PageInfo<>(list); + + return pageInfo; + } + + private LambdaQueryWrapper createWrapper(ApprovalConfig entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + SysUser loginAccount = SessionManager.getLoginAccount(); + if (loginAccount.getOrganId() != 1) { + wrapper.eq(ApprovalConfig::getOrganId, loginAccount.getOrganId()); + } + if (entity != null) { + if (entity.getId() != null) { + wrapper.eq(ApprovalConfig::getId, entity.getId()); + } + if (entity.getApprovalStatus() != null) { + wrapper.eq(ApprovalConfig::getApprovalStatus, entity.getApprovalStatus()); + } else { + wrapper.ne(ApprovalConfig::getApprovalStatus, ApprovalConsts.ApprovalStatus.DELETE); + } + if (entity.getCreateUserId() != null) { + wrapper.eq(ApprovalConfig::getCreateUserId, entity.getCreateUserId()); + } + if (entity.getUpdateUserId() != null) { + wrapper.eq(ApprovalConfig::getUpdateUserId, entity.getUpdateUserId()); + } + } else { + wrapper.ne(ApprovalConfig::getApprovalStatus, ApprovalConsts.ApprovalStatus.DELETE); + } + return wrapper; + } + + @Override + public boolean updateApprovalStatus(StatusParam statusParam) { + List oldList = this.list(createWrapper(null)); + Map map = new HashMap<>(); + if (oldList != null && !oldList.isEmpty()) { + map = oldList.stream().collect(Collectors.toMap(ApprovalConfig::getApprovalType, item -> { + return item; + })); + } + List list = statusParam.getList(); + List updateList = new ArrayList<>(); + int update = 0; + if (list != null && !list.isEmpty()) { + for (ApprovalConfig approvalConfig : list) { + ApprovalConfig old = map.get(approvalConfig.getApprovalType()); + if (old != null) { + old.setApprovalStatus(statusParam.getStatus()); + updateList.add(old); + } else { + approvalConfig.setApprovalStatus(statusParam.getStatus()); + this.initEntity(approvalConfig, 0); + updateList.add(approvalConfig); + } + } + update = approvalConfigMapper.insertOrUpdateBatch(updateList); + } + + return update > 0; + } + + @Override + public boolean checkApproval(String approvalType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApprovalConfig::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.eq(ApprovalConfig::getApprovalType, approvalType); + ApprovalConfig approvalConfig = this.getOne(wrapper, false); + if (approvalConfig != null && approvalConfig.getApprovalStatus() == ApprovalConsts.ApprovalStatus.ON) { + return true; + } + return false; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalServiceImpl.java new file mode 100644 index 0000000..f26b7b1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/approval/impl/ApprovalServiceImpl.java @@ -0,0 +1,224 @@ +package com.fibo.ddp.common.service.approval.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.approval.ApprovalMapper; +import com.fibo.ddp.common.model.approval.Approval; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.service.approval.ApprovalService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.utils.constant.ApprovalConsts; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * (Approval)表服务实现类 + */ +@Service("approvalService") +public class ApprovalServiceImpl extends ServiceImpl implements ApprovalService { + @Resource + private ApprovalMapper approvalMapper; + @Resource + private EngineVersionService engineVersionService; + + @Override + @Transactional + public boolean addApproval(Approval entity) { + if (entity == null) { + return false; + } + this.initEntity(entity, 0); + boolean insert = this.saveOrUpdate(entity); + return insert; + } + + private void initEntity(Approval entity, int type) { + SysUser loginAccount = SessionManager.getLoginAccount(); + if (entity==null){ + entity = new Approval(); + } + switch (type) { + //新增 + case 0: + if (entity.getApplyStatus() == null) { + entity.setApplyStatus(ApprovalConsts.ApplyStatus.WAIT); + } + if (entity.getStatus() == null) { + entity.setStatus(StatusConst.STATUS_ENABLED); + } + if (entity.getCreateTime() != null) { + entity.setCreateTime(new Date()); + } + if (loginAccount!=null){ + if (entity.getCreateUserId() == null) { + entity.setCreateUserId(loginAccount.getUserId()); + } + if (StringUtils.isBlank(entity.getCreateUserName())) { + entity.setCreateUserName(loginAccount.getNickName()); + } + if (entity.getOrganId()==null){ + entity.setOrganId(loginAccount.getOrganId()); + } + } + break; + //修改审批状态,需要一并执行修改该的内容 + case 1: + if (entity.getApplyStatus()!= ApprovalConsts.ApplyStatus.CANCEL){ + if (entity.getApprovalTime() == null) { + entity.setApprovalTime(new Date()); + } + if (loginAccount!=null){ + if (entity.getApprovalUserId() == null) { + entity.setApprovalUserId(loginAccount.getUserId()); + } + if (StringUtils.isBlank(entity.getApprovalUserName())) { + entity.setApprovalUserName(loginAccount.getNickName()); + } + } + } + //修改 + case 2: + if (entity.getUpdateTime() == null) { + entity.setUpdateTime(new Date()); + } + if (loginAccount!=null){ + if (entity.getUpdateUserId() == null) { + entity.setUpdateUserId(loginAccount.getUserId()); + } + if (StringUtils.isBlank(entity.getUpdateUserName())) { + entity.setUpdateUserName(loginAccount.getNickName()); + } + } + break; + } + + + } + + @Override + public PageInfo queryList(QueryListParam param) { + int pageNum = param.getPageNum(); + int pageSize = param.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = this.createWrapper(param.getEntity()); + wrapper.orderByDesc(Approval::getId); + List list = this.list(wrapper); + PageInfo pageInfo = new PageInfo<>(list); + + return pageInfo; + } + + @Override + @Transactional + public boolean updateApplyStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(Approval::getId, statusParam.getIds()); + Approval approval = new Approval(); + approval.setApplyStatus(statusParam.getStatus()); + initEntity(approval,1); + //修改状态 + boolean update = this.update(approval, updateWrapper); + if (update) { + //处理申请相关的逻辑 + handlerApplyByType(statusParam.getList(), statusParam.getStatus()); + } + return update; + } + + private boolean handlerApplyByType(List list, int status) { + for (Approval approval : list) { + try { + String applyDetail = approval.getApplyDetail(); + JSONObject jsonObject = JSON.parseObject(applyDetail); + switch (approval.getApplyType()) { + //决策流版本发布 + case ApprovalConsts.ApprovalType.DECISION_FLOW_VERSION_DEPLOY: + long engineVersionId = jsonObject.getLongValue("engineVersionId"); + engineVersionService.approvalCallBack(engineVersionId, status); + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Approval::getId,statusParam.getIds()); + Approval approval = new Approval(); + approval.setStatus(statusParam.getStatus()); + boolean update = this.update(approval, wrapper); + return update; + } + + private LambdaQueryWrapper createWrapper(Approval entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + SysUser loginAccount = SessionManager.getLoginAccount(); + if (loginAccount.getOrganId()!=1){ + wrapper.eq(Approval::getOrganId, loginAccount.getOrganId()); + } + if (entity != null) { + if (entity.getId() != null) { + wrapper.eq(Approval::getId, entity.getId()); + } + if (StringUtils.isNotBlank(entity.getApplyType())) { + wrapper.eq(Approval::getApplyType, entity.getApplyType()); + } + if (StringUtils.isNotBlank(entity.getCreateUserName())) { + wrapper.eq(Approval::getCreateUserName, entity.getCreateUserName()); + } + if (StringUtils.isNotBlank(entity.getApprovalUserName())) { + wrapper.eq(Approval::getApprovalUserName, entity.getApprovalUserName()); + } + if (entity.getApplyStatus()!=null){ + wrapper.eq(Approval::getApplyStatus,entity.getApplyStatus()); + } + if (entity.getStatus() != null) { + wrapper.eq(Approval::getStatus, entity.getStatus()); + } else { + wrapper.eq(Approval::getStatus, StatusConst.STATUS_ENABLED); + } + if (entity.getCreateUserId()!=null) { + if (entity.getCreateUserId()==0L){ + wrapper.eq(Approval::getCreateUserId, loginAccount.getUserId()); + }else { + wrapper.eq(Approval::getCreateUserId,entity.getCreateUserId()); + } + + } + if (entity.getQueryStartTime()!=null){ + wrapper.ge(Approval::getCreateTime,entity.getQueryStartTime()); + } + if (entity.getQueryEndTime()!=null){ + wrapper.le(Approval::getCreateTime,entity.getQueryEndTime()); + } + } else { + wrapper.eq(Approval::getStatus, StatusConst.STATUS_ENABLED); + } + return wrapper; + } + + private boolean checkAuthority(SysUser sysUser) { + + return false; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/DictionaryService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/DictionaryService.java new file mode 100644 index 0000000..0ff90a4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/DictionaryService.java @@ -0,0 +1,31 @@ +package com.fibo.ddp.common.service.authx.dictionary; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.authx.dictionary.Dictionary; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.github.pagehelper.PageInfo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * (Dictionary)表服务接口 + * + * @author jgp + * @since 2021-12-15 15:08:04 + */ +public interface DictionaryService extends IService { + + Dictionary queryByKey(String key); + + PageInfo queryList(QueryListParam param); + + boolean saveBatchDictionary(Collection dictionaries); + + boolean update(Dictionary param); + + Map refreshCache(); + + boolean deleteByIds(List ids); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/impl/DictionaryServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/impl/DictionaryServiceImpl.java new file mode 100644 index 0000000..e9a3106 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/dictionary/impl/DictionaryServiceImpl.java @@ -0,0 +1,129 @@ +package com.fibo.ddp.common.service.authx.dictionary.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.dictionary.DictionaryMapper; +import com.fibo.ddp.common.model.authx.dictionary.Dictionary; +import com.fibo.ddp.common.model.authx.dictionary.DictionaryCacheManager; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; + +import com.fibo.ddp.common.service.authx.dictionary.DictionaryService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * (Dictionary)表服务实现类 + * + * @author jgp + * @since 2021-12-15 15:08:05 + */ +@Service("dictionaryService") +public class DictionaryServiceImpl extends ServiceImpl implements DictionaryService { + private static boolean useCache = false; + private static final String useCacheKey = "useCache"; + private static final String useCacheOn = "on"; + @Resource + private DictionaryMapper dictionaryMapper; + + + @Override + public Dictionary queryByKey(String dictKey) { + if (StringUtils.isBlank(dictKey)) { + return null; + } + if (useCache) { + return DictionaryCacheManager.getByKey(dictKey); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Dictionary::getDictKey, dictKey); + return dictionaryMapper.selectOne(wrapper); + } + + @Override + public PageInfo queryList(QueryListParam param) { + QueryListParam.checkIsPage(param); + if (useCache) { + return DictionaryCacheManager.getByPage(param.getPageSize(), param.getPageNum()); + } + if (QueryListParam.checkIsPage(param)) { + + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + PageInfo pageInfo = new PageInfo<>(this.list()); + return pageInfo; + } + + @Override + public boolean saveBatchDictionary(Collection dictionaries) { + checkDictionaries(dictionaries); + boolean result = dictionaryMapper.insertOrUpdateBatch(dictionaries) > 0; + if (useCache) { + DictionaryCacheManager.addCache(dictionaries.stream().filter(item -> item.getId() != null).collect(Collectors.toList())); + } + return result; + } + + @Override + public boolean update(Dictionary param) { + checkDictionary(param); + boolean result = this.updateById(param); + if (useCache) { + DictionaryCacheManager.updateOrAddCache(param); + } + if (useCacheKey.equals(param.getDictKey())){ + refreshCache(); + } + return result; + } + + @Override + public synchronized Map refreshCache() { + useCache = false; + Dictionary dictionary = this.queryByKey(useCacheKey); + if (dictionary != null && useCacheOn.equals(dictionary.getDictValue())) { + useCache = true; + } + DictionaryCacheManager.clearCache(); + if (useCache) { + DictionaryCacheManager.addCache(this.list()); + } + return DictionaryCacheManager.getAllCache(); + } + + @Override + public boolean deleteByIds(List ids) { + boolean result = this.removeByIds(ids); + if (useCache) { + DictionaryCacheManager.deleteCacheByIds(ids); + } + return result; + } + + private boolean checkDictionaries(Collection dictionaries) { + if (!CollectionUtils.isEmpty(dictionaries)) { + dictionaries.forEach(item -> { + checkDictionary(item); + }); + return true; + } + return false; + } + + private void checkDictionary(Dictionary dictionary) { + if (dictionary == null || StringUtils.isBlank(dictionary.getDictKey())) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "新增字典变量的key不能为空"); + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysMenuService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysMenuService.java new file mode 100644 index 0000000..87b8d73 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysMenuService.java @@ -0,0 +1,64 @@ + +package com.fibo.ddp.common.service.authx.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.authx.system.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SysMenuService extends IService { + /** + * 查询所有资源 + * @return + */ + public List getAllSysMenu(SysMenu entity); + /** + * 查询单条资源 + * @param id + * @return + */ + public SysMenu findById(long id); + /** + * 新增资源 + * @param sysMenu + * @return + */ + public int createSysMenu(SysMenu sysMenu); + /** + * 修改资源 + * @param sysMenu + * @return + */ + public int updateSysMenu(SysMenu sysMenu); + /** + * 修改资源状态 + * @param id + * @param idList + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + /** + * 保存角色菜单关系(实现修改) + */ + public int insertRoleMenu(@Param("roleId") long roleId, @Param("list") List list); + /** + * 分配资源树 + * @param roleId + * @return + */ + public List findTreeList(SysMenu entity); + /** + * 获取所有启用资源 + * @return + */ + public List getAllValidMenu(SysMenu entity); + /** + * 删除角色菜单关系(实现修改) + */ + public int deleteRoleMenu(long roleId); + /** + * 验证唯一性 + */ + public List validateMenuOnly(SysMenu sysMenu); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysOrganizationService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysOrganizationService.java new file mode 100644 index 0000000..dc1ca4d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysOrganizationService.java @@ -0,0 +1,61 @@ +package com.fibo.ddp.common.service.authx.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.authx.system.SysOrganization; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +public interface SysOrganizationService extends IService { + /** + * 查询所有公司 + * + * @return + */ + public List getAllSysOrganization(); + + /** + * 获取所有启用公司 + * + * @return + */ + public List getAllValidOrgan(); + + /** + * 查询单个公司 + * + * @param id + * @return + */ + public SysOrganization findById(long id); + + /** + * 创建公司 + * + * @param SysOrganization + * @return + */ + public int createSysOrganization(SysOrganization SysOrganization); + + /** + * 修改公司 + * + * @param SysOrganization + * @return + */ + public int updateSysOrganization(SysOrganization SysOrganization); + + /** + * 修改公司状态(停用/启用、删除) + * + * @param states + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + + /** + * 验证唯一性 + */ + public List validateOrganOnly(SysOrganization SysOrganization); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysRoleService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysRoleService.java new file mode 100644 index 0000000..c25d2b4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysRoleService.java @@ -0,0 +1,73 @@ +package com.fibo.ddp.common.service.authx.system; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.authx.system.SysRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +public interface SysRoleService extends IService { + /** + * 获取本组织所有角色 + * @param organId + * @return + */ + public List getAllSysRole(long organId); + /** + * 获取所有角色 + */ + public List getAllRoles(); + /** + * 获取本组织启用的角色 + * @param organId + * @return + */ + public List getAllValidRole(@Param("organId") long organId, @Param("author") String author); + /** + * 查询本组织的单个用户 + * @param id + * @return + */ + public SysRole findById(@Param("userId") long id, @Param("organId") long organId); + /** + * 查询单个角色 + * @param id + * @return + */ + public SysRole findByAId(long id); + /** + * 创建本组织角色 + * @param sysRole + * @return + */ + public int createSysRole(SysRole sysRole); + /** + * 修改本公司角色 + * @param sysRole + * @return + */ + public int updateSysRole(SysRole sysRole); + + /** + * 修改角色状态(启用、停用、删除) + * @param id + * @param idList + * @return + */ + public int updateStatus(@Param("status") int status, @Param("list") List list); + /** + * 根据角色查询角色所在公司 + */ + public long getOrganByRoleId(long roleId); + /** + * 验证角色唯一性 + */ + public List validateRoleOnly(SysRole sysRole); + /** + * 查询公司管理员角色id + */ + public List getOrganRoleByAuthor(SysRole sysRole); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysUserService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysUserService.java new file mode 100644 index 0000000..2b5d06a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/SysUserService.java @@ -0,0 +1,58 @@ + +package com.fibo.ddp.common.service.authx.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.authx.system.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +public interface SysUserService extends IService { + /** + * 查询搜索用户 + */ + public List getAllUsers(SysUser sysUser); + /** + * 查询本组织单个用户 + * @param + * @return + */ + public SysUser findById(SysUser sysUser); + /** + * 创建本公司用户 + * @param sysUser + * @return + */ + public long createSysUser(SysUser sysUser); + /** + * 修改本公司用户 + * @param user + * @return + */ + public int updateSysUser(SysUser user); + /** + * 修改用户状态(停用/启用) + * @param + * @return + */ + public int updateStates(@Param("status") int status, @Param("list") List list); + /** + * 通过用户id查询角色 + * @param userId + * @return + */ + public SysUser findRoleByUserId(long userId); + /** + * 修改密码 + */ + public int updatePassword(SysUser sysUser); + + /** + * 本公司账号员工编号唯一性 + */ + public List validateUserOnly(SysUser sysUser); + + SysUser login(String account,String password); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysMenuServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..7f38b5d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysMenuServiceImpl.java @@ -0,0 +1,107 @@ +package com.fibo.ddp.common.service.authx.system.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysMenuMapper; +import com.fibo.ddp.common.model.authx.system.SysMenu; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.service.authx.system.SysMenuService; +import com.fibo.ddp.common.service.common.SessionManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + @Autowired + private SysMenuMapper sysMenuMapper; + + /** + * 查询所有资源 + */ + @Override + public List getAllSysMenu(SysMenu entity) { + return sysMenuMapper.getAllSysMenu(entity); + } + + /** + * 查询单条资源 + */ + @Override + public SysMenu findById(long id) { + return sysMenuMapper.findById(id); + } + + /** + * 新增资源 + */ + @Override + public int createSysMenu(SysMenu sysMenu) { + //获取登录人信息 + SysUser sysUser = SessionManager.getLoginAccount(); + //分配者 + long userId = sysUser.getUserId(); + sysMenu.setUserId(userId); + return sysMenuMapper.createSysMenu(sysMenu); + } + + /** + * 修改资源 + */ + @Override + public int updateSysMenu(SysMenu sysMenu) { + return sysMenuMapper.updateSysMenu(sysMenu); + } + + /** + * 修改资源状态 + */ + @Override + public int updateStatus(int status, List list) { + return sysMenuMapper.updateStatus(status, list); + } + + /** + * 获取所有启用资源 + */ + @Override + public List getAllValidMenu(SysMenu entity) { + return sysMenuMapper.getAllValidMenu(entity); + } + + /** + * 分配资源树 + */ + @Override + public List findTreeList(SysMenu entity) { + return sysMenuMapper.findTreeList(entity); + } + + /** + * 保存、修改资源树(实现修改) + */ + @Override + public int insertRoleMenu(long roleId, List list) { + //先删除原关系 + sysMenuMapper.deleteRoleMenu(roleId); + //保存菜单角色关系 + int insertNum = sysMenuMapper.insertRoleMenu(roleId, list); + return insertNum; + } + + /** + * 删除资源树 + */ + @Override + public int deleteRoleMenu(long roleId) { + return sysMenuMapper.deleteRoleMenu(roleId); + } + + /** + * 验证唯一性 + */ + @Override + public List validateMenuOnly(SysMenu sysMenu) { + return sysMenuMapper.validateMenuOnly(sysMenu); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysOrganizationServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysOrganizationServiceImpl.java new file mode 100644 index 0000000..07efc49 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysOrganizationServiceImpl.java @@ -0,0 +1,98 @@ +package com.fibo.ddp.common.service.authx.system.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysOrganizationMapper; +import com.fibo.ddp.common.dao.authx.system.SysRoleMapper; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.model.authx.system.SysOrganization; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.service.authx.system.SysOrganizationService; +import com.fibo.ddp.common.service.common.SessionManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class SysOrganizationServiceImpl extends ServiceImpl implements SysOrganizationService { + @Autowired + private SysOrganizationMapper sysOrganizationMapper; + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysUserMapper sysUserMapper; + + /** + * 查询公司 + */ + @Override + public List getAllSysOrganization() { + return sysOrganizationMapper.getAllSysOrganization(); + } + + /** + * 查询单个公司 + */ + @Override + public SysOrganization findById(long id) { + return sysOrganizationMapper.findById(id); + } + + /** + * 创建公司 + */ + @Override + public int createSysOrganization(SysOrganization SysOrganization) { + //获取登录人信息(超级管理员) + SysUser sysUser = SessionManager.getLoginAccount(); + String nickName = sysUser.getNickName(); + SysOrganization.setAuthor(nickName); + //生成token唯一标识 + String uuid = UUID.randomUUID().toString(); + SysOrganization.setToken(uuid); + return sysOrganizationMapper.createSysOrganization(SysOrganization); + } + + /** + * 修改公司 + */ + @Override + public int updateSysOrganization(SysOrganization SysOrganization) { + return sysOrganizationMapper.updateSysOrganization(SysOrganization); + } + + /** + * 批量修改公司状态 + */ + @Override + public int updateStatus(int status, List list) { + //删除、停用、启用每个公司下的所有角色 + sysRoleMapper.deleteRolesByOrgans(status, list); + //删除、停用、启用每个公司下的所有账号 + sysUserMapper.deleteUsersByOrgans(status, list); + //删除、停用、启用每个公司下的所有用户角色关系 + sysUserMapper.deleteUserRoleByOrgan(status, list); + //删除、停用、启用公司 + int num = sysOrganizationMapper.updateStatus(status, list); + return num; + } + + /** + * 获取所有启用公司 + */ + @Override + public List getAllValidOrgan() { + return sysOrganizationMapper.getAllValidOrgan(); + } + + /** + * 验证唯一性 + */ + @Override + public List validateOrganOnly( + SysOrganization SysOrganization) { + return sysOrganizationMapper.validateOrganOnly(SysOrganization); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysRoleServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..8730ee6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysRoleServiceImpl.java @@ -0,0 +1,130 @@ +package com.fibo.ddp.common.service.authx.system.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysRoleMapper; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.model.authx.system.SysRole; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.service.authx.system.SysRoleService; +import com.fibo.ddp.common.service.common.SessionManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysUserMapper sysUserMapper; + + /** + * 获取本组织所有角色 + * + * @return + */ + @Override + public List getAllSysRole(long organId) { + return sysRoleMapper.getAllSysRole(organId); + } + + /** + * 获取所有角色 + */ + @Override + public List getAllRoles() { + return sysRoleMapper.getAllRoles(); + } + + /** + * 获取本组织的单个角色 + */ + @Override + public SysRole findById(long id, long organId) { + return sysRoleMapper.findById(id, organId); + } + + /** + * 查询单个角色 + */ + @Override + public SysRole findByAId(long id) { + return sysRoleMapper.findByAId(id); + } + + /** + * 创建本公司的角色 + */ + @Override + public int createSysRole(SysRole sysRole) { + return sysRoleMapper.createSysRole(sysRole); + } + + /** + * 修改本公司角色 + */ + @Override + public int updateSysRole(SysRole sysRole) { + //获取管理员所在公司 + SysUser sysUser = SessionManager.getLoginAccount(); + long organId = sysUser.getOrganId(); + if (organId != 1) { + //修改本公司角色 + sysRole.setOrganId(organId); + } + return sysRoleMapper.updateSysRole(sysRole); + } + + /** + * 修改角色状态(启用、停用、删除) + */ + @Override + public int updateStatus(int status, List list) { + //查询角色下的账号id + List listu = sysUserMapper.getBatchUserIdsByRoleId(list); + //批量删除角色关联账号 + if (listu != null && listu.size() > 0) { + sysUserMapper.deleteUsersByIds(status, listu); + } + //批量删除角色账号关系 + sysUserMapper.deleteBatchUserRole(status, list); + //批量删除角色 + int num = sysRoleMapper.updateStatus(status, list); + return num; + } + + /** + * 根据角色查询公司 + */ + @Override + public long getOrganByRoleId(long roleId) { + return sysRoleMapper.getOrganByRoleId(roleId); + } + + /** + * 验证角色唯一性 + */ + @Override + public List validateRoleOnly(SysRole sysRole) { + return sysRoleMapper.validateRoleOnly(sysRole); + } + + /** + * 查询公司管理员角色id + */ + @Override + public List getOrganRoleByAuthor(SysRole sysRole) { + return sysRoleMapper.getOrganRoleByAuthor(sysRole); + } + + /** + * 获取公司启用角色 + */ + @Override + public List getAllValidRole(long organId, String author) { + return sysRoleMapper.getAllValidRole(organId, author); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysUserServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..657b26a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/authx/system/impl/SysUserServiceImpl.java @@ -0,0 +1,135 @@ +package com.fibo.ddp.common.service.authx.system.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.service.authx.system.SysUserService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.constant.StatusConst; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + + +@Service +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + @Autowired + private SysUserMapper sysUserMapper; + + /** + * 查询搜索用户 + */ + @Override + public List getAllUsers(SysUser sysUser) { + return sysUserMapper.getAllUsers(sysUser); + } + + /** + * 查询本组织单个用户 + * + * @return + */ + @Override + public SysUser findById(SysUser sysUser) { + return sysUserMapper.findById(sysUser); + } + + /** + * 创建用户 + */ + @Override + public long createSysUser(SysUser sysUser) { + long num = 0; + //密码加密 + String password = MD5.GetMD5Code("111111"); + sysUser.setPassword(password); + //创建人 + SysUser user = SessionManager.getLoginAccount(); + String nickName = user.getNickName(); + sysUser.setAuthor(nickName); + //创建用户并返回id +// sysUserMapper.createSysUser(sysUser); + sysUser.setStatus(StatusConst.STATUS_ENABLED); + sysUser.setBirth(new Date()); + sysUserMapper.insert(sysUser); + long uId = sysUser.getUserId(); + long roleId = sysUser.getSysRole().getRoleId(); + long orgaId = sysUser.getOrganId(); + if (uId != 0 && roleId != 0) { + //添加表关系 + num = sysUserMapper.insertUserRole(uId, roleId, orgaId); + } + return num; + } + + /** + * 修改本公司用户 + */ + @Override + public int updateSysUser(SysUser sysUser) { + int num = 0; + //修改用户 + int updateNum = sysUserMapper.updateSysUser(sysUser); + //修改用户角色关系 + if (updateNum == 1) { + num = sysUserMapper.updateUserRole(sysUser); + } + return num; + } + + /** + * 修改用户状态 + */ + @Override + public int updateStates(int status, List list) { + return sysUserMapper.updateStates(status, list); + } + + /** + * 通过用户id查询角色 + */ + @Override + public SysUser findRoleByUserId(long userId) { + return sysUserMapper.findRoleByUserId(userId); + } + + /** + * 修改密码 + */ + @Override + public int updatePassword(SysUser sysUser) { + //获取登录人id +// SysUser sysUser = SessionManager.getLoginAccount(); +// long userId = sysUser.getUserId(); + //密码加密 + String password = MD5.GetMD5Code(sysUser.getPassword()); + sysUser.setPassword(password); +// sysUser.setUserId(userId); + return sysUserMapper.updatePassword(sysUser); + } + + /** + * 本公司账号员工编号唯一性 + */ + @Override + public List validateUserOnly(SysUser sysUser) { + return sysUserMapper.validateUserOnly(sysUser); + } + + @Override + public SysUser login(String account, String password) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SysUser::getAccount, account) + .eq(SysUser::getPassword, password); + List list = this.list(wrapper); + if (list.size() == 1) { + return list.get(0); + } + return null; + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessEventLogService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessEventLogService.java new file mode 100644 index 0000000..e5c34da --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessEventLogService.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.service.cignacmb; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.cignacmb.BusinessEventLog; +import com.fibo.ddp.common.model.cignacmb.request.EventLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogResponse; +import com.github.pagehelper.PageInfo; + +/** + * 事件调用记录(BusinessEventLog)表服务接口 + */ +public interface BusinessEventLogService extends IService { + + PageInfo getEventLogList(EventLogParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessRuleLogService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessRuleLogService.java new file mode 100644 index 0000000..67ea670 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/BusinessRuleLogService.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.cignacmb; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.cignacmb.BusinessRuleLog; +import com.fibo.ddp.common.model.cignacmb.request.RuleLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogDetailResponse; +import com.fibo.ddp.common.model.cignacmb.response.RuleLogResponse; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * 规则执行记录(BusinessRuleLog)表服务接口 + */ +public interface BusinessRuleLogService extends IService { + + PageInfo getRuleLogList(RuleLogParam param); + + List queryByIds(List ids); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/ITBusinessRuleRelService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/ITBusinessRuleRelService.java new file mode 100644 index 0000000..5ebdda3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/ITBusinessRuleRelService.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.service.cignacmb; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.cignacmb.TBusinessRuleRel; +import com.fibo.ddp.common.model.cignacmb.req.BusinessRuleRelReq; +import com.fibo.ddp.common.model.common.ResponseEntityDto; + +/** + *

+ * 业务类型与规则关联表 服务类 + *

+ * + * @author oldRose + * @since 2021-11-10 + */ +public interface ITBusinessRuleRelService extends IService { + + ResponseEntityDto addBusinessRuleRel(BusinessRuleRelReq param); + + ResponseEntityDto editBusinessRuleRel(BusinessRuleRelReq param); + + ResponseEntityDto detailBusinessRuleRel(BusinessRuleRelReq param); + + ResponseEntityDto deleteBusinessRuleRel(BusinessRuleRelReq param); + + ResponseEntityDto pageList(BusinessRuleRelReq param); + + ResponseEntityDto queryByBusinessType(BusinessRuleRelReq param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessEventLogServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessEventLogServiceImpl.java new file mode 100644 index 0000000..2790802 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessEventLogServiceImpl.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.service.cignacmb.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.cignacmb.BusinessEventLogMapper; +import com.fibo.ddp.common.model.cignacmb.BusinessEventLog; +import com.fibo.ddp.common.model.cignacmb.request.EventLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogResponse; +import com.fibo.ddp.common.service.cignacmb.BusinessEventLogService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 事件调用记录(BusinessEventLog)表服务实现类 + */ +@Service +public class BusinessEventLogServiceImpl extends ServiceImpl implements BusinessEventLogService { + + @Autowired + private BusinessEventLogMapper eventLogMapper; + + @Override + public PageInfo getEventLogList(EventLogParam param) { + Long organId = SessionManager.getSession().getSysUser().getOrganId(); + param.setOrganId(organId); + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + List eventLogResponses = eventLogMapper.queryAllByLimit(param); + PageInfo pageInfo = new PageInfo<>(eventLogResponses); + return pageInfo; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessRuleLogServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessRuleLogServiceImpl.java new file mode 100644 index 0000000..41c30a1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/BusinessRuleLogServiceImpl.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.service.cignacmb.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.cignacmb.BusinessRuleLogMapper; +import com.fibo.ddp.common.model.cignacmb.BusinessRuleLog; +import com.fibo.ddp.common.model.cignacmb.request.RuleLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogDetailResponse; +import com.fibo.ddp.common.model.cignacmb.response.RuleLogResponse; +import com.fibo.ddp.common.service.cignacmb.BusinessRuleLogService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 规则执行记录(BusinessRuleLog)表服务实现类 + */ +@Service +public class BusinessRuleLogServiceImpl extends ServiceImpl implements BusinessRuleLogService { + + @Autowired + private BusinessRuleLogMapper ruleLogMapper; + + @Override + public PageInfo getRuleLogList(RuleLogParam param) { + Long organId = SessionManager.getSession().getSysUser().getOrganId(); + param.setOrganId(organId); + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + List ruleLogResponses = ruleLogMapper.queryAllByLimit(param); + PageInfo pageInfo = new PageInfo<>(ruleLogResponses); + return pageInfo; + } + + @Override + public List queryByIds(List ids) { + return ruleLogMapper.queryByIds(ids); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/TBusinessRuleRelServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/TBusinessRuleRelServiceImpl.java new file mode 100644 index 0000000..dd3d883 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/cignacmb/impl/TBusinessRuleRelServiceImpl.java @@ -0,0 +1,208 @@ +package com.fibo.ddp.common.service.cignacmb.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.cignacmb.TBusinessRuleRelMapper; +import com.fibo.ddp.common.model.cignacmb.TBusinessRuleRel; +import com.fibo.ddp.common.model.cignacmb.req.BusinessRuleRelReq; +import com.fibo.ddp.common.model.cignacmb.vo.BusinessRuleRelVO; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.service.cignacmb.ITBusinessRuleRelService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.fibo.ddp.common.utils.constant.RuleInfoConstants; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 业务类型与规则关联表 服务实现类 + *

+ * + * @author oldRose + * @since 2021-11-10 + */ +@Service("iTBusinessRuleRelService") +public class TBusinessRuleRelServiceImpl extends ServiceImpl implements ITBusinessRuleRelService { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public ResponseEntityDto addBusinessRuleRel(BusinessRuleRelReq param) { + try { + //参数校验 + checkParam(param); + TBusinessRuleRel businessRuleRel = new TBusinessRuleRel(); + //组件规则信息 + buildModel(param,businessRuleRel); + //插入 + this.save(businessRuleRel); + } catch (Exception e) { + logger.info("新增业务类型和规则关联 记录出错"); + return ResponseEntityBuilder.buildErrorResponse("999999999",e.getMessage()); + } + return ResponseEntityBuilder.buildNormalResponse(); + } + + /** + * 组件实体 + * @param param + */ + private void buildModel(BusinessRuleRelReq param,TBusinessRuleRel businessRuleRel) { + BeanUtils.copyProperties(param,businessRuleRel); + //组件规则信息 + JSONObject jsonObject = new JSONObject(); + jsonObject.put(RuleInfoConstants.BLACK_LIST,param.getBlacklist()); + jsonObject.put(RuleInfoConstants.THRESHOLD,param.getThreshold()); + jsonObject.put(RuleInfoConstants.MUTEX,param.getMutex()); + jsonObject.put(RuleInfoConstants.MERGE,param.getMerge()); + jsonObject.put(RuleInfoConstants.INTERCEPT,param.getIntercept()); + businessRuleRel.setRuleInfo(JSON.toJSONString(jsonObject)); + businessRuleRel.setStatus(1); + businessRuleRel.setCreator(Long.valueOf(1)); + businessRuleRel.setCreateTime(new Date()); + businessRuleRel.setUpdateTime(new Date()); + businessRuleRel.setOrganId(SessionManager.getLoginAccount().getOrganId()); + } + + /** + * 检查参数 + * @param param + */ + private void checkParam(BusinessRuleRelReq param) throws Exception { + if(param == null){ + throw new Exception("参数不能为空", new Throwable()); + } + if(StringUtil.isBlank(param.getBusinessName())){ + throw new Exception("业务类型名称不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getBusinessChildCode())){ + throw new Exception("业务类型编码不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getBusinessChildName())){ + throw new Exception("业务子类型名称不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getBusinessChildCode())){ + throw new Exception("业务子类型编码不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getSendType())){ + throw new Exception("发送方式不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getIsUnsubscribe())){ + throw new Exception("是否取消订阅 不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getEventType())){ + throw new Exception("事件类型 不能为空",new Throwable()); + } + if(StringUtil.isBlank(param.getIsManualIntervention())){ + throw new Exception("是否人工干预 不能为空",new Throwable()); + } + } + + @Override + public ResponseEntityDto editBusinessRuleRel(BusinessRuleRelReq param) { + //参数校验 + if(param.getId()==null){ + return ResponseEntityBuilder.buildErrorResponse("999999","id必须传,不能为空"); + } + try { + checkParam(param); + //组件规则信息 + TBusinessRuleRel businessRuleRel = new TBusinessRuleRel(); + buildModel(param,businessRuleRel); + this.saveOrUpdate(businessRuleRel); + } catch (Exception e) { + logger.info("编辑业务类型与规则关联表 出错"); + return ResponseEntityBuilder.buildErrorResponse("999999999",e.getMessage()); + } + return ResponseEntityBuilder.buildNormalResponse(); + } + + @Override + public ResponseEntityDto detailBusinessRuleRel(BusinessRuleRelReq param) { + //参数校验 + if(param.getId()==null){ + return ResponseEntityBuilder.buildErrorResponse("999999","id必须传,不能为空"); + } + TBusinessRuleRel businessRuleRel = this.getById(param.getId()); + //获取出ruleInfo,循环拿出规则,方便展示 + String ruleInfo = businessRuleRel.getRuleInfo(); + JSONObject jsonObject = JSON.parseObject(ruleInfo); + JSONArray blacklist = JSONArray.parseArray(jsonObject.get("blacklist")+""); + JSONArray threshold = JSONArray.parseArray(jsonObject.get("threshold")+""); + JSONArray mutex = JSONArray.parseArray(jsonObject.get("mutex")+""); + JSONArray merge = JSONArray.parseArray(jsonObject.get("merge")+""); + JSONArray intercept = JSONArray.parseArray(jsonObject.get("intercept")+""); + //提取到对应的id 查出规则 + BusinessRuleRelVO businessRuleRelVO = new BusinessRuleRelVO(); + BeanUtils.copyProperties(businessRuleRel,businessRuleRelVO); + businessRuleRelVO.setBlackList(blacklist); + businessRuleRelVO.setThresholdList(threshold); + businessRuleRelVO.setMutexList(mutex); + businessRuleRelVO.setMergeList(merge); + businessRuleRelVO.setInterceptList(intercept); + return ResponseEntityBuilder.buildNormalResponse(businessRuleRel); + } + + @Override + public ResponseEntityDto deleteBusinessRuleRel(BusinessRuleRelReq param) { + //参数校验 + if(param.getId()==null){ + return ResponseEntityBuilder.buildErrorResponse("999999","id必须传,不能为空"); + } + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userId",param.getId()); + TBusinessRuleRel businessRuleRel = new TBusinessRuleRel(); + businessRuleRel.setStatus(0); + this.update(businessRuleRel,queryWrapper); + return ResponseEntityBuilder.buildNormalResponse(); + } + + @Override + public ResponseEntityDto pageList(BusinessRuleRelReq param) { + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + buildQueryWrapper(queryWrapper, param); + List businessRuleRelList = this.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(businessRuleRelList); + pageInfo.setList(businessRuleRelList); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + @Override + public ResponseEntityDto queryByBusinessType(BusinessRuleRelReq param) { + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + //根据业务类型查询对应规则(对外接口) + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("business_code",param.getBusinessCode()); + queryWrapper.eq("business_child_code",param.getBusinessChildCode()); + List businessRuleRelList = this.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(businessRuleRelList); + pageInfo.setList(businessRuleRelList); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 组建查询条件 + * + * @param queryWrapper + * @param param + */ + private void buildQueryWrapper(QueryWrapper queryWrapper, BusinessRuleRelReq param) { + queryWrapper.eq("status",1); + //更新时间倒序查询 + queryWrapper.orderByDesc("update_time"); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/AccountSessionWrap.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/AccountSessionWrap.java new file mode 100644 index 0000000..3893754 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/AccountSessionWrap.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.service.common; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import lombok.Data; + +/** + * session 包装类 + */ +@Data +public class AccountSessionWrap { + public AccountSessionWrap(String ip, String requestUri) { + init(null, ip, requestUri); + } + + public AccountSessionWrap(SysUser sysUser, String ip, String requestUri) { + init(sysUser, ip, requestUri); + } + + private void init(SysUser sysUser, String ip, String requestUri) { + setSysUser(sysUser); + setIp(ip); + setRequestUri(requestUri); + } + + /** session */ + private SysUser sysUser; + private String ip; + private String requestUri; + /** 请求唯一标识 */ + private String traceId; + +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/ExcelUtil.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/ExcelUtil.java new file mode 100644 index 0000000..a6dcb21 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/ExcelUtil.java @@ -0,0 +1,305 @@ +package com.fibo.ddp.common.service.common; + +import com.fibo.ddp.common.model.common.ExcelModel; +import com.fibo.ddp.common.model.common.ExcelSheetModel; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +/** + * ClassName:ExcelUtil
+ * Description: Excel实用类 + */ +@SuppressWarnings("rawtypes") +public class ExcelUtil { + + /** + * exportExcel:导出excel + * + * @param out 输出流 + * @param exlType 导出格式 + * @param headers 表头信息 + * @param list 要导出的数据 + * @return cell + * + */ + public static void exportExcel(OutputStream out, String exlType, String[] headers, String[] classNames, List list) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { + Workbook workbook; + if (exlType.equalsIgnoreCase("xlsx")) { + // 2007以上 + workbook = new SXSSFWorkbook(200); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + + Sheet sheet = workbook.createSheet("title"); + for (short i = 0; i < headers.length; i++) { + if (i == headers.length - 1 || i == headers.length - 2) { + sheet.setColumnWidth(i, 50 * 256); + } else { + sheet.setColumnWidth(i, 25 * 256); + } + } + + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(headers[i]); + } + Iterator it = list.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + row.setHeight((short) 800); + T t = it.next(); + if (null != t) { + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + Field field = t.getClass().getDeclaredField(classNames[j]); + field.setAccessible(true); + Class valType = field.getType(); + + cell.setCellStyle(cellStyle1); + if ("java.lang.String" + .equalsIgnoreCase(valType.getName())) { + cell.setCellValue((String) field.get(t)); + } else if ("java.lang.Integer" + .equalsIgnoreCase(valType.getName()) + || "int".equalsIgnoreCase(valType.getName())) { + cell.setCellValue((Integer) field.get(t)); + } else if ("java.lang.Double" + .equalsIgnoreCase(valType.getName()) + || "double".equalsIgnoreCase(valType.getName())) { + cell.setCellValue((Double) field.get(t) == null + ? 0 + : (Double) field.get(t)); + } else if ("java.lang.Long" + .equalsIgnoreCase(valType.getName()) + || "long".equalsIgnoreCase(valType.getName())) { + cell.setCellValue((Long) field.get(t) == null + ? 0 + : (Long) field.get(t)); + } else if ("java.util.Date" + .equalsIgnoreCase(valType.getName())) { + if (null == field.get(t)) { + cell.setCellValue(""); + } else { + SimpleDateFormat sdf = new SimpleDateFormat( + "yyyy/MM/dd"); + cell.setCellValue(sdf.format((Date) field.get(t))); + } + } + field.setAccessible(false); + } + } + } + try { + workbook.write(out); + out.flush(); + out.close(); + out = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + /** + * 处理单元格格式 + * + * @param cell + * @return + * + */ + public static String formatCell(Cell cell) { + if (cell == null) { + return ""; + } + switch (cell.getCellType()) { + case Cell.CELL_TYPE_NUMERIC: + //日期格式的处理 + if (HSSFDateUtil.isCellDateFormatted(cell)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString(); + } + + return String.valueOf(cell.getNumericCellValue()); + + //字符串 + case Cell.CELL_TYPE_STRING: + return cell.getStringCellValue(); + + // 公式 + case Cell.CELL_TYPE_FORMULA: + return cell.getCellFormula(); + + // 空白 + case Cell.CELL_TYPE_BLANK: + return ""; + + // 布尔取值 + case Cell.CELL_TYPE_BOOLEAN: + return cell.getBooleanCellValue() + ""; + + //错误类型 + case Cell.CELL_TYPE_ERROR: + return cell.getErrorCellValue() + ""; + } + + return ""; + } + + + public static void exportExcelTemplate(OutputStream out, ExcelModel model) throws SecurityException, IllegalArgumentException { + Workbook workbook; + if ("xlsx".equalsIgnoreCase(model.getType())) { + // 2007以上 + workbook = new XSSFWorkbook(); + } else { + // 97-2003 + workbook = new HSSFWorkbook(); + } + List sheets = model.getSheets(); + if (sheets == null && sheets.size() == 0) { + return; + } + for (ExcelSheetModel info : sheets) { + Sheet sheet = workbook.createSheet(info.getSheetName()); + int headerSize = info.getHeaders().size(); + for (short i = 0; i < headerSize; i++) { + if (i == headerSize - 1 || i == headerSize - 2) { + sheet.setColumnWidth(i, 50 * 256); + } else { + sheet.setColumnWidth(i, 25 * 256); + } + } + CellStyle cellStyle = workbook.createCellStyle(); + CellStyle cellStyle1 = workbook.createCellStyle(); + + Font font = workbook.createFont(); + Font font1 = workbook.createFont(); + + //微软雅黑,字体10,加粗,背景灰色 + font.setFontName("微软雅黑"); + font.setFontHeight((short) 240); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + cellStyle.setFont(font); + cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 指定单元格居中对齐 + cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle.setBorderRight(CellStyle.BORDER_THIN); + cellStyle.setBorderTop(CellStyle.BORDER_THIN); + + //微软雅黑,字体10,加粗,背景灰色 + font1.setFontName("微软雅黑"); + font1.setFontHeight((short) 240); + cellStyle1.setFont(font1); + cellStyle1.setAlignment(CellStyle.ALIGN_LEFT); // 指定单元格居中对齐 + cellStyle1.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + cellStyle1.setWrapText(true); + cellStyle1.setBorderBottom(CellStyle.BORDER_THIN); // 设置单无格的边框为粗体 + cellStyle1.setBorderLeft(CellStyle.BORDER_THIN); + cellStyle1.setBorderRight(CellStyle.BORDER_THIN); + cellStyle1.setBorderTop(CellStyle.BORDER_THIN); + + Row row = sheet.createRow(0); + row.setHeight((short) 400); + + for (short i = 0; i < headerSize; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(cellStyle); + cell.setCellValue(info.getHeaders().get(i)); + } + List data = info.getData(); + for (int i = 0; i < data.size(); i++) { + List oneRow = data.get(i); + row = sheet.createRow(i+1); + for (int j = 0; j < oneRow.size(); j++) { + Object cellData = oneRow.get(j); + Cell cell = row.createCell(j); + cell.setCellStyle(cellStyle1); + cell.setCellValue(cellData.toString()); + } + } + try { + workbook.write(out); + out.flush(); + out.close(); + out = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/SessionManager.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/SessionManager.java new file mode 100644 index 0000000..10ce66f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/SessionManager.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.service.common; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.fibo.ddp.common.model.authx.system.SysUser; + +/** + * session管理类 + */ +public class SessionManager { + + private static TransmittableThreadLocal session = new TransmittableThreadLocal() { + + }; + + public static AccountSessionWrap getSession() { + return session.get(); + } + + public static void setSession(AccountSessionWrap conn) { + session.set(conn); + } + + public static SysUser getLoginAccount(){ + if(getSession() != null){ + return getSession().getSysUser(); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/EmailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/EmailService.java new file mode 100644 index 0000000..260deac --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/EmailService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.common.message.send; + +public interface EmailService { + /** + * 发送邮件方法 + * @param to 收件人邮件地址 + * @param subject 主题 + * @param content 邮件内容 + */ + public void sendHtmlMail(String to, String subject, String content); + + /** + * 发送模板邮件方法 + * @param to 收件人邮件地址 + * @param subject 主题 + * @param templateName 模板名称 + * @param context 追加参数集合 + */ +// public void sendTemplateMail(String to, String subject, String templateName, Context context); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/impl/EmailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/impl/EmailServiceImpl.java new file mode 100644 index 0000000..915236b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/send/impl/EmailServiceImpl.java @@ -0,0 +1,49 @@ +package com.fibo.ddp.common.service.common.message.send.impl; + +import com.fibo.ddp.common.service.common.message.send.EmailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.mail.internet.MimeMessage; + +@Service("emailService") +@Slf4j +public class EmailServiceImpl implements EmailService { + + @Resource + private JavaMailSender mailSender; + + @Value("${spring.mail.username}") + private String fromAddr; + + @Override + public void sendHtmlMail(String to, String subject, String content) { + log.info("开始发送邮件,to:{}, subject:{}, content:{}", to, subject, content); + MimeMessage message = mailSender.createMimeMessage(); + try { + //true表示需要创建一个multipart message + MimeMessageHelper helper = new MimeMessageHelper(message,true, "utf-8"); + helper.setFrom(fromAddr); + String[] split = to.split(","); + helper.setTo(split); + helper.setSubject(subject); + helper.setText(content,true); + mailSender.send(message); + log.info("邮件发送成功"); + }catch (Exception e){ + log.error("邮件发送失败",e); + } + } + + public String getFromAddr() { + return fromAddr; + } + + public void setFromAddr(String fromAddr) { + this.fromAddr = fromAddr; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/AppTemplateService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/AppTemplateService.java new file mode 100644 index 0000000..9d296d5 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/AppTemplateService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.common.message.template; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.message.template.entity.AppTemplate; + +/** + * APP推送模板表(AppTemplate)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +public interface AppTemplateService extends IService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/MessageSendRecordService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/MessageSendRecordService.java new file mode 100644 index 0000000..aaf44b5 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/MessageSendRecordService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.common.message.template; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.message.template.entity.MessageSendRecord; + +/** + * 消息发送记录表(MessageSendRecord)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +public interface MessageSendRecordService extends IService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/SmsTemplateService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/SmsTemplateService.java new file mode 100644 index 0000000..8a729b3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/SmsTemplateService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.common.message.template; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.message.template.entity.SmsTemplate; + +/** + * 短信模板表(SmsTemplate)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +public interface SmsTemplateService extends IService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WebhookTemplateService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WebhookTemplateService.java new file mode 100644 index 0000000..6d75ae6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WebhookTemplateService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.common.message.template; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.message.template.entity.WebhookTemplate; + +/** + * webhook模板表(WebhookTemplate)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:12:03 + */ +public interface WebhookTemplateService extends IService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WechatTemplateService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WechatTemplateService.java new file mode 100644 index 0000000..bc279d9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/WechatTemplateService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.common.message.template; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.message.template.entity.WechatTemplate; + +/** + * 微信服务号模板表(WechatTemplate)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +public interface WechatTemplateService extends IService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/AppTemplateServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/AppTemplateServiceImpl.java new file mode 100644 index 0000000..8d68192 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/AppTemplateServiceImpl.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.common.message.template.impl; + +import com.fibo.ddp.common.model.common.message.template.entity.AppTemplate; +import com.fibo.ddp.common.dao.common.message.template.AppTemplateMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.service.common.message.template.AppTemplateService; +import org.springframework.stereotype.Service; + +/** + * APP推送模板表(AppTemplate)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Service +public class AppTemplateServiceImpl extends ServiceImpl implements AppTemplateService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/MessageSendRecordServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/MessageSendRecordServiceImpl.java new file mode 100644 index 0000000..83c0557 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/MessageSendRecordServiceImpl.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.common.message.template.impl; + +import com.fibo.ddp.common.model.common.message.template.entity.MessageSendRecord; +import com.fibo.ddp.common.dao.common.message.template.MessageSendRecordMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.service.common.message.template.MessageSendRecordService; +import org.springframework.stereotype.Service; + +/** + * 消息发送记录表(MessageSendRecord)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Service +public class MessageSendRecordServiceImpl extends ServiceImpl implements MessageSendRecordService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/SmsTemplateServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..48721b5 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/SmsTemplateServiceImpl.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.common.message.template.impl; + +import com.fibo.ddp.common.model.common.message.template.entity.SmsTemplate; +import com.fibo.ddp.common.dao.common.message.template.SmsTemplateMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.service.common.message.template.SmsTemplateService; +import org.springframework.stereotype.Service; + +/** + * 短信模板表(SmsTemplate)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Service +public class SmsTemplateServiceImpl extends ServiceImpl implements SmsTemplateService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WebhookTemplateServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WebhookTemplateServiceImpl.java new file mode 100644 index 0000000..a229a3f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WebhookTemplateServiceImpl.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.common.message.template.impl; + +import com.fibo.ddp.common.model.common.message.template.entity.WebhookTemplate; +import com.fibo.ddp.common.dao.common.message.template.WebhookTemplateMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.service.common.message.template.WebhookTemplateService; +import org.springframework.stereotype.Service; + +/** + * webhook模板表(WebhookTemplate)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:12:03 + */ +@Service +public class WebhookTemplateServiceImpl extends ServiceImpl implements WebhookTemplateService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WechatTemplateServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WechatTemplateServiceImpl.java new file mode 100644 index 0000000..e618f60 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/message/template/impl/WechatTemplateServiceImpl.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.common.message.template.impl; + +import com.fibo.ddp.common.model.common.message.template.entity.WechatTemplate; +import com.fibo.ddp.common.dao.common.message.template.WechatTemplateMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.service.common.message.template.WechatTemplateService; +import org.springframework.stereotype.Service; + +/** + * 微信服务号模板表(WechatTemplate)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@Service +public class WechatTemplateServiceImpl extends ServiceImpl implements WechatTemplateService { + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/RunnerSessionManager.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/RunnerSessionManager.java new file mode 100644 index 0000000..23082c4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/RunnerSessionManager.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.common.runner; + +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * session管理类 + */ +public class RunnerSessionManager { + private static TransmittableThreadLocal session = new TransmittableThreadLocal() { + + }; + + public static SessionData getSession() { + return session.get(); + } + + public static void setSession(SessionData conn) { + session.set(conn); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/SessionData.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/SessionData.java new file mode 100644 index 0000000..1fd2b8e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/common/runner/SessionData.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.service.common.runner; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class SessionData { + + private Long organId; // 组织id + private Long engineId; // 引擎id + private Integer reqType;//请求类型 +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXCacheService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXCacheService.java new file mode 100644 index 0000000..135421f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXCacheService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.datax.cache; + + +import java.util.Map; + + +public interface DataXCacheService { + Map queryForChange(Map param, long time); + + Map queryChangeInfo(); + + void notifyCondion(); + + boolean sendChangeToWeb(); + + void initRedisSub(); + + void pushRedisSub(String channel,String message); + + String refreshCacheInfo(String changeName); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChange.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChange.java new file mode 100644 index 0000000..1dba0a8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChange.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.datax.cache; + +import java.lang.annotation.*; + +/** + * ClassName:DataXChange
+ * Description: 日志操作类型注解.
+ */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataXChange { + + public String changeName() default ""; + + public String changeType() default "update"; + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChangeAspect.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChangeAspect.java new file mode 100644 index 0000000..b3de786 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/DataXChangeAspect.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.service.datax.cache; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +import java.util.Date; + + +@Aspect +@Component +public class DataXChangeAspect { + @Autowired + private DataXCacheService dataXCacheService; + + private HttpServletRequest request = null; + + @Pointcut("@annotation(com.fibo.ddp.common.service.datax.cache.DataXChange))") + public void controllerAspect() { + } + @AfterReturning(pointcut = "controllerAspect() && @annotation(dataXChange)", returning = "returnValue") + public void doAfter(JoinPoint joinPoint,DataXChange dataXChange, Object returnValue) { + String changeName = dataXChange.changeName(); + System.out.println(changeName); + dataXCacheService.refreshCacheInfo(changeName); + dataXCacheService.pushRedisSub(null,dataXChange.changeName()); + } + + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/Subscriber.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/Subscriber.java new file mode 100644 index 0000000..790d63e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/Subscriber.java @@ -0,0 +1,55 @@ +package com.fibo.ddp.common.service.datax.cache; + +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.JedisPubSub; + +@Slf4j +@Component +public class Subscriber extends JedisPubSub { + @Autowired + private DataXCacheService dataXCacheService; + + public Subscriber() { + } + @Override + public void onMessage(String channel, String message) { + log.info(String.format("receive redis published message, channel %s, message %s", channel, message)); + if (DataXCacheConst.DATAX_PUBSUB_CACHE_REDIS_CHANNEL.equals(channel)){ + dataXCacheService.notifyCondion(); + dataXCacheService.sendChangeToWeb(); + } + } + + @Override + public void onPMessage(String pattern, String channel, String message) { + + log.info(String.format("receive redis published message, channel %s, message %s", channel, message)); + } + + @Override + public void onSubscribe(String channel, int subscribedChannels) { + log.info(String.format("subscribe redis channel success, channel %s, subscribedChannels %d", + channel, subscribedChannels)); + } + + @Override + public void onUnsubscribe(String channel, int subscribedChannels) { + log.info(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d", + channel, subscribedChannels)); + } + + @Override + public void onPUnsubscribe(String pattern, int subscribedChannels) { + log.info(String.format("unsubscribe redis channel, pattern %s, subscribedChannels %d", + pattern, subscribedChannels)); + } + + @Override + public void onPSubscribe(String pattern, int subscribedChannels) { + log.info(String.format("subscribe redis channel success, pattern %s, subscribedChannels %d", + pattern, subscribedChannels)); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/impl/DataXCacheServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/impl/DataXCacheServiceImpl.java new file mode 100644 index 0000000..3bbd7d4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/cache/impl/DataXCacheServiceImpl.java @@ -0,0 +1,128 @@ +package com.fibo.ddp.common.service.datax.cache.impl; + + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import com.fibo.ddp.common.service.datax.cache.DataXCacheService; +import com.fibo.ddp.common.service.datax.cache.Subscriber; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import com.fibo.ddp.common.utils.websocket.constant.SendToWebConst; +import com.fibo.ddp.common.utils.websocket.manager.MyWebSocketSessionManager; +import com.fibo.ddp.common.utils.websocket.model.vo.SendToWebModel; +import org.apache.commons.lang.StringUtils; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +@Service +public class DataXCacheServiceImpl implements DataXCacheService { + @Autowired + private RedisManager redisManager; + //等待的锁 + private static final ReentrantLock lock = new ReentrantLock(); + //锁的等待队列 + private static final Condition condition = lock.newCondition(); + //监听缓存改变通知的redis单线程线程池 + private static final ExecutorService redisSingleExecutor = Executors.newSingleThreadExecutor(); + //订阅者 + @Autowired + private Subscriber subscriber; + + @Override + public Map queryForChange(Map param, long time) { + Map result = new HashMap<>(); + List changeList = new ArrayList<>(); + Map cacheMap = queryChangeInfo(); + handlerChangeList(param,cacheMap,changeList); + //双重检查 + if (changeList.isEmpty()) { + try { + lock.lock(); + cacheMap = queryChangeInfo(); + handlerChangeList(param,cacheMap,changeList); + if (changeList.isEmpty()){ + condition.await(time, TimeUnit.SECONDS); + cacheMap = queryChangeInfo(); + handlerChangeList(param,cacheMap,changeList); + } + } catch (InterruptedException e) { + e.printStackTrace(); + }finally { + lock.unlock(); + } + } + result.put(DataXCacheConst.DATAX_CACHE_CHANGE_LIST_KEY, changeList); + result.put(DataXCacheConst.DATAX_CACHE_INFO_KEY, cacheMap); + return result; + } + + public Map queryChangeInfo() { + Map result = redisManager.hgetAll(DataXCacheConst.DATAX_WEB_CACHE_REDIS_KEY); + return result; + } + + private void handlerChangeList(Map paramMap,Map cacheMap,List changeList){ + for (Map.Entry entry : paramMap.entrySet()) { + String cacheValue = cacheMap.get(entry.getKey()); + String paramValue = entry.getValue(); + if (paramValue != null && !paramValue.equals(cacheValue)) { + //匹配到有更新,添加到更新列表中 + changeList.add(entry.getKey()); + } + } + } + + + public void notifyCondion(){ + try { + lock.lock(); + condition.signalAll(); + }finally { + lock.unlock(); + } + } + + @Override + public boolean sendChangeToWeb() { + Map map = queryChangeInfo(); + MyWebSocketSessionManager.sendTextToWeb(JSON.toJSONString(new SendToWebModel(SendToWebConst.DATAX_CACHE_CHANGE,map))); + return false; + } + + + @Override + public void initRedisSub() { + redisSingleExecutor.submit(new Runnable() { + @Override + public void run() { + redisManager.subscribe(subscriber,DataXCacheConst.DATAX_PUBSUB_CACHE_REDIS_CHANNEL); + } + }); + for (String type : DataXCacheConst.Type.TYPE_LIST) { + redisManager.hsetnx(DataXCacheConst.DATAX_WEB_CACHE_REDIS_KEY,type, SnowFlakUtil.snowflakeIdStr()); + } + } + + @Override + public void pushRedisSub(String channel,String message) { + if (StringUtils.isBlank(channel)){ + channel = DataXCacheConst.DATAX_PUBSUB_CACHE_REDIS_CHANNEL; + } + redisManager.publish(channel,message); + } + + @Override + public String refreshCacheInfo(String changeName) { + redisManager.hset(DataXCacheConst.DATAX_WEB_CACHE_REDIS_KEY,changeName, SnowFlakUtil.snowflakeIdStr()); + return null; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/InterfaceService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/InterfaceService.java new file mode 100644 index 0000000..0fed930 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/InterfaceService.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.service.datax.datainterface; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.datax.datainterface.vo.InterfaceVo; +import com.github.pagehelper.PageInfo; + +import java.util.Map; + +public interface InterfaceService extends IService { + InterfaceVo getInterfaceById(Long id); + + PageInfo queryByEntity(QueryListParam param); + + InterfaceVo inserInterfaceInfo(InterfaceVo interfaceVo); + + InterfaceVo updateInterfaceInfo(InterfaceVo interfaceVo); + + //更新接口 + boolean updateStatus(Long[] ids, Integer status); + + //删除接口 + Boolean deleteInterfaceInfo(InterfaceVo interfaceVo); + + //http请求 + String getHttpResponse(InterfaceInfo interfaceInfo); + + // runner + InterfaceInfo getInterfaceById(Integer id); + + /** + * 接口请求 + * @param interfaceInfo + * @param inputParam + * @param callType + * @return + */ + String getHttpResponse(InterfaceInfo interfaceInfo, Map inputParam, Integer callType); + + /** + * 解析接口指标 + * @param parseStr + * @param jsonStr + * @return + */ + String interfaceParseField(String parseStr, String jsonStr); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/impl/InterfaceServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/impl/InterfaceServiceImpl.java new file mode 100644 index 0000000..84876ff --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datainterface/impl/InterfaceServiceImpl.java @@ -0,0 +1,345 @@ +package com.fibo.ddp.common.service.datax.datainterface.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.datax.datainterface.InterfaceMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.datax.datainterface.vo.InterfaceVo; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datainterface.InterfaceService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.runner.DictVariableUtils; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.concurrent.ListenableFuture; +import org.springframework.util.concurrent.ListenableFutureCallback; +import org.springframework.web.client.AsyncRestTemplate; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class InterfaceServiceImpl extends ServiceImpl implements InterfaceService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + InterfaceMapper interfaceMapper; + + @Autowired + SysUserMapper sysUserMapper; + + @Autowired + private RestTemplate restTemplate; + + @Autowired(required = false) + private AsyncRestTemplate asyncRestTemplate; + + @Autowired + private RedisManager redisManager; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public String getHttpResponse(InterfaceInfo interfaceInfo) { + + String result = this.getHttpResponse(interfaceInfo, new HashMap<>(), null); + return result; + +// HttpHeaders httpHeaders = new HttpHeaders(); +// // 设置请求头 +// httpHeaders.setContentType(MediaType.APPLICATION_JSON); +// // 封装请求体 +// JSONObject body = JSONObject.parseObject(JSONObject.toJSONString(interfaceInfo)); +// // 封装参数和头信息 +// HttpEntity httpEntity = new HttpEntity(body, httpHeaders); +// String url = runnerUrl + "/manager/invokeInterface"; +// ResponseEntity responseEntity = restTemplate.postForEntity(url, httpEntity, String.class); +// return responseEntity.getBody(); + } + + @Override + public Boolean deleteInterfaceInfo(InterfaceVo interfaceVo) { + interfaceMapper.deleteById(interfaceVo.getId()); + return true; + } + + @Override + public InterfaceVo updateInterfaceInfo(InterfaceVo interfaceVo) { + InterfaceInfo interfaceInfo = new InterfaceInfo(); + BeanUtils.copyProperties(interfaceVo, interfaceInfo); + SysUser sysUser = SessionManager.getLoginAccount(); + //设置创建者和修改者id + interfaceInfo.setModifier(sysUser.getUserId()); + interfaceMapper.updateById(interfaceInfo); + return interfaceVo; + } + + @Override + @Transactional + public boolean updateStatus(Long[] ids, Integer status) { + int updateNum = interfaceMapper.updateStatus(ids, status); + if (updateNum > 0) { + return true; + } + return false; + } + + //添加接口信息 + @Override + public InterfaceVo inserInterfaceInfo(InterfaceVo interfaceVo) { + //拷贝VO到Info对象 + InterfaceInfo interfaceInfo = new InterfaceInfo(); + BeanUtils.copyProperties(interfaceVo, interfaceInfo); + SysUser sysUser = SessionManager.getLoginAccount(); + //设置创建者和修改者id + interfaceInfo.setCreator(sysUser.getUserId()); + interfaceInfo.setModifier(sysUser.getUserId()); + interfaceInfo.setOrganId(sysUser.getOrganId()); + interfaceInfo.setStatus(1); + //插入并获取insert后实体对象返回id + boolean save = this.save(interfaceInfo); + if (!save) { + throw new ApiException(ErrorCodeEnum.INTERFACE_SAVE_ERROR.getCode(), ErrorCodeEnum.INTERFACE_SAVE_ERROR.getMessage()); + } + return interfaceVo; + } + + @Override + public PageInfo queryByEntity(QueryListParam interfaceListParam) { + InterfaceInfo interfaceInfo = interfaceListParam.getEntity(); + Integer pageNo = interfaceListParam.getPageNum(); + Integer pageSize = interfaceListParam.getPageSize(); + if (pageNo > 0 && pageSize > 0) { + PageHelper.startPage(pageNo, pageSize); + } + Wrapper wrapper = createWrapper(interfaceListParam.getEntity()); + List interfaceList = interfaceMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(interfaceList); + // 级联操作完成拼装 + List interfaceVos = new ArrayList<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + for (InterfaceInfo info : interfaceList) { + InterfaceVo interfaceVo = new InterfaceVo(); + BeanUtils.copyProperties(info, interfaceVo); + interfaceVo.setUsername(sysUser.getNickName()); + //设置创建者昵称 + interfaceVo.setCreatorName(sysUserMapper.findNickNameById(info.getCreator())); + //设置修改者昵称 + interfaceVo.setModifierName(sysUserMapper.findNickNameById(info.getModifier())); + interfaceVos.add(interfaceVo); + } + pageInfo.setList(interfaceVos); + + + return pageInfo; + } + + @Override + public InterfaceVo getInterfaceById(Long id) { + InterfaceInfo info = interfaceMapper.selectById(id); + InterfaceVo interfaceVo = new InterfaceVo(); + BeanUtils.copyProperties(info, interfaceVo); + SysUser sysUser = SessionManager.getLoginAccount(); + interfaceVo.setUsername(sysUser.getNickName()); + //设置创建者昵称 + interfaceVo.setCreatorName(sysUserMapper.findNickNameById(info.getCreator())); + //设置修改者昵称 + interfaceVo.setModifierName(sysUserMapper.findNickNameById(info.getModifier())); + return interfaceVo; + } + + //创建查询器 + private Wrapper createWrapper(InterfaceInfo query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query != null) { + if (StringUtils.isNotBlank(query.getName())) { + wrapper.like(InterfaceInfo::getName, query.getName()); + } + if (StringUtils.isNotBlank(query.getMethod())) { + wrapper.eq(InterfaceInfo::getMethod, query.getMethod()); + } + if (StringUtils.isNotBlank(query.getUrl())) { + wrapper.eq(InterfaceInfo::getUrl, query.getUrl()); + } + if (query.getStatus() != null) { + wrapper.eq(InterfaceInfo::getStatus, query.getStatus()); + } else { + wrapper.ne(InterfaceInfo::getStatus, -1); + } + } else { + wrapper.ne(InterfaceInfo::getStatus, -1); + } + wrapper.orderByDesc(InterfaceInfo::getId); + return wrapper; + } + + @Override + public InterfaceInfo getInterfaceById(Integer id) { + InterfaceInfo interfaceInfo = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_FIELD_INTERFACE, id); + interfaceInfo = redisManager.getByPrimaryKey(key, InterfaceInfo.class); + } else { + interfaceInfo = interfaceMapper.selectById(id); + } + return interfaceInfo; + } + + @Override + public String getHttpResponse(InterfaceInfo interfaceInfo, Map inputParam, Integer callType) { + if(callType == null){ + callType = 2; // 1为异步,2为同步 + } + + String url = interfaceInfo.getUrl(); + ResponseEntity responseEntity = null; + ListenableFuture> listenableFuture = null; + String bindParam = interfaceInfo.getBindParam(); + if (StringUtils.isNotBlank(bindParam)){ + JSONObject param = JSON.parseObject(bindParam); + JSONArray dictVariable = param.getJSONArray("dictVariable"); + for (int i = 0; i < dictVariable.size(); i++) { + JSONObject jsonObject = dictVariable.getJSONObject(i); + Object value = DictVariableUtils.getValueFromJsonObject(jsonObject); + inputParam.put(jsonObject.getString("key"),value); + } + JSONArray variable = param.getJSONArray("variable"); + for (int i = 0; i < variable.size(); i++) { + JSONObject jsonObject = variable.getJSONObject(i); + if (!inputParam.containsKey(jsonObject.getString("key"))){ + inputParam.put(jsonObject.getString("key"),jsonObject.get("value")); + } + } + + } + // 请求参数中的变量赋值 + String requestBody = setRequestBodyParams(interfaceInfo.getRequestBody(), inputParam); + if(HttpMethod.POST.name().equals(interfaceInfo.getMethod())){ + HttpHeaders httpHeaders = new HttpHeaders(); + // 设置请求头 + httpHeaders.setAll(JSONObject.parseObject(interfaceInfo.getRequestHeaders(), Map.class)); + // 封装请求体 + JSONObject body = JSONObject.parseObject(requestBody); + // 封装参数和头信息 + HttpEntity httpEntity = new HttpEntity(body, httpHeaders); + // 发送请求 + if(callType == 2){ + responseEntity = restTemplate.postForEntity(url, httpEntity, String.class); + } else { + listenableFuture = asyncRestTemplate.postForEntity(url, httpEntity, String.class); + } + + } else if(HttpMethod.GET.name().equals(interfaceInfo.getMethod())){ + // 封装uri地址路径变量 + Map uriVariables = new HashMap<>(); + if(StringUtils.isNotBlank(requestBody)){ + uriVariables = JSONObject.parseObject(requestBody, Map.class); + } + // 发送请求 + if(callType == 2){ + responseEntity = restTemplate.getForEntity(url, String.class, uriVariables); + } else { + listenableFuture = asyncRestTemplate.getForEntity(url, String.class, uriVariables); + } + } + + String result = null; + if(responseEntity != null && HttpStatus.OK.equals(responseEntity.getStatusCode())){ + result = responseEntity.getBody(); + } + + if(listenableFuture != null){ + listenableFuture.addCallback(new ListenableFutureCallback>() { + @Override + public void onFailure(Throwable throwable) { + logger.info("异步接口调用失败", throwable); + } + + @Override + public void onSuccess(ResponseEntity stringResponseEntity) { + String result = stringResponseEntity.getBody(); + logger.info("异步接口调用成功,result:{}", result); + } + }); + } + logger.info("【请求接口源完成】 url:{},requestMethod:{}, request:{}, response:{}",url,interfaceInfo.getMethod(),requestBody,result); + return result; + } + + private String setRequestBodyParams(String requestBody, Map inputParam){ + if(StringUtils.isBlank(requestBody) || inputParam == null){ + return ""; + } + // 添加动态参数 + Pattern pattern = Pattern.compile("\\{[a-zA-Z0-9_\u4e00-\u9fa5()()-]+\\}"); + Matcher matcher = pattern.matcher(requestBody); + while (matcher.find()) { + String matchStr = matcher.group(0); + String param = matchStr.replace("{", "").replace("}", ""); + // 动态参数从变量池获取 + requestBody = requestBody.replace(matchStr, String.valueOf(inputParam.get(param))); + } + return requestBody; + } + + @Override //解析接口指标 + public String interfaceParseField(String parseStr, String jsonStr) { + JSONObject json = null; + try { + json = JSONObject.parseObject(jsonStr); + } catch (Exception e) { + JSONArray jsonArray = JSONArray.parseArray(jsonStr); + json = jsonArray.getJSONObject(0); + } + + if(parseStr.contains(".[]")){ + parseStr = parseStr.replace(".[]", "[]"); + } + String[] strArr = parseStr.split("\\."); + for(int i = 0; i < strArr.length - 1; i++){ + if(strArr[i].contains("[]")){ + strArr[i] = strArr[i].replace("[]", ""); + JSONArray jsonArray = json.getJSONArray(strArr[i]); + json = jsonArray.getJSONObject(0); + }else{ + json = json.getJSONObject(strArr[i]); + } + } + + String value = null; + if(json != null){ + value = json.getString(strArr[strArr.length - 1]); + } + return value; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldCallLogService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldCallLogService.java new file mode 100644 index 0000000..4c508e1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldCallLogService.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.service.datax.datamanage; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datamanage.FieldCall; +import com.fibo.ddp.common.model.datax.datamanage.FieldCallLog; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldCallParam; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * (FieldCallLog)表服务接口 + * + * @author jgp + * @since 2021-12-08 14:18:29 + */ +public interface FieldCallLogService extends IService { + + PageInfo queryFieldCallList(QueryListParam param); + + PageInfo queryFieldCallLogList(QueryListParam param); + + List queryFieldCallCountList(FieldCallParam param); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldService.java new file mode 100644 index 0000000..1896a89 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldService.java @@ -0,0 +1,165 @@ +package com.fibo.ddp.common.service.datax.datamanage; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.datax.datamanage.Field; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public interface FieldService extends IService { + /** + * createField:(插入新字段).
+ * + * @param fieldVo 字段实体类 + * @return 字段插入成功 + */ + public boolean createField(Field fieldVo, Map paramMap); + + /** + * isExists:(查找字段是否存在).
+ * + * @param paramMap 参数集合 + * @return 存在的记录条数 + */ + public int isExists(Map paramMap); + + /** + * isExistsFieldType:(查找字段类型是否存在).
+ * + * @param paramMap 参数集合 + * @return 存在的记录条数 + */ + public int isExistsFieldType(Map paramMap); + + /** + * updateField:(修改字段内容).
+ * + * @param fieldVo 字段实体类 + * @return 更新成功 + */ + public boolean updateField(Map paramMap); + + /** + * findByFieldType:(按照字段类型查找字段列表).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + */ + public List findByFieldType(Map paramMap); + + /** + * findByFieldId:(根据Id查找字段).
+ * + * @param paramMap 参数集合 + * @return 字段列表 + */ + public Field findByFieldId(Map paramMap); + + /** + * findByUser:(查找用户可用字段).
+ * + * @param paramMap 参数集合 + * @return 字段类型列表 + */ + public List findByUser(Map paramMap); + + /** + * updateStatus:(单个或批量更新用户字段关系).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + */ + public Map updateStatus(Map paramMap); + + /** + * checkField:(公共方法:检查字段是否被引用).
+ * + * @param paramMap 参数集合 + * @return 结果集合 + */ + public Map checkField(Map paramMap); + + /** + * getSourceField:(公共方法:检查字段的所有构成字段).
+ * + * @param paramMap 参数集合 + * @return + */ + public String getSourceField(String fieldIds, String fieldId); + + /** + * importExcel:(导入excel).
+ * + * @param url + * @param paramMap 参数集合 + * @return 导入成功 + */ + Map importExcel(String url, Map paramMap); + + /** + * getFieldList:(获取组织的所有字段).
+ * + * @param paramMap 参数集合 + * @return + */ + public List getFieldList(Map paramMap); + + /** + * bindEngineField:(根据传入的engineId和字段id找到一连串的字段并绑定关系).
+ * + * @param paramMap 参数集合 + * @return 是否创建成功 + */ + public boolean bindEngineField(Map paramMap); + + /** + * getField:(根据引擎和字段中文名找出引擎所用字段对象).
+ * + * @param paramMap 参数集合 + * @return 字段对象 + */ + public String getField(String fieldIds, String usedFieldId, String engineId); + + /** + * 查找某字段被引用的字段id并拼成逗号分隔的字符串 + * + * @return + */ + public String getAllFieldTypeId(String ids, String pid, String engineId); + + /** + * 查找某字段类型所有的<父类型>拼成逗号分隔的字符串 + * + * @return + */ + public String getAllParentFieldTypeId(String ids, String id, String engineId); + + int updateFieldFolder(UpdateFolderParam param); + + String getFieldEnById(Long id); + + List queryByIds(Collection ids); + + List queryByEns(Collection ens); + + List queryByOrganAndCns(Collection cns, Long organId); + + void sqlFieldCheck(Map map); + + int countFieldByOrganId(Long organId); + + List> countFieldGroupByType(Long organId); + + // runner + Field queryById(Long id); + + List findFieldByIdsbyorganId(Long organId, List ids); + + List selectFieldListByEns(List fieldEnList); + + Field findByFieldEnbyorganId(Long organId, String fieldEn); + + Field findByFieldCnbyorganId(Long organId, String fieldCn); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldTypeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldTypeService.java new file mode 100644 index 0000000..e441f84 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/FieldTypeService.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.service.datax.datamanage; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.datax.datamanage.FieldType; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldTreeParam; + +import java.util.List; +import java.util.Map; + +public interface FieldTypeService extends IService { + + /** + * getFieldTypeList:(查找用户的字段类型列表). 支持查询组织通用字段类型、子类型 支持查询引擎自定义字段类型、子类型
+ * + * @param paramMap 参数集合 + * @return 字段类型列表 + */ + public List getFieldTypeList(Map paramMap); + + /** + * createFieldType:(新增字段类型).
+ * + * @param paramMap 参数集合 + * @return 插入成功 + */ + public boolean createFieldType(FieldType fieldTypeVo, Map paramMap); + + /** + * updateFieldType:(更新字段类型名).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + */ + public boolean updateFieldType(FieldTreeParam param); + + + List getTreeList(FieldTreeParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldCallLogServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldCallLogServiceImpl.java new file mode 100644 index 0000000..8c3b69d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldCallLogServiceImpl.java @@ -0,0 +1,62 @@ +package com.fibo.ddp.common.service.datax.datamanage.imp; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.datax.datamanage.FieldCallLogMapper; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datamanage.FieldCall; +import com.fibo.ddp.common.model.datax.datamanage.FieldCallLog; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldCallParam; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldCallLogService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (FieldCallLog)表服务实现类 + * + * @author jgp + * @since 2021-12-08 14:18:29 + */ +@Service("fieldCallLogService") +public class FieldCallLogServiceImpl extends ServiceImpl implements FieldCallLogService { + @Resource + private FieldCallLogMapper fieldCallLogMapper; + + @Override + public PageInfo queryFieldCallList(QueryListParam param) { + if (param.getPageNum() > 0 && param.getPageSize() > 0) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + setOrganId(param.getEntity()); + List fieldCallList = fieldCallLogMapper.findFieldCallList(param.getEntity()); + PageInfo pageInfo = new PageInfo<>(fieldCallList); + return pageInfo; + } + + @Override + public PageInfo queryFieldCallLogList(QueryListParam param) { + if (param.getPageNum() > 0 && param.getPageSize() > 0) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + setOrganId(param.getEntity()); + List fieldCallLogs = fieldCallLogMapper.findFieldCallLogList(param.getEntity()); + PageInfo pageInfo = new PageInfo<>(fieldCallLogs); + return pageInfo; + } + + @Override + public List queryFieldCallCountList(FieldCallParam param) { + setOrganId(param); + List fieldCallCountList = fieldCallLogMapper.findFieldCallCountList(param); + return fieldCallCountList; + } + + private void setOrganId(FieldCallParam param) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + param.setOrganId(organId); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldServiceImp.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldServiceImp.java new file mode 100644 index 0000000..40daaf7 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldServiceImp.java @@ -0,0 +1,1200 @@ +package com.fibo.ddp.common.service.datax.datamanage.imp; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.datax.datamanage.*; +import com.fibo.ddp.common.dao.strategyx.knowledge.RuleMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbMapper; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.datax.common.ExcelUtil; +import com.fibo.ddp.common.model.datax.common.Status; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.datax.datamanage.FieldCond; +import com.fibo.ddp.common.model.datax.datamanage.FieldUser; +import com.fibo.ddp.common.model.strategyx.knowledge.Rule; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.usermodel.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Service +public class FieldServiceImp extends ServiceImpl implements FieldService { + + @Autowired + private FieldMapper fieldMapper; + @Autowired + private FieldUserMapper fieldUserMapper; + @Autowired + private FieldCondMapper fieldCondMapper; + @Autowired + private ListDbMapper listDbMapper; + @Autowired + private RuleMapper ruleMapper; + @Autowired + private ScorecardMapper scorecardMapper; + @Autowired + private FieldTypeUserMapper fieldTypeUserMapper; + @Autowired + private FieldTypeMapper fieldTypeMapper; + @Autowired + private RedisManager redisManager; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + + protected static final Set KEY_WORDS = new HashSet() {{ + add("DELETE "); + add("DROP "); + add("TRUNCATE "); + add("UPDATE "); + add("ALTER "); + add("INSERT "); + add("CREATE "); + add("RENAME "); + }}; + + /* + * 公共方法:去掉id串里重复id + */ + public StringBuffer getUniqueStr(String usedFieldStr) { + + String arrUsedFieldStr[] = usedFieldStr.split(","); + Set usedFieldSet = new HashSet<>(); + for (int k = 0; k < arrUsedFieldStr.length; k++) { + usedFieldSet.add(arrUsedFieldStr[k]); + } + String[] arrUsedField = (String[]) usedFieldSet.toArray(new String[usedFieldSet.size()]); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < arrUsedField.length; i++) { + if (i != arrUsedField.length - 1) + sb.append(arrUsedField[i]).append(","); + else + sb.append(arrUsedField[i]); + } + return sb; + } + + @Override + public boolean createField(Field fieldVo, Map paramMap) { + + String formulaHidden = ""; + + //获取衍生字段公式编辑区域引用字段的原生字段 + if (paramMap.containsKey("formulaHidden") && !paramMap.get("formulaHidden").equals("")) { + + formulaHidden = (String) paramMap.get("formulaHidden"); + fieldVo.setFormula(formulaHidden); + + List formulaList = new ArrayList<>(); + formulaList = JSONObject.parseArray(formulaHidden); + + JSONArray jsonArrayFormula = new JSONArray(); + + String origFieldStr = ""; + String usedFieldStr = ""; + + for (int i = 0; i < formulaList.size(); i++) { + + JSONObject f = ((JSONArray) formulaList).getJSONObject(i); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("fvalue", f.getString("fvalue")); + jsonObject.put("formula", f.getString("formula")); + jsonObject.put("idx", f.getString("idx")); + jsonArrayFormula.add(jsonObject); + + List farrList = new ArrayList<>(); + String formula = f.getString("formula"); + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(formula); + while (matcher.find()) { + String fieldCN = matcher.group(0).replace("@", ""); + Map fieldMap = new HashMap(); + fieldMap.put("userId", paramMap.get("userId")); + fieldMap.put("engineId", paramMap.get("engineId")); + fieldMap.put("fieldCn", fieldCN); + + Field field = fieldMapper.findByFieldCn(fieldMap); + + if (field.getOrigFieldId() == null) { + if (origFieldStr.equals("")) { + origFieldStr = Long.toString(field.getId()); + } else { + origFieldStr = origFieldStr + "," + field.getId(); + } + } else { + if (origFieldStr.equals("")) { + origFieldStr = field.getOrigFieldId(); + } else { + origFieldStr = origFieldStr + "," + field.getOrigFieldId(); + } + } + usedFieldStr = usedFieldStr + field.getId() + ","; //拼凑该字段引用的字段id + } +// } + } + + fieldVo.setFormulaShow(JSON.toJSONString(jsonArrayFormula)); + + //合并原生字段id + if (!origFieldStr.equals("")) { + fieldVo.setOrigFieldId(getUniqueStr(origFieldStr).toString()); + } + + //合并引用字段id + if (!usedFieldStr.equals(",") && !usedFieldStr.equals("")) { + usedFieldStr = usedFieldStr.substring(0, usedFieldStr.length() - 1); + fieldVo.setUsedFieldId(getUniqueStr(usedFieldStr).toString()); + } + + } else if (paramMap.containsKey("fieldCondList") && !paramMap.get("fieldCondList").equals("")) { + //条件区域的使用字段和原生字段获取 + + /* + fieldContent=[{"fieldContent2":"[{\"fieldId\":\"3\",\"operator\":\">\",\"fieldValue\":\"200\",\"logical\":\"&&\"} + ,{\"fieldId\":\"11\",\"operator\":\"<\",\"fieldValue\":\"50\"}]","conditionValue":"5","fieldValue":"50"} + ,{"fieldContent2":"[{\"fieldId\":\"12\",\"operator\":\"in\",\"fieldValue\":\"z\",\"logical\":\"&&\"} + ,{\"fieldId\":\"11\",\"operator\":\">\",\"fieldValue\":\"200\",\"logical\":\"&&\"} + ,{\"fieldId\":\"31\",\"operator\":\">\",\"fieldValue\":\"1000\"}]","conditionValue":"8","fieldValue":"1000"} + ,{"fieldContent2":"[{\"fieldId\":\"31\",\"operator\":\">\",\"fieldValue\":\"4000\"}]","conditionValue":"9","fieldValue":"4000"}] + */ + String fieldContent = (String) paramMap.get("fieldCondList"); + List fieldContentList = new ArrayList<>(); + fieldContentList = JSONObject.parseArray(fieldContent); + + String origFieldStr = ""; + String usedFieldStr = ""; + + for (int i = 0; i < fieldContentList.size(); i++) { + JSONObject fc = ((JSONArray) fieldContentList).getJSONObject(i); + List farrList = new ArrayList<>(); + if (!fc.getString("fieldSubCond").equals("") && fc.getString("fieldSubCond") != null) { + farrList = JSONObject.parseArray(fc.getString("fieldSubCond")); + for (int j = 0; j < farrList.size(); j++) { + JSONObject ObjField = ((JSONArray) farrList).getJSONObject(j); + usedFieldStr = usedFieldStr + ObjField.get("fieldId") + ","; + + Map fieldMap = new HashMap(); + fieldMap.put("userId", paramMap.get("userId")); + fieldMap.put("engineId", paramMap.get("engineId")); + fieldMap.put("id", ObjField.get("fieldId")); + Field field = fieldMapper.findByFieldId(fieldMap); + + if (field.getOrigFieldId() == null) { + if (origFieldStr.equals("")) { + origFieldStr = Long.toString(field.getId()); + } else { + origFieldStr = origFieldStr + "," + field.getId(); + } + } else { + if (origFieldStr.equals("")) { + origFieldStr = field.getOrigFieldId(); + } else { + origFieldStr = origFieldStr + "," + field.getOrigFieldId(); + } + } + + + } + } + } + + //合并引用字段id + if (!usedFieldStr.equals(",") && !usedFieldStr.equals("")) { + usedFieldStr = usedFieldStr.substring(0, usedFieldStr.length() - 1); + fieldVo.setUsedFieldId(getUniqueStr(usedFieldStr).toString()); + } + + //合并原生字段id + if (!origFieldStr.equals("")) { + fieldVo.setOrigFieldId(getUniqueStr(origFieldStr).toString()); + } + } + + if (fieldMapper.isExists(paramMap) == 0) { + fieldVo.setSourceType((Integer) paramMap.getOrDefault("sourceType", 1)); + fieldMapper.createField(fieldVo); + FieldUser fieldUserVo = new FieldUser(); + fieldUserVo.setFieldId(fieldVo.getId()); + fieldUserVo.setOrganId((Long) paramMap.get("organId")); + if (paramMap.get("engineId") != null) { + fieldUserVo.setEngineId(Long.valueOf((String) paramMap.get("engineId"))); + } + fieldUserVo.setUserId((Long) paramMap.get("userId")); + fieldUserVo.setStatus(Status.enable.value); + fieldUserMapper.createFieldUserRel(fieldUserVo); + + //可能衍生字段只有公式,没有条件设置 + if (paramMap.containsKey("fieldCondList")) { + + String fieldContent = (String) paramMap.get("fieldCondList"); + if (!fieldContent.equals("")) { + List fieldCondVoList = new ArrayList(); + List condList = new ArrayList<>(); + condList = JSONObject.parseArray(fieldContent); + for (int i = 0; i < condList.size(); i++) { + JSONObject cond = ((JSONArray) condList).getJSONObject(i); + List subCondList = new ArrayList<>(); + if (!cond.getString("fieldSubCond").equals("")) { + subCondList = JSONObject.parseArray(cond.getString("fieldSubCond")); + for (int j = 0; j < subCondList.size(); j++) { + JSONObject subCond = ((JSONArray) subCondList).getJSONObject(j); + FieldCond fieldCondVo = new FieldCond(); + fieldCondVo.setFieldId(fieldVo.getId()); + fieldCondVo.setConditionValue(cond.getString("conditionValue")); + fieldCondVo.setContent(cond.getString("fieldSubCond")); + fieldCondVo.setCondFieldId(Long.valueOf(subCond.getString("fieldId"))); + fieldCondVo.setCondFieldOperator(subCond.getString("operator")); + fieldCondVo.setCondFieldValue(subCond.getString("fieldValue")); + fieldCondVo.setCondFieldLogical(subCond.getString("logical")); + fieldCondVoList.add(fieldCondVo); + } + } + fieldCondMapper.createFieldCond(fieldCondVoList); + } + + } + } + + return true; + + } else + return false; + } + + @Override + public boolean updateField(Map paramMap) { + + String formulaHidden = ""; + + if (paramMap.containsKey("formulaHidden") && !paramMap.get("formulaHidden").equals("")) { + + formulaHidden = (String) paramMap.get("formulaHidden"); + paramMap.put("formula", formulaHidden); + + List formulaList = new ArrayList<>(); + formulaList = JSONObject.parseArray(formulaHidden); + + JSONArray jsonArrayFormula = new JSONArray(); + + String origFieldStr = ""; + String usedFieldStr = ""; + + for (int i = 0; i < formulaList.size(); i++) { + + JSONObject f = ((JSONArray) formulaList).getJSONObject(i); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("fvalue", f.getString("fvalue")); + jsonObject.put("formula", f.getString("formula")); + jsonObject.put("idx", f.getString("idx")); + jsonArrayFormula.add(jsonObject); + + List farrList = new ArrayList<>(); + String formula = f.getString("formula"); + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(formula); + while (matcher.find()) { + String fieldCN = matcher.group(0).replace("@", ""); + Map fieldMap = new HashMap(); + fieldMap.put("userId", paramMap.get("userId")); + fieldMap.put("engineId", paramMap.get("engineId")); + fieldMap.put("fieldCn", fieldCN); + + Field field = fieldMapper.findByFieldCn(fieldMap); + + if (field.getOrigFieldId() == null) { + if (origFieldStr.equals("")) { + origFieldStr = Long.toString(field.getId()); + } else { + origFieldStr = origFieldStr + "," + field.getId(); + } + } else { + if (origFieldStr.equals("")) { + origFieldStr = field.getOrigFieldId(); + } else { + origFieldStr = origFieldStr + "," + field.getOrigFieldId(); + } + } + usedFieldStr = usedFieldStr + field.getId() + ","; //拼凑该字段引用的字段id + } +// } + } + + paramMap.put("formulaShow", JSON.toJSONString(jsonArrayFormula)); + //合并原生字段id + if (!origFieldStr.equals("")) { + paramMap.put("origFieldId", getUniqueStr(origFieldStr).toString()); + } + + //合并引用字段id + if (!usedFieldStr.equals(",") && !usedFieldStr.equals("")) { + usedFieldStr = usedFieldStr.substring(0, usedFieldStr.length() - 1); + paramMap.put("usedFieldId", getUniqueStr(usedFieldStr).toString()); + } + + } else if (paramMap.containsKey("fieldCondList") && !paramMap.get("fieldCondList").equals("")) { + //条件区域的使用字段和原生字段获取 + + /* + fieldContent=[{"fieldContent2":"[{\"fieldId\":\"3\",\"operator\":\">\",\"fieldValue\":\"200\",\"logical\":\"&&\"} + ,{\"fieldId\":\"11\",\"operator\":\"<\",\"fieldValue\":\"50\"}]","conditionValue":"5","fieldValue":"50"} + ,{"fieldContent2":"[{\"fieldId\":\"12\",\"operator\":\"in\",\"fieldValue\":\"z\",\"logical\":\"&&\"} + ,{\"fieldId\":\"11\",\"operator\":\">\",\"fieldValue\":\"200\",\"logical\":\"&&\"} + ,{\"fieldId\":\"31\",\"operator\":\">\",\"fieldValue\":\"1000\"}]","conditionValue":"8","fieldValue":"1000"} + ,{"fieldContent2":"[{\"fieldId\":\"31\",\"operator\":\">\",\"fieldValue\":\"4000\"}]","conditionValue":"9","fieldValue":"4000"}] + */ + String fieldContent = (String) paramMap.get("fieldCondList"); + List fieldContentList = new ArrayList<>(); + fieldContentList = JSONObject.parseArray(fieldContent); + + String origFieldStr = ""; + String usedFieldStr = ""; + + for (int i = 0; i < fieldContentList.size(); i++) { + JSONObject fc = ((JSONArray) fieldContentList).getJSONObject(i); + List farrList = new ArrayList<>(); + if (!fc.getString("fieldSubCond").equals("") && fc.getString("fieldSubCond") != null) { + farrList = JSONObject.parseArray(fc.getString("fieldSubCond")); + for (int j = 0; j < farrList.size(); j++) { + JSONObject ObjField = ((JSONArray) farrList).getJSONObject(j); + usedFieldStr = usedFieldStr + ObjField.get("fieldId") + ","; + + Map fieldMap = new HashMap(); + fieldMap.put("userId", paramMap.get("userId")); + fieldMap.put("engineId", paramMap.get("engineId")); + fieldMap.put("id", ObjField.get("fieldId")); + Field field = fieldMapper.findByFieldId(fieldMap); + + if (field.getOrigFieldId() == null) { + if (origFieldStr.equals("")) { + origFieldStr = Long.toString(field.getId()); + } else { + origFieldStr = origFieldStr + "," + field.getId(); + } + } else { + if (origFieldStr.equals("")) { + origFieldStr = field.getOrigFieldId(); + } else { + origFieldStr = origFieldStr + "," + field.getOrigFieldId(); + } + } + } + } + } + //合并引用字段id + if (!usedFieldStr.equals(",") && !usedFieldStr.equals("")) { + usedFieldStr = usedFieldStr.substring(0, usedFieldStr.length() - 1); + paramMap.put("usedFieldId", getUniqueStr(usedFieldStr).toString()); + } + //合并原生字段id + if (!origFieldStr.equals("")) { + paramMap.put("origFieldId", getUniqueStr(origFieldStr).toString()); + } + } + + Long id = Long.valueOf(paramMap.get("userId").toString()); + //检查字段id是否归属该用户存在 + Field oldFieldVo = new Field(); + oldFieldVo = fieldMapper.findByFieldId(paramMap); + if (!oldFieldVo.getId().equals(null)) { + fieldMapper.updateField(paramMap); + + fieldCondMapper.deleteFieldCondById(id); + + String fieldContent = (String) paramMap.get("fieldCondList"); + List fieldCondVoList = new ArrayList(); + List condList = new ArrayList<>(); + if (!fieldContent.equals("")) { + condList = JSONObject.parseArray(fieldContent); + for (int i = 0; i < condList.size(); i++) { + JSONObject cond = ((JSONArray) condList).getJSONObject(i); + List subCondList = new ArrayList<>(); + subCondList = JSONObject.parseArray(cond.getString("fieldSubCond")); + for (int j = 0; j < subCondList.size(); j++) { + JSONObject subCond = ((JSONArray) subCondList).getJSONObject(j); + FieldCond fieldCondVo = new FieldCond(); + fieldCondVo.setFieldId(id); + fieldCondVo.setConditionValue(cond.getString("conditionValue")); + fieldCondVo.setContent(cond.getString("fieldSubCond")); + fieldCondVo.setCondFieldId(Long.valueOf(subCond.getString("fieldId"))); + fieldCondVo.setCondFieldOperator(subCond.getString("operator")); + fieldCondVo.setCondFieldValue(subCond.getString("fieldValue")); + fieldCondVo.setCondFieldLogical(subCond.getString("logical")); + fieldCondVoList.add(fieldCondVo); + } + } + fieldCondMapper.createFieldCond(fieldCondVoList); + } + return true; + } else + return false; + } + + /** + * 查找继承自某字段的所有字段id拼成逗号分隔的字符串返回 + * + * @return + */ + public String getField(String fieldIds, String usedFieldId, String engineId) { + + Map param = new HashMap(); + Long userId = SessionManager.getLoginAccount().getUserId(); + param.put("userId", userId); + param.put("fieldId", usedFieldId); + param.put("engineId", engineId); + + fieldIds = ""; + + String str = fieldMapper.checkField(param); + + if (str != null && str.length() >= 0) { + + String arrIds[] = str.split(","); + for (int i = 0; i < arrIds.length; i++) { + if (fieldIds.equals("")) { + fieldIds = getField("", arrIds[i], engineId); + } else { + fieldIds = fieldIds + "," + getField("", arrIds[i], engineId); + } + + } + } else { + return usedFieldId; + } + return fieldIds; + } + + /** + * 查找某字段的所有组成字段id并与该字段一起拼成逗号分隔的字符串返回,用于拷贝字段时检查组成该字段的所有子字段 + * + * @return + */ + @Override + public String getSourceField(String fieldIds, String fieldId) { + + Map paramMap = new HashMap(); + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + paramMap.put("fieldId", fieldId); + + fieldIds = ""; + + //String origFieldId = inputParam.get("origFieldId"); + String usedFieldId = fieldMapper.getSourceField(paramMap); + + if (usedFieldId != null && usedFieldId.length() >= 0) { + //fieldIds = usedFieldId; + String arrIds[] = usedFieldId.split(","); + for (int i = 0; i < arrIds.length; i++) { + if (fieldIds.equals("")) + fieldIds = getSourceField("", arrIds[i]); + else + fieldIds = fieldIds + "," + getSourceField("", arrIds[i]); + } + } else { + return fieldId; + } + + return fieldIds; + } + + /** + * 公共检查字段方法 供删除、停用、编辑提交时校验用 + * + * @return + */ + @Override + public Map checkField(Map paramMap) { + + boolean beUsed = false; + + List fieldList = new ArrayList(); + List listDbList = new ArrayList(); + List ruleList = new ArrayList(); + List scorecardList = new ArrayList(); + + String fieldIds = ""; + + String fieldId = (String) paramMap.get("fieldId"); + String s = getField("", fieldId, (String) paramMap.get("engineId")); + + //如果字段没有被引用不做字段有效性校验 + if (!s.equals("") && !s.equals(fieldId)) { + fieldIds = getUniqueStr(s).toString(); + List Ids = new ArrayList(); + Ids = StringUtil.toLongList(fieldIds); + paramMap.put("Ids", Ids); + if (!fieldIds.equals("") && fieldIds != null) { + //校验字段,命中则b改为true + fieldList = fieldMapper.findFieldByIdsForCheckField(paramMap); + if (fieldList.size() > 0) + beUsed = true; + } + s = fieldId + "," + s; //把自身字段加入检查序列,为后续检查做准备 + } else { + s = fieldId; + } + + fieldIds = getUniqueStr(s).toString(); + List Ids = new ArrayList(); + Ids = StringUtil.toLongList(fieldIds); + paramMap.put("Ids", Ids); + + //校验数据管理里的黑白名单库,命中则b改为true + String listDbIdStr = ""; + List listDbIds = new ArrayList(); + for (Iterator iterator = Ids.iterator(); iterator.hasNext(); ) { + Long Id = (Long) iterator.next(); + paramMap.put("fieldId", Id); + String str = listDbMapper.checkByField(paramMap); + if (str != null) { + if (listDbIdStr.equals("")) + listDbIdStr = str; + else + listDbIdStr = listDbIdStr + "," + str; + } + + } + if (!listDbIdStr.equals("") && !listDbIdStr.equals(",")) { + String str = getUniqueStr(listDbIdStr).toString(); + listDbIds = StringUtil.toLongList(str); + paramMap.put("listDbIds", listDbIds); + listDbList = listDbMapper.findListDbByIds(paramMap); + } + if (listDbList.size() > 0) + beUsed = true; + + //校验规则管理的规则,命中则b改为true + paramMap.put("fieldIds", Ids); +// ruleList = ruleMapper.checkByField(paramMap); +// if (ruleList.size() > 0) +// beUsed = true; + + //校验引擎管理-知识库-评分卡 +// scorecardList = scorecardMapper.checkByField(paramMap); +// if (scorecardList.size() > 0) +// beUsed = true; + + //<待完善>校验引擎管理-决策流节点(决策选项-客户分群) + + paramMap.put("fieldList", fieldList); + paramMap.put("listDbList", listDbList); + paramMap.put("ruleList", ruleList); + paramMap.put("scorecardList", scorecardList); + paramMap.put("beUsed", beUsed); + + return paramMap; + + } + + @Override + public Map updateStatus(Map paramMap) { + + boolean result = false; + + List Ids = (List) paramMap.get("Ids"); + paramMap.put("Ids", Ids); + + if (paramMap.containsKey("status") && !paramMap.get("status").equals("1")) {//停用、删除特殊处理需要增加校验 + + for (Iterator iterator = Ids.iterator(); iterator.hasNext(); ) { + Long Id = (Long) iterator.next(); + paramMap.put("fieldId", Id.toString()); + checkField(paramMap); + if ((boolean) paramMap.get("beUsed")) { + break; // 遇到第一个被使用的就跳出循环来 + } + } + + if (!(boolean) paramMap.get("beUsed")) { + paramMap.put("Ids", Ids); + result = fieldUserMapper.updateStatus(paramMap); + } + + } else if (paramMap.containsKey("listType") && paramMap.get("listType").equals("cabage") + && paramMap.get("status").equals("1")) {//回收站里删除状态变为启用状态 + + result = backEngFieldType(paramMap); + + } else {//停用变启用 + result = fieldUserMapper.updateStatus(paramMap); + } + + paramMap.put("result", result); + + return paramMap; + } + + @Override + public List findByFieldType(Map paramMap) { + + if (!paramMap.containsKey("fType")) { + return null; + // throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getVersionCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + Integer fType = Integer.valueOf(paramMap.get("fType").toString()); + + switch (fType) { + case 1: + // paramMap.put("useSql", false); + // paramMap.put("derivative", false); + break; + case 2: + // paramMap.put("useSql", true); + break; + case 3: + // paramMap.put("derivative", true); + break; + case 4: + // paramMap.put("interface", true); + break; + case 5: + break; + case 6: + break; + default: + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + + return fieldMapper.findByFieldType(paramMap); + } + + @Override + public int isExists(Map paramMap) { + return fieldMapper.isExists(paramMap); + } + + @Override + public Field findByFieldId(Map paramMap) { + return fieldMapper.findByFieldId(paramMap); + } + + @Override + public List findByUser(Map paramMap) { + return fieldMapper.findByUser(paramMap); + } + + @Override + public List getFieldList(Map paramMap) { + return fieldMapper.getFieldList(paramMap); + } + + @Override + public boolean bindEngineField(Map paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + paramMap.put("userId", userId); + paramMap.put("organId", organId); + + //获取所有字段id + String iFieldIds = (String) paramMap.get("fieldIds"); + String oFieldIds = iFieldIds; + if (iFieldIds != null && iFieldIds.length() >= 0) { + String arrIds[] = iFieldIds.split(","); + for (int i = 0; i < arrIds.length; i++) { + oFieldIds = oFieldIds + "," + getSourceField("", arrIds[i]); + } + } + String strFieldIds = getUniqueStr(oFieldIds).toString(); + + //把不存在字段关系绑定在一起 + if (!strFieldIds.equals("") && strFieldIds != null) { + //获取所有字段类型id + List fieldIds = StringUtil.toLongList(strFieldIds); + paramMap.put("fieldIds", fieldIds); + fieldUserMapper.batchBindEngineFieldUserRel(paramMap); + } + + + String strFieldTypeIds = fieldMapper.findOrgFieldTypeIdsByIds(paramMap); + if (!strFieldTypeIds.equals("") && strFieldTypeIds != null) { + + String parentFieldTypeIds = ""; + //查所有字段类型id的父id + if (!strFieldTypeIds.equals("")) { + strFieldTypeIds = getUniqueStr(strFieldTypeIds).toString(); + String arrIds[] = strFieldTypeIds.split(","); + + for (int i = 0; i < arrIds.length; i++) { + if (parentFieldTypeIds.equals("")) { + parentFieldTypeIds = getAllParentFieldTypeId("", arrIds[i], ""); + } else { + parentFieldTypeIds = parentFieldTypeIds + "," + getAllParentFieldTypeId("", arrIds[i], ""); + } + } + } + + if (!parentFieldTypeIds.equals("")) { + strFieldTypeIds = strFieldTypeIds + "," + parentFieldTypeIds; + } + List fieldTypeIds = StringUtil.toLongList(strFieldTypeIds); + + paramMap.put("fieldTypeIds", fieldTypeIds); + fieldTypeUserMapper.batchBindEngineFieldTypeUserRel(paramMap); + } + + return true; + } + + @Override + public Map importExcel(String url, Map paramMap) { + Map resultMap = new HashMap<>(); + + InputStream is = null; + Workbook Workbook = null; + Sheet Sheet; + try { + is = new FileInputStream(url); + Workbook = WorkbookFactory.create(is); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (InvalidFormatException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + List fieldVoList = new ArrayList(); + List fieldEnList = new ArrayList<>(); + int sucRows = 0; // 导入成功行数 + int failRows = 0; // 导入失败行数 + int repeatRows = 0; // 重复行数 + int existRows = 0; // 已存在的字段 + + // 循环工作表 Sheet + for (int numSheet = 0; numSheet < Workbook.getNumberOfSheets(); numSheet++) { + Sheet = Workbook.getSheetAt(numSheet); + if (Sheet == null) { + continue; + } + // 循环行 Row + for (int rowNum = 1; rowNum <= Sheet.getLastRowNum(); rowNum++) { + try { + Row Row = Sheet.getRow(rowNum); + if (Row == null) { + continue; + } + Field fieldVo = new Field(); + fieldVo.setAuthor(Long.valueOf(paramMap.get("author").toString())); + fieldVo.setIsCommon(Integer.valueOf(paramMap.get("isCommon").toString())); + + // 循环单元格 Cell + for (int cellNum = 0; cellNum <= Row.getLastCellNum(); cellNum++) { + Cell cell = Row.getCell(cellNum); + String cellStr = ExcelUtil.getCellValue(cell).trim(); + switch (cellNum) { // 逐单元格处理 + + case 0: + fieldVo.setFieldEn(cellStr); + break; + case 1: + fieldVo.setFieldCn(cellStr); + break; + case 2: + paramMap.put("fieldType", cellStr); + Long fieldTypeId = fieldTypeMapper.findIdByFieldType(paramMap); + if (fieldTypeId != 0) + fieldVo.setFieldTypeId(fieldTypeId); + else + fieldVo.setFieldTypeId(new Long(0)); //异常1:如果字段类型没法匹配,如何处理? + break; + case 3: + Integer valueType = 0; + if (cellStr.equals("数值型")) { + valueType = 1; + } + if (cellStr.equals("字符型")) { + valueType = 2; + } + if (cellStr.equals("枚举型")) { + valueType = 3; + } + if (cellStr.equals("小数型")) { + valueType = 4; + } + fieldVo.setValueType(valueType); + break; + case 4: + fieldVo.setValueScope(cellStr); + break; + case 5: + if (ExcelUtil.getCellValue(cell).equals("Y")) { + fieldVo.setIsDerivative(1); + } else { + fieldVo.setIsDerivative(0); + } + break; + case 6: + if (cellStr.equals("Y")) { + fieldVo.setIsOutput(1); + } else if (cellStr.equals("N")) { + fieldVo.setIsOutput(0); + } + break; + case 7://这里只处理公式原始值,不确定回显字段及字段绑定 + fieldVo.setFormula(cellStr); + break; + default: + break; + } + } + if (fieldVo.getFieldEn() != null) { + paramMap.put("fieldEn", fieldVo.getFieldEn()); + Field OldFieldVo = fieldMapper.findByFieldName(paramMap); + if (OldFieldVo != null) { + existRows++; + // fieldVo.setUserId(OldFieldVo.getUserId()); + // 不能直接更新字段,需先修改已使用到的地方 + // fieldMapper.updateField(paramMap); + } else { + // 防止重复字段 + if (fieldEnList.contains(fieldVo.getFieldEn())) { + repeatRows++; + } else { + sucRows++; + // 加入到list,等待批量更新 + fieldVoList.add(fieldVo); + fieldEnList.add(fieldVo.getFieldEn()); + } + } + } + } catch (Exception e) { + failRows++; + e.printStackTrace(); + } + }// end for Row + }// end first sheet + if (fieldVoList.size() > 0) { + fieldMapper.batchCreateField(fieldVoList); + paramMap.put("status", 1);// 导入后字段状态默认启用 + fieldUserMapper.batchCreateFieldUserRel(paramMap); + } + resultMap.put("sucRows", sucRows); + resultMap.put("failRows", failRows); + resultMap.put("repeatRows", repeatRows); + resultMap.put("existRows", existRows); + return resultMap; + } + + /** + * 查找某字段类型所有的<子类型>拼成逗号分隔的字符串 + * + * @return + */ + public String getAllFieldTypeId(String ids, String pid, String engineId) { + + Map param = new HashMap(); + Long userId = SessionManager.getLoginAccount().getUserId(); + param.put("userId", userId); + param.put("engineId", engineId); + param.put("parentId", pid); + + String sid = fieldTypeMapper.findTypeIdByParentId(param); + if (sid != null && sid.length() > 0) { + if (ids.equals("")) + ids = sid; + else + ids = ids + "," + sid; + + String arrIds[] = sid.split(","); + for (int i = 0; i < arrIds.length; i++) { + String str = getAllFieldTypeId("", arrIds[i], engineId); + if (!str.equals("")) + ids = ids + "," + str; + } + } + return ids; + } + + /** + * 查找某字段类型所有的<父类型>拼成逗号分隔的字符串 + * + * @return + */ + public String getAllParentFieldTypeId(String ids, String id, String engineId) { + + Map param = new HashMap(); + Long userId = SessionManager.getLoginAccount().getUserId(); + param.put("userId", userId); + if (engineId == null || engineId.equals("")) { + engineId = null; + } + param.put("engineId", engineId); + param.put("fieldTypeId", id); + + String pid = fieldTypeMapper.findParentIdByTypeId(param); + String s = ""; + if (!pid.equals("0")) { + ids = id + "," + getAllParentFieldTypeId("", pid, engineId); + } else { + return id; + } + + return ids; + } + + /** + * 从回收站还原一个或多个同类型或不同类型字段同时还原字段类型 + * + * @return + */ + public boolean backEngFieldType(Map paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + String basicFieldTypeIds = fieldMapper.findFieldTypeIdsByFieldId(paramMap); + + String strFieldTypeIds = basicFieldTypeIds; + + String arrIds[] = basicFieldTypeIds.split(","); + for (int i = 0; i < arrIds.length; i++) { + String str = getAllParentFieldTypeId("", arrIds[i], (String) paramMap.get("engineId")); + if (!str.equals("")) { + strFieldTypeIds = strFieldTypeIds + "," + str; + } + } + + //更新指定字段状态为1 + boolean f = fieldUserMapper.backFieldByIds(paramMap); + + //更新指定类型节点状态为1 + List fieldTypeIds = StringUtil.toLongList(strFieldTypeIds); + paramMap.put("fieldTypeIds", fieldTypeIds); + boolean ft = fieldTypeMapper.backFieldTypeByTypeIds(paramMap); + //ft 有两种情况:true是通过删除树节点还原会更新,如果通过删除字段还原,执行结果是false. + boolean result = false; + if (f) + result = true; + + return result; + + } + + @Override + public int isExistsFieldType(Map paramMap) { + return fieldTypeMapper.isExists(paramMap); + } + + /** + * 生成字符型随机数 + * + * @return + */ + public static String getRandomString(int length) { + String base = "abcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 生成指定范围内的随机整数 + * + * @return + */ + public static int getRandomInt(String minS, String maxS) { + + int min = 0, max = 0; + + if (minS.indexOf(".") >= 0) { // 3.90 | .9 + minS = minS.substring(0, minS.indexOf(".")); + } + + if (maxS.indexOf(".") >= 0) { // 3.90 + maxS = maxS.substring(0, maxS.indexOf(".")); + } + + if (maxS.equals("") && !minS.equals("")) { // (4,) 右开区间 + min = Integer.parseInt(minS); + max = min + 10000; + } else if (minS.equals("") && !maxS.equals("")) { // (,10) 左开区间 + max = Integer.parseInt(maxS); + min = max - 10000; + } else if (!minS.equals("") && !maxS.equals("")) {// (4,10) 左右闭区间 + min = Integer.parseInt(minS); + max = Integer.parseInt(maxS); + } + + Random random = new Random(); + int i = random.nextInt(max) % (max - min + 1) + min; + + return i; + + } + + @Override + public int updateFieldFolder(UpdateFolderParam param) { + int result = fieldMapper.updateFieldFolder(param); + return result; + } + + @Override + public String getFieldEnById(Long id) { + return fieldMapper.findFieldNameById(id); + } + + @Override + public List queryByIds(Collection ids) { + if (ids == null || ids.size() == 0) { + return new ArrayList<>(); + } + return fieldMapper.selectByIds(ids); + } + + @Override + public List queryByEns(Collection ens) { + if (ens == null || ens.size() == 0) { + return new ArrayList<>(); + } + return fieldMapper.selectByEns(ens); + } + + @Override + public List queryByOrganAndCns(Collection cns, Long organId) { + if (cns == null || cns.size() == 0) { + return new ArrayList<>(); + } + return fieldMapper.selectByOrganCns(cns, organId); + } + + public void sqlFieldCheck(Map map) { + if (map.containsKey("sqlStatement")) { + Object sqlStatement = map.get("sqlStatement"); + if (sqlStatement != null && !"".equals(sqlStatement)) { + String param = sqlStatement.toString().toUpperCase(); + for (String match : KEY_WORDS) { + if (param.contains(match)) { + throw new ApiException(ErrorCodeEnum.SQL_FIELD_HAVE_RISK.getCode(), ErrorCodeEnum.SQL_FIELD_HAVE_RISK.getMessage() + ":" + match); + } + } + } + } + } + + @Override + public int countFieldByOrganId(Long organId) { + Map map = new HashMap<>(); + map.put("organId", organId); + int result = fieldUserMapper.countFieldByOrganId(map); + return result; + } + + @Override + public List> countFieldGroupByType(Long organId) { + Map map = new HashMap<>(); + map.put("organId", organId); + List> result = fieldUserMapper.countFieldGroupByType(map); + return result; + } + + @Override + public Field queryById(Long id) { + Field field = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_FIELD, id); + field = redisManager.getByPrimaryKey(key, Field.class); + } else { + field = fieldMapper.selectById(id); + } + return field; + } + + @Override + public List findFieldByIdsbyorganId(Long organId, List ids) { + List fieldList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + List keys = RedisUtils.getPrimaryKey(TableEnum.T_FIELD, ids); + fieldList = redisManager.hgetAllBatchByPrimaryKeys(keys, Field.class); + } else { + Map paramMap = new HashMap<>(); + paramMap.put("organId", organId); + paramMap.put("Ids", ids); + fieldList = fieldMapper.findFieldByIdsbyorganId(paramMap); + } + return fieldList; + } + + @Override + public List selectFieldListByEns(List fieldEnList) { + List fieldList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + Long organId = RunnerSessionManager.getSession().getOrganId(); + List keys = fieldEnList.stream().map(item -> { + String fieldEnStr = Constants.fieldName.fieldEn + ":" + organId + ":" + item; + String fieldEnKey = RedisUtils.getPrimaryKey(TableEnum.T_FIELD, fieldEnStr); + return fieldEnKey; + }).collect(Collectors.toList()); + + fieldList = redisManager.hgetAllBatchByPrimaryKeys(keys, Field.class); + + } else { + fieldList = fieldMapper.selectFieldListByEns(fieldEnList); + } + return fieldList; + } + + @Override + public Field findByFieldEnbyorganId(Long organId, String fieldEn) { + Field field = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String fieldEnStr = Constants.fieldName.fieldEn + ":" + organId + ":" + fieldEn; + String fieldEnKey = RedisUtils.getPrimaryKey(TableEnum.T_FIELD, fieldEnStr); + field = redisManager.getByPrimaryKey(fieldEnKey, Field.class); + // todo 是否需要status = 1判断 + } else { + Map paramMap = new HashMap(); + paramMap.put("organId", organId); + paramMap.put("fieldEn", fieldEn); + field = fieldMapper.findByFieldEnbyorganId(paramMap); + } + return field; + } + + @Override + public Field findByFieldCnbyorganId(Long organId, String fieldCn) { + Field field = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String fieldCnStr = Constants.fieldName.fieldCn + ":" + organId + ":" + fieldCn; + String fieldCnKey = RedisUtils.getPrimaryKey(TableEnum.T_FIELD, fieldCnStr); + field = redisManager.getByPrimaryKey(fieldCnKey, Field.class); + // todo 是否需要status = 1判断 + } else { + Map paramMap = new HashMap(); + paramMap.put("organId", organId); + paramMap.put("fieldCn", fieldCn); + field = fieldMapper.findByFieldCnbyorganId(paramMap); + } + return field; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldTypeServiceImp.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldTypeServiceImp.java new file mode 100644 index 0000000..3099806 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datamanage/imp/FieldTypeServiceImp.java @@ -0,0 +1,78 @@ +package com.fibo.ddp.common.service.datax.datamanage.imp; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.datax.datamanage.FieldTypeMapper; +import com.fibo.ddp.common.dao.datax.datamanage.FieldTypeUserMapper; +import com.fibo.ddp.common.model.datax.datamanage.FieldType; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldTreeParam; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class FieldTypeServiceImp extends ServiceImpl implements FieldTypeService { + @Autowired + private FieldTypeMapper fieldTypeMapper; + @Autowired + private FieldTypeUserMapper fieldTypeUserMapper; + + @Override + public List getFieldTypeList(Map paramMap) { + return fieldTypeMapper.getFieldTypeList(paramMap); + } + + @Override + public boolean createFieldType(FieldType fieldTypeVo, + Map paramMap) { + // 检查字段类型是否存在 + if (fieldTypeMapper.createFieldType(fieldTypeVo)) { + paramMap.put("fieldTypeId", fieldTypeVo.getId()); + if (fieldTypeUserMapper.createFieldTypeUserRel(paramMap)) { + return true; + } else + return false; + } else + return false; + } + + @Override + public boolean updateFieldType(FieldTreeParam param) { + param.setOrganId(SessionManager.getLoginAccount().getOrganId()); + param.setUserId(SessionManager.getLoginAccount().getUserId()); + fieldTypeMapper.updateFieldType(param); + fieldTypeUserMapper.updateFieldTypeUserRel(param); + return true; + } + + @Override + public List getTreeList(FieldTreeParam param) { + param.setOrganId(SessionManager.getLoginAccount().getOrganId()); + param.setUserId(SessionManager.getLoginAccount().getUserId()); + List fieldTypes = fieldTypeMapper.selectFieldTypeList(param); + List collect = fieldTypes.stream().filter(fieldType -> fieldType.getParentId() == 0).collect(Collectors.toList()); + for (FieldType fieldType : collect) { + fieldType.setChildren(this.assembleTreeList(fieldTypes, fieldType)); + } + return collect; + } + + private FieldType[] assembleTreeList(List fieldTypes, FieldType root) { + List children = new ArrayList(); + for (FieldType fieldType : fieldTypes) { + if (fieldType.getParentId().equals(root.getId())) { + fieldType.setChildren(this.assembleTreeList(fieldTypes, fieldType)); + children.add(fieldType); + } + } + if (children.size() == 0) { + return new FieldType[0]; + } + return children.toArray(new FieldType[children.size()]); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/DataSourceService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/DataSourceService.java new file mode 100644 index 0000000..ec5cfd4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/DataSourceService.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.service.datax.datasource; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.model.datax.datasource.request.DataSourceListParam; +import com.fibo.ddp.common.model.datax.datasource.vo.DataSourceVo; + +import java.util.Map; + +public interface DataSourceService extends IService { + + Integer saveDataSource(DataSourceVo dataSource); + + Integer updateDataSource(DataSourceVo dataSource); + + DataSourceVo getDataSourceById(Integer id); + + Map getDataSourceList(DataSourceListParam param); + + Integer deleteDataSourceById(Integer id); + + // runner + DataSource getDataSourceByIdRunner(Integer id); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/MqSourceService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/MqSourceService.java new file mode 100644 index 0000000..0259e95 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/MqSourceService.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.service.datax.datasource; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datasource.MqSource; +import com.github.pagehelper.PageInfo; + + +import java.util.List; + +/** + * (MqSource)表服务接口 + * + * @author jgp + * @since 2021-12-20 13:31:51 + */ +public interface MqSourceService extends IService { + + MqSource queryById(Long id); + + PageInfo queryList(QueryListParam param); + + MqSource add(MqSource param); + + MqSource update(MqSource param); + + boolean updateStatus(List ids, Integer status); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/DataSourceServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/DataSourceServiceImpl.java new file mode 100644 index 0000000..0e41a2a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/DataSourceServiceImpl.java @@ -0,0 +1,131 @@ +package com.fibo.ddp.common.service.datax.datasource.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.datax.datasource.DataSourceMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.model.datax.datasource.request.DataSourceListParam; +import com.fibo.ddp.common.model.datax.datasource.vo.DataSourceVo; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datasource.DataSourceService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.utils.constant.Constants; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class DataSourceServiceImpl extends ServiceImpl implements DataSourceService { + + @Resource + public DataSourceMapper dataSourceMapper; + + @Resource + public SysUserMapper sysUserMapper; + + @Autowired + private RedisManager redisManager; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public Integer saveDataSource(DataSourceVo dataSourceVo) { + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + DataSource dataSource = new DataSource(); + BeanUtils.copyProperties(dataSourceVo, dataSource); + dataSource.setCreator(sysUser.getUserId()); + dataSource.setModifier(sysUser.getUserId()); + dataSource.setOrganId(organId); + return dataSourceMapper.insert(dataSource); + } + + @Override + public Integer updateDataSource(DataSourceVo dataSourceVo) { + SysUser sysUser = SessionManager.getLoginAccount(); + DataSource dataSource = new DataSource(); + BeanUtils.copyProperties(dataSourceVo, dataSource); + dataSource.setModifier(sysUser.getUserId()); + return dataSourceMapper.updateById(dataSource); + } + + @Override + public DataSourceVo getDataSourceById(Integer id) { + DataSource dataSource = dataSourceMapper.selectById(id); + DataSourceVo dataSourceVo = new DataSourceVo(); + BeanUtils.copyProperties(dataSource, dataSourceVo); + SysUser creator = sysUserMapper.findUserById(dataSource.getCreator()); + SysUser modifier = sysUserMapper.findUserById(dataSource.getModifier()); + dataSourceVo.setCreatorName(creator.getAccount()); + dataSourceVo.setModifierName(modifier.getAccount()); + return dataSourceVo; + } + + @Override + public Map getDataSourceList(DataSourceListParam param) { + Map result = new HashMap<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataSource::getStatus, 1); + if(param.getTypeList()!=null&&!param.getTypeList().isEmpty()){ + queryWrapper.in(DataSource::getType, param.getTypeList()); + } + queryWrapper.orderByDesc(DataSource::getUpdateTime); + if (param.getPageNo()>0 && param.getPageSize()>0){ + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + } + List dataSourceList = dataSourceMapper.selectList(queryWrapper); + PageInfo pageInfo = new PageInfo<>(dataSourceList); + pageInfo.setList(null); + result.put("pager", pageInfo); + + List dataSourceVoList = new ArrayList<>(); + for (DataSource dataSource : dataSourceList) { + DataSourceVo dataSourceVo = new DataSourceVo(); + BeanUtils.copyProperties(dataSource, dataSourceVo); + SysUser creator = sysUserMapper.findUserById(dataSource.getCreator()); + SysUser modifier = sysUserMapper.findUserById(dataSource.getModifier()); + dataSourceVo.setCreatorName(creator.getAccount()); + dataSourceVo.setModifierName(modifier.getAccount()); + dataSourceVoList.add(dataSourceVo); + } + result.put("data", dataSourceVoList); + + return result; + } + + @Override + public Integer deleteDataSourceById(Integer id) { + DataSource dataSource = new DataSource(); + dataSource.setId(id); + dataSource.setStatus(0); + return dataSourceMapper.updateById(dataSource); + } + + @Override + public DataSource getDataSourceByIdRunner(Integer id) { + DataSource dataSource = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_FIELD_DATA_SOURCE, id); + dataSource = redisManager.getByPrimaryKey(key, DataSource.class); + } else { + dataSource = this.getById(id); + } + return dataSource; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/MqSourceServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/MqSourceServiceImpl.java new file mode 100644 index 0000000..18ed80b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/datasource/impl/MqSourceServiceImpl.java @@ -0,0 +1,124 @@ +package com.fibo.ddp.common.service.datax.datasource.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.datax.datasource.MqSourceMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datasource.MqSource; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datasource.MqSourceService; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (MqSource)表服务实现类 + * + * @author jgp + * @since 2021-12-20 13:31:51 + */ +@Service("fieldMqSourceService") +public class MqSourceServiceImpl extends ServiceImpl implements MqSourceService { + @Resource + private MqSourceMapper mqSourceMapper; + + @Override + public MqSource queryById(Long id) { + if (id == null || id < 1) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "参数异常:id错误"); + } + MqSource result = this.getById(id); + if (result == null || result.getStatus() == -1) { + return null; + } + return result; + } + + @Override + public PageInfo queryList(QueryListParam param) { + if (QueryListParam.checkIsPage(param)) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + LambdaQueryWrapper wrapper = createWrapper(param.getEntity()); + PageInfo pageInfo = new PageInfo<>(this.list(wrapper)); + return pageInfo; + } + + @Override + public MqSource add(MqSource param) { + if (param == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "参数错误,添加消息队列源失败"); + } + init(param); + param.setCreator(param.getModifier()); + boolean save = this.save(param); + MqSource result = null; + if (save) { + result = this.queryById(param.getId()); + } + return result; + } + + @Override + public MqSource update(MqSource param) { + if (param == null || param.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "参数错误:修改消息队列源失败"); + } + init(param); + boolean save = this.updateById(param); + MqSource result = null; + if (save) { + result = this.queryById(param.getId()); + } + return result; + } + + @Override + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(MqSource::getId, ids); + MqSource mqSource = new MqSource(); + mqSource.setStatus(status); + mqSource.setModifier(SessionManager.getLoginAccount().getUserId()); + return this.update(mqSource, wrapper); + } + + private LambdaQueryWrapper createWrapper(MqSource entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MqSource::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc(MqSource::getId); + if (entity == null) { + wrapper.ne(MqSource::getStatus, StatusConst.STATUS_DELETE); + return wrapper; + } + if (StringUtils.isNotBlank(entity.getType())) { + wrapper.eq(MqSource::getType, entity.getType()); + } + if (StringUtils.isNotBlank(entity.getName())) { + wrapper.like(MqSource::getName, entity.getName()); + } + if (entity.getStatus() != null) { + wrapper.eq(MqSource::getStatus, entity.getStatus()); + } else { + wrapper.ne(MqSource::getStatus, StatusConst.STATUS_DELETE); + } + return wrapper; + } + + private void init(MqSource mqSource) { + SysUser loginAccount = SessionManager.getLoginAccount(); + mqSource.setStatus(1); + mqSource.setOrganId(loginAccount.getOrganId()); + mqSource.setModifier(loginAccount.getUserId()); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/HomeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/HomeService.java new file mode 100644 index 0000000..b9e1e74 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/HomeService.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.service.datax.home; + +import java.util.Map; + +public interface HomeService { + + Map getIndexInfo(); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/impl/DataXHomeServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/impl/DataXHomeServiceImpl.java new file mode 100644 index 0000000..c097af9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/home/impl/DataXHomeServiceImpl.java @@ -0,0 +1,96 @@ +package com.fibo.ddp.common.service.datax.home.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.model.monitor.logger.Logger; +import com.fibo.ddp.common.service.cignacmb.BusinessEventLogService; +import com.fibo.ddp.common.service.cignacmb.ITBusinessRuleRelService; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.datax.datainterface.InterfaceService; +import com.fibo.ddp.common.service.datax.datasource.DataSourceService; +import com.fibo.ddp.common.service.datax.home.HomeService; +import com.fibo.ddp.common.service.monitor.logger.LogService; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationService; +import com.fibo.ddp.common.utils.util.DataHelp; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service("dataXService") +public class DataXHomeServiceImpl implements HomeService { + @Autowired + LogService logService; + @Autowired + BusinessEventLogService businessEventLogService; + @Autowired + ListOperationService listOperationService; + @Autowired + ITBusinessRuleRelService itBusinessRuleRelService; + @Autowired + FieldService fieldService; + @Autowired + DataSourceService dataSourceService; + @Autowired + InterfaceService interfaceService; + + @Override + public Map getIndexInfo() { + Map map = new HashMap<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + Map paramMap = new HashMap<>(); + paramMap.put("organId", organId); + + + // 查询首页上次登录时间 + List lastLoginTimeList = logService.getLastLoginInfo(sysUser.getUserId()); + Date lastLoginTime = lastLoginTimeList.size() > 1 ? lastLoginTimeList.get(1) : lastLoginTimeList.get(0); + + // 查询首页当天活动日志 + Map param = new HashMap<>(); + param.put("organId", organId); + param.put("startDate", DataHelp.getDay()); + param.put("endDate", DataHelp.getNowDate()); + PageHelper.startPage(1, 6); + List logList = logService.getLogList(param); + logList = logList.stream().filter(item -> item.getOpType() != null && item.getOpType().startsWith("log")).collect(Collectors.toList()); + map.put("lastLoginTime", lastLoginTime); + map.put("logList", logList); + map.put("databaseCount", getDataBaseCount(organId)); + map.put("interfaceCount", getInterfaceCount(organId)); + map.put("fieldTypeGroup", getFieldTypeGroup(organId)); + map.put("fieldCount", getFieldNum(organId)); + return map; + } + + private int getInterfaceCount(Long organId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(InterfaceInfo::getOrganId, organId); + wrapper.ne(InterfaceInfo::getStatus, -1); + return interfaceService.count(wrapper); + } + + private int getDataBaseCount(Long organId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataSource::getOrganId, organId); + wrapper.ne(DataSource::getStatus, -1); + return dataSourceService.count(wrapper); + } + + private int getFieldNum(Long organId) { + return fieldService.countFieldByOrganId(organId); + } + + private List> getFieldTypeGroup(Long organId) { + return fieldService.countFieldGroupByType(organId); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/CommonService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/CommonService.java new file mode 100644 index 0000000..3b75d27 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/CommonService.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.service.datax.runner; + +import com.fibo.ddp.common.model.datax.datamanage.Field; + +import java.util.List; +import java.util.Map; + +public interface CommonService { + + boolean getFieldByIds(List ids, Map inputParam); + + /** + * 获取引擎节点所需的指标 + * @param fields + * @param inputParam + * @return + */ + boolean getEngineField(List fields, Map inputParam); + + Map getFields(List fields, Map inputParam); + + /** + * 获取衍生指标 + * @param inputParam + */ + void getFieldResult(Map inputParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/DataBaseReSource.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/DataBaseReSource.java new file mode 100644 index 0000000..4d9b2e6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/DataBaseReSource.java @@ -0,0 +1,124 @@ +package com.fibo.ddp.common.service.datax.runner; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.service.datax.runner.redis.RedisKSessionPool; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.utils.exception.ApiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; + +@Component +@Slf4j +public class DataBaseReSource { + + private static RedisKSessionPool redisKSessionPool; + + private static RedisManager redisManager; + + @Autowired + public DataBaseReSource(RedisKSessionPool redisKSessionPool, RedisManager redisManager) { + DataBaseReSource.redisKSessionPool = redisKSessionPool; + DataBaseReSource.redisManager = redisManager; + } + + public static final DruidDataSource getDataSource(String driverClassName, String url , String username, String passWord){ + DruidDataSource dynamicDataSource = new DruidDataSource(); + dynamicDataSource.setDriverClassName(driverClassName); + dynamicDataSource.setUrl(url); + dynamicDataSource.setUsername(username); + dynamicDataSource.setPassword(passWord); + return dynamicDataSource; + } + + + public static final class MySql { + public static final String type = "MySQL"; + public static final String driverClassName="com.mysql.cj.jdbc.Driver"; + public static final String urlPrefix="jdbc:mysql://"; + public static final String urlPostfix ="?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"; + public static DruidDataSource getDataSource( DataSource dataSource){ + String url = urlPrefix + dataSource.getHost() + ":" + dataSource.getPort() + "/" + dataSource.getDbName() + urlPostfix; + DruidDataSource dynamicDataSource = DataBaseReSource.getDataSource(driverClassName, url, dataSource.getUserName(), dataSource.getPassword()); + return dynamicDataSource; + } + } + public static final class Oracle { + public static final String type = "Oracle"; + public static final String driverClassName="oracle.jdbc.driver.OracleDriver"; + public static final String urlPrefix="jdbc:oracle:thin:@"; + public static DruidDataSource getDataSource( DataSource dataSource){ + String url = urlPrefix + dataSource.getHost() + ":" + dataSource.getPort() + ":" + dataSource.getDbName(); + String username = dataSource.getUserName(); + String passWord = dataSource.getPassword(); + DruidDataSource dynamicDataSource = DataBaseReSource.getDataSource(driverClassName, url, username, passWord); + return dynamicDataSource; + } + + } + public static final class SqlServer { + public static final String type = "SqlServer"; + public static final String driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"; + public static final String urlPrefix="jdbc:sqlserver://"; + public static final String DBNamePrefix=";DatabaseName="; + public static DruidDataSource getDataSource( DataSource dataSource){ + String url = urlPrefix + dataSource.getHost() + ":" + dataSource.getPort() + DBNamePrefix + dataSource.getDbName(); + String username = dataSource.getUserName(); + String passWord = dataSource.getPassword(); + DruidDataSource dynamicDataSource = DataBaseReSource.getDataSource(driverClassName, url, username, passWord); + return dynamicDataSource; + } + + } + public static final class DB2 { + public static final String type = "DB2"; + public static final String driverClassName="com.ibm.db2.jcc.DB2Driver"; + public static final String urlPrefix="jdbc:db2://"; + public static DruidDataSource getDataSource( DataSource dataSource){ + String url = urlPrefix + dataSource.getHost() + ":" + dataSource.getPort() + "/" + dataSource.getDbName(); + String username = dataSource.getUserName(); + String passWord = dataSource.getPassword(); + DruidDataSource dynamicDataSource = DataBaseReSource.getDataSource(driverClassName, url, username, passWord); + return dynamicDataSource; + } + } + public static final class Redis { + public static final String type = "Redis"; + + public static Jedis getDataSource(DataSource dataSource,String keyMd5){ + Jedis jedis = null; + redisManager.set(keyMd5, JSON.toJSONString(dataSource), 120); + try { + jedis = redisKSessionPool.borrowObject(keyMd5); + } catch (Exception e) { + log.error("获取jedis连接失败,Md5Key:{},dataSource:{}",keyMd5,dataSource); + throw new ApiException(ErrorCodeEnum.GET_REDIS_SOURCE_ERROR.getCode(), ErrorCodeEnum.GET_REDIS_SOURCE_ERROR.getMessage()); + } + return jedis; + } + public static void closeJedis(Jedis jedis){ + //关闭链接 + try { + jedis.close(); + }catch (Exception e){ + e.printStackTrace(); + } + } + + } + public static final class HiveConst{ + public static final String type = "Hive"; + public static final String driverClassName=""; + + } + public static final class SparkConst{ + public static final String type = "HSpark"; + public static final String driverClassName=""; + + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/ExecuteUtils.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/ExecuteUtils.java new file mode 100644 index 0000000..818a275 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/ExecuteUtils.java @@ -0,0 +1,656 @@ +package com.fibo.ddp.common.service.datax.runner; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.constant.runner.ParamTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.runner.JevalUtil; +import com.fibo.ddp.common.utils.util.runner.StrUtils; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.math.Groovy; +import com.fibo.ddp.common.utils.util.runner.jeval.function.math.Python; +import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +//底层执行的工具类 +@Component +public class ExecuteUtils { + private static final Logger logger = LoggerFactory.getLogger(ExecuteUtils.class); + private static Groovy groovy; + private static CommonService commonService; + private static Python python; + private static FieldService fieldService; + + @Autowired + public ExecuteUtils(Groovy groovy, CommonService commonService, Python python, FieldService fieldService) { + ExecuteUtils.groovy = groovy; + ExecuteUtils.commonService = commonService; + ExecuteUtils.python = python; + ExecuteUtils.fieldService = fieldService; + } + + //获取基本单元的执行结果 + public final static boolean getExpressionResult(ExpressionParam expressionParam, Map params) { + //如果是规则的条件的话,判断是否为叶子节点,如果不是则直接返回false + if (expressionParam.getConditionType() != null && expressionParam.getConditionType() != 2) { + return false; + } + String operator = expressionParam.getOperator(); + + //获取第二个参数的类型 + Integer variableType = expressionParam.getVariableType(); + //给每个参数取值 + Object paramOne = getValueByKey(2, params, expressionParam.getFieldEn(), null); + //默认为常量 + Object paramTwo = getValueByKey(variableType, params, expressionParam.getFieldValue(), null); + + if (paramOne == null || "".equals(paramOne) || paramTwo == null || "".equals(paramTwo)) { + return false; + } + return getCondResult(operator, paramOne, paramTwo); + } + + //传入两个参数和一个操作符进行比对获取结果 + public final static boolean getCondResult(String operator, Object paramOne, Object paramTwo) { + boolean result = false; + Double numOne = StrUtils.strToDouble(paramOne.toString()); + Double numTwo = StrUtils.strToDouble(paramTwo.toString()); + switch (operator) { + //数值之间的比较 + case "==": + if (numOne != null && numTwo != null) { + result = numOne.equals(numTwo); + } else if (paramOne != null && paramTwo != null) { + result = paramOne.toString().equals(paramTwo.toString()); + } + break; + case "!=": + if (numOne != null && numTwo != null) { + result = !numOne.equals(numTwo); + } else if (paramOne != null && paramTwo != null) { + result = !paramOne.toString().equals(paramTwo.toString()); + } + break; + case ">": + if (numOne != null && numTwo != null) { + result = numOne > numTwo; + } + break; + case "<": + if (numOne != null && numTwo != null) { + result = numOne < numTwo; + } + break; + case ">=": + if (numOne != null && numTwo != null) { + result = numOne >= numTwo; + } + break; + case "<=": + if (numOne != null && numTwo != null) { + result = numOne <= numTwo; + } + break; + //字符串之间的比较 + case "equals": + result = paramOne.toString().equals(paramTwo.toString()); + break; + case "not equals": + result = !paramOne.toString().equals(paramTwo.toString()); + break; + case "contains": + result = paramOne.toString().contains(paramTwo.toString()); + break; + case "not contains": + result = !paramOne.toString().contains(paramTwo.toString()); + break; + case "regex": + Pattern pattern = Pattern.compile(paramTwo.toString()); + Matcher matcher = pattern.matcher(paramOne.toString()); + result = matcher.find(); + break; + case "in": + if (paramTwo instanceof List) { + List list = (List) paramTwo; + result = list.contains(paramOne); + } else if (paramTwo instanceof Map) { + Map map = (Map) paramTwo; + result = map.containsKey(paramOne); + } + break; + case "not in": + if (paramTwo instanceof List) { + List list = (List) paramTwo; + result = !list.contains(paramOne); + } else if (paramTwo instanceof Map) { + Map map = (Map) paramTwo; + result = !map.containsKey(paramOne); + } + break; + } + return result; + } + + //根据key,分不同类型取出值 + public final static Object getValueByKey(Integer variableType, Map params, String paramKey, List list) { + Object result = paramKey; + if (variableType != null) { + switch (variableType) { + case ParamTypeConst + .CONSTANT: + //常量类型 + result = paramKey; + break; + case ParamTypeConst + .VARIABLE: + //变量类型 + result = getObjFromMap(params, paramKey); + break; + case ParamTypeConst + .CUSTOM: + //自定义脚本类型 + if (list == null || list.isEmpty()) { + result = getObjFromScript(params, paramKey); + } else { + result = getObjFromScript(params, paramKey, list); + } + break; + case ParamTypeConst + .REGEX: + //正则表达式类型 + result = getObjFromRegex(params, paramKey); + } + } + return result; + } + + //从map中取值 + public final static Object getObjFromMap(Map input, String key) { + if (StringUtils.isBlank(key)) { + return ""; + } + if (input == null) { + input = new ConcurrentHashMap<>(); + } + String[] array = key.split("\\."); + //如果当前变量池中未找到此变量则需要获取 + if (input.get(array[0]) == null && !array[0].startsWith("%")) { + List strings = new ArrayList(); + strings.add(array[0]); + boolean result = getFieldToInputByEns(strings, input); + if (!result) { + return ""; + } + } + return getObjFromMap(input, array); + } + + //从map中找到需要的对象并返回 + public final static Object getObjFromMap(Map input, String[] array) { + if (array.length == 1) { + Object o = input.get(array[0]); + if (o == null) { + return ""; + } + return o; + } + Map map = input; + for (int i = 0; i < array.length; i++) { + String childKey = array[i]; + //判断是否能找到key + if (map.containsKey(childKey)) { + Object o = map.get(childKey); + if (i == array.length - 1) { + return map.get(childKey); + } + //如果是数组取length + if (i == array.length - 2) { + if ("length()".equals(array[array.length - 1])) { + return JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(o)), ArrayList.class).size(); + } + } + //未找到最后一个数组元素则将其识别为map + map = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(o)), Map.class); + } + } + return ""; + } + + //根据入参map,通过公式和groovy计算出返回结果 + public final static Object getObjFromScript(Map input, String fieldValue) { + JSONObject formulaJson = JSON.parseObject(fieldValue); + //找到脚本中引用的字段,放入data中 + Map data = new HashMap<>(); + Object farr = formulaJson.get("farr"); + List fieldIds = new ArrayList<>(); + //字段cn为key,字段en为value + Map fieldMap = new HashMap<>(); + if (farr != null && !"".equals(farr)) { + List fieldList = JSONArray.parseArray(JSON.toJSONString(farr), Field.class); + for (Field field : fieldList) { + String fieldCn = field.getFieldCn(); + String fieldEn = field.getFieldEn(); + if (fieldCn != null && fieldEn != null && !"".equals(fieldCn) && !"".equals(fieldEn)) { + fieldMap.put(fieldCn, field); + } + fieldIds.add(field.getId()); + } + } + if (fieldIds.size() > 0) { + getFieldToInputByIds(fieldIds, input); + } + Object result = executeScript(formulaJson, fieldMap, input); + return result; + } + + //处理集合中的特殊自定义 + private final static Object getObjFromScript(Map input, String fieldValue, List current) { + JSONObject formulaJson = JSON.parseObject(fieldValue); + //找到脚本中引用的字段,放入data中 + Object farr = formulaJson.get("farr"); + List fieldIds = new ArrayList<>(); + //字段cn为key,字段en为value + Map fieldMap = new HashMap<>(); + if (farr != null && !"".equals(farr)) { + List fieldList = JSONArray.parseArray(JSON.toJSONString(farr), JSONObject.class); + String inputParamStr = JSON.toJSONString(input); + for (JSONObject jsonObject : fieldList) { + String fieldCn = jsonObject.getString("fieldCn"); + String fieldEn = jsonObject.getString("fieldEn"); + Field field = new Field(); + field.setFieldEn(fieldEn); + field.setFieldCn(fieldCn); + field.setValueType(jsonObject.getInteger("valueType")); + Object thisFieldEnValue = null; + if (fieldCn != null && fieldEn != null && !"".equals(fieldCn) && !"".equals(fieldEn)) { + fieldMap.put(fieldCn, field); + } + if (jsonObject.containsKey("temp") && jsonObject.getBoolean("temp")) { + continue; + } + Long id = jsonObject.getLong("id"); + if (!jsonObject.containsKey("paramList")) { + if (id != null) { + fieldIds.add(id); + } + continue; + } + + //存在paramList证明是参数绑定过的需要单个字段取出 + JSONArray paramList = jsonObject.getJSONArray("paramList"); + //input中根据fieldEn和绑定参数设置了缓存,此缓存需要规则中管理缓存层级。 + String thisFieldEnKey = MD5.GetMD5Code(fieldEn + ":" + paramList.toJSONString()); + if (input.containsKey(thisFieldEnKey)) { + thisFieldEnValue = input.get(thisFieldEnKey); + } else { + Map temp = JSON.parseObject(inputParamStr, Map.class); + for (int i = 0; i < paramList.size(); i++) { + JSONObject param = paramList.getJSONObject(i); + String paramEn = param.getString("en"); + String paramValue = param.getString("value"); + switch (param.getIntValue("type")) { + case ParamTypeConst.CONSTANT: + temp.put(paramEn, paramValue); + break; + case ParamTypeConst.VARIABLE: + temp.put(paramEn, DataCleanUtils.getObjByKeyAndJson(current.get(0), paramValue)); + break; + } + } + getFieldToInputByIds(Arrays.asList(id), temp); + thisFieldEnValue = temp.get(fieldEn); + input.put(thisFieldEnKey, thisFieldEnValue); + } + input.put(fieldEn, thisFieldEnValue); + } + } + + if (!fieldIds.isEmpty()) { + getFieldToInputByIds(fieldIds, input); + } + //取出groovy脚本 + Object result = executeScript(formulaJson, fieldMap, input); + return result; + } + + //对正则取值 + public final static Object getObjFromRegex(Map input, String fieldValue) { + String result = fieldValue; + //校验是否使用了字段如果使用了则需要替换为值 + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(fieldValue); + while (matcher.find()) { + String fieldEn = matcher.group().replace("@", ""); + Object value = ExecuteUtils.getObjFromMap(input, fieldEn); + String valueStr = ""; + if (value != null) { + valueStr = value.toString(); + } + result = result.replace("@" + fieldEn + "@", valueStr); + } + return result; + } + + //执行自定义脚本 + private final static Object executeScript(JSONObject formulaJson, Map fieldMap, Map input) { + String formula = formulaJson.getString("formula"); + //替换掉特殊的字符 + formula = formula.replace(">", ">"); //3>=6 && 3< 12 + formula = formula.replace("<", "<"); + //正则匹配自定义中用到的变量对其进行替换 + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(formula); + String subexp = formula; + String exp = ""; + int j = 0; + Map data = new HashMap<>(); + while (matcher.find()) { + String fieldCN = matcher.group(0).replace("@", ""); + Field subField = fieldMap.get(fieldCN); + if (subField == null) { + return ""; + } + String fieldEn = subField.getFieldEn(); + String v = ""; + v = "" + input.get(fieldEn); + data.put(fieldEn, input.get(fieldEn)); + if (subexp.contains("def main")) { + // groovy脚本替换为动态参数 + v = "_['" + fieldEn + "']"; + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", v); + } else { + if (subField.getValueType() == 1 || subField.getValueType() == 4) { + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", v); + } else { + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", "'" + v + "'"); + } + } + j = matcher.end(); + } + + + exp += formula.substring(j, formula.length()); + Evaluator evaluator = new Evaluator(); + Object result = ""; + try { + if (exp.contains("def main")) { + // 执行groovy脚本 + + logger.warn("groovy:{},{}", exp, data); + result = groovy.executeForObject(exp, data); + } else if (exp.contains("def python_main(_):")) { + //执行python脚本 + result = python.executeForObject(exp, data); + } else { + //执行公式 + result = evaluator.evaluate(exp); + } + if (result.toString().startsWith("'")) { + //字符串 + result = result.toString().replace("'", ""); + } else { + //数值 + if (StrUtils.isNum(result.toString())) { + String[] split = result.toString().split("\\."); + if (split.length > 1 && StrUtils.strToLong(split[1]) > 0) { + result = StrUtils.strToDouble(result.toString()); + } else { + result = StrUtils.strToLong(split[0]); + } + } + } + } catch (EvaluationException e) { + logger.error("自定义执行异常", e); + throw new ApiException(ErrorCodeEnum.RUNNER_CUSTOM_ERROR.getCode(), ErrorCodeEnum.RUNNER_CUSTOM_ERROR.getMessage()); + } + return result; + } + + //对groovy脚本执行结果进一步处理 + public static Map handleGroovyResult(Map map) { + + Iterator> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (entry.getKey().startsWith("_['") && entry.getKey().endsWith("']")) { + map.remove(entry.getKey()); + String key = entry.getKey().replace("_['", "").replace("']", ""); + map.put(key, entry.getValue()); + } + } + return map; + } + + //调用commonService根据ens取参数 + public static boolean getFieldToInputByEns(List fieldEns, Map input) { + boolean result = commonService.getEngineField(fieldService.selectFieldListByEns(fieldEns), input); + return result; + } + //调用commonService根据ids取参数 + private static boolean getFieldToInputByIds(List ids, Map input) { + boolean result = commonService.getFieldByIds(ids, input); + return result; + } + + // 解析nodeJson + public final static List getExecuteListFromNodeJson(EngineNode engineNode) { + JSONObject nodeJson = JSON.parseObject(engineNode.getNodeJson()); + String strategyStr = null; + switch (engineNode.getNodeType()) { + case 2://规则集 + strategyStr = JSON.toJSONString(nodeJson.getJSONObject("executeGroup").get("strategyList")); + break; + case 4://评分卡 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("scorecardList")); + break; + case 5://名单库 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("listDbList")); + break; + case 15://模型 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("modelList")); + break; + case 16://决策表 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("decisionTableList")); + break; + case 17://决策树 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("decisionTreeList")); + break; + + } + List maps = JSON.parseArray(strategyStr, Map.class); + return maps; + } + + //获取执行用的id列表 + public final static List getExecuteIdList(EngineNode engineNode, String idKey) { + List maps = ExecuteUtils.getExecuteListFromNodeJson(engineNode); + List executeIdList = new ArrayList<>(); + if (maps != null && maps.size() > 0) { + for (Map map : maps) { + if (map.containsKey(idKey)) { + Object o = map.get(idKey); + if (o != null) { + Long id = StrUtils.strToLong(String.valueOf(o)); + if (id != null) { + executeIdList.add(id); + } + } + + } + } + } + return executeIdList; + } + + //判断终止条件是否满足,满足则结束 + public final static void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap, Map variablesMap) { + if (StringUtils.isBlank(engineNode.getNodeScript())) { + return; + } + JSONObject nodeScript = JSONObject.parseObject(engineNode.getNodeScript()); + JSONObject terminationInfo = nodeScript.getJSONObject("terminationInfo"); + JSONArray selectedRule = terminationInfo.getJSONArray("selectedRule"); + if(selectedRule == null || selectedRule.isEmpty()){ + return; + } + + String conditions = terminationInfo.getString("conditions"); + Map fieldTypeMap = terminationInfo.getObject("fieldTypeMap", Map.class); + JevalUtil.convertVariables(fieldTypeMap, variablesMap); + // 判断终止条件 + boolean result = false; + try { + result = JevalUtil.evaluateBoolean(conditions, variablesMap); + } catch (EvaluationException e) { + logger.error("终止条件执行异常,执行内容:{},参数:{}", conditions, variablesMap); + e.printStackTrace(); + } + + if (result) { + Object outValue = ""; + JSONObject output = terminationInfo.getJSONObject("output"); + String fieldValue = output.getString("fieldValue"); + String fieldCode = output.getString("fieldCode"); + int variableType = output.getInteger("variableType"); + switch (variableType) { + case 1: + outValue = fieldValue; + break; + case 2: + outValue = ExecuteUtils.getObjFromMap(inputParam, fieldValue); + break; + case 3: + outValue = ExecuteUtils.getObjFromScript(inputParam, fieldValue); + break; + } + // 输出终止结果 + if (outValue == null) { + outValue = ""; + } + if (outValue instanceof String) { + outMap.put("result", outValue); + } else { + outMap.put("result", JSONObject.toJSON(outValue)); + } + if (StringUtils.isNotBlank(fieldCode)) { + inputParam.put(fieldCode, outValue); + } + engineNode.setNextNodes(null); + } + } + + //根据key,分不同类型取出值 + public final static Object getValueByKeyYiHao(Integer variableType, Map params, String paramKey, JSONObject collectionObject) { + Object result = paramKey; + if (variableType != null) { + switch (variableType) { + case ParamTypeConst + .CONSTANT: + //常量类型 + result = paramKey; + break; + case ParamTypeConst + .VARIABLE: + //变量类型 + result = getObjFromMap(params, paramKey); + break; + case ParamTypeConst + .CUSTOM: + //自定义脚本类型 + result = getObjFromScriptYiHao(paramKey, collectionObject); + break; + case ParamTypeConst + .REGEX: + //正则表达式类型 + result = getObjFromRegex(params, paramKey); + } + } + return result; + } + + //处理集合中的特殊自定义 + private final static Object getObjFromScriptYiHao(String outputValue, JSONObject collectionObject) { + JSONObject formulaJson = JSON.parseObject(outputValue); + Object farr = formulaJson.get("farr"); + Map fieldMap = new HashMap<>(); + if (farr != null && !"".equals(farr)) { + List fieldList = JSONArray.parseArray(JSON.toJSONString(farr), JSONObject.class); + for (JSONObject jsonObject : fieldList) { + String fieldCn = jsonObject.getString("fieldCn"); + String fieldEn = jsonObject.getString("fieldEn"); + Object opValue = DataCleanUtils.getObjByKeyAndJson(collectionObject, fieldEn); + fieldMap.put(fieldCn, opValue); + } + } + //取出groovy脚本 + Object result = executeScriptYiHao(formulaJson, fieldMap); + return result; + } + + //执行自定义脚本 + private final static Object executeScriptYiHao(JSONObject formulaJson, Map fieldMap) { + String formula = formulaJson.getString("formula"); + //替换掉特殊的字符 + formula = formula.replace(">", ">"); //3>=6 && 3< 12 + formula = formula.replace("<", "<"); + //正则匹配自定义中用到的变量对其进行替换 + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(formula); + String subexp = formula; + String exp = ""; + int j = 0; + while (matcher.find()) { + String fieldCn = matcher.group(0).replace("@", ""); + Object fieldCnValue = fieldMap.get(fieldCn); + if (fieldCnValue == null) { + return ""; + } + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCn + "@", fieldCnValue.toString()); + j = matcher.end(); + } + + exp += formula.substring(j, formula.length()); + Evaluator evaluator = new Evaluator(); + Object result = ""; + try { + //执行公式 + result = evaluator.evaluate(exp); + + if (result.toString().startsWith("'")) { + //字符串 + result = result.toString().replace("'", ""); + } else { + //数值 + if (StrUtils.isNum(result.toString())) { + String[] split = result.toString().split("\\."); + if (split.length > 1 && StrUtils.strToLong(split[1]) > 0) { + result = StrUtils.strToDouble(result.toString()); + } else { + result = StrUtils.strToLong(split[0]); + } + } + } + } catch (EvaluationException e) { + logger.error("自定义执行异常", e); + throw new ApiException(ErrorCodeEnum.RUNNER_CUSTOM_ERROR.getCode(), ErrorCodeEnum.RUNNER_CUSTOM_ERROR.getMessage()); + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/FieldTypeConsts.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/FieldTypeConsts.java new file mode 100644 index 0000000..ad23a31 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/FieldTypeConsts.java @@ -0,0 +1,10 @@ +package com.fibo.ddp.common.service.datax.runner; + +public class FieldTypeConsts { + public static String BASICS = "basics"; + public static String CONST = "const"; + public static String DATABASE = "database"; + public static String INTERFACE = "interface"; + public static String DERIVE = "derive"; + public static Long DERIVE_SOURCE_ID = 0L; +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/impl/CommonServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/impl/CommonServiceImpl.java new file mode 100644 index 0000000..ab79fae --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/impl/CommonServiceImpl.java @@ -0,0 +1,1014 @@ +package com.fibo.ddp.common.service.datax.runner.impl; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.datax.datasource.SimpleMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.datax.datamanage.FieldCallLog; +import com.fibo.ddp.common.model.datax.datamanage.FieldCond; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.runner.SessionData; +import com.fibo.ddp.common.service.datax.datainterface.InterfaceService; +import com.fibo.ddp.common.service.datax.datamanage.FieldCallLogService; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.datax.datasource.DataSourceService; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.DataBaseReSource; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.datax.runner.FieldTypeConsts; +import com.fibo.ddp.common.service.datax.runner.mysql.DataSourceContextHolder; +import com.fibo.ddp.common.service.datax.runner.mysql.DynamicDataSource; +import com.fibo.ddp.common.service.datax.runner.redis.RedisKSessionPool; +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.fibo.ddp.common.utils.util.runner.DictVariableUtils; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.math.Groovy; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import redis.clients.jedis.Jedis; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class CommonServiceImpl implements CommonService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private SimpleMapper simpleMapper; + + @Autowired + public FieldService fieldService; + + @Autowired + private Groovy groovy; + + @Autowired + private InterfaceService interfaceService; + + @Autowired + private DataSourceService dataSourceService; + @Autowired + private RedisKSessionPool redisKSessionPool; + @Autowired + private FieldCallLogService fieldCallLogService; + + @Override + public boolean getFieldByIds(List ids, Map inputParam) { + if (ids == null || ids.size() == 0) { + return true; + } + SessionData sessionData = RunnerSessionManager.getSession(); + Long organId = sessionData.getOrganId(); + List fieldList = fieldService.findFieldByIdsbyorganId(organId, ids); + List list = new ArrayList<>(); + ids = new ArrayList<>(); + for (int i = 0; i < fieldList.size(); i++) { + if (fieldList.get(i).getIsDerivative() == 1) { + ids.addAll(StringUtil.toLongList(fieldList.get(i).getOrigFieldId())); + } else + list.add(fieldList.get(i)); + } + if (ids.size() > 0) { + List lists = fieldService.findFieldByIdsbyorganId(organId, ids); + list.addAll(lists); + } + + List fields = new ArrayList<>(); + fields.addAll(list); + + this.getEngineField(fields, inputParam); +// 迁移到getEngineField方法中执行 +// for (Field field : fieldList) { +// if (field.getIsDerivative() == 1) { +// inputParam.put(field.getFieldEn(), ""); +// this.getFieldResult(inputParam); +// } +// } + return false; + } + + /** + * 调用http请求得到引擎节点所需要的字段 + * + * @return 引擎所需字段 + * @see + */ + @Override + public boolean getEngineField(List fields, Map inputParam) { + logger.info("start getEngineField, fields:{},inputParam:{}", JSONObject.toJSONString(fields), JSONObject.toJSONString(inputParam)); + + if (null != fields && fields.size() < 1) { + return true; + } + // 循环规则特殊处理 + List tempFields = new ArrayList<>(fields); + for (Field field : fields) { + if (field.getFieldEn().contains("[") && field.getFieldEn().contains("]")) { + String fieldEn = field.getFieldEn().substring(0, field.getFieldEn().indexOf("[")); + Field nField = new Field(); + nField.setFieldEn(fieldEn); + tempFields.add(nField); + tempFields.remove(field); + } + } + fields = new ArrayList<>(tempFields); + + // 需要调用指标系统的字段集合 + List remainFields = new ArrayList<>(fields); + + for (Field field : fields) { + if (inputParam.containsKey(field.getFieldEn())) { + // 优先从入参中获取指标 + remainFields.remove(field); + } else if (field.getType() != null && field.getType() == 5) { + // 常量指标 + // 常量JOSN指标直接获取定义好的常量的value + String value = field.getJsonValue(); + inputParam.put(field.getFieldEn(), JSONObject.parseObject(value)); + remainFields.remove(field); + } else if (field.getIsUseSql()) { + // 通过sql方式获取指标 + Object value = getFieldValueBySql(field, inputParam); + inputParam.put(field.getFieldEn(), value); + remainFields.remove(field); + } else if (field.getIsInterface()) { + // 解析接口指标 + String value = getFieldValueByInterface(field, inputParam); + inputParam.put(field.getFieldEn(), value); + remainFields.remove(field); + } + } + + if (null != remainFields && remainFields.size() < 1) { + return true; + } + for (Field field : remainFields) { + if (field.getIsDerivative() == 1) { + //衍生指标 + inputParam.put(field.getFieldEn(), ""); + this.getFieldResult(inputParam); + Object value = inputParam.get(field.getFieldEn()); + } + } + return false; + } + + @Override + public Map getFields(List fields, Map inputParam) { + logger.info("start getEngineField, fields:{},inputParam:{}", JSONObject.toJSONString(fields), JSONObject.toJSONString(inputParam)); + Map result = new HashMap<>(); + if (null != fields && fields.size() < 1) { + return result; + } + // 循环规则特殊处理 + List tempFields = new ArrayList<>(fields); + for (Field field : fields) { + if (field.getFieldEn().contains("[") && field.getFieldEn().contains("]")) { + String fieldEn = field.getFieldEn().substring(0, field.getFieldEn().indexOf("[")); + Field nField = new Field(); + nField.setFieldEn(fieldEn); + tempFields.add(nField); + tempFields.remove(field); + } + } + fields = new ArrayList<>(tempFields); + + // 需要调用指标系统的字段集合 + List remainFields = new ArrayList<>(fields); + + for (Field field : fields) { + Object value = null; + if (inputParam.containsKey(field.getFieldEn())) { + // 优先从入参中获取指标 + remainFields.remove(field); + value = inputParam.get(field.getFieldEn()); + } else if (field.getType() != null && field.getType() == 5) { + // 常量指标 + // 常量JOSN指标直接获取定义好的常量的value + value = field.getJsonValue(); + inputParam.put(field.getFieldEn(), value); + remainFields.remove(field); + } else if (field.getIsUseSql()) { + // 通过sql方式获取指标 + value = getFieldValueBySql(field, inputParam); + inputParam.put(field.getFieldEn(), value); + remainFields.remove(field); + } else if (field.getIsInterface()) { + // 解析接口指标 + value = getFieldValueByInterface(field, inputParam); + inputParam.put(field.getFieldEn(), value); + remainFields.remove(field); + } + if (value != null) { + result.put(field.getFieldEn(),value); + } + } + + if (null != remainFields && remainFields.size() < 1) { + return result; + } + for (Field field : remainFields) { + if (field.getIsDerivative() == 1) { + //衍生指标 + inputParam.put(field.getFieldEn(), ""); + this.getFieldResult(inputParam); + Object value = inputParam.get(field.getFieldEn()); + if (value != null) { + result.put(field.getFieldEn(),value); + } + } + } +// int type = 1; +// Properties p = new Properties(); +// try { +// InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("datacenter.properties"); +// p.load(inputStream); +// } catch (Exception e1) { +// e1.printStackTrace(); +// logger.error("remainFields:{},请求异常", JSONObject.toJSONString(remainFields), e1); +// } +// String act = p.getProperty("act"); +// //随机数 +// String nonce = UUID.randomUUID().toString(); +// String token = p.getProperty("token"); +// Date date = new Date(); +// long ts = date.getTime(); +//// String sign = MD5.GetMD5Code(act.trim() + "," + date.getTime() + "," + nonce.trim() + "," + pid.trim() + "," + uid.trim() + "," + token.trim()); +// HttpClient httpClient = new HttpClient(); +// String url = p.getProperty("url") + "?token=" + token.trim() + "&ts=" + ts + "&act=" + act.trim() + "&nonce=" + nonce.trim(); +// Map pam = new HashMap<>(); +// pam.put("fields", getListFieldByString(remainFields)); +//// pam.put("sign", sign); +// pam.put("type", String.valueOf(type)); +// try { +// String result = httpClient.post(url, pam); +// JSONObject jsonObject = JSONObject.parseObject(result); +// //返回成功状态下解析返回的字段 +// if (jsonObject.getString("status").equals("0x0000")) { +// JSONArray array = jsonObject.getJSONArray("data"); +// +// if (type == 1) { //普通规则 +// for (int i = 0; i < array.size(); i++) { +// JSONObject object = array.getJSONObject(i); +// for (Map.Entry entry : object.entrySet()) { +// inputParam.put(entry.getKey(), entry.getValue()); +// } +// } +// return true; +// } else { //复杂规则 +// List list = new ArrayList(); +// return true; +// } +// } else { +// //返回状态不成功,直接返回null +// return false; +// } +// } catch (Exception e) { +// e.printStackTrace(); +// logger.error("remainFields:{},请求异常", JSONObject.toJSONString(remainFields), e); +// } + return result; + } + +// /** +// * 把list对象转换为以,号隔开的string字符串 +// * +// * @inputParam list +// * @return +// * @see +// */ +// private String getListFieldByString(List list) { +// String fields = ""; +// for (int i = 0; i < list.size(); i++) { +// fields = fields + list.get(i).getFieldEn() + ","; +// } +// return fields; +// +// } + + /** + * 通过sql获取指标 + * + * @param field + * @return + */ + private Object getFieldValueBySql(Field field, Map inputParam) { + logger.info("start【获取sql指标】, fieldEn:{}", field.getFieldEn()); + long start = System.currentTimeMillis(); + DataSource dataSource = dataSourceService.getDataSourceByIdRunner(field.getDataSourceId()); + if (dataSource == null || dataSource.getStatus() == 0) { + return null; + } + DruidDataSource dynamicDataSource = null; + Jedis jedis = null; + boolean isDurid = false; + String keyMd5 = null; + Object resultValue = null; + Map parameterMap = new HashMap<>(); // 可以传入通用参数 + //替换参数 + this.getSqlFieldParam(field, inputParam, parameterMap); + try { + switch (dataSource.getType()) { + case DataBaseReSource.MySql.type: + dynamicDataSource = DataBaseReSource.MySql.getDataSource(dataSource); + isDurid = true; + break; + case DataBaseReSource.Oracle.type: + dynamicDataSource = DataBaseReSource.Oracle.getDataSource(dataSource); + isDurid = true; + break; + case DataBaseReSource.Redis.type: + String userName = dataSource.getUserName(); + if (StringUtils.isBlank(userName)) { + userName = "root"; + } + keyMd5 = CommonConst.JEDIS_KSESSION_KEY_PREFIX + MD5.GetMD5Code(dataSource.getHost() + ":" + + dataSource.getPort() + ":" + dataSource.getDbName() + ":" + userName + ":" + dataSource.getPassword()); + jedis = DataBaseReSource.Redis.getDataSource(dataSource, keyMd5); + break; + } + + if (isDurid) { + // 创建动态数据源,并切换数据源 + Map dataSourceMap = DynamicDataSource.getInstance().getDataSourceMap(); + String dataSourceKey = "dynamic-" + dataSource.getId(); + dataSourceMap.put(dataSourceKey, dynamicDataSource); + DynamicDataSource.getInstance().setTargetDataSources(dataSourceMap); + DataSourceContextHolder.setDBType(dataSourceKey); + resultValue = handlerSqlFieldResult(field, parameterMap); + } else if (jedis != null) { + resultValue = jedis.eval(parameterMap.get("sqlStr").toString()); + } + if (resultValue == null) { + throw new ApiException(ErrorCodeEnum.GET_DATABASE_FIELD_ERROR.getCode(), ErrorCodeEnum.GET_DATABASE_FIELD_ERROR.getMessage()); + } + } finally { + // 执行完成后切换到系统数据源 + DataSourceContextHolder.setDBType("default"); + if (StringUtils.isNotBlank(keyMd5) && jedis != null) { + redisKSessionPool.returnObject(keyMd5, jedis); + } + } + long end = System.currentTimeMillis(); + fieldCallLogService.save(new FieldCallLog(field.getId(), FieldTypeConsts.DATABASE,dataSource.getType(),dataSource.getId().longValue(),JSON.toJSONString(parameterMap), + JSON.toJSONString(resultValue),(end - start),field.getOrganId())); + logger.info("【获取数据库指标】fieldEn:{}, 耗时:{}, result:{}, parameterMap:{}", field.getFieldEn(), (end - start), resultValue, parameterMap); + return resultValue; + + } + + /** + * 解析接口指标 + * + * @param field + * @return + */ + private String getFieldValueByInterface(Field field, Map inputParam) { + long start = System.currentTimeMillis(); + InterfaceInfo interfaceInfo = interfaceService.getInterfaceById(field.getInterfaceId()); + //http请求获得json响应体 + String response = interfaceService.getHttpResponse(interfaceInfo, inputParam, null); + //解析接口指标 + String resultValue ; + try { + resultValue = interfaceService.interfaceParseField(field.getInterfaceParseField(), response); + logger.info("【解析接口响应体完成】fieldEn:{},fieldCn:{}, fieldValue:{}, response:{}",field.getFieldEn(),field.getFieldCn(),resultValue,response); + } catch (Exception e) { + logger.error("【解析接口响应体失败】fieldEn:{},fieldCn:{},response:{}",field.getFieldEn(),field.getFieldCn(),response); + e.printStackTrace(); + throw new ApiException(ErrorCodeEnum.GET_INTERFACE_FIELD_ERROR.getCode(),ErrorCodeEnum.GET_INTERFACE_FIELD_ERROR.getMessage()); + } + long end = System.currentTimeMillis(); + fieldCallLogService.save(new FieldCallLog(field.getId(), FieldTypeConsts.INTERFACE,FieldTypeConsts.INTERFACE,interfaceInfo.getId().longValue(),JSON.toJSONString(inputParam), + JSON.toJSONString(resultValue),(end - start),field.getOrganId())); + return resultValue; + } + + /** + * 根据输入字段参数返回衍生字段的结果 + * 输入:引擎id及参数列表(原生字段英文字段名和值、待计算的衍生字段只有英文字段名) + * 输出:待计算衍生字段的计算结果值 + */ + @Override + public void getFieldResult(Map paramMap) { + //参数传递中间临时Map + Map paramMap2 = new HashMap(); + for (Map.Entry entry : paramMap.entrySet()) { + if (null != entry.getValue()) + paramMap2.put(entry.getKey(), entry.getValue()); + else + paramMap2.put(entry.getKey(), ""); + } + + SessionData sessionData = RunnerSessionManager.getSession(); + Long organId = sessionData.getOrganId(); + paramMap2.put("organId", organId); + + List fieldCallLogs = new ArrayList<>(); + for (Map.Entry entry : paramMap.entrySet()) { + String fieldEn = entry.getKey(); + String fieldValue = ""; + if (null != entry.getValue()) + fieldValue = String.valueOf(entry.getValue()); + + if (null == fieldValue || fieldValue.equals("")) { + + paramMap2.put("fieldEn", fieldEn); + Field field = fieldService.findByFieldEnbyorganId(organId, fieldEn); + + if (field != null) { + if (field.getIsDerivative() == 1) { + long start = System.currentTimeMillis(); + String result = ""; + paramMap2.put("fieldCn", field.getFieldCn()); + result = getExpAll(field.getFieldCn(), "", paramMap); + //单独返回数值结果会带上(),做处理去掉 + result = result.replace("(", ""); + result = result.replace(")", ""); + long end = System.currentTimeMillis(); + fieldCallLogs.add(new FieldCallLog(field.getId(),FieldTypeConsts.DERIVE,FieldTypeConsts.DERIVE, + FieldTypeConsts.DERIVE_SOURCE_ID,JSON.toJSONString(paramMap),result,(end-start),field.getOrganId())); + paramMap.put(fieldEn, result); + } + } + } + } + if (!fieldCallLogs.isEmpty()){ + fieldCallLogService.saveBatch(fieldCallLogs); + } + } + + /** + * 递归生成衍生字段嵌套的逻辑表达式或公式计算的结果 + */ + private String getExpAll(String fieldCn, String exp, Map param) { + + String result = ""; + Map param2 = new HashMap(); + for (Map.Entry entry : param.entrySet()) { + if (null != entry.getValue()) + param2.put(entry.getKey(), entry.getValue()); + else + param2.put(entry.getKey(), ""); + } + + SessionData sessionData = RunnerSessionManager.getSession(); + Long organId = sessionData.getOrganId(); + + Map paramMap = new HashMap(); + + paramMap.put("organId", organId); + paramMap.put("engineId", param.get("engineId")); + paramMap.put("fieldCn", fieldCn); + + //放大从组织通用字段拷贝生成的引擎字段里字段的获取范围,优先取引擎,没有再取组织里的(因为中文名在组织通用字段和引擎字段里有重复) + String arrFormula = ""; + Field engField = fieldService.findByFieldCnbyorganId(organId, fieldCn); + String engFormula = engField.getFormula(); + if (!engFormula.equals("") && engFormula != null) { + arrFormula = engFormula; + } + + if (arrFormula.equals("") || arrFormula == null) { //衍生字段只有条件区域 + + List fieldCondList = new ArrayList(); + List engfieldCondList = fieldService.findByFieldCnbyorganId(organId, fieldCn).getFieldCondList(); + if (engfieldCondList.size() > 0) { + fieldCondList = engfieldCondList; + } + + if (fieldCondList.size() > 0) {//需要进行条件区域逻辑运算 + for (FieldCond fieldCond : fieldCondList) {//这里的fieldCond是字段设置的逻辑运算符 + String condValue = fieldCond.getConditionValue(); + List condList = new ArrayList<>(); + condList = JSONObject.parseArray(fieldCond.getContent()); + exp = ""; + for (int j = 0; j < condList.size(); j++) { + JSONObject cond = ((JSONArray) condList).getJSONObject(j); + //[{\"fieldId\":\"31\",\"operator\":\">\",\"fieldValue\":\"1000\",\"logical\":\"&&\"},{\"fieldId\":\"31\",\"operator\":\">=\",\"fieldValue\":\"7000\"}] + paramMap.put("id", cond.getString("fieldId")); + + Field condfield = fieldService.queryById(Long.valueOf(cond.getString("fieldId"))); + if (condfield == null) { + condfield = fieldService.findByFieldCnbyorganId(organId, fieldCn); + } + + String condFieldEn = condfield.getFieldEn();//yqshouru 月收入 + String condFieldCn = condfield.getFieldCn(); + Integer condValueType = condfield.getValueType(); //1数值型 + String condFieldValue = cond.getString("fieldValue"); //1000 + String operator = cond.getString("operator"); //>大于号 + String fieldValue = param2.get(condFieldEn).toString(); //取输入变量的值 + + String logical = ""; + + if (condfield.getIsDerivative() == 0) { + if (cond.containsKey("logical")) + logical = " " + cond.getString("logical") + " "; + if (operator.equals("in")) { + //exp += "(indexOf(#{"+fieldValue+"},'"+condFieldValue+"')>0"+logical; + exp += "(indexOf('" + condFieldValue + "','" + fieldValue + "',0) >= 0)" + logical; + } else if (operator.equals("not in")) { + //exp += "(indexOf(#{"+fieldValue+"},'"+condFieldValue+"')=0"+logical; + exp += "(indexOf('" + condFieldValue + "','" + fieldValue + "',0) = -1)" + logical; + } else if (operator.equals("like")) { //交换位置 (indexOf('abc','c',0) >= 0) + exp += "(indexOf('" + fieldValue + "','" + condFieldValue + "',0) >= 0)" + logical; + } else if (operator.equals("not like")) { //(indexOf('abc','x',0) = -1) + exp += "(indexOf('" + fieldValue + "','" + condFieldValue + "',0) = -1)" + logical; + } else { + if (condValueType == 1 || condValueType == 4) { + exp += " (" + fieldValue + "" + operator + "" + condFieldValue + ") " + logical; + } else + exp += " ('" + fieldValue + "'" + operator + "'" + condFieldValue + "') " + logical; + } + } else {//衍生字段 + if (cond.containsKey("logical")) + logical = " " + cond.getString("logical") + " "; + if (operator.equals("in")) { + //exp += "(indexOf(#{"+getExpAll(condFieldCn,"",param2)+"},'"+condFieldValue+"')>0"+logical; + //(indexOf('abc','c',0) >= 0) && (indexOf('abc','x',0) = -1) + exp += "(indexOf('" + condFieldValue + "','" + getExpAll(condFieldCn, "", param2) + "',0) >= 0)" + logical; + } else if (operator.equals("not in")) { + exp += "(indexOf('" + condFieldValue + "','" + getExpAll(condFieldCn, "", param2) + "',0) = -1)" + logical; + } else if (operator.equals("like")) { //交换位置 (indexOf('abc','c',0) >= 0) + exp += "(indexOf('" + getExpAll(condFieldCn, "", param2) + "','" + condFieldValue + "',0) >= 0)" + logical; + } else if (operator.equals("not like")) { //(indexOf('abc','x',0) = -1) + exp += "(indexOf('" + getExpAll(condFieldCn, "", param2) + "','" + condFieldValue + "',0) = -1)" + logical; + } else { + if (condValueType == 1 || condValueType == 4) { + exp += " (" + getExpAll(condFieldCn, "", param2) + "" + operator + "" + condFieldValue + ") " + logical; + } else + exp += " ('" + getExpAll(condFieldCn, "", param2) + "'" + operator + "'" + condFieldValue + "') " + logical; + } + } + } + Evaluator evaluator = new Evaluator(); + String b = ""; + try { + System.out.println("========字段区域设置的的表达式输出:" + exp); + b = evaluator.evaluate(exp); + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + if (b.equals("1.0")) { + result = condValue; + break; //遇到一个满足条件的则跳出循环 + } + } + } + } else { //衍生字段只有公式 + List formulaList = new ArrayList<>(); + formulaList = JSONObject.parseArray(arrFormula); + for (int i = 0; i < formulaList.size(); i++) { + JSONObject formulaJson = ((JSONArray) formulaList).getJSONObject(i); + + String formula = (String) formulaJson.get("formula"); + formula = formula.replace(">", ">"); //3>=6 && 3< 12 + formula = formula.replace("<", "<"); + Pattern pattern = Pattern.compile("@[a-zA-Z0-9_\u4e00-\u9fa5()()-]+@"); + Matcher matcher = pattern.matcher(formula); + String subexp = formula; + int j = 0; + exp = ""; + // 存放groovy脚本入参 + Map data = new HashMap<>(); + //System.out.println("待替换的字段串:"+formula); + while (matcher.find()) { + String fieldCN = matcher.group(0).replace("@", ""); + Map fieldMap = new HashMap(); + paramMap.put("organId", organId); + fieldMap.put("engineId", paramMap.get("engineId")); + fieldMap.put("fieldCn", fieldCN); + fieldMap.put("organId", organId); + Field subField = fieldService.findByFieldCnbyorganId(organId, fieldCN); + + //构造字段条件区间计算输入参数 + Map paramCond = new HashMap(); + paramCond.put("fieldValue", param2.get(subField.getFieldEn())); + paramCond.put("fieldEn", subField.getFieldEn()); + paramCond.put("fieldValueType", subField.getValueType()); + + //字段条件转换 + JSONArray fieldCond = new JSONArray(); + if (formulaJson.get("farr") != null && !"".equals(formulaJson.get("farr"))) { + JSONArray jsonArr = (JSONArray) formulaJson.get("farr"); + for (Iterator iterator = jsonArr.iterator(); iterator.hasNext(); ) { + JSONObject job = (JSONObject) iterator.next(); + if (job.get("fieldCN").equals(fieldCN) && !job.get("fieldCond").equals("")) { + fieldCond = (JSONArray) job.get("fieldCond"); + break; + } + } + } + + paramCond.put("fieldCond", fieldCond); + String v = ""; + if (fieldCond.size() > 0) { + v = calcFieldCond(paramCond); + } else { + v = "" + param2.get(subField.getFieldEn()); + } + data.put(subField.getFieldEn(), param2.get(subField.getFieldEn())); + + if (subField.getIsDerivative() == 0) { +// if(subexp.indexOf("substring")>=0||subexp.indexOf("equals")>=0){ //substring(@字段A@,3,6) +// exp += subexp.substring(j, matcher.end()).replace("@"+fieldCN+"@", "'"+v+"'"); +// }else{ +// exp += subexp.substring(j, matcher.end()).replace("@"+fieldCN+"@", v); +// } + + if (subexp.contains("def main")) { + // groovy脚本替换为动态参数 + v = "_['" + subField.getFieldEn() + "']"; + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", v); + } else { + if (subField.getValueType() == 1 || subField.getValueType() == 4) { + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", v); + } else { + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", "'" + v + "'"); + } + } + + } else { + + v = getExpAll(fieldCN, exp, param2); + // 存衍生字段 + if (subField.getValueType() == 1 || subField.getValueType() == 4) { + data.put(subField.getFieldEn(), Integer.valueOf(v)); + } else { + data.put(subField.getFieldEn(), v); + } + + if (subexp.contains("def main")) { + // groovy脚本替换为动态参数 + v = "_['" + subField.getFieldEn() + "']"; + } + exp += subexp.substring(j, matcher.end()).replace("@" + fieldCN + "@", v); + } + j = matcher.end(); + } + exp += formula.substring(j, formula.length()); + Evaluator evaluator = new Evaluator(); + String b = ""; + try { +// System.out.println("========字段公式编辑设置的表达式输出:" + exp); + + if (exp.contains("def main")) { + // 执行groovy脚本 + b = groovy.execute(exp, data); +// b = String.valueOf(groovy.execute(exp, data)); + } else { + b = evaluator.evaluate(exp); + } + + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + + // + if (engField.getValueType().intValue() == 1 || engField.getValueType().intValue() == 2) { //数值型或者字符型字段的衍生表达式b的结果返回值0.0代表计算结果 + if (!b.equals("")) { + result = b; + if (StringUtil.isValidStr(result) && result.startsWith("'") && result.endsWith("'")) { + result = result.substring(1, result.length() - 1); + } + } + } else if (engField.getValueType().intValue() == 3) { //枚举型字段的衍生表达式b的结果返回值0.0代表false即逻辑表达式无效 + if (!b.equals("1.0") && !b.equals("0.0") && !b.equals("")) { + result = b; + if (StringUtil.isValidStr(result) && result.startsWith("'") && result.endsWith("'")) { + result = result.substring(1, result.length() - 1); + } + } + if (b.equals("1.0")) { + result = (String) formulaJson.get("fvalue"); + //result = result.substring(result.indexOf(":")+1,result.length());// a:2 取2返回 + if (isNumeric(result)) { + result = "(" + result + ")"; + } else { + result = "'" + result + "'"; + } + break; //遇到一个满足条件的则跳出循环 + } + } + + } + } + + return result; + + } + + /** + * 公式编辑里设置字段条件区域转换的通用方法 + * 输入:待转换字段的输入参数、值类型 + * 输出:输入参数所在区间对应的结果值 + */ + private String calcFieldCond(Map paramMap) { + + String fieldValue = (String) paramMap.get("fieldValue"); + Integer fieldValueType = (Integer) paramMap.get("fieldValueType"); + + String result = ""; + //[{"fieldCN":"引擎字段1-1","fieldCond":[{"inputOne":"a","inputThree":"33"},{"inputOne":"b","inputThree":"490"},{"inputOne":"c","inputThree":"50"}]}] + //[{"fieldCN":"引擎字段1-1","fieldCond":[{"inputOne":"(3,19]","inputThree":"1"},{"inputOne":"(19,200]","inputThree":"2"}]},{"fieldCN":"通用字段2贷前","fieldCond":""}] + JSONArray jsonArr = (JSONArray) paramMap.get("fieldCond"); + for (Iterator iterator = jsonArr.iterator(); iterator.hasNext(); ) { + JSONObject job = (JSONObject) iterator.next(); + String inputOne = (String) job.get("inputOne"); + String inputThree = (String) job.get("inputThree"); + + if (fieldValueType == 3) { + if (fieldValue.equals(inputOne)) { + result = inputThree; + break; + } + } else if (fieldValueType == 1 || fieldValueType == 4) { + //(40,50] + Double lv = Double.parseDouble(inputOne.substring(1, inputOne.indexOf(","))); + Double rv = Double.parseDouble(inputOne.substring(inputOne.indexOf(",") + 1, inputOne.length() - 1)); + + String exp = ""; + if (inputOne.startsWith("(") && !lv.equals("")) { + exp = fieldValue + ">" + lv; + } + if (inputOne.startsWith("[") && !lv.equals("")) { + exp = fieldValue + ">=" + lv; + } + if (inputOne.endsWith(")") && !rv.equals("")) { + if (exp.equals("")) + exp += fieldValue + "<" + rv; + else + exp += "&&" + fieldValue + "<" + rv; + } + if (inputOne.endsWith("]") && !rv.equals("")) { + if (exp.equals("")) + exp += fieldValue + "<=" + rv; + else + exp += "&&" + fieldValue + "<=" + rv; + } + + Evaluator evaluator = new Evaluator(); + String b = ""; + try { + b = evaluator.evaluate(exp); + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + if (b.equals("1.0")) { + result = inputThree; + break; //遇到一个满足条件的则跳出循环 + } + } + } + return result; + } + + /** + * 判断表达式的运算结果是否数值型的公共方法 + */ + private boolean isNumeric(String str) { + Pattern pattern = Pattern.compile("^(-|\\+)?\\d+(\\.\\d+)?$"); + Matcher isNum = pattern.matcher(str); + if (!isNum.matches()) { + return false; + } + return true; + } + + /** + * 匹配数据库指令中的占位符 + */ + private Map getSqlFieldParam(Field field, Map inputParam, Map parameterMap) { + String sqlStr = field.getSqlStatement(); + // 添加动态参数 + //处理in方法中的遍历 + Pattern sqlInPattern = Pattern.compile("[\\s]*in[\\s]*\\([\\s]*#\\{([a-zA-Z0-9_\u4e00-\u9fa5()()-]+)\\}[\\s]*\\)"); + Matcher sqlInMatcher = sqlInPattern.matcher(sqlStr); + while (sqlInMatcher.find()) { + String replaceOld = sqlInMatcher.group(0); + String sqlField = sqlInMatcher.group(1); + String sqlVariable = field.getSqlVariable(); + String fieldEn = sqlField.split("\\.")[0]; + String convertStr = ""; + Object value = null; + if (StringUtils.isNotBlank(sqlVariable)) { + JSONArray sqlVariableArr = JSONArray.parseArray(sqlVariable); + for (int i = 0; i < sqlVariableArr.size(); i++) { + JSONObject sqlVariableObj = sqlVariableArr.getJSONObject(i); + if (sqlField.equals(sqlVariableObj.getString("key"))) { + value = sqlVariableObj.getJSONArray("value"); + } + } + } + if (value == null) { + if (!inputParam.containsKey(fieldEn)) { + //不存再需要重新获取 + List fieldEns = new ArrayList<>(); + fieldEns.add(fieldEn); + //查询未入参的en是否是指标库中的指标,如果是则u需要继续查找 + List fieldList = fieldService.selectFieldListByEns(fieldEns); + if (fieldList != null && !fieldList.isEmpty()) { + //查询引用到的指标 + getEngineField(fieldList, inputParam); + } + + } +// value = inputParam.get(sqlField); + value = ExecuteUtils.getObjFromMap(inputParam, sqlField); + } + if (StringUtils.isBlank(convertStr) && value != null) { + if (value instanceof String) { + convertStr = value.toString(); + } else if (value instanceof List) { + List collection = (List) value; + int size = collection.size(); + + for (int i = 0; i < size; i++) { + convertStr += ("'" + String.valueOf(collection.get(i)) + "'"); + if (i < size - 1) { + convertStr += ","; + } + } + } + } + sqlStr = sqlStr.replace(replaceOld, " in (" + convertStr + ") "); + } + Pattern pattern = Pattern.compile("#\\{[a-zA-Z0-9_\u4e00-\u9fa5()()-]+\\}"); + Matcher matcher = pattern.matcher(sqlStr); + while (matcher.find()) { + String sqlField = matcher.group(0).replace("#{", "").replace("}", ""); + String fieldEn = sqlField.split("\\.")[0]; + // sql动态参数从页面配置获取 + String sqlVariable = field.getSqlVariable(); + if (StringUtils.isNotBlank(sqlVariable)) { + JSONArray sqlVariableArr = JSONArray.parseArray(sqlVariable); + for (int i = 0; i < sqlVariableArr.size(); i++) { + JSONObject sqlVariableObj = sqlVariableArr.getJSONObject(i); + if (sqlField.equals(sqlVariableObj.getString("key"))) { + parameterMap.put(sqlField, sqlVariableObj.get("value")); + } + } + } + + // sql动态参数从变量池获取 + if (!parameterMap.containsKey(fieldEn)) { + if (!inputParam.containsKey(fieldEn)) { + //不存再需要重新获取 + List fieldEns = new ArrayList<>(); + fieldEns.add(fieldEn); + //查询未入参的en是否是指标库中的指标,如果是则u需要继续查找 + List fieldList = fieldService.selectFieldListByEns(fieldEns); + if (fieldList != null && !fieldList.isEmpty()) { + //查询引用到的指标 + getEngineField(fieldList, inputParam); + } + + } + parameterMap.put(sqlField, ExecuteUtils.getObjFromMap(inputParam, sqlField)); + } + } + Pattern pattern$ = Pattern.compile("\\$\\{[a-zA-Z0-9_\u4e00-\u9fa5()()-]+\\}"); + Matcher matcher$ = pattern$.matcher(sqlStr); + while (matcher$.find()) { + String sqlField = matcher$.group(0).replace("${", "").replace("}", ""); + String fieldEn = sqlField.split("\\.")[0]; + // sql绑定参数从页面配置获取 + String sqlVariable = field.getSqlVariable(); + String dictVariable = field.getDictVariable(); + String replaceStr = ""; + if (StringUtils.isNotBlank(sqlVariable)) { + JSONArray sqlVariableArr = JSONArray.parseArray(sqlVariable); + for (int i = 0; i < sqlVariableArr.size(); i++) { + JSONObject sqlVariableObj = sqlVariableArr.getJSONObject(i); + + if (!sqlField.equals(sqlVariableObj.getString("key"))) { + continue; + } + if (inputParam.containsKey(fieldEn)) { + replaceStr = ExecuteUtils.getObjFromMap(inputParam, sqlField).toString(); + } else if (sqlVariableObj.get("value") != null) { + replaceStr = String.valueOf(sqlVariableObj.get("value")); + } + if (StringUtils.isNotBlank(replaceStr)) { + break; + } + + } + } + if (StringUtils.isNotBlank(dictVariable)) { + JSONArray jsonArray = JSONArray.parseArray(dictVariable); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + if (!sqlField.equals(jsonObject.getString("key"))) { + continue; + } +// if (inputParam.containsKey(fieldEn)) { +// replaceStr = ExecuteUtils.getObjFromMap(inputParam, sqlField).toString(); +// } else +// if (jsonObject.get("value") != null) { +// switch (jsonObject.getString("type")){ +// case "date": +// try { +// replaceStr = DateUtil.format(new Date(),jsonObject.getString("value")); +// }catch (Exception e){ +// e.printStackTrace(); +// replaceStr = DateUtil.format(new Date(),"yyyyMMdd"); +// } +// break; +// default: +// replaceStr = String.valueOf(jsonObject.get("value")); +// } +// } + replaceStr = DictVariableUtils.getValueFromJsonObject(jsonObject).toString(); + if (StringUtils.isNotBlank(replaceStr)) { + break; + } + } + } + if (StringUtils.isNotBlank(replaceStr)) { + //已经取出则直接跳过 + sqlStr = sqlStr.replace("${" + sqlField + "}", replaceStr); + continue; + } + // sql动态参数从变量池获取 + if (!parameterMap.containsKey(fieldEn)) { + if (!inputParam.containsKey(fieldEn)) { + //不存再需要重新获取 + //查询未入参的en是否是指标库中的指标,如果是则u需要继续查找 + List fieldList = fieldService.selectFieldListByEns(Arrays.asList(fieldEn)); + if (fieldList != null && !fieldList.isEmpty()) { + //查询引用到的指标 + getEngineField(fieldList, inputParam); + } + } + replaceStr = ExecuteUtils.getObjFromMap(inputParam, sqlField).toString(); + } + if (StringUtils.isNotBlank(replaceStr)) { + sqlStr = sqlStr.replace("${" + sqlField + "}", replaceStr); + break; + } + } + parameterMap.put("sqlStr", sqlStr); + return parameterMap; + } + + /** + * 调用第三方数据库执行sql获取结果 + */ + private Object handlerSqlFieldResult(Field field, Map parameterMap) { + List> result = simpleMapper.customSelect(parameterMap); + Object resultValue = null; + if (result == null || result.size() == 0) { + resultValue = null; + } else { + //json类型的数据 + if (field.getValueType() == 6) { + String json = field.getJsonValue(); + //示例数据为数组 + if (StringUtils.isNotBlank(json) && json.startsWith("[") && json.endsWith("]")) { + resultValue = result; + } else { + resultValue = result.get(0); + } + } else if (result.size() == 1) {// 基本指标只能是一个值。所以只能取sql查出来的第一个值。否则抛出异常 + LinkedHashMap resultMap = result.get(0); + if (resultMap.size() == 1) { + for (Map.Entry entry : resultMap.entrySet()) { + Object value = entry.getValue(); + + // 防止double表示为科学计数法 + if (value instanceof Double) { + value = BigDecimal.valueOf((Double) value); + } + resultValue = value.toString(); + } + } else { + throw new RuntimeException("sql库指标计算异常,sql字段个数超出预期。查询结果resultMap:" + resultMap.toString()); + } + } else { + throw new RuntimeException("sql库指标计算异常,sql结果个数超出预期。查询结果result:" + result.toString()); + } + } + return resultValue; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DataSourceContextHolder.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DataSourceContextHolder.java new file mode 100644 index 0000000..97df16b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DataSourceContextHolder.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.service.datax.runner.mysql; + +public class DataSourceContextHolder { + private static final ThreadLocal contextHolder = new ThreadLocal(); + + public static synchronized void setDBType(String dbType){ + contextHolder.set(dbType); + } + + public static String getDBType(){ + return contextHolder.get(); + } + + public static void clearDBType(){ + contextHolder.remove(); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DynamicDataSource.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DynamicDataSource.java new file mode 100644 index 0000000..c9d4f3a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/mysql/DynamicDataSource.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.service.datax.runner.mysql; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.HashMap; +import java.util.Map; + +public class DynamicDataSource extends AbstractRoutingDataSource { + private static DynamicDataSource instance; + private static byte[] lock=new byte[0]; + private static Map dataSourceMap=new HashMap(); + + @Override + public void setTargetDataSources(Map targetDataSources) { + super.setTargetDataSources(targetDataSources); + dataSourceMap.putAll(targetDataSources); + super.afterPropertiesSet();// 必须添加该句,否则新添加数据源无法识别到 + } + + public Map getDataSourceMap() { + return dataSourceMap; + } + + public static synchronized DynamicDataSource getInstance(){ + if(instance==null){ + synchronized (lock){ + if(instance==null){ + instance=new DynamicDataSource(); + } + } + } + return instance; + } + //必须实现其方法 + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDBType(); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionFactory.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionFactory.java new file mode 100644 index 0000000..35ba99a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionFactory.java @@ -0,0 +1,60 @@ +package com.fibo.ddp.common.service.datax.runner.redis; + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.datax.datasource.DataSource; +import com.fibo.ddp.common.service.redis.RedisManager; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.pool2.BaseKeyedPooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisShardInfo; + +/** + * kSession工厂类 + */ +@Component +public class RedisKSessionFactory extends BaseKeyedPooledObjectFactory { + + @Autowired + private RedisManager redisManager; + + @Override + public Jedis create(String key) throws Exception { + Jedis jedis = null; + try { +// long start = System.currentTimeMillis(); + String json = redisManager.get(key); + if(json == null){ + throw new Exception("create jedis kSession fail, key is "+ key + ", ruleString is null!"); + } + DataSource dataSource = JSON.parseObject(json, DataSource.class); + String userName = dataSource.getUserName(); + if (StringUtils.isBlank(userName)){ + userName = "root"; + } + JedisShardInfo jedisShardInfo = new JedisShardInfo( dataSource.getHost(),Integer.valueOf(dataSource.getPort()),3000,userName); + jedisShardInfo.setPassword(dataSource.getPassword()); + jedis = new Jedis(jedisShardInfo); + jedis.select(Integer.valueOf(dataSource.getDbName())); + +// long end = System.currentTimeMillis(); +// System.out.println("------------------jedis连接创建耗时:" + (end - start) + " ----------------------"); + } catch (Exception e) { + throw e; + } + + return jedis; + } + + @Override + public PooledObject wrap(Jedis kSession) { + return new DefaultPooledObject(kSession); + } + + public void setRedisManager(RedisManager redisManager) { + this.redisManager = redisManager; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionPool.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionPool.java new file mode 100644 index 0000000..2676d7d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/datax/runner/redis/RedisKSessionPool.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.common.service.datax.runner.redis; + +import org.apache.commons.pool2.impl.GenericKeyedObjectPool; +import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; + +/** + * kSession连接池 + */ +@Component +public class RedisKSessionPool implements InitializingBean { + + private GenericKeyedObjectPool pool; + + @Autowired + private RedisKSessionFactory kSessionFactory; + + /** + * 初始化方法 + * @throws Exception + */ + @Override + public void afterPropertiesSet() throws Exception { + initPool(); + } + + /** + * 初始化连接池 + * @return + * @throws Exception + */ + public void initPool() throws Exception { + GenericKeyedObjectPoolConfig poolConfig = new GenericKeyedObjectPoolConfig(); + poolConfig.setMaxTotalPerKey(200); + poolConfig.setMaxIdlePerKey(50); + poolConfig.setMinIdlePerKey(5); + poolConfig.setMaxTotal(2000); + this.pool = new GenericKeyedObjectPool(kSessionFactory, poolConfig); + } + + /** + * 获取一个连接对象 + * @return + * @throws Exception + */ + public Jedis borrowObject(String key) throws Exception { + return pool.borrowObject(key); + } + + /** + * 归还一个连接对象 + * @param + */ + public void returnObject(String key, Jedis kSession) { + if(kSession != null){ + pool.returnObject(key, kSession); + } + } + + public void setkSessionFactory(RedisKSessionFactory kSessionFactory) { + this.kSessionFactory = kSessionFactory; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineNodeServiceV3.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineNodeServiceV3.java new file mode 100644 index 0000000..0f3f6e6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineNodeServiceV3.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.enginex.dataflow; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; + +import java.util.List; + +/** + * 存储版本模型的信息包括(使用的参数,节点的位置,节点的执行逻辑)(EngineNode)表服务接口 + * @since 2021-12-22 17:32:09 + */ +public interface EngineNodeServiceV3 extends IService{ + + List queryNodeListByVersion(Long versionId); + + boolean saveStartNode(Long versionId); + + boolean updateStatus(List ids, Integer status); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineServiceV3.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineServiceV3.java new file mode 100644 index 0000000..6c64584 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineServiceV3.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.common.service.enginex.dataflow; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * (Engine)表服务接口 + * + * @author jgp + * @since 2021-12-22 13:28:08 + */ +public interface EngineServiceV3 extends IService { + + PageInfo queryList(QueryListParam param); + + boolean updateStatus(List ids, Integer status); + + Engine addEngine(Engine engine); + + Engine updateEngine(Engine engine); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionContentService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionContentService.java new file mode 100644 index 0000000..bc83967 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionContentService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.enginex.dataflow; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; + +import java.util.Collection; +import java.util.List; + +/** + * (EngineVersionContent)表服务接口 + * @since 2021-12-23 10:21:08 + */ +public interface EngineVersionContentService extends IService{ + + EngineVersionContentVo queryById(Long versionId); + List queryByIds(Collection versionIds); + boolean addVersionContent(EngineVersionContentVo versionContent); + boolean updateVersionContent(EngineVersionContentVo versionContent); + boolean deleteVersionContent(EngineVersionContent versionContent); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionServiceV3.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionServiceV3.java new file mode 100644 index 0000000..b2d6828 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/EngineVersionServiceV3.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.service.enginex.dataflow; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.github.pagehelper.PageInfo; + +import java.util.Collection; +import java.util.List; + +/** + * 不同场景下的多个模型版本(EngineVersion)表服务接口 + * + * @since 2021-12-22 14:39:33 + */ +public interface EngineVersionServiceV3 extends IService { + + EngineVersion queryById(Long versionId); + + PageInfo queryList(QueryListParam param); + List queryByEngineIds(Collection engineIds); + List queryByEngineId(Long engineId); + + boolean addEngineVersion(EngineVersion param); + + boolean copyEngineVersion(Long versionId); + + /** + * 假删,修改状态 + */ + boolean updateStatus(List ids, Integer status); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineNodeServiceV3Impl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineNodeServiceV3Impl.java new file mode 100644 index 0000000..20e4783 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineNodeServiceV3Impl.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.service.enginex.dataflow.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.risk.EngineNodeMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.enginex.dataflow.EngineNodeServiceV3; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 存储版本模型的信息包括(使用的参数,节点的位置,节点的执行逻辑)(EngineNode)表服务实现类 + * + * @author jgp + * @since 2021-12-22 17:32:09 + */ +@Service("engineNodeServiceV3") +public class EngineNodeServiceV3Impl extends ServiceImpl implements EngineNodeServiceV3 { + + @Override + public List queryNodeListByVersion(Long versionId) { + + return null; + } + + @Override + @Transactional + public boolean saveStartNode(Long versionId) { + EngineNode node = new EngineNode(); + node.setNodeX(200D); + node.setNodeY(200D); + node.setNodeName("开始"); + node.setNodeOrder(1); + node.setNodeType(NodeTypeEnum.START.getValue()); + node.setNodeCode("ND_START"); + node.setParams("{\"arr_linkId\":\"\",\"dataId\":\"-1\",\"url\":\"/Riskmanage/resource/images/decision/start.png\",\"type\":\"1\"}"); + node.setVersionId(versionId); + // 直接插入节点 + return this.save(node); + } + + @Override + public boolean updateStatus(List ids,Integer statu) { + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineServiceV3Impl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineServiceV3Impl.java new file mode 100644 index 0000000..c62fb58 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineServiceV3Impl.java @@ -0,0 +1,138 @@ +package com.fibo.ddp.common.service.enginex.dataflow.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.risk.EngineMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.dataflow.EngineServiceV3; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionServiceV3; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * (Engine)表服务实现类 + * + * @author jgp + * @since 2021-12-22 13:28:09 + */ +@Service("engineServiceV3") +public class EngineServiceV3Impl extends ServiceImpl implements EngineServiceV3 { + + @Autowired + private EngineVersionServiceV3 engineVersionServiceV3; + + @Override + public PageInfo queryList(QueryListParam param) { + if (QueryListParam.checkIsPage(param)) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + LambdaQueryWrapper wrapper = createWrapper(param.getEntity()); + PageInfo pageInfo = new PageInfo<>(this.list(wrapper)); + if(pageInfo.getSize()!=0){ + List bootEngineIds = engineVersionServiceV3. + queryByEngineIds(pageInfo.getList().stream().map(Engine::getId).collect(Collectors.toList())) + .stream().filter(item -> { + return item.getBootState() == 1; + }).map(EngineVersion::getEngineId).distinct().collect(Collectors.toList()); + for (Engine Engine : pageInfo.getList()) { + if (bootEngineIds.contains(Engine.getId())){ + Engine.setRunStatus(1); + } + } + } + return pageInfo; + } + + @Override + @Transactional + public Engine addEngine(Engine engine) { + initEngine(engine); + boolean saveEngine = this.save(engine); + if (saveEngine) { + //保存成功添加版本 + EngineVersion version = new EngineVersion(); + version.setEngineId(engine.getId()); + version.setVersion(0); + version.setEngineType(engine.getEngineType()); + boolean saveVersion = engineVersionServiceV3.addEngineVersion(version); + if (!saveVersion) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增引擎添加默认版本失败"); + } + return engine; + } + return null; + } + + @Override + public Engine updateEngine(Engine engine) { + if (engine != null && engine.getId() != null){ + boolean result = this.updateById(engine); + return engine; + } + return null; + } + + + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(Engine::getId, ids); + Engine Engine = new Engine(); + Engine.setStatus(status); + Engine.setCreator(SessionManager.getLoginAccount().getUserId()); + return this.update(Engine, wrapper); + } + + + private void initEngine(Engine engine) { + if (engine == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "新增引擎不能为nll"); + } + SysUser sysUser = SessionManager.getLoginAccount(); + engine.setOrganId(sysUser.getOrganId()); + engine.setCreator(sysUser.getUserId()); + engine.setStatus(StatusConst.STATUS_ENABLED); + } + + + private LambdaQueryWrapper createWrapper(Engine entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(Engine::getId); + wrapper.eq(Engine::getOrganId, SessionManager.getLoginAccount().getOrganId()); + if (entity == null) { + wrapper.ne(Engine::getStatus, StatusConst.STATUS_DELETE); + return wrapper; + } + if (StringUtils.isNotBlank(entity.getCode())) { + wrapper.eq(Engine::getCode, entity.getCode()); + } + if (StringUtils.isNotBlank(entity.getEngineType())) { + wrapper.like(Engine::getEngineType, entity.getEngineType()); + } + if (entity.getStatus() != null) { + wrapper.eq(Engine::getStatus, entity.getStatus()); + } else { + wrapper.ne(Engine::getStatus, StatusConst.STATUS_DELETE); + } + if (StringUtils.isNotBlank(entity.getName())) { + wrapper.like(Engine::getName, entity.getName()); + } + return wrapper; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionContentServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionContentServiceImpl.java new file mode 100644 index 0000000..19dac7d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionContentServiceImpl.java @@ -0,0 +1,362 @@ +package com.fibo.ddp.common.service.enginex.dataflow.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.dataflow.EngineVersionContentMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.dataflow.vo.DataFlowEngineContentVo; +import com.fibo.ddp.common.model.enginex.dataflow.vo.DataFlowNodeVo; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; +import com.fibo.ddp.common.model.enginex.marketing.dto.AudienceNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.dto.TargetSettingNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.dto.TouchConfigNodeDto; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingEngineContentVo; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleTypeEnum; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionContentService; +import com.fibo.ddp.common.service.strategyx.baserule.BaseRuleService; +import com.fibo.ddp.common.utils.constant.enginex.EngineContentConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * (EngineVersionContent)表服务实现类 + * + * @author jgp + * @since 2021-12-23 10:21:08 + */ +@Service("engineVersionContentService") +public class EngineVersionContentServiceImpl extends ServiceImpl implements EngineVersionContentService { + + @Resource + private EngineVersionContentMapper engineVersionContentMapper; + @Resource + private BaseRuleService baseRuleService; + + @Override + public EngineVersionContentVo queryById(Long versionId) { + if (versionId == null) { + return null; + } + EngineVersionContent engineVersionContent = this.getById(versionId); + EngineVersionContentVo engineVersionContentVo = queryDetail(engineVersionContent); + return engineVersionContentVo; + } + + @Override + public List queryByIds(Collection versionIds) { + if (CollectionUtils.isEmpty(versionIds)) { + return null; + } + List engineVersionContents = engineVersionContentMapper.selectBatchIds(versionIds); + List engineVersionContentVos = new ArrayList<>(); + for (EngineVersionContent engineVersionContent : engineVersionContents) { + EngineVersionContentVo engineVersionContentVo = queryDetail(engineVersionContent); + engineVersionContentVos.add(engineVersionContentVo); + } + return engineVersionContentVos; + } + + private EngineVersionContentVo queryDetail(EngineVersionContent engineVersionContent) { + EngineVersionContentVo engineVersionContentVo = new EngineVersionContentVo(); + if (engineVersionContent == null) { + return engineVersionContentVo; + } + BeanUtils.copyProperties(engineVersionContent, engineVersionContentVo); + String engineContent = engineVersionContent.getEngineContent(); + String engineType = engineVersionContent.getEngineType(); + switch (engineType) { + case EngineTypeConst + .DATA_FLOW_ENGINE: + if (StringUtils.isNotBlank(engineContent)){ + engineVersionContentVo.setDataFlowEngineContentVo(JSON.parseObject(engineContent,DataFlowEngineContentVo.class)); + }else { + engineVersionContentVo.setDataFlowEngineContentVo(new DataFlowEngineContentVo()); + } + DataFlowEngineContentVo dataFlowEngineContentVo = engineVersionContentVo.getDataFlowEngineContentVo(); + if (dataFlowEngineContentVo == null) { + break; + } + List nodeList = dataFlowEngineContentVo.getNodeList(); + if (CollectionUtils.isEmpty(nodeList)) { + break; + } + for (DataFlowNodeVo dataFlowNodeVo : nodeList) { + Long baseRuleId = dataFlowNodeVo.getBaseRuleId(); + if (baseRuleId != null) { + BaseRule baseRule = baseRuleService.queryById(baseRuleId); + dataFlowNodeVo.setBaseRule(baseRule); + } + } + break; + case EngineTypeConst.MARKETING_ENGINE: + assemblyMarketingEngineContent(engineContent, engineVersionContentVo); + break; + } + return engineVersionContentVo; + } + + /** + * 组装营销引擎content + * @param engineContent 引擎内容 + * @param engineVersionContentVo 组装后返回对象 + */ + private void assemblyMarketingEngineContent(String engineContent, EngineVersionContentVo engineVersionContentVo) { + if (StringUtils.isNotBlank(engineContent)) { + MarketingEngineContentVo marketingEngineContentVo = JSONObject.parseObject(engineContent, MarketingEngineContentVo.class); + // 受众用户节点 + AudienceNodeDto audienceNodeDto = marketingEngineContentVo.getAudienceNodeDto(); + BaseRule baseRule = baseRuleService.queryById(audienceNodeDto.getBaseRuleId()); + audienceNodeDto.setBaseRule(baseRule); + // 触达配置节点 + List touchConfigNodeDtoList = marketingEngineContentVo.getTouchConfigNodeDtoList(); + for (TouchConfigNodeDto touchConfigNodeDto : touchConfigNodeDtoList) { + BaseRule userSelectRule = baseRuleService.queryById(touchConfigNodeDto.getUserSelectRuleId()); + touchConfigNodeDto.setUserSelectRule(userSelectRule); + } + // 目标设置节点 + TargetSettingNodeDto targetSettingNodeDto = marketingEngineContentVo.getTargetSettingNodeDto(); + BaseRule primaryRule = baseRuleService.queryById(targetSettingNodeDto.getPrimaryRuleId()); + targetSettingNodeDto.setPrimaryRule(primaryRule); + BaseRule secondaryRule = baseRuleService.queryById(targetSettingNodeDto.getSecondaryRuleId()); + targetSettingNodeDto.setSecondaryRule(secondaryRule); + + engineVersionContentVo.setMarketingEngineContentVo(marketingEngineContentVo); + } + } + + @Override + @Transactional + public boolean addVersionContent(EngineVersionContentVo versionContent) { + boolean save = false; + if (checkContent(versionContent)) { + versionContent.setCreateUserId(SessionManager.getLoginAccount().getUserId()); + save = this.save(versionContent); + } + return save; + } + + @Override + @Transactional + public boolean updateVersionContent(EngineVersionContentVo versionContent) { + boolean update = false; + if (checkContent(versionContent)) { + versionContent.setUpdateUserId(SessionManager.getLoginAccount().getUserId()); + //修改时处理基础信息 + updateBaseInfo(versionContent); + update = engineVersionContentMapper.updateById(versionContent) > 0; + } + return update; + } + + @Override + public boolean deleteVersionContent(EngineVersionContent versionContent) { + if (null != versionContent && null != versionContent.getEngineVersionId()) { + return this.removeById(versionContent.getEngineVersionId()); + } + return false; + } + + @Transactional + public boolean checkContent(EngineVersionContentVo versionContent) { + if (versionContent == null || versionContent.getEngineVersionId() == null || StringUtils.isBlank(versionContent.getEngineType())) { + return false; + } + if (StringUtils.isBlank(versionContent.getEngineContent())) { + DataFlowEngineContentVo engineContentVo = new DataFlowEngineContentVo(); + versionContent.setEngineContent(JSON.toJSONString(engineContentVo)); + } + versionContent.setUpdateUserId(SessionManager.getLoginAccount().getUserId()); + return true; + } + + @Transactional + public void updateBaseInfo(EngineVersionContentVo versionContent) { + String engineType = versionContent.getEngineType(); + SysUser loginAccount = SessionManager.getLoginAccount(); + switch (engineType) { + case EngineTypeConst + .DATA_FLOW_ENGINE: + DataFlowEngineContentVo engineContentVo = versionContent.getDataFlowEngineContentVo(); + EngineVersionContentVo old = this.queryById(versionContent.getEngineVersionId()); + DataFlowEngineContentVo dataFlowEngineContentVo = old.getDataFlowEngineContentVo(); + if (dataFlowEngineContentVo != null) { + List nodeList = dataFlowEngineContentVo.getNodeList(); + if (CollectionUtils.isNotEmpty(nodeList)) { + List baseRuleIds = new ArrayList<>(); + for (DataFlowNodeVo dataFlowNodeVo : nodeList) { + baseRuleIds.add(dataFlowNodeVo.getBaseRuleId()); + } + baseRuleService.deleteBaseRuleByIds(baseRuleIds); + } + } + if (engineContentVo != null) { + List nodeList = engineContentVo.getNodeList(); + if (CollectionUtils.isNotEmpty(nodeList)) { + for (DataFlowNodeVo node : nodeList) { + BaseRule baseRule = node.getBaseRule(); + if (baseRule != null) { + baseRule.setRuleType(BaseRuleTypeEnum.DATA_FLOW_ENGINE.getType()); + baseRule.setCreateUserId(loginAccount.getUserId()); + baseRule.setOrganId(loginAccount.getOrganId()); + boolean b = baseRuleService.insertBaseRule(baseRule); + if (b) { + node.setBaseRuleId(baseRule.getId()); + } else { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "数据流引擎节点条件块保存失败"); + } + } + } + } + versionContent.setEngineContent(JSON.toJSONString(engineContentVo)); + } + break; + case EngineTypeConst.MARKETING_ENGINE: + handleMarketingEngineContent(versionContent); + versionContent.setEngineContent(JSON.toJSONString(versionContent.getMarketingEngineContentVo())); + break; + } + } + + /** + * 处理营销引擎内容修改 + * @param versionContent + */ + private void handleMarketingEngineContent(EngineVersionContentVo versionContent) { + // 先删除原条件 + EngineVersionContentVo old = this.queryById(versionContent.getEngineVersionId()); + if (old != null) { + MarketingEngineContentVo dbContentVo = old.getMarketingEngineContentVo(); + List baseRuleIds = new ArrayList<>(); + // 受众用户节点 + baseRuleIds.add(dbContentVo.getAudienceNodeDto().getBaseRuleId()); + // 触达配置节点 + for (TouchConfigNodeDto touchConfigNodeDto : dbContentVo.getTouchConfigNodeDtoList()) { + baseRuleIds.add(touchConfigNodeDto.getUserSelectRuleId()); + } + // 目标设置节点 + baseRuleIds.add(dbContentVo.getTargetSettingNodeDto().getPrimaryRuleId()); + baseRuleIds.add(dbContentVo.getTargetSettingNodeDto().getSecondaryRuleId()); + baseRuleService.deleteBaseRuleByIds(baseRuleIds); + } + + // 重新保存新条件 + MarketingEngineContentVo marketingEngineContentVo = versionContent.getMarketingEngineContentVo(); + // 受众用户节点 + AudienceNodeDto audienceNodeDto = marketingEngineContentVo.getAudienceNodeDto(); + BaseRule baseRule = audienceNodeDto.getBaseRule(); + audienceNodeDto.setBaseRuleId(saveMarketingEngineBaseRule(baseRule)); + audienceNodeDto.setBaseRule(null); + // 触达配置节点 + List touchConfigNodeDtoList = marketingEngineContentVo.getTouchConfigNodeDtoList(); + for (TouchConfigNodeDto touchConfigNodeDto : touchConfigNodeDtoList) { + BaseRule userSelectRule = touchConfigNodeDto.getUserSelectRule(); + touchConfigNodeDto.setUserSelectRuleId(saveMarketingEngineBaseRule(userSelectRule)); + touchConfigNodeDto.setUserSelectRule(null); + } + // 目标设置节点 + TargetSettingNodeDto targetSettingNodeDto = marketingEngineContentVo.getTargetSettingNodeDto(); + BaseRule primaryRule = targetSettingNodeDto.getPrimaryRule(); + targetSettingNodeDto.setPrimaryRuleId(saveMarketingEngineBaseRule(primaryRule)); + targetSettingNodeDto.setPrimaryRule(null); + BaseRule secondaryRule = targetSettingNodeDto.getSecondaryRule(); + targetSettingNodeDto.setSecondaryRuleId(saveMarketingEngineBaseRule(secondaryRule)); + targetSettingNodeDto.setSecondaryRule(null); + } + + /** + * 保存营销引擎条件 + * @param baseRule + * @return + */ + private Long saveMarketingEngineBaseRule(BaseRule baseRule){ + if (baseRule != null) { + SysUser loginAccount = SessionManager.getLoginAccount(); + baseRule.setRuleType(BaseRuleTypeEnum.MARKETING_ENGINE.getType()); + baseRule.setOrganId(loginAccount.getOrganId()); + baseRule.setCreateUserId(loginAccount.getUserId()); + boolean result = baseRuleService.insertBaseRule(baseRule); + if (!result) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "营销引擎节点条件块保存失败"); + } + } + return baseRule.getId(); + } + + private void handlerEngineScript(EngineVersionContentVo versionContent) { + if (versionContent != null && StringUtils.isNotBlank(versionContent.getEngineContent())) { + //拼装执行条件 + JSONObject engineJson = JSON.parseObject(versionContent.getEngineContent()); + JSONArray nodeList = engineJson.getJSONArray(EngineContentConst.NODE_LIST_KEY); + for (int i = 0; i < nodeList.size(); i++) { + JSONObject node = nodeList.getJSONObject(i); + String nodeType = node.getString(EngineContentConst.DataFlowEngine.NODE_TYPE); + switch (nodeType) { + case EngineContentConst + .DataFlowEngine + .NodeType.BEGIN: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.WHERE: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.OR: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.WITHIN: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.NEXT: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.FOLLOWED_BY: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.ONE_OR_MORE: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.TIMES: + + break; + case EngineContentConst + .DataFlowEngine + .NodeType.TIMES_OR_MORE: + + break; + default: + break; + } + } + } + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionServiceV3Impl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionServiceV3Impl.java new file mode 100644 index 0000000..2c628cc --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/dataflow/impl/EngineVersionServiceV3Impl.java @@ -0,0 +1,303 @@ +package com.fibo.ddp.common.service.enginex.dataflow.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.risk.EngineVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.dataflow.EngineNodeServiceV3; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionContentService; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionServiceV3; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 不同场景下的多个模型版本(EngineVersion)表服务实现类 + * + * @author jgp + * @since 2021-12-22 14:39:33 + */ +@Service("engineVersionServiceV3") +public class EngineVersionServiceV3Impl extends ServiceImpl implements EngineVersionServiceV3 { + + @Autowired + private EngineNodeServiceV3 engineNodeServiceV3; + @Autowired + private EngineVersionContentService engineVersionContentService; + + /** + * 根据主表获取完整信息:包含子表内容 + * + * @param versionId + * @return + */ + @Override + public EngineVersion queryById(Long versionId) { + if (versionId == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "参数异常:版本id为空"); + } + EngineVersion result = this.getById(versionId); + if (result != null) { + this.queryDetailInfoSetToParam(result); + } + return result; + } + + /** + * 查询列表根据入参决定是否分页 + * + * @param param + * @return + */ + @Override + public PageInfo queryList(QueryListParam param) { + if (QueryListParam.checkIsPage(param)) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + LambdaQueryWrapper wrapper = this.createWrapper(param.getEntity()); + PageInfo pageInfo = new PageInfo<>(this.list(wrapper)); + return pageInfo; + } + + @Override + public List queryByEngineIds(Collection engineIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(EngineVersion::getEngineId,engineIds); + wrapper.ne(EngineVersion::getStatus, StatusConst.STATUS_DELETE); + return this.list(wrapper); + } + + @Override + public List queryByEngineId(Long engineId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(EngineVersion::getEngineId,engineId); + wrapper.ne(EngineVersion::getStatus,StatusConst.STATUS_DELETE); + return this.list(wrapper); + } + + /** + * 修改状态,用于假删 + * + * @param ids + * @param status + * @return + */ + @Override + public boolean updateStatus(List ids, Integer status) { + return true; + } + + /** + * 添加一个引擎的版本 + * + * @return + */ + @Override + @Transactional + public synchronized boolean addEngineVersion(EngineVersion param) { + if (param == null + || param.getEngineId() == null + || StringUtils.isBlank(param.getEngineType())) { + return false; + } + EngineVersion engineVersion = this.getLatestEngineSubVersion(param); + + Integer subVersion = engineVersion == null || engineVersion.getSubVersion() == null ? 0 : engineVersion.getSubVersion() + 1; // 子版本 +1 + //无论引擎是否正在运行,皆在此版本下创建子版本 + param.setBootState(0); + param.setCreateTime(new Date().toString()); + param.setSubVersion(subVersion); + this.initEngine(param); + boolean saveVersionResult = this.save(param); + boolean result = false; + if (saveVersionResult) { + result =this.addDetailInfo(param); + } + return result; + } + + /** + * 赋值一个引擎版本 + * + * @param versionId + * @return + */ + @Override + public boolean copyEngineVersion(Long versionId) { + + return false; + } + + /** + * 新增修改初始化 + * + * @param EngineVersion + */ + private void initEngine(EngineVersion EngineVersion) { + if (EngineVersion == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "引擎版本不能为nll"); + } + SysUser loginAccount = SessionManager.getLoginAccount(); + EngineVersion.setLatestTime(new Date().toString()); + EngineVersion.setLayout(0); + EngineVersion.setLatestUser(loginAccount.getUserId()); + EngineVersion.setUserId(loginAccount.getUserId()); + EngineVersion.setStatus(StatusConst.STATUS_ENABLED); + } + + /** + * 创建查询wrapper + * + * @param entity + * @return + */ + private LambdaQueryWrapper createWrapper(EngineVersion entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(EngineVersion::getVersionId); + if (entity == null || entity.getEngineId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "查询引擎版本需要引擎id"); + } + if (entity.getStatus() != null) { + wrapper.eq(EngineVersion::getStatus, entity.getStatus()); + } else { + wrapper.ne(EngineVersion::getStatus, StatusConst.STATUS_DELETE); + } + return wrapper; + } + + /** + * 获取最后一个子版本用于新版本自增 + * + * @param entity + * @return + */ + private EngineVersion getLatestEngineSubVersion(EngineVersion entity) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(EngineVersion::getEngineId, entity.getEngineId()); + wrapper.eq(EngineVersion::getVersion, entity.getVersion()); + wrapper.orderByDesc(EngineVersion::getSubVersion); + return this.getOne(wrapper, false); + } + + /** + * 根据参数查出子级内容并且装配 + * @param param + * @return + */ + private boolean queryDetailInfoSetToParam(EngineVersion param) { + boolean result = false; + if (param == null || StringUtils.isBlank(param.getEngineType())) { + return result; + } + result = true; + switch (param.getEngineType()){ + case EngineTypeConst + .RULE_ENGINE: + param.setEngineNodeList(engineNodeServiceV3.queryNodeListByVersion(param.getVersionId())); + break; + case EngineTypeConst + .RISK_CONTROL_ENGINE: + break; + case EngineTypeConst + .DATA_FLOW_ENGINE: + param.setEngineVersionContent(engineVersionContentService.queryById(param.getVersionId())); + break; + case EngineTypeConst + .PERSONAS_ENGINE: + break; + case EngineTypeConst + .MARKETING_ENGINE: + break; + case EngineTypeConst + .WARNING_ENGINE: + break; + case EngineTypeConst + .SCORING_ENGINE: + break; + case EngineTypeConst + .LOGIC_ENGINE: + break; + case EngineTypeConst + .QUESTIONNAIRE_ENGINE: + break; + case EngineTypeConst + .PAGE_ENGINE: + break; + case EngineTypeConst + .MATCHING_ENGINE: + break; + default: + result = false; + } + return result; + } + + /** + * 添加子级详情表的内容 + * @param param + * @return + */ + private boolean addDetailInfo(EngineVersion param) { + boolean result = false; + if (param == null || StringUtils.isBlank(param.getEngineType())) { + return result; + } + SysUser loginAccount = SessionManager.getLoginAccount(); + EngineVersionContentVo engineVersionContent; + switch (param.getEngineType()){ + case EngineTypeConst + .RULE_ENGINE: + result = engineNodeServiceV3.saveStartNode(param.getVersionId()); + break; + case EngineTypeConst + .RISK_CONTROL_ENGINE: + break; + case EngineTypeConst + .DATA_FLOW_ENGINE: + case EngineTypeConst + .PERSONAS_ENGINE: + case EngineTypeConst + .MARKETING_ENGINE: + engineVersionContent = new EngineVersionContentVo(); + engineVersionContent.setEngineVersionId(param.getVersionId()); + engineVersionContent.setEngineType(param.getEngineType()); + engineVersionContent.setCreateUserId(loginAccount.getUserId()); + result = engineVersionContentService.addVersionContent(engineVersionContent); + break; + case EngineTypeConst + .WARNING_ENGINE: + break; + case EngineTypeConst + .SCORING_ENGINE: + break; + case EngineTypeConst + .LOGIC_ENGINE: + break; + case EngineTypeConst + .QUESTIONNAIRE_ENGINE: + break; + case EngineTypeConst + .PAGE_ENGINE: + break; + case EngineTypeConst + .MATCHING_ENGINE: + break; + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeDateResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeDateResultService.java new file mode 100644 index 0000000..d09bb8d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeDateResultService.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.enginex.marketing; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeDateResult; + +import java.util.Date; +import java.util.List; + +/** + * 营销引擎节点当天结果表(MarketingEngineNodeDateResult)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +public interface MarketingEngineNodeDateResultService extends IService { + + List getNodeDateResultByDate(Integer engineVersionId, Date startDate, Date endDate); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeResultService.java new file mode 100644 index 0000000..d55707a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineNodeResultService.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.service.enginex.marketing; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeResult; + +import java.util.List; + +/** + * 营销引擎节点结果表(MarketingEngineNodeResult)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +public interface MarketingEngineNodeResultService extends IService { + + List getNodeResultByVersionId(Integer engineVersionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineResultService.java new file mode 100644 index 0000000..7cba3f2 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/MarketingEngineResultService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.enginex.marketing; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineResult; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingDataResultReqVo; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingDataResultRspVo; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingListResultReqVo; +import com.github.pagehelper.PageInfo; + +/** + * 营销引擎结果表(MarketingEngineResult)表服务接口 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +public interface MarketingEngineResultService extends IService { + + PageInfo getListByPage(MarketingListResultReqVo param); + + MarketingDataResultRspVo getEngineDataByDate(MarketingDataResultReqVo param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeDateResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeDateResultServiceImpl.java new file mode 100644 index 0000000..37364ba --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeDateResultServiceImpl.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.service.enginex.marketing.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.marketing.MarketingEngineNodeDateResultMapper; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeDateResult; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineNodeDateResultService; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 营销引擎节点当天结果表(MarketingEngineNodeDateResult)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Service +public class MarketingEngineNodeDateResultServiceImpl extends ServiceImpl implements MarketingEngineNodeDateResultService { + + @Override + public List getNodeDateResultByDate(Integer engineVersionId, Date startDate, Date endDate) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MarketingEngineNodeDateResult::getEngineVersionId, engineVersionId); + if (startDate != null && endDate != null) { + queryWrapper.between(MarketingEngineNodeDateResult::getCurrentDate, startDate, endDate); + } + List list = this.list(queryWrapper); + return list; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeResultServiceImpl.java new file mode 100644 index 0000000..4b05652 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineNodeResultServiceImpl.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.service.enginex.marketing.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.marketing.MarketingEngineNodeResultMapper; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeResult; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineNodeResultService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 营销引擎节点结果表(MarketingEngineNodeResult)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Service +public class MarketingEngineNodeResultServiceImpl extends ServiceImpl implements MarketingEngineNodeResultService { + + @Override + public List getNodeResultByVersionId(Integer engineVersionId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MarketingEngineNodeResult::getEngineVersionId, engineVersionId); + List list = this.list(queryWrapper); + return list; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineResultServiceImpl.java new file mode 100644 index 0000000..4e72b26 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/marketing/impl/MarketingEngineResultServiceImpl.java @@ -0,0 +1,159 @@ +package com.fibo.ddp.common.service.enginex.marketing.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.enginex.marketing.MarketingEngineResultMapper; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeDateResult; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineNodeResult; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineResult; +import com.fibo.ddp.common.model.enginex.marketing.vo.*; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineNodeDateResultService; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineNodeResultService; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineResultService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 营销引擎结果表(MarketingEngineResult)表服务实现类 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@Service +public class MarketingEngineResultServiceImpl extends ServiceImpl implements MarketingEngineResultService { + + @Autowired + private MarketingEngineNodeDateResultService nodeDateResultService; + @Autowired + private MarketingEngineNodeResultService nodeResultService; + + @Override + public PageInfo getListByPage(MarketingListResultReqVo param) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MarketingEngineResult::getOrganId, organId); + String searchKey = param.getSearchKey(); + if (StringUtils.isNotBlank(searchKey)) { + queryWrapper.and(i -> i.like(MarketingEngineResult::getEngineId, searchKey).or() + .like(MarketingEngineResult::getEngineName, searchKey)); + } + List list = this.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(list); + return pageInfo; + } + + @Override + public MarketingDataResultRspVo getEngineDataByDate(MarketingDataResultReqVo param) { + MarketingDataResultRspVo marketingDataResultRspVo = null; + Integer engineVersionId = param.getEngineVersionId(); + Date startDate = param.getStartDate(); + Date endDate = param.getEndDate(); + if (startDate != null && endDate != null) { + // 根据时间维度查询引擎统计数据 + marketingDataResultRspVo = getEngineResultByDate(engineVersionId, startDate, endDate); + } else { + // 从表中查询引擎统计好的数据 + marketingDataResultRspVo = getEngineResultByVersionId(engineVersionId); + } + return marketingDataResultRspVo; + } + + /** + * 从表中查询引擎统计好的数据 + * + * @param engineVersionId + * @return + */ + public MarketingDataResultRspVo getEngineResultByVersionId(Integer engineVersionId) { + MarketingDataResultRspVo dataResultRspVo = new MarketingDataResultRspVo(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MarketingEngineResult::getEngineVersionId, engineVersionId); + List list = this.list(queryWrapper); + if (list != null && !list.isEmpty()) { + MarketingEngineResult engineResult = list.get(0); + dataResultRspVo = JSONObject.parseObject(JSONObject.toJSONString(engineResult), MarketingDataResultRspVo.class); + List nodeResultList = nodeResultService.getNodeResultByVersionId(engineVersionId); + List nodeDateResultList = nodeDateResultService.getNodeDateResultByDate(engineVersionId, null, null); + Map> nodeDateResultMap = nodeDateResultList.stream().collect(Collectors.groupingBy(item -> item.getNodeId())); + List nodeResultRspVoList = new ArrayList<>(); + // 组装引擎节点中按天的统计信息 + for (MarketingEngineNodeResult nodeResult : nodeResultList) { + MarketingNodeResultRspVo nodeResultRspVo = JSONObject.parseObject(JSONObject.toJSONString(nodeResult), MarketingNodeResultRspVo.class); + Integer nodeId = nodeResult.getNodeId(); + if (nodeDateResultMap != null && nodeDateResultMap.containsKey(nodeId)) { + List engineNodeDateResults = nodeDateResultMap.get(nodeId); + List nodeDateResultRspVoList = JSONObject.parseArray(JSONObject.toJSONString(engineNodeDateResults), MarketingNodeDateResultRspVo.class); + nodeResultRspVo.setNodeDateResultRspVoList(nodeDateResultRspVoList); + } + nodeResultRspVoList.add(nodeResultRspVo); + } + dataResultRspVo.setNodeResultRspVoList(nodeResultRspVoList); + } + return dataResultRspVo; + } + + /** + * 根据时间维度查询引擎统计数据 + * + * @param engineVersionId + * @param startDate + * @param endDate + * @return + */ + public MarketingDataResultRspVo getEngineResultByDate(Integer engineVersionId, Date startDate, Date endDate) { + MarketingDataResultRspVo dataResultRspVo = new MarketingDataResultRspVo(); + List nodeDateResultList = nodeDateResultService.getNodeDateResultByDate(engineVersionId, startDate, endDate); + if (nodeDateResultList != null && nodeDateResultList.isEmpty()) { + List nodeResultRspVoList = new ArrayList<>(); + int engineEnterNum = 0; + int engineTouchNum = 0; + int engineCompleteNum = 0; + Map> nodeDateResultMap = nodeDateResultList.stream().collect(Collectors.groupingBy(item -> item.getNodeId())); + for (Integer nodeId : nodeDateResultMap.keySet()) { + MarketingNodeResultRspVo nodeResultRspVo = new MarketingNodeResultRspVo(); + List engineNodeDateResults = nodeDateResultMap.get(nodeId); + int enterNum = 0; + int touchNum = 0; + int completeNum = 0; + for (MarketingEngineNodeDateResult nodeDateResult : engineNodeDateResults) { + enterNum += nodeDateResult.getEnterNum(); + touchNum += nodeDateResult.getTouchNum(); + completeNum += nodeDateResult.getCompleteNum(); + } + float completeRate = completeNum / enterNum; + nodeResultRspVo.setNodeId(nodeId); + nodeResultRspVo.setEnterNum(enterNum); + nodeResultRspVo.setTouchNum(touchNum); + nodeResultRspVo.setCompleteNum(completeNum); + nodeResultRspVo.setCompleteRate(completeRate); + List nodeDateResultRspVoList = JSONObject.parseArray(JSONObject.toJSONString(engineNodeDateResults), MarketingNodeDateResultRspVo.class); + nodeResultRspVo.setNodeDateResultRspVoList(nodeDateResultRspVoList); + nodeResultRspVoList.add(nodeResultRspVo); + + engineEnterNum += enterNum; + engineTouchNum += touchNum; + engineCompleteNum += completeNum; + } + float engineCompleteRate = engineCompleteNum / engineEnterNum; + dataResultRspVo.setEngineVersionId(engineVersionId); + dataResultRspVo.setEnterNum(engineEnterNum); + dataResultRspVo.setTouchNum(engineTouchNum); + dataResultRspVo.setCompleteNum(engineCompleteNum); + dataResultRspVo.setCompleteRate(engineCompleteRate); + dataResultRspVo.setNodeResultRspVoList(nodeResultRspVoList); + } + return dataResultRspVo; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultDetailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultDetailService.java new file mode 100644 index 0000000..913de42 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultDetailService.java @@ -0,0 +1,34 @@ +package com.fibo.ddp.common.service.enginex.personas; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResultDetail; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReport; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReportParam; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + + +/** + * (PersonasEngineResultDetail)表服务接口 + * @since 2022-01-06 14:24:57 + */ +public interface PersonasEngineResultDetailService extends IService{ + + /** + * 通过ID查询单条数据 + * @param id 主键 + * @return 实例对象 + */ + PersonasEngineResultDetail queryById(Long id); + + /** + * 分页查询多条数据 + */ + PageInfo queryByEntity(QueryListParam param) ; + + + Map queryReportList(QueryListParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultService.java new file mode 100644 index 0000000..dc77a61 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/PersonasEngineResultService.java @@ -0,0 +1,22 @@ +package com.fibo.ddp.common.service.enginex.personas; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResult; +import com.github.pagehelper.PageInfo; + + +/** + * (PersonasEngineResult)表服务接口 + * @since 2022-01-06 14:23:10 + */ +public interface PersonasEngineResultService extends IService{ + + PersonasEngineResult queryById(Long id); + /** + * 分页查询多条数据 + */ + PageInfo queryByEntity(QueryListParam param); + + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultDetailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultDetailServiceImpl.java new file mode 100644 index 0000000..e4970ca --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultDetailServiceImpl.java @@ -0,0 +1,101 @@ +package com.fibo.ddp.common.service.enginex.personas.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.dao.enginex.personas.PersonasEngineResultDetailMapper; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResultDetail; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReport; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReportParam; +import com.fibo.ddp.common.service.enginex.personas.PersonasEngineResultDetailService; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * (PersonasEngineResultDetail)表服务实现类 + * + * @author jgp + * @since 2022-01-06 14:24:57 + */ +@Service("personasEngineResultDetailService") +public class PersonasEngineResultDetailServiceImpl extends ServiceImpl implements PersonasEngineResultDetailService { + @Resource + private PersonasEngineResultDetailMapper personasEngineResultDetailMapper; + + @Override + public PersonasEngineResultDetail queryById(Long id) { + if (id == null) { + return null; + } + PersonasEngineResultDetail result = this.getById(id); + return result; + } + + @Override + public PageInfo queryByEntity(QueryListParam param) { + if (QueryListParam.checkIsPage(param)) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + LambdaQueryWrapper wrapper = createWrapper(param.getEntity()); + PageInfo resultPageInfo = new PageInfo<>(this.list(wrapper)); + return resultPageInfo; + } + + @Override + public Map queryReportList(QueryListParam param) { + List list = personasEngineResultDetailMapper.selectReportList(param.getEntity()); + Map> collect = list.stream().collect(Collectors.groupingBy(item -> { + return item.getTagId()+","+item.getTagVersionId()+","+item.getTagName(); + })); + Map result = new HashMap(); + List reportList = new ArrayList<>(); + for (Map.Entry> entry : collect.entrySet()) { + Map map = new HashMap(); + String[] split = entry.getKey().split(","); + map.put("tagId",split[0]); + map.put("yagVersionId",split[1]); + map.put("tagName",split[2]); + map.put("list",entry.getValue()); + reportList.add(map); + } + result.put("reportList",reportList); + return result; + } + + private LambdaQueryWrapper createWrapper(PersonasEngineResultDetail query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query != null) { + if (query.getEngineId() != null) { + wrapper.eq(PersonasEngineResultDetail::getEngineId, query.getEngineId()); + } + if (query.getEngineVersionId() != null) { + wrapper.eq(PersonasEngineResultDetail::getEngineVersionId, query.getEngineVersionId()); + } + if (query.getBatchNo() != null) { + wrapper.eq(PersonasEngineResultDetail::getBatchNo, query.getBatchNo()); + } + if (query.getTagId() != null) { + wrapper.eq(PersonasEngineResultDetail::getTagId,query.getTagId()); + } + if (StringUtils.isNotBlank(query.getTagValue())){ + wrapper.eq(PersonasEngineResultDetail::getTagValue,query.getTagValue()); + } + if (query.getQueryStartTime() != null) { + wrapper.ge(PersonasEngineResultDetail::getCreateTime, query.getQueryStartTime()); + } + if (query.getQueryEndTime() != null) { + wrapper.le(PersonasEngineResultDetail::getCreateTime, query.getQueryEndTime()); + } + } + return wrapper; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultServiceImpl.java new file mode 100644 index 0000000..5360650 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/personas/impl/PersonasEngineResultServiceImpl.java @@ -0,0 +1,69 @@ +package com.fibo.ddp.common.service.enginex.personas.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.dao.enginex.personas.PersonasEngineResultMapper; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResult; +import com.fibo.ddp.common.service.enginex.personas.PersonasEngineResultService; +import com.github.pagehelper.PageHelper; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (PersonasEngineResult)表服务实现类 + * + * @author jgp + * @since 2022-01-06 14:23:10 + */ +@Service("personasEngineResultService") +public class PersonasEngineResultServiceImpl extends ServiceImpl implements PersonasEngineResultService { + @Resource + private PersonasEngineResultMapper personasEngineResultMapper; + + + @Override + public PersonasEngineResult queryById(Long id) { + if (id == null) { + return null; + } + PersonasEngineResult result = this.getById(id); + return result; + } + + @Override + public PageInfo queryByEntity(QueryListParam param) { + if (QueryListParam.checkIsPage(param)) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + } + LambdaQueryWrapper wrapper = createWrapper(param.getEntity()); + PageInfo resultPageInfo = new PageInfo<>(this.list(wrapper)); + return resultPageInfo; + } + + private LambdaQueryWrapper createWrapper(PersonasEngineResult query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query != null) { + if (query.getEngineId() != null) { + wrapper.eq(PersonasEngineResult::getEngineId,query.getEngineId()); + } + if (query.getEngineVersionId() != null) { + wrapper.eq(PersonasEngineResult::getEngineVersionId,query.getEngineVersionId()); + } + if (query.getBatchNo() != null) { + wrapper.eq(PersonasEngineResult::getBatchNo, query.getBatchNo()); + } + if (query.getQueryStartTime() != null) { + wrapper.ge(PersonasEngineResult::getCreateTime, query.getQueryStartTime()); + } + if (query.getQueryEndTime() != null) { + wrapper.le(PersonasEngineResult::getCreateTime, query.getQueryEndTime()); + } + } + return wrapper; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineNodeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineNodeService.java new file mode 100644 index 0000000..5492808 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineNodeService.java @@ -0,0 +1,102 @@ +package com.fibo.ddp.common.service.enginex.risk; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.response.param.NodeTypeResponse; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName:EngineNodeServiceV3
+ * Description: 引擎节点接口.
+ */ +public interface EngineNodeService { + + /** + * getEngineNodeListByEngineVersionId:(根据版本id获取版本下的所有节点) + * + * @param engineVersionId 引擎版本id + * @return 节点集合 + * */ + List getEngineNodeListByEngineVersionId(Long engineVersionId); + + /** + * findById:(根据节点Id查找节点) + * + * @param engineNode 节点信息 + * @return + * */ + public EngineNode findById(Long id); + + /** + * updateNode:(修改节点) + * + * @param engineNode 节点信息 + * @return + * */ + public boolean updateNode(EngineNode engineNode, Long targetId); + + /** + * 新增引擎节点 + * @param eNode + * @return + */ + public boolean saveEngineNode(EngineNode eNode); + + // V2 + public EngineNode saveEngineNodeV2(EngineNode eNode); + + /** + * 修改节点参数nextOrder,Params + * @param nodeId + * @return + */ + public boolean updateNodeForNextOrderAndParams(List eList); + + /** + * 获取版下节点的最大顺序号 + * @param engineId + * @return + */ + int getMaxNodeOrder(Long versionId); + + /** + * updateNodeForMove:(节点移动时,修改节点坐标) + * + * @param engineNode 节点信息 + * @return + * */ + public boolean updateNodeForMove(EngineNode engineNode); + + public int renameNode(Map param); + + public void removeNode(Long engineNodeId, String preEngineNodeId); + + public void removeLink(Long engineNodeId, Long preEngineNodeId); + + public List getEngineTypedNodeListByEngineVersionId(Long versionId, List types); + + int updateParentIdByNodeId(Long nodeId, String parentId); + + /** + * 获取当前节点前面所有节点的输出信息 + * @param nodeId + * @return + */ + List getPreviousNodeOutput(Long nodeId); + + /** + * 更新节点快照信息 + * @param paramMap + */ + void updateNodeSnapshot(HashMap paramMap); + + // runner + /** + * 根据版本id获取版本下的所有节点 + * @param versionId + * @return + */ + List getEngineNodeListByVersionId(Long versionId); +} \ No newline at end of file diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineService.java new file mode 100644 index 0000000..4d96b8b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineService.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.service.enginex.risk; + +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.enginex.risk.IndexEngineReportVo; +import com.fibo.ddp.common.model.enginex.risk.response.TestResponse; +import org.apache.ibatis.annotations.Param; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +public interface EngineService { + + List getEngineByList(Engine engineVo); + + Engine getEngineById(Engine engineVo) ; + + int updateEngine(Engine engineVo); + + boolean saveEngine(Engine engine); + + /** + * 查询本公司引擎 + */ + public List getEngineList(@Param("organId") long organId, + @Param("searchString") String searchString, + @Param("list") List list); + + /** + * 页面填写 + * @param inputParam 入参 + * @param id 版本号 + * @return 返回id + * @see + */ + Map getEngineVersionExecute(Map inputParam, String id); + + /** + * 查询首页引擎基本信息 + * @param paramMap + * @return + */ + Map getIndexEngineBaseInfo(Map paramMap); + + /** + * 查询首页最近几天引擎使用情况 + * @param paramMap + * @return + */ + List getIndexRecentDayEngineUseInfo(Map paramMap); + + /** + * 查询首页最近几个月引擎使用情况 + * @param paramMap + * @return + */ + List getIndexRecentMonthEngineUseInfo(Map paramMap); + + /** + * 查询首页引擎使用占比 + * @param paramMap + * @return + */ + List> getIndexEngineUseRatio(Map paramMap); + + List getFieldByEngineVersion(EngineVersion version) ; + + boolean getFieldExcelTemplate(HttpServletResponse response, EngineVersion version); + + String getJsonField(EngineVersion version); + + TestResponse batchTest(HttpServletRequest request); + + // runner + Engine getEngineById(Long id); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineVersionService.java new file mode 100644 index 0000000..ffbe8f8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/EngineVersionService.java @@ -0,0 +1,80 @@ +package com.fibo.ddp.common.service.enginex.risk; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; + +import java.util.List; +import java.util.Map; + +public interface EngineVersionService { + + /** + * 申请部署引擎版本 + * + * @param + * @return + */ + Map applyDeployEngine(Long versionId); + + boolean applyDeployFail(Long versionId); + + boolean approvalCallBack(Long versionId, int result); + + /** + * 部署引擎版本 + * + * @param versionId + * @return + */ + int deployEngine(Long versionId); + + /** + * 取消部署引擎版本 + * + * @param versionId + * @return + */ + int undeployEngine(Long versionId); + + // V2 + List getEngineVersionListByEngineIdV2(Long engineId); + + int update(EngineVersion engineVersion); + + /** + * 获取此版本下最新的子版本 + * + * @param engineVersion + * @return + */ + EngineVersion getLatestEngineSubVersion(EngineVersion engineVersion); + + /** + * 新增版本 + * + * @param engineVersion + * @param nodeList + */ + Long saveEngineVersion(EngineVersion engineVersion, List nodeList); + + EngineVersion selectByPrimaryKey(Long versionId); + + boolean clear(Long versionId); + + /** + * 获取引擎对应的版本及引擎名信息 + * yuanlinfeng + * + * @param paramMap + * @return + */ + public List getEngineVersionByEngineId(Map paramMap); + + // runner + /** + * 获取引擎正在运行中的版本 + * @param engineId + * @return + */ + EngineVersion getRunningVersion(Long engineId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineNodeServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineNodeServiceImpl.java new file mode 100644 index 0000000..e1e5068 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineNodeServiceImpl.java @@ -0,0 +1,792 @@ +package com.fibo.ddp.common.service.enginex.risk.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.enginex.risk.EngineNodeMapper; +import com.fibo.ddp.common.dao.strategyx.aimodel.MachineLearningModelsMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.consts.EngineNodeConst; +import com.fibo.ddp.common.model.enginex.risk.response.param.*; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVo; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; +import com.fibo.ddp.common.model.strategyx.guiderule.param.RuleSetNodeResultParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.util.EngineNodeUtil; +import com.fibo.ddp.common.service.enginex.util.EngineUtil; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class EngineNodeServiceImpl extends ServiceImpl implements EngineNodeService { + + @Autowired + public ScorecardService scorecardService; + @Autowired + private DecisionTablesService decisionTablesService; + @Autowired + private DecisionTreeService decisionTreeService; + @Autowired + private MachineLearningModelsMapper machineLearningModelsMapper; + @Autowired + private ScorecardVersionService scorecardVersionService; + @Autowired + private RuleVersionService ruleVersionService; + @Autowired + private RuleScriptVersionService ruleScriptVersionService; + @Autowired + private RuleService ruleService; + @Autowired + private EngineNodeMapper engineNodeMapper; + @Autowired + private ListDbMapper listDbMapper; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getEngineNodeListByEngineVersionId( + Long engineVersionId) { + // TODO Auto-generated method stub + return engineNodeMapper.getEngineNodeListByEngineVersionId(engineVersionId); + } + + @Override + public EngineNode findById(Long id) { + // TODO Auto-generated method stub + return engineNodeMapper.selectById(id); + } + + @Override + public boolean updateNode(EngineNode engineNode, Long targetId) { + boolean flag = true; + //第一步:插入节点 + int count = engineNodeMapper.updateById(engineNode); + Map hashParam = new HashedMap(); + hashParam.put("snapshot",engineNode.getSnapshot()); + hashParam.put("nodeId",engineNode.getNodeId()); + engineNodeMapper.updateSnapshot(hashParam); + if (count == 1) { + //节点编号 + Long nodeId = engineNode.getNodeId(); + // 更新目标节点的parentId + if (targetId != null) { + EngineNode targetNode = findById(targetId); + String targetParentId = targetNode.getParentId(); + if(StringUtils.isNotBlank(targetParentId)){ + targetParentId = targetParentId.concat(CommonConst.SYMBOL_COMMA).concat(nodeId.toString()); + } else { + targetParentId = nodeId.toString(); + } + + Map map = new HashMap<>(); + map.put("nodeId", targetId); + map.put("parentId", targetParentId); + engineNodeMapper.updateParentIdByNodeId(map); + } + } else { + flag = false; + } + return flag; + } + + /** + * 保存引擎节点 + */ + @Override + public boolean saveEngineNode(EngineNode eNode) { + //第一步:插入节点 + int count = engineNodeMapper.insertNodeAndReturnId(eNode); + return count == 1; + } + + @Override + public EngineNode saveEngineNodeV2(EngineNode eNode) { + engineNodeMapper.insertNodeAndReturnIdV2(eNode); + return eNode; + } + + @Override + public boolean updateNodeForNextOrderAndParams(List eList) { + int count = engineNodeMapper.updateNodeForNextOrderAndParams(eList); + if (count > 0) { + return true; + } + return false; + } + + @Override + public int getMaxNodeOrder(Long versionId) { + // TODO Auto-generated method stub + return engineNodeMapper.getMaxNodeOrder(versionId); + } + + @Override + public boolean updateNodeForMove(EngineNode engineNode) { + // TODO Auto-generated method stub + int count = engineNodeMapper.updateNodePosition(engineNode); + if (count > 0) { + return true; + } + return false; + } + + @Override + public int renameNode(Map param) { + return engineNodeMapper.renameNode(param); + } + + @Override + public void removeNode(Long engineNodeId, String preEngineNodeId) { + //得到此节点 + EngineNode engineNode = engineNodeMapper.selectById(engineNodeId); + + if (engineNode != null) { + //判断此节点是否有上一节点 + if ("-1".equals(preEngineNodeId)) { + //没有上一节点 + // if (engineNode.getNodeType() == NodeTypeEnum.SCORECARD.getDictValue() || engineNode.getNodeType() == NodeTypeEnum.POLICY.getDictValue() || NodeTypeEnum.NODE_COMPLEXRULE.getDictValue() == engineNode.getNodeType()) { + // deleteKnowledgeRef(engineNode); + // } + //不是评分卡或规则,直接删除节点 + engineNodeMapper.deleteById(engineNode.getNodeId()); + } else { + // 更新当前节点的下一节点的parentId + List nodeList = engineNodeMapper.getEngineNodeListByEngineVersionId(engineNode.getVersionId()); + List nodeListUpdate = EngineUtil.getUpdateParentIdNodes(engineNode, nodeList); + if (CollectionUtil.isNotNullOrEmpty(nodeListUpdate)) { + //批量更新node节点 + engineNodeMapper.updateNodeForNextOrderAndParams(nodeListUpdate); + } + + // 更新当前节点的上一节点的nextNodes + String[] preEngineNodeIdArr = preEngineNodeId.split(","); + for(String preNodeId : preEngineNodeIdArr){ + EngineNode preEngineNode = engineNodeMapper.selectById(Long.valueOf(preNodeId)); + if (preEngineNode != null) { + //判断前一节点类型 + int nodeType = preEngineNode.getNodeType(); + switch (nodeType) { + case 3: // 分组节点 + case 7: // 分流节点 + case 19: // 并行节点 + case 21: // 冠军挑战节点 + handlePreClassifyOrSandBoxNode(engineNode, preEngineNode); + break; + default: + handlePreCommonNode(engineNode, preEngineNode); + break; + } + } + } + engineNodeMapper.deleteById(engineNode.getNodeId()); + } + } + } + + /** + * 处理分群节点(前一个是分群或沙盒) + * + * @param engineNode + * @param preEngineNode + */ + private void handlePreClassifyOrSandBoxNode(EngineNode engineNode, EngineNode preEngineNode) { + //第一步,删除节点的nextNode + String nextNodes = preEngineNode.getNextNodes(); + if (StringUtil.isValidStr(nextNodes)) { + nextNodes = nextNodes.replace(engineNode.getNodeCode(), ""); + //去掉nextnodes的前后逗号 + if (nextNodes.startsWith(CommonConst.SYMBOL_COMMA)) { + nextNodes = nextNodes.substring(1); + } + if (nextNodes.endsWith(CommonConst.SYMBOL_COMMA)) { + nextNodes = nextNodes.substring(0, nextNodes.length() - 1); + } + //如果删除了中间胡nextnode,则将,,替换为, + preEngineNode.setNextNodes(nextNodes.replace(CommonConst.SYMBOL_COMMA + CommonConst.SYMBOL_COMMA, CommonConst.SYMBOL_COMMA)); + } + //第二步,删除nodeJson中的当前节点信息 + String nodeJson = preEngineNode.getNodeJson(); + if (StringUtil.isValidStr(nodeJson)) { + nodeJson = nodeJson.replace(engineNode.getNodeCode(), ""); + preEngineNode.setNodeJson(nodeJson); + } + //第三步,更新节点 + preEngineNode = EngineNodeUtil.boxEngineNodeJson(preEngineNode); + engineNodeMapper.updateById(preEngineNode); + //第四步,删除现有节点 +// engineNodeMapper.deleteByExample(engineNode); + } + + /** + * 删除节点(节点前一节点是开始节点) + * + * @param engineNode + * @param preEngineNode + */ + private void handlePreCommonNode(EngineNode engineNode, EngineNode preEngineNode) { + //第一步,删除开始节点的nextNode + preEngineNode.setNextNodes(""); + engineNodeMapper.updateById(preEngineNode); + //第二步,删除当前节点 + // if (engineNode.getNodeType() == NodeTypeEnum.SCORECARD.getDictValue() || engineNode.getNodeType() == NodeTypeEnum.POLICY.getDictValue()) { + // deleteKnowledgeRef(engineNode); + // } +// engineNodeMapper.deleteByExample(engineNode); + } + + /** + * 删除连线 + */ + @Override + public void removeLink(Long engineNodeId, Long preEngineNodeId) { + //得到此节点 + EngineNode engineNode = engineNodeMapper.selectById(engineNodeId); + //得到上一节点 + EngineNode preEngineNode = engineNodeMapper.selectById(preEngineNodeId); + //删除连线时修改后一个节点的parentId + String targetParentId = engineNode.getParentId(); + if(targetParentId.contains(CommonConst.SYMBOL_COMMA)){ + List targetParentIdList = Arrays.asList(targetParentId.split(CommonConst.SYMBOL_COMMA)); + targetParentIdList = targetParentIdList.stream().filter(item -> !item.equals(preEngineNodeId.toString())).collect(Collectors.toList()); + targetParentId = StringUtils.join(targetParentIdList, CommonConst.SYMBOL_COMMA); + } else { + targetParentId = EngineNodeConst.REMOVE_LINK_PARENT_ID; + } + engineNode.setParentId(targetParentId); + + if (preEngineNode != null) { + //判断前一节点类型 + int nodeType = preEngineNode.getNodeType(); + switch (nodeType) { + case 3: //分群节点 + case 7: //沙盒节点 + case 19: //并行节点 + case 21: //冠军挑战 + handlePreClassifyOrSandBoxLink(engineNode, preEngineNode); + break; + default: + //其他节点只更新前一节点的nextNode + handleCommonLink(engineNode, preEngineNode); + break; + } + } + } + + /** + * 分群和沙盒的连线删除 + * + * @param engineNode + * @param preEngineNode + */ + private void handlePreClassifyOrSandBoxLink(EngineNode engineNode, EngineNode preEngineNode) { + String nextNodes = preEngineNode.getNextNodes(); + if (StringUtil.isValidStr(nextNodes)) { + nextNodes = nextNodes.replace(engineNode.getNodeCode(), ""); + //去掉nextnodes的前后逗号 + if (nextNodes.startsWith(CommonConst.SYMBOL_COMMA)) { + nextNodes = nextNodes.substring(1); + } + if (nextNodes.endsWith(CommonConst.SYMBOL_COMMA)) { + nextNodes = nextNodes.substring(0, nextNodes.length() - 1); + } + //更新节点parentId信息 +// engineNode.setParentId(null); + engineNodeMapper.updateById(engineNode); + //如果删除了中间的nextnode,则将,,替换为, + preEngineNode.setNextNodes(nextNodes.replace(CommonConst.SYMBOL_COMMA + CommonConst.SYMBOL_COMMA, CommonConst.SYMBOL_COMMA)); + } + //第二步,删除nodeJson中的当前节点信息 + String nodeJson = preEngineNode.getNodeJson(); + if (StringUtil.isValidStr(nodeJson)) { + nodeJson = nodeJson.replace(engineNode.getNodeCode(), ""); + preEngineNode.setNodeJson(nodeJson); + } + //第三步,更新节点 + preEngineNode = EngineNodeUtil.boxEngineNodeJson(preEngineNode); + engineNodeMapper.updateById(preEngineNode); + } + + /** + * 删除普通节点连线问题 + * + * @param engineNode + * @param preEngineNode + */ + private void handleCommonLink(EngineNode engineNode, EngineNode preEngineNode) { + String nextNodes = preEngineNode.getNextNodes(); +// engineNode.setParentId(null); + engineNodeMapper.updateById(engineNode); + if (StringUtil.isValidStr(nextNodes)) { + if (nextNodes.equals(engineNode.getNodeCode())){ + nextNodes = ""; + }else if (nextNodes.endsWith(","+engineNode.getNodeCode())){ + nextNodes=nextNodes.replace(","+engineNode.getNodeCode(),""); + }else { + nextNodes=nextNodes.replace(engineNode.getNodeCode()+",",""); + } + preEngineNode.setNextNodes(nextNodes); + } + engineNodeMapper.updateById(preEngineNode); + } + + @Override + public List getEngineTypedNodeListByEngineVersionId(Long versionId, List types) { + return engineNodeMapper.getEngineTypedNodeListByEngineVersionId(versionId, types); + } + + @Override + public int updateParentIdByNodeId(Long nodeId, String parentId) { + if (nodeId != null && parentId != null) { + Map map = new HashMap<>(); + map.put("nodeId", nodeId); + map.put("parentId", parentId); + return engineNodeMapper.updateParentIdByNodeId(map); + } else { + return 0; + } + } + + @Override + public List getPreviousNodeOutput(Long nodeId) { + List nodeTypeList = new ArrayList<>(); + EngineNode engineNode = findById(nodeId); + Long versionId = engineNode.getVersionId(); + List nodeList = getEngineNodeListByEngineVersionId(versionId); + Map nodeMap = EngineUtil.convertNodeList2Map(nodeList); + Set nodeTypeSet = nodeList.stream() + .map(item -> item.getNodeType()) + .filter(item -> item != NodeTypeEnum.START.getValue() + && item != NodeTypeEnum.CLASSIFY.getValue() + && item != NodeTypeEnum.SANDBOX.getValue()) + .collect(Collectors.toSet()); + for(Integer nodeType : nodeTypeSet){ + NodeTypeEnum nodeTypeEnum = NodeTypeEnum.adapad(nodeType); + Map previousNodeMap = new HashMap<>(); + recursivePreviousNode(engineNode, nodeMap, nodeTypeEnum, previousNodeMap); + List previousNodes = new ArrayList<>(previousNodeMap.values()); + List nodeInfoList = new ArrayList<>(); + + switch (nodeTypeEnum) { + case POLICY: + nodeInfoList = getRuleNodeInfo(previousNodes, nodeTypeEnum); + break; + case SCORECARD: + case DECISION_TABLES: + case DECISION_TREE: + case MODEL_ENGINE: + case CHILD_ENGINE: + case DECISION: + nodeInfoList = getSingleStrategyNodeInfo(previousNodes, nodeTypeEnum); + break; + case BLACKLIST: + case WHITELIST: + nodeInfoList = getListDbNodeInfo(previousNodes, nodeTypeEnum); + break; + default: + break; + } + + NodeTypeResponse nodeTypeResponse = new NodeTypeResponse(); + nodeTypeResponse.setNodeType(nodeTypeEnum.getValue()); + nodeTypeResponse.setNodeTypeName(nodeTypeEnum.getType()); + nodeTypeResponse.setNodeInfoList(nodeInfoList); + nodeTypeList.add(nodeTypeResponse); + } + return nodeTypeList; + } + + @Override + public void updateNodeSnapshot(HashMap paramMap) { + engineNodeMapper.updateSnapshot(paramMap); + } + + /** + * 向上递归节点 + * + * @param currentNode + */ + private void recursivePreviousNode(EngineNode currentNode, Map nodeMap, NodeTypeEnum nodeTypeEnum, Map previousNodeMap) { + if (StringUtils.isNotBlank(currentNode.getParentId())) { + List parentIdList = Arrays.asList(currentNode.getParentId().split(CommonConst.SYMBOL_COMMA)); + for(String parentId : parentIdList){ + EngineNode exNode = nodeMap.get(Long.valueOf(parentId)); + if (exNode != null && exNode.getNodeType() == nodeTypeEnum.getValue()) { + previousNodeMap.put(exNode.getNodeId(), exNode); + } + if (exNode != null) { + recursivePreviousNode(exNode, nodeMap, nodeTypeEnum, previousNodeMap); + } + } + } + } + + /** + * 获取单个策略的节点信息集合 + * @param previousNodes + * @param nodeTypeEnum + * @return + */ + private List getSingleStrategyNodeInfo(List previousNodes, NodeTypeEnum nodeTypeEnum) { + List nodeInfoList = new ArrayList<>(); + for(EngineNode engineNode : previousNodes){ + if(StringUtils.isBlank(engineNode.getNodeJson())){ + continue; + } + String resultFieldEn = ""; + String resultFieldCn = ""; + Integer valueType = 1; + JSONObject nodeJson = JSON.parseObject(engineNode.getNodeJson()); + JSONObject jsonObject = null; + switch (nodeTypeEnum) { + case SCORECARD: +// Scorecard scorecard = scorecardService.getById(); + jsonObject = JSON.parseObject(JSON.toJSONString(nodeJson.getJSONArray("scorecardList").get(0))); + ScorecardVersionVo versionVo = scorecardVersionService.queryById(jsonObject.getLong("versionId")); + if(StringUtils.isNotBlank(versionVo.getResultFieldEn())){ + resultFieldEn = versionVo.getResultFieldEn(); + } else { + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + versionVo.getId() + "_score"; + } + resultFieldCn = "评分"; + valueType = 1; + break; + case DECISION_TABLES: + jsonObject = JSON.parseObject(JSON.toJSONString(nodeJson.getJSONArray("decisionTableList").get(0))); + DecisionTablesVo decisionTablesVo = decisionTablesService.queryById(jsonObject.getLong("decisionTableId")); + List versionList = decisionTablesVo.getDecisionTablesVersionList(); + for (DecisionTablesVersionVo decisionTablesVersionVo : versionList) { + if (decisionTablesVersionVo.getId().equals(jsonObject.getLong("versionId"))){ + resultFieldEn = decisionTablesVersionVo.getResultFieldEn(); + if (StringUtils.isBlank(resultFieldEn)){ + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + decisionTablesVersionVo.getId() + "_result"; + } + break; + } + } +// DecisionTables decisionTables = decisionTablesService.getById(Long.valueOf(engineNode.getNodeJson())); +// resultFieldEn = decisionTables.getResultFieldEn(); + resultFieldCn = "决策结果"; + valueType = 2; + break; + case DECISION_TREE: + //决策树 + jsonObject = JSON.parseObject(JSON.toJSONString(nodeJson.getJSONArray("decisionTreeList").get(0))); + DecisionTreeVo decisionTree = decisionTreeService.queryById(jsonObject.getLong("decisionTreeId")); + List decisionTreeVersionList = decisionTree.getVersionList(); + for (DecisionTreeVersionVo decisionTreeVersionVo : decisionTreeVersionList) { + if (decisionTreeVersionVo.getId().equals(jsonObject.getLong("versionId"))){ + resultFieldEn = decisionTreeVersionVo.getResultFieldEn(); + if (StringUtils.isBlank(resultFieldEn)){ + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + decisionTreeVersionVo.getId() + "_result"; + } + break; + } + } + resultFieldCn = "决策结果"; + valueType = 2; + break; + case MODEL_ENGINE: + MachineLearningModels machineLearningModels = machineLearningModelsMapper.selectById(Integer.valueOf(engineNode.getNodeJson())); + resultFieldEn = machineLearningModels.getResultFieldEn(); + if (StringUtils.isBlank(resultFieldEn)){ + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + machineLearningModels.getId() + "_result"; + } + resultFieldCn = "预测结果"; + valueType = 1; + break; + case CHILD_ENGINE: + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + engineNode.getNodeJson() + "_result"; + resultFieldCn = "引擎结果"; + valueType = 2; + break; + case DECISION: + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_result"; + resultFieldCn = "决策选项结果"; + valueType = 2; + break; + default: + break; + } + + NodeStrategyOutputResponse nodeStrategyOutputResponse = new NodeStrategyOutputResponse(); + nodeStrategyOutputResponse.setFieldEn(resultFieldEn); + nodeStrategyOutputResponse.setFieldCn(resultFieldCn); + nodeStrategyOutputResponse.setValueType(valueType); + List strategyOutputList = new ArrayList<>(); + strategyOutputList.add(nodeStrategyOutputResponse); + + NodeInfoResponse nodeInfoResponse = new NodeInfoResponse(); + nodeInfoResponse.setNodeId(engineNode.getNodeId()); + nodeInfoResponse.setNodeName(engineNode.getNodeName()); + nodeInfoResponse.setStrategyOutputList(strategyOutputList); + nodeInfoList.add(nodeInfoResponse); + } + + return nodeInfoList; + } + + private List getRuleNodeInfo(List previousNodes, NodeTypeEnum nodeTypeEnum) { + List nodeInfoList = new ArrayList<>(); + for(EngineNode engineNode : previousNodes){ + List ruleInfoList = new ArrayList<>(); + List ruleIds = new ArrayList<>(); + List complexRuleVersionIds = new ArrayList<>(); + List scriptRuleVersionIds = new ArrayList<>(); + JSONObject nodeJson = JSONObject.parseObject(engineNode.getNodeJson()); + if(nodeJson == null){ + return nodeInfoList; + } + + JSONArray jsonArray = null; + int groupType = nodeJson.getInteger("groupType") == null ? Constants.ruleNode.EXECUTEGROUP : nodeJson.getInteger("groupType"); + if(groupType == Constants.ruleNode.MUTEXGROUP){ + jsonArray = nodeJson.getJSONObject("mutexGroup").getJSONArray("rules"); + } else { + jsonArray = nodeJson.getJSONObject("executeGroup").getJSONArray("rules"); + } + Integer difficulty = null; + for(int i = 0; i < jsonArray.size(); i++){ + JSONObject ruleObj = jsonArray.getJSONObject(i); + difficulty = ruleObj.getInteger("difficulty"); + Long ruleVersionId = ruleObj.getLong("ruleVersionId"); + ruleIds.add(ruleObj.getLong("userId")); + if (difficulty==null){ +// ruleIds.add(ruleObj.getLong("userId")); + continue; + } + switch (difficulty){ + case 1: + ruleIds.add(ruleObj.getLong("userId")); + break; + case 2: + complexRuleVersionIds.add(ruleVersionId); + break; + case 3: + scriptRuleVersionIds.add(ruleVersionId); + break; + + } + } + List ruleSetNodeResultParams = new ArrayList<>(); + List ruleList = new ArrayList<>(); + Map ruleMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(ruleIds)){ + ruleList.addAll(ruleService.listByIds(ruleIds)); + if (CollectionUtils.isNotEmpty(ruleList)){ + for (RuleInfo rule : ruleList) { + ruleMap.put(rule.getId(),rule); + if (rule.getDifficulty()==null||rule.getDifficulty()==1){ + String resultEn = rule.getResultFieldEn(); + String scoreEn = rule.getScoreFieldEn(); + ruleSetNodeResultParams.add(new RuleSetNodeResultParam(rule.getId(),1,null,resultEn,scoreEn,rule.getCode(),rule.getName())); + } + } + } + } + + if (CollectionUtils.isNotEmpty(complexRuleVersionIds)){ + List ruleVersionList = ruleVersionService.listByIds(complexRuleVersionIds); + if (CollectionUtils.isNotEmpty(ruleVersionList)){ + for (RuleVersion ruleVersion : ruleVersionList) { + String resultEn = ruleVersion.getResultFieldEn(); + String scoreEn = ruleVersion.getScoreFieldEn(); + RuleInfo rule = ruleMap.get(ruleVersion.getRuleId()); + ruleSetNodeResultParams.add(new RuleSetNodeResultParam(ruleVersion.getRuleId(),2,ruleVersion.getId(),resultEn,scoreEn,rule.getCode(),rule.getName())); + } + } + } + if (CollectionUtils.isNotEmpty(scriptRuleVersionIds)){ + List ruleScriptVersionList = ruleScriptVersionService.listByIds(scriptRuleVersionIds); + if (CollectionUtils.isNotEmpty(ruleScriptVersionList)){ + for (RuleScriptVersion ruleVersion : ruleScriptVersionList) { + String resultEn = "hitResult"; + String scoreEn = "scoreResult"; + RuleInfo rule = ruleMap.get(ruleVersion.getRuleId()); + ruleSetNodeResultParams.add(new RuleSetNodeResultParam(ruleVersion.getRuleId(),3,ruleVersion.getId(),resultEn,scoreEn,rule.getCode(),rule.getName())); + } + } + } + +// List ruleList = ruleMapper.selectnodeByInRoleid(ruleIds); + for(RuleSetNodeResultParam rule : ruleSetNodeResultParams){ + RuleInfoOutputResponse ruleInfoOutputResponse = new RuleInfoOutputResponse(); + ruleInfoOutputResponse.setId(rule.getId()); + ruleInfoOutputResponse.setCode(rule.getCode()); + ruleInfoOutputResponse.setName(rule.getName()); + + List ruleOutputList = new ArrayList<>(); + NodeStrategyOutputResponse hitOutputResponse = new NodeStrategyOutputResponse(); + String resultEn = rule.getResultEn(); + if (StringUtils.isBlank(resultEn)){ + if (null !=rule.getVersionId()){ + resultEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_"+rule.getVersionId()+"_hitResult"; + }else { + resultEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_hitResult"; + } + + } + hitOutputResponse.setFieldEn(resultEn); + hitOutputResponse.setFieldCn("是否命中"); + hitOutputResponse.setValueType(2); + ruleOutputList.add(hitOutputResponse); + + NodeStrategyOutputResponse scoreOutputResponse = new NodeStrategyOutputResponse(); + String scoreEn = rule.getScoreEn(); + if (StringUtils.isBlank(scoreEn)){ + if (null !=rule.getVersionId()){ + scoreEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_"+rule.getVersionId()+"_score"; + }else { + scoreEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_score"; + } + } + scoreOutputResponse.setFieldEn(scoreEn); + scoreOutputResponse.setFieldCn("得分"); + scoreOutputResponse.setValueType(1); + ruleOutputList.add(scoreOutputResponse); + ruleInfoOutputResponse.setRuleOutputList(ruleOutputList); + + ruleInfoList.add(ruleInfoOutputResponse); + } + + List statisticsOutputList = new ArrayList<>(); + NodeStrategyOutputResponse statisticsSizeOutput = new NodeStrategyOutputResponse(); + statisticsSizeOutput.setFieldEn(engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_size"); + statisticsSizeOutput.setFieldCn("规则命中个数"); + statisticsSizeOutput.setValueType(1); + statisticsOutputList.add(statisticsSizeOutput); + + NodeStrategyOutputResponse statisticsScoreOutput = new NodeStrategyOutputResponse(); + statisticsScoreOutput.setFieldEn(engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_score"); + statisticsScoreOutput.setFieldCn("规则总得分"); + statisticsScoreOutput.setValueType(1); + statisticsOutputList.add(statisticsScoreOutput); + + RuleOutputResponse ruleOutput = new RuleOutputResponse(); + ruleOutput.setStatisticsOutputList(statisticsOutputList); + ruleOutput.setRuleInfoList(ruleInfoList); + + NodeInfoResponse nodeInfoResponse = new NodeInfoResponse(); + nodeInfoResponse.setNodeId(engineNode.getNodeId()); + nodeInfoResponse.setNodeName(engineNode.getNodeName()); + nodeInfoResponse.setRuleOutput(ruleOutput); + nodeInfoList.add(nodeInfoResponse); + } + + return nodeInfoList; + } + + private List getListDbNodeInfo(List previousNodes, NodeTypeEnum nodeTypeEnum) { + List nodeInfoList = new ArrayList<>(); + for(EngineNode engineNode : previousNodes){ + List listDbInfoOutput = new ArrayList<>(); + + List listDbIds = new ArrayList<>(); + String nodeJson = engineNode.getNodeJson(); + if (StringUtils.isBlank(nodeJson)){ + continue; + } + JSONArray jsonArray = JSON.parseObject(nodeJson).getJSONArray("listDbList"); + if (jsonArray!=null&&jsonArray.size()>0){ + for (Object o : jsonArray) { + if (o==null){ + continue; + } + Long id = JSON.parseObject(JSON.toJSONString(o)).getLong("listDbId"); + if (id==null){ + continue; + } + listDbIds.add(id); + } + } + if (listDbIds.isEmpty()){ + continue; + } + Map paramMap = new HashMap<>(); + paramMap.put("listDbIds", listDbIds); + List listDbList = listDbMapper.findListDbByIds(paramMap); + for(ListDb listDb : listDbList){ + ListDbInfoOutputResponse listDbInfoOutputResponse = new ListDbInfoOutputResponse(); + listDbInfoOutputResponse.setId(listDb.getId()); + listDbInfoOutputResponse.setListName(listDb.getListName()); + + List listDbOutputList = new ArrayList<>(); + NodeStrategyOutputResponse hitOutputResponse = new NodeStrategyOutputResponse(); + hitOutputResponse.setFieldEn(listDb.getResultFieldEn()); + hitOutputResponse.setFieldCn("是否命中"); + listDbOutputList.add(hitOutputResponse); + listDbInfoOutputResponse.setListDbOutputList(listDbOutputList); + + listDbInfoOutput.add(listDbInfoOutputResponse); + } + + List statisticsOutputList = new ArrayList<>(); + NodeStrategyOutputResponse statisticsSizeOutput = new NodeStrategyOutputResponse(); + statisticsSizeOutput.setFieldEn(engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_size"); + statisticsSizeOutput.setFieldCn("名单库命中个数"); + statisticsOutputList.add(statisticsSizeOutput); + + ListDbOutputResponse listDbOutput = new ListDbOutputResponse(); + listDbOutput.setStatisticsOutputList(statisticsOutputList); + listDbOutput.setListDbInfoOutput(listDbInfoOutput); + + NodeInfoResponse nodeInfoResponse = new NodeInfoResponse(); + nodeInfoResponse.setNodeId(engineNode.getNodeId()); + nodeInfoResponse.setNodeName(engineNode.getNodeName()); + nodeInfoResponse.setListDbOutput(listDbOutput); + nodeInfoList.add(nodeInfoResponse); + } + + return nodeInfoList; + } + + @Override + public List getEngineNodeListByVersionId(Long versionId) { + List engineNodeList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_ENGINE_NODE, versionId); + engineNodeList = redisManager.getByForeignKey(key, EngineNode.class); + if(engineNodeList != null){ + // 按node_order升序排序 + engineNodeList = engineNodeList.stream().sorted(Comparator.comparing(EngineNode::getNodeOrder)).collect(Collectors.toList()); + } + } else { + engineNodeList = engineNodeMapper.getEngineNodeListByVersionId(versionId); + } + + return engineNodeList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineServiceImpl.java new file mode 100644 index 0000000..7b4a18b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineServiceImpl.java @@ -0,0 +1,758 @@ +package com.fibo.ddp.common.service.enginex.risk.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.authx.system.SysMenuMapper; +import com.fibo.ddp.common.dao.authx.system.SysRoleMapper; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.enginex.risk.EngineMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineNodeMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysRole; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ExcelModel; +import com.fibo.ddp.common.model.common.ExcelSheetModel; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.*; +import com.fibo.ddp.common.model.enginex.risk.response.TestResponse; +import com.fibo.ddp.common.service.common.ExcelUtil; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.enginex.risk.EngineService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.enginex.util.EngineNodeJsonUtil; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.aimodel.ModelsService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbV3Service; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Service +public class EngineServiceImpl implements EngineService { + private static final Logger logger = LoggerFactory.getLogger(EngineServiceImpl.class); + + @Autowired + private RestTemplate restTemplate; + @Autowired + private ListDbV3Service listDbService;//名单库 + @Resource + private RuleService ruleService;//规则 + @Autowired + private RuleVersionService ruleVersionService; + @Autowired + private RuleScriptVersionService ruleScriptVersionService; + @Resource + private DecisionTablesService decisionTablesService;//决策表 + @Resource + private DecisionTreeService decisionTreeService;//决策表 + @Resource + private ModelsService modelsService;//机器学习模型 + @Resource + private ScorecardVersionService scorecardVersionService;//评分卡 + @Resource + private EngineVersionService versionService;//引擎版本 + @Resource + private FieldService fieldService;//字段 + @Autowired + private EngineMapper engineMapper; + @Autowired + private EngineVersionMapper engineVersionMapper; + @Autowired + private EngineNodeMapper engineNodeMapper; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysMenuMapper sysMenuMapper; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getEngineByList(Engine engineVo) { + // TODO Auto-generated method stub + return engineMapper.getEngineByList(engineVo); + } + + @Override + public Engine getEngineById(Engine engineVo) { + // TODO Auto-generated method stub + return engineMapper.getEngineById(engineVo); + } + + @Override + public int updateEngine(Engine engineVo) { + // TODO Auto-generated method stub + return engineMapper.updateEngine(engineVo); + } + + @Override + public boolean saveEngine(Engine engine) { + boolean flag = true; + int engineCount = engineMapper.insertEngineAndReturnId(engine); + if (engineCount == 1) { + Long engineId = engine.getId(); + if (engineId != null && engineId > 0) { + // 开始新增版本 + EngineVersion engineVersion = new EngineVersion(); + engineVersion.setBootState(0); + engineVersion.setCreateTime(new Date().toString()); + engineVersion.setEngineId(engine.getId()); + engineVersion.setLatestTime(new Date().toString()); + engineVersion.setLatestUser(engine.getCreator()); + // 默认自定义布局 + engineVersion.setLayout(0); + // 状态正常 + engineVersion.setStatus(1); + engineVersion.setUserId(engine.getCreator()); + // 默认新增版本0.0 + engineVersion.setVersion(0); + // 默认子版本为0 + engineVersion.setSubVersion(0); + EngineNode node = new EngineNode(); + node.setNodeX(200d); + node.setNodeY(200d); + node.setNodeName("开始"); + node.setNodeOrder(1); + node.setNodeType(NodeTypeEnum.START.getValue()); + node.setNodeCode("ND_START"); + node.setParams("{\"arr_linkId\":\"\",\"dataId\":\"-1\",\"url\":\"/Riskmanage/resource/images/decision/start.png\",\"type\":\"1\"}"); + // 保存引擎版本 + int count = engineVersionMapper + .insertEngineVersionAndReturnId(engineVersion); + if (count == 1) { + long versionId = engineVersion.getVersionId(); + node.setVersionId(versionId); + // 普通节点就直接插入 + engineNodeMapper.insert(node); + } + } else { + flag = false; + } + } else { + flag = false; + } + + return flag; + } + + public Map getEngineVersionExecute(Map inputParam, String id) { + // TODO + return null; + } + + /** + * 判断表达式的运算结果是否数值型的公共方法 + */ + public boolean isNumeric(String str) { + Pattern pattern = Pattern.compile("^(-|\\+)?\\d+(\\.\\d+)?$"); + Matcher isNum = pattern.matcher(str); + if (!isNum.matches()) { + return false; + } + return true; + } + + /** + * 查询本公司引擎 + */ + @Override + public List getEngineList(long organId, String searchString, + List list) { + return engineMapper.getEngineList(organId, searchString, list); + } + + @Override + public Map getIndexEngineBaseInfo(Map paramMap) { + return engineMapper.getIndexEngineBaseInfo(paramMap); + } + + @Override + public List getIndexRecentDayEngineUseInfo(Map paramMap) { + return engineMapper.getIndexRecentDayEngineUseInfo(paramMap); + } + + @Override + public List getIndexRecentMonthEngineUseInfo(Map paramMap) { + return engineMapper.getIndexRecentMonthEngineUseInfo(paramMap); + } + + @Override + public List> getIndexEngineUseRatio(Map paramMap) { + return engineMapper.getIndexEngineUseRatio(paramMap); + } + + @Override + public List getFieldByEngineVersion(EngineVersion version) { + Set fieldEns = getFieldEnByEngineVersion(version); + List fields = fieldService.queryByEns(fieldEns); + if (fields == null || fields.size() == 0) { + return new ArrayList<>(); + } + Set oldIds = new HashSet<>(); + Set ids = new HashSet<>(); + Iterator iterator = fields.iterator(); + while (iterator.hasNext()) { + Field field = iterator.next(); + oldIds.add(field.getId()); + if (field.getIsDerivative() == null || field.getIsDerivative() != 1) { + continue; + } + + String origFieldId = field.getOrigFieldId(); + if (origFieldId == null || "".equals(origFieldId)) { + continue; + } + String[] split = origFieldId.split(","); + for (String s : split) { + if (isNumeric(s)) { + ids.add(Long.valueOf(s)); + } + } + iterator.remove(); + } + + if (ids.size() > 0) { + ids = ids.stream().filter(id -> { + return !oldIds.contains(id); + }).collect(Collectors.toSet()); + List fieldList = fieldService.queryByIds(ids); + if (fieldList != null && fieldList.size() > 0) { + fields.addAll(fieldList.stream().filter(field -> { + return !fieldEns.contains(field.getFieldEn()); + }).collect(Collectors.toList())); + } + } + return fields; + } + + @Override + public String getJsonField(EngineVersion version) { + version = engineVersionMapper.selectByPrimaryKey(version.getVersionId()); + +// JSONObject biz_data = new JSONObject(); + Long organId = SessionManager.getLoginAccount().getOrganId(); +// biz_data.put("organId", organId); + Long engineId = version.getEngineId(); +// biz_data.put("engineId", engineId); + String businessId = ""; +// biz_data.put("businessId", businessId); + String biz_enc = "0"; +// biz_data.put("biz_enc", biz_enc); + Long timestamp = System.currentTimeMillis(); +// biz_data.put("timestamp", timestamp); + + List fieldList = getFieldByEngineVersion(version); + Map fields = new HashMap(); + for (Field field : fieldList) { + Object result; + switch (field.getValueType()) { + case 1: + result = 123; + break; + case 2: + result = "abc"; + break; + case 6: + result = JSON.parse(field.getJsonValue()); + break; + default: + result = "xyz"; + } + fields.put(field.getFieldEn(), result); + } +// biz_data.put("fields", fields); + JSONObject result = new JSONObject(); + ExecuteParam biz_data = new ExecuteParam(engineId, organId, biz_enc, timestamp, businessId, fields); + result.put("biz_data", biz_data); + return JSON.toJSONString(result); + } + + @Override + public boolean getFieldExcelTemplate(HttpServletResponse response, EngineVersion version) { + List fieldList = getFieldByEngineVersion(version); + + if (fieldList == null || fieldList.size() == 0) { + return false; + } + List headList = new ArrayList<>(); + List data = new ArrayList<>(); + List exampleRow = new ArrayList(); + headList.add("业务id"); + exampleRow.add("业务唯一id,示例:example200"); + data.add(exampleRow); + for (Field field : fieldList) { + headList.add(field.getFieldCn()); + switch (field.getValueType()) { + case 1: + exampleRow.add("数值型,示例:123"); + break; + case 2: + exampleRow.add("字符串,示例:abc"); + break; + case 6: + exampleRow.add("json型,示例:" + field.getJsonValue()); + break; + default: + exampleRow.add("其他类型"); + } + } + OutputStream out = null; + try { + // 设置response的Header + + response.setContentType("application/octet-stream"); + response.setHeader("content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=\"" + new String("引擎入参".getBytes("utf-8"), "ISO8859-1") + ".xlsx\""); + + +// response.setHeader("Content-disposition", "attachment; filename=\""+ new String("引擎入参.xlsx".getBytes("utf-8"), "ISO8859-1") + "\""); + + ExcelSheetModel sheet = new ExcelSheetModel("引擎入参", headList, data); + List sheets = new ArrayList<>(); + sheets.add(sheet); + out = response.getOutputStream(); + ExcelUtil.exportExcelTemplate(out, new ExcelModel("引擎入参.xlsx", "xlsx", sheets)); + } catch (IOException ex) { + ex.printStackTrace(); + return false; + } finally { + if (out != null) { + try { + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return true; + } + + @Override + public TestResponse batchTest(HttpServletRequest request){ + //引擎id + String engineIdStr = request.getParameter("engineId"); + long engineId = StringUtil.getStrTolong(engineIdStr); + if (engineIdStr==null|| engineId==0){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"未找到测试引擎"); + } + //组织id + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + //加解密标识 + String biz_enc = "0"; + //时间戳 + Long timestamp = System.currentTimeMillis(); + Map fields = new HashMap<>(); + String businessId = ""; + ExecuteParam biz_data = new ExecuteParam(engineId, organId, biz_enc, timestamp, businessId, fields); + Map param = new HashMap(); + param.put("biz_data", biz_data); + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + Iterator iterator = multiRequest.getFileNames(); + + List list = new ArrayList<>(); + while (iterator.hasNext()) { + MultipartFile file = multiRequest.getFile(iterator.next().toString()); + boolean isXlsx = false; + String fileName = file.getOriginalFilename(); + + if (fileName.endsWith(".xlsx")) { + isXlsx = true; + } + InputStream input = null; + Workbook wb = null; + try { + input = file.getInputStream(); + //根据文件格式(2003或者2007)来初始化 + if (isXlsx) + wb = new XSSFWorkbook(input); + else + wb = new HSSFWorkbook(input); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + Sheet sheet = wb.getSheetAt(0); + + if (sheet != null) { + try { + //处理头信息 + Row header = sheet.getRow(0); + List fieldEns = new ArrayList<>(); + List fieldCns = new ArrayList<>(); + int cellNum = header.getLastCellNum(); + Cell cell = header.getCell(0); + for (int i = 1; i < cellNum; i++) { + cell = header.getCell(i); + Map map = new HashMap<>(); + fieldCns.add(ExcelUtil.formatCell(cell)); + } + List fieldList = fieldService.queryByOrganAndCns(fieldCns, sysUser.getOrganId()); + Map collect = fieldList.stream().collect(Collectors.toMap(e -> e.getFieldCn(), e -> e.getFieldEn())); + for (String fieldCn : fieldCns) { + String en = collect.get(fieldCn); + if (StringUtils.isNotBlank(en)){ + fieldEns.add(en); + }else { + fieldEns.add(fieldCn); + } + } + //遍历excel,从第二行开始 即 rowNum=1,逐个获取单元格的内容,然后进行格式处理,最后插入数据库 + for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { + Row hssfRow = sheet.getRow(rowNum); + if (hssfRow == null || hssfRow.getCell(0) == null) { + continue; + } + cellNum = hssfRow.getLastCellNum(); + businessId = ExcelUtil.formatCell(hssfRow.getCell(0)); + for (int i = 1; i < cellNum; i++) { + fields.put(fieldEns.get(i-1), ExcelUtil.formatCell(hssfRow.getCell(i))); + } + biz_data.setFields(fields); + biz_data.setBusinessId(businessId); + list.add(JSONObject.parse(JSON.toJSONString(param))); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + ResponseEntity testResult = getTestResult(list); + //执行成功 + Map success = new HashMap<>(); + Integer total = list.size();//总条数 + Integer failNum = 0;//失败条数 + Integer successNum = 0;//成功条数 + if (testResult.getStatusCodeValue()==200){ + List bodyList = testResult.getBody(); + for (String object : bodyList) { + JSONObject json = JSON.parseObject(object); + String status = json.getString("status"); + //执行成功 + if ("0x0000".equals(status)){ + successNum++; + String result = ""; + if (json.containsKey("result")){ + result = json.getString("result"); + } + int count = 1; + if (success.containsKey(result)){ + count += success.get(result); + } + success.put(result,count); + }else {//失败 + failNum++; + } + } + }else { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"链接执行器失败"); + } + return new TestResponse(success, successNum, failNum, total); + } + + private ResponseEntity getTestResult(List reqJsonStr) { + + return null; + +// try { +// HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.APPLICATION_JSON); +// HttpEntity entity = new HttpEntity(reqJsonStr,headers); +// String url = runnerUrl + "/runner/batchExecute"; +// ResponseEntity resp = restTemplate.exchange(url, HttpMethod.POST, entity,List.class); +// return resp; +// }catch (Exception e){ +// e.printStackTrace(); +// throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"链接执行器失败"); +// } + } + + private Set getFieldEnByEngineVersion(EngineVersion version) { + EngineVersion engineVersion = engineVersionMapper.selectByPrimaryKey(version.getVersionId()); + Engine engine = new Engine(); + engine.setId(engineVersion.getEngineId()); + Set fieldEns = new HashSet<>(); + if (null != engineVersion) { + List engineNodeList = engineNodeMapper.getEngineNodeListByEngineVersionId(engineVersion.getVersionId()); + for (int i = 0; i < engineNodeList.size(); i++) { + EngineNode node = engineNodeList.get(i); + fieldEns.addAll(getFieldEnList(node)); + } + } + return fieldEns; + } + + private Set getFieldEnList(EngineNode node) { + Integer nodeType = node.getNodeType(); + Set fieldEns = new HashSet<>(); + if (nodeType == null) { + return fieldEns; + } + switch (nodeType) { + case 1://开始节点,无逻辑 + + break; + case 2://规则集 从nodeJson.deny_rules.rules[].userId + fieldEns.addAll(getRuleFieldEnList(node)); + break; + case 3://分组 nodeJson.fields->{字段对象。fieldcode} + fieldEns.addAll(getGroupFieldEnList(node)); + break; + case 4://评分卡 nodeJson直接取 + fieldEns.addAll(getScorecardFieldEnList(node)); + break; + case 5://黑名单 nodeJson 根据nodeId取关联表查询内外部名单库id, + case 6://白名单 nodeJson 根据nodeId取关联表查询内外部名单库id, + fieldEns.addAll(getListDbFieldEnList(node)); + break; + case 7://分流,无字段 + + break; + case 9://决策选项 nodeJson.input[]字段对象 + fieldEns.addAll(getDecisionOptionsFieldEnList(node)); + break; + case 14://子引擎 nodeJson中直接为引擎id取运行中版本(t_engine_version中boot_state为1的是运行版本) + fieldEns.addAll(getChildEngineFieldEnList(node)); + break; + case 15://模型 nodeJson取模型id + fieldEns.addAll(getModelsFieldEnList(node)); + break; + case 16://决策表 nodeJson取决策表id + fieldEns.addAll(getDecisionTablesFieldEnList(node)); + break; + case 17://决策树 + fieldEns.addAll(getDecisionTreeFieldEnList(node)); + break; + case 18://远程调用 + break; + case 19://聚合节点 + break; + case 20://冠军挑战节点 + break; + } + return fieldEns; + } + + private Set getRuleFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + String nodeJson = node.getNodeJson(); + if (nodeJson == null || "".equals(nodeJson)) { + return fieldEns; + } + JSONObject ruleMap = JSON.parseObject(nodeJson); + Integer groupType = ruleMap.getInteger("groupType"); + List maps = new ArrayList<>(); + Object o; + if (groupType == 1) { + o = JSON.parseObject(ruleMap.get("mutexGroup").toString(), Map.class).get("rules"); + maps = JSON.parseArray(JSON.toJSONString(o), JSONObject.class); + } else if (groupType == 2) { + o = JSON.parseObject(ruleMap.get("executeGroup").toString(), Map.class).get("rules"); + maps = JSON.parseArray(JSON.toJSONString(o), JSONObject.class); + } else { + return fieldEns; + } + + + for (JSONObject map : maps) { + Long id = map.getLong("userId"); + Long ruleVersionId = map.getLong("ruleVersionId"); + int difficulty = map.getIntValue("difficulty"); + switch (difficulty){ + case 2: + fieldEns.addAll(ruleVersionService.queryFieldEnByVersionId(ruleVersionId)); + break; + case 3: + fieldEns.addAll(ruleScriptVersionService.queryFieldEnByVersionId(ruleVersionId)); + break; + } + } + return fieldEns; + } + + private Set getGroupFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + String nodeJson = node.getNodeJson(); + if (nodeJson == null || "".equals(nodeJson)) { + return fieldEns; + } + Map groupMap = JSON.parseObject(nodeJson, Map.class); + List maps = JSON.parseArray(JSON.toJSONString(groupMap.get("fields")), Map.class); + if (maps == null || maps.size() == 0) { + return fieldEns; + } + for (Map map : maps) { + Object fieldCode = map.get("fieldCode"); + if (fieldCode != null) { + fieldEns.add(fieldCode.toString()); + } + } + return fieldEns; + } + + private Set getScorecardFieldEnList(EngineNode node) { + String nodeJson = node.getNodeJson(); + Set fieldEns = new HashSet<>(); + if (StringUtils.isBlank(nodeJson)) { + return fieldEns; + } + List versionIds = EngineNodeJsonUtil.getExecuteIdList(node, "versionId"); + if (versionIds==null||versionIds.isEmpty()){ + return fieldEns; + } + for (Long versionId : versionIds) { + if (versionId!=null&&versionId>0){ + fieldEns.addAll(scorecardVersionService.queryFieldEnByVersionId(versionId)); + } + } + return fieldEns; + } + + private Set getListDbFieldEnList(EngineNode node) { + String nodeJson = node.getNodeJson(); + Set fieldEns = new HashSet<>(); + if (StringUtils.isBlank(nodeJson)) { + return fieldEns; + } + List listDbIds = EngineNodeJsonUtil.getExecuteIdList(node, "listDbId"); + for (Long listDbId : listDbIds) { + fieldEns.addAll(listDbService.queryFieldEnsByListDbIds(listDbId)); + } + return fieldEns; + } + + private Set getDecisionOptionsFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + String nodeJson = node.getNodeJson(); + if (nodeJson == null || "".equals(nodeJson)) { + return fieldEns; + } + Map groupMap = JSON.parseObject(nodeJson, Map.class); + List maps = JSON.parseArray(JSON.toJSONString(groupMap.get("input")), JSONObject.class); + for (JSONObject map : maps) { + long nodeType = map.getLongValue("nodeType"); + Object fieldCode = map.getString("field_code"); + if (nodeType<0 && fieldCode != null) { + fieldEns.add(fieldCode.toString()); + } + } + return fieldEns; + } + + private Set getChildEngineFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + String nodeJson = node.getNodeJson(); + if (nodeJson == null || "".equals(nodeJson)) { + return fieldEns; + } + String[] split = nodeJson.split(","); + for (String s : split) { + List versionList = versionService.getEngineVersionListByEngineIdV2(Long.valueOf(s)); + for (EngineVersion version : versionList) { + Integer bootState = version.getBootState(); + if (bootState == null || bootState == 0) { + continue; + } else if (bootState == 1) { + fieldEns.addAll(this.getFieldEnByEngineVersion(version)); + } + } + } + return fieldEns; + } + + private Set getModelsFieldEnList(EngineNode node) { + + Set fieldEns = new HashSet<>(); + List versionIds = EngineNodeJsonUtil.getExecuteIdList(node, "modelId"); + if (versionIds==null||versionIds.isEmpty()){ + return fieldEns; + } + for (Long versionId : versionIds) { + fieldEns.addAll(modelsService.queryFieldEnByModelsId(versionId.intValue())); + } + return fieldEns; + } + + private Set getDecisionTablesFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + List versionIds = EngineNodeJsonUtil.getExecuteIdList(node, "versionId"); + if (versionIds==null||versionIds.isEmpty()){ + return fieldEns; + } + for (Long versionId : versionIds) { + fieldEns.addAll(decisionTablesService.queryFieldEnByDecisionTablesVersionId(versionId)); + } + return fieldEns; + } + + private Set getDecisionTreeFieldEnList(EngineNode node) { + Set fieldEns = new HashSet<>(); + List versionIds = EngineNodeJsonUtil.getExecuteIdList(node, "versionId"); + if (versionIds==null||versionIds.isEmpty()){ + return fieldEns; + } + for (Long versionId : versionIds) { + fieldEns.addAll(decisionTreeService.queryFieldEnByVersionId(versionId)); + } + return fieldEns; + } + + @Override + public Engine getEngineById(Long id) { + Engine engine = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_ENGINE, id); + engine = redisManager.getByPrimaryKey(key, Engine.class); + } else { + engine = engineMapper.selectById(id); + } + + return engine; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineVersionServiceImpl.java new file mode 100644 index 0000000..736e57e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/risk/impl/EngineVersionServiceImpl.java @@ -0,0 +1,292 @@ +package com.fibo.ddp.common.service.enginex.risk.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.enginex.risk.EngineNodeMapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineVersionMapper; +import com.fibo.ddp.common.model.approval.Approval; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.approval.ApprovalConfigService; +import com.fibo.ddp.common.service.approval.ApprovalService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.utils.constant.ApprovalConsts; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.enginex.EngineConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineMsg; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class EngineVersionServiceImpl implements EngineVersionService { + + @Autowired + private EngineVersionMapper engineVersionMapper; + @Autowired + private EngineNodeMapper engineNodeMapper; + @Resource + private ApprovalService approvalService; + @Resource + private ApprovalConfigService approvalConfigService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + @Transactional + public Map applyDeployEngine(Long versionId) { + boolean isApproval = approvalConfigService.checkApproval(ApprovalConsts.ApprovalType.DECISION_FLOW_VERSION_DEPLOY); + Map resultMap = new HashMap<>(); + resultMap.put("versionId", versionId); + if (!isApproval){ + int count = this.deployEngine(versionId); + if (count == 1) { + resultMap.put("status", EngineMsg.STATUS_SUCCESS); + resultMap.put("msg", EngineMsg.DEPLOY_SUCCESS); + } else { + resultMap.put("status", EngineMsg.STATUS_FAILED); + resultMap.put("msg", EngineMsg.DEPLOY_FAILED); + } + }else { + int b = engineVersionMapper.updateBootState(versionId, EngineConst.BOOT_STATE_DEPLOY_APPLY); + //TODO需要存储审批表内容 + Approval approval = new Approval(); + approval.setApplyType(ApprovalConsts.ApprovalType.DECISION_FLOW_VERSION_DEPLOY); + JSONObject detail = new JSONObject(); + detail.put("engineVersionId",versionId); + approval.setApplyDetail(JSON.toJSONString(detail)); + JSONObject desc = new JSONObject(); + desc.put("remark","决策流版本发布申请"); + approval.setApplyDesc(JSON.toJSONString(desc)); + approvalService.addApproval(approval); + resultMap.put("status", EngineMsg.STATUS_WAIT); + resultMap.put("msg", EngineMsg.DEPLOY_WAIT); + } + return resultMap; + } + + @Override + @Transactional + public boolean applyDeployFail(Long versionId) { + engineVersionMapper.updateBootState(versionId,EngineConst.BOOT_STATE_UNDEPLOY); + return true; + } + + @Override + @Transactional + public boolean approvalCallBack(Long versionId, int result) { + switch (result){ + //通过 + case ApprovalConsts.ApplyStatus + .PASS: + this.deployEngine(versionId); + break; + //拒绝 + case ApprovalConsts.ApplyStatus + .DENY: + this.applyDeployFail(versionId); + break; + //取消 + case ApprovalConsts.ApplyStatus + .CANCEL: + + break; + case ApprovalConsts.ApplyStatus + .WAIT: + + break; + } + + return true; + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + @Transactional + @Override + public int deployEngine(Long versionId) { + EngineVersion engineVersion = engineVersionMapper.selectByPrimaryKey(versionId); + int count = 0; + if (engineVersion != null) { + //获取当前引擎编号 + long engineId = engineVersion.getEngineId(); + //查看是否有正在运行的版本,如果有,将其模型设置为未部署 + engineVersionMapper.undeployVersion(engineId); + //当前版本 + int version = engineVersion.getVersion(); + //获取当前子版本 + int subVersion = engineVersion.getSubVersion(); + //插入完之后清除之前版本下的所有小版本 + Map map = new HashMap(); + map.put("engineId", engineId); + map.put("version", version); + if (subVersion != 0) { + //获取当前引擎的最大版本 + EngineVersion latestEngineVersion = engineVersionMapper.getLatestEngineVersion(engineVersion); + //说明此版本为小版本,则需要生成大版本 + engineVersion.setVersion(latestEngineVersion.getVersion() + 1); + engineVersion.setSubVersion(0); + engineVersion.setBootState(EngineConst.BOOT_STATE_DEPLOY); + count = engineVersionMapper.updateByPrimaryKeySelective(engineVersion); + if (count == 1) { + engineVersionMapper.cleanSubVersionByVersion(map); + } + } else { + //说明此版本为大版本,将boot_state值置为1:正在运行 + engineVersion.setBootState(EngineConst.BOOT_STATE_DEPLOY); + count = engineVersionMapper.updateByPrimaryKeySelective(engineVersion); + } + } + return count; + } + + @Override + public int undeployEngine(Long versionId) { + EngineVersion engineVersion = engineVersionMapper.selectByPrimaryKey(versionId); + int count = 0; + if (engineVersion != null) { + engineVersion.setBootState(EngineConst.BOOT_STATE_UNDEPLOY); + count = engineVersionMapper.updateByPrimaryKeySelective(engineVersion); + } + return count; + } + + // V2 + @Override + public List getEngineVersionListByEngineIdV2(Long engineId) { + return engineVersionMapper.getEngineVersionListByEngineIdV2(engineId); + } + + @Override + public int update(EngineVersion engineVersion) { + return engineVersionMapper.updateByPrimaryKey(engineVersion); + } + + @Override + public EngineVersion getLatestEngineSubVersion(EngineVersion engineVersion) { + return engineVersionMapper.getLatestEngineSubVersion(engineVersion); + } + + @Override + public Long saveEngineVersion(EngineVersion engineVersion, List nodeList) { + int count = engineVersionMapper.insertEngineVersionAndReturnId(engineVersion); + if (count == 1) { + long versionId = engineVersion.getVersionId(); + //开始插入节点信息及知识库映射信息 + for (EngineNode engineNode : nodeList) { + // 清空原有父节点id + engineNode.setParentId(null); + engineNode.setVersionId(versionId); + if (engineNode.getNodeType().intValue() == NodeTypeEnum.POLICY.getValue() || engineNode.getNodeType().intValue() == NodeTypeEnum.NODE_COMPLEXRULE.getValue()) { + engineNodeMapper.insertNodeAndReturnId(engineNode); + } else if (engineNode.getNodeType().intValue() == NodeTypeEnum.SCORECARD.getValue()) { + engineNodeMapper.insertNodeAndReturnId(engineNode); + } else if (engineNode.getNodeType().intValue() == NodeTypeEnum.BLACKLIST.getValue() || engineNode.getNodeType().intValue() == NodeTypeEnum.WHITELIST.getValue()) { + //插入节点并且返回节点编号 + engineNodeMapper.insertNodeAndReturnId(engineNode); + } else { + //普通节点就直接插入 + engineNodeMapper.insert(engineNode); + } + } + return versionId; + } + return new Long(0); + } + + @Override + public EngineVersion selectByPrimaryKey(Long versionId) { + return engineVersionMapper.selectByPrimaryKey(versionId); + } + + @Override + public boolean clear(Long versionId) { + // 所有节点分为四类: + // 第一类开始节点,只需要更新nextNode, + // 第二类评分卡和规则节点,需要删除知识库映射关系, + // 第三类,黑白名单需要删除字段映射关系, + // 第四类,普通节点直接删除 + EngineNode startNode = null; + List knowledges = new ArrayList<>(); + List blackWhites = new ArrayList<>(); + List commons = new ArrayList<>(); + + // 第一步,获取版本所有节点 + List engineNodes = engineNodeMapper.getEngineNodeListByEngineVersionId(versionId); + if (CollectionUtil.isNotNullOrEmpty(engineNodes)) { + for (EngineNode engineNode : engineNodes) { + switch (engineNode.getNodeType()) { + case 1: + //开始节点 + startNode = engineNode; + startNode.setNextNodes(""); + break; + case 2: + case 4: + case 13: + //规则,评分卡 + knowledges.add(engineNode.getNodeId()); + commons.add(engineNode.getNodeId()); + break; + case 5: + case 6: + //黑白名单 + blackWhites.add(engineNode.getNodeId()); + commons.add(engineNode.getNodeId()); + break; + default: + commons.add(engineNode.getNodeId()); + break; + } + } + + //第二步,清除评分卡,规则节点映射信息 + if (CollectionUtil.isNotNullOrEmpty(knowledges)) { + // nodeKnowledgeMapper.deleteKnowledgesBatchByNodeIds(knowledges); + } + //第四步,删除节点 + if (CollectionUtil.isNotNullOrEmpty(commons)) { + engineNodeMapper.deleteNodesByNodeIds(commons); + } + //第五步,将start节点的nextNode置空 + if (startNode != null) { + engineNodeMapper.updateNextNodes(startNode); + } + } else { + return false; + } + return true; + } + + @Override + public List getEngineVersionByEngineId(Map paramMap) { + return engineVersionMapper.getEngineVersionByEngineId(paramMap); + } + + @Override + public EngineVersion getRunningVersion(Long engineId) { + EngineVersion engineVersion = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_ENGINE_VERSION, engineId); + List list = redisManager.getByForeignKey(key, EngineVersion.class); + Optional optional = list.stream().filter(item -> item.getBootState() == 1).findFirst(); + if(optional.isPresent()){ + engineVersion = optional.get(); + } + } else { + engineVersion = engineVersionMapper.getRunningVersion(engineId); + } + + return engineVersion; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeJsonUtil.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeJsonUtil.java new file mode 100644 index 0000000..d45aa77 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeJsonUtil.java @@ -0,0 +1,63 @@ +package com.fibo.ddp.common.service.enginex.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.utils.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class EngineNodeJsonUtil { + // 解析nodeJson + public final static List getExecuteListFromNodeJson(EngineNode engineNode) { + JSONObject nodeJson = JSON.parseObject(engineNode.getNodeJson()); + String strategyStr = null; + switch (engineNode.getNodeType()) { +// case 2://规则集 +// strategyStr = JSON.toJSONString(nodeJson.getJSONObject("executeGroup").get("strategyList")); +// break; + case 4://评分卡 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("scorecardList")); + break; + case 5://名单库 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("listDbList")); + break; + case 15://模型 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("modelList")); + break; + case 16://决策表 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("decisionTableList")); + break; + case 17://决策树 + strategyStr = JSON.toJSONString(nodeJson.getJSONArray("decisionTreeList")); + break; + + } + List maps = JSON.parseArray(strategyStr, Map.class); + return maps; + } + + //获取执行用的id列表 + public final static List getExecuteIdList(EngineNode engineNode, String idKey) { + List maps = EngineNodeJsonUtil.getExecuteListFromNodeJson(engineNode); + List executeIdList = new ArrayList<>(); + if (maps != null && maps.size() > 0) { + for (Map map : maps) { + if (map.containsKey(idKey)) { + Object o = map.get(idKey); + if (o != null){ + Long id = StringUtil.getStrTolong(String.valueOf(o)); + if (id!=null&&id!=0){ + executeIdList.add(id); + } + } + + } + } + } + return executeIdList; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtil.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtil.java new file mode 100644 index 0000000..80d91b0 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtil.java @@ -0,0 +1,509 @@ +package com.fibo.ddp.common.service.enginex.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineOperator; +import com.fibo.ddp.common.utils.util.runner.JevalUtil; +import com.fibo.ddp.common.utils.util.StringUtil; + +import java.util.HashMap; +import java.util.Map; + +import static com.fibo.ddp.common.service.enginex.util.EngineNodeUtilV2.convertClassifyV2; +import static com.fibo.ddp.common.service.enginex.util.EngineNodeUtilV2.convertDecisionV2; + +public class EngineNodeUtil { + + /** + * 组装规则节点参数信息 + * @param param + * @return + */ + public static EngineNode boxEngineNode(Map param){ + //组装节点基本信息 + EngineNode engineNode = boxEngineNode_Common(param); + return engineNode; + } + + /** + * 组装一个引擎节点的基本参数 + * @param param + * @return + */ + private static EngineNode boxEngineNode_Common(Map param){ + //节点对应版本 + Long versionId = Long.parseLong((String)param.get("initEngineVersionId")); + //父节点 + String parentId = (String)param.get("parentId"); + //节点名称 + String nodeName = (String) param.get("nodeName"); + //节点nodeCode + String nodeCode = (String) param.get("nodeCode"); + //节点顺序 + int nodeOrder = Integer.parseInt(param.get("nodeOrder").toString()) ; + //节点类型 + int nodeType = Integer.parseInt(param.get("nodeType").toString()) ; + //节点横坐标 + double nodeX = Double.parseDouble(param.get("nodeX").toString()); + //节点纵坐标 + double nodeY = Double.parseDouble(param.get("nodeY").toString()); + //下个节点nodeCode + String nextNodes = (String)param.get("nextNodes"); + //nodeJson + String nodeJson = (String)param.get("nodeJson"); + String snapshot = (String)param.get("snapshot"); + EngineNode engineNode = new EngineNode(); + engineNode.setVersionId(versionId); + engineNode.setNodeName(nodeName); + engineNode.setNodeCode(nodeCode); + engineNode.setNodeOrder(nodeOrder); + engineNode.setNodeType(nodeType); + engineNode.setNodeJson(nodeJson); + engineNode.setNodeX(nodeX); + engineNode.setNodeY(nodeY); + engineNode.setNextNodes(nextNodes); + engineNode.setParentId(parentId); + //snapshot节点快照 + engineNode.setSnapshot(snapshot); + //组装特殊节点的nodeScript + convertNodeScript(engineNode); + + return engineNode; + } + + /** + * 组装一个引擎节点的基本参数 + * @param engineNode + * @return + */ + public static EngineNode boxEngineNodeJson(EngineNode engineNode){ + //组装特殊节点的nodeScript + convertNodeScript(engineNode); + return engineNode; + } + + public static void convertNodeScript(EngineNode node){ + int nodeType = node.getNodeType(); + switch (nodeType) { + case 2: + //规则集 + EngineNodeUtilV2.convertRule(node); + break; + case 3: + //分群 + // convertClassify(node); + convertClassifyV2(node); // 调用 V2 + break; + case 4://评分卡 + case 5://名单库 + case 15://模型 + case 16://决策表 + case 17://决策树 + EngineNodeUtilV2.convertRule(node); + break; + case 7: + //沙盒节点 + convertSandBox(node); + break; + case 9: + //决策选项 + // convertDecision(node); + convertDecisionV2(node); // 调用 V2 + break; + default: + break; + } + } + + /** + * 处理沙河比例 + * @param node + */ + private static void convertSandBox(EngineNode node) { + String nodeJson = node.getNodeJson(); + if(StringUtil.isValidStr(nodeJson)){ + JSONArray jsonArray = JSONArray.parseArray(nodeJson); + if(jsonArray != null && !jsonArray.isEmpty()){ + int size = jsonArray.size(); + int sum = 0; + for (int i = 0; i < size; i++) { + sum+=jsonArray.getJSONObject(i).getIntValue("proportion"); + } + //把这个值put进每个json + for (int i = 0; i < size; i++) { + jsonArray.getJSONObject(i).put("sum", sum); + } + } + node.setNodeScript(jsonArray.toString()); + } + } + + /** + * 处理分群 + * @param node + */ + private static void convertClassify(EngineNode node){ + String nodeJson = node.getNodeJson(); + if(StringUtil.isValidStr(nodeJson)){ + JSONObject jsonObject = JSONObject.parseObject(nodeJson); + if(jsonObject != null && !jsonObject.isEmpty()){ + JSONArray conditions = jsonObject.getJSONArray("conditions"); + if(null != conditions && !conditions.isEmpty()){ + JSONArray conditionArray = processClassifyConditions(conditions); + JSONObject resultjson = new JSONObject(); + resultjson.put("fields", jsonObject.getJSONArray("fields")); + resultjson.put("conditions", conditionArray); + node.setNodeScript(resultjson.toString()); + } + } + } + } + + /** + * 处理分群条件 + * @param conditions + * @return + */ + private static JSONArray processClassifyConditions(JSONArray conditions){ + JSONArray resultArray = new JSONArray(); + int size = conditions.size(); + JSONObject condition = null; + JSONObject resultJson = null; + String nextNode = ""; + for (int i = 0; i < size; i++) { + condition = conditions.getJSONObject(i); + //获取nextNode,如果nextNode为空,则跳过 + nextNode = condition.getString("nextNode"); + if(null == nextNode || CommonConst.STRING_EMPTY.equals(nextNode)){ + continue; + }else{ + //开始解析公式 + JSONArray formulas = condition.getJSONArray("formulas"); + if(formulas != null && !formulas.isEmpty()){ + resultJson = new JSONObject(); + resultJson.put("nextNode", nextNode); + resultJson.put("formula", processClassifyFormulas(formulas)); + resultArray.add(resultJson); + }else{ + resultJson = new JSONObject(); + resultJson.put("nextNode", nextNode); + resultJson.put("formula", ""); + resultArray.add(resultJson); + } + } + } + return resultArray; + } + + /** + * 处理分群公式 + * @param formulas + * @return + */ + private static String processClassifyFormulas(JSONArray formulas){ + int size = formulas.size(); + if(size == 1){ + return convertFormula(formulas.getJSONObject(0)); + } + StringBuffer sb = new StringBuffer(); + JSONObject formula = null; + for (int i = 0; i < size; i++) { + formula = formulas.getJSONObject(i); + if(i == 0){ + sb.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(convertFormula(formula)); + sb.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + }else{ + sb.append(CommonConst.SYMBOL_BLANK); + sb.append(formulas.getJSONObject(i-1).getString("sign")); + sb.append(CommonConst.SYMBOL_BLANK); + sb.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(convertFormula(formula)); + sb.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } + } + return sb.toString(); + } + + /** + * 转化公式 + * @param formula + * @return + */ + private static String convertFormula(JSONObject formula){ + //公式一 + String fieldCode1 = EngineOperator.OPERATOR_VARIABLE_LEFT+formula.getString("field_code1")+EngineOperator.OPERATOR_VARIABLE_RIGHT; + String operator1 = formula.getString("operator1"); + Object value1 = formula.get("value1"); + //公式一和公式二之间的关系 + String relativeOperator = formula.getString("relative_operator"); + //公式二 + String fieldCode2 = EngineOperator.OPERATOR_VARIABLE_LEFT+formula.getString("field_code2")+EngineOperator.OPERATOR_VARIABLE_RIGHT; + String operator2 = formula.getString("operator2"); + Object value2 = formula.get("value2"); + StringBuffer sb = new StringBuffer(); + if(StringUtil.isValidStr(relativeOperator)){ + sb.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(convertOperator(fieldCode1, operator1, value1)); + sb.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + sb.append(CommonConst.SYMBOL_BLANK); + sb.append(relativeOperator); + sb.append(CommonConst.SYMBOL_BLANK); + sb.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(convertOperator(fieldCode2, operator2, value2)); + sb.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + }else{ + sb.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(convertOperator(fieldCode1, operator1, value1)); + sb.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } + return sb.toString(); + } + + /** + * 特殊处理字符串函数(等于不等于,包含不包含) + * @param variable + * @param operator + * @param value + * @return + */ + private static String convertOperator(String variable,String operator,Object value){ + StringBuffer sb = new StringBuffer(); + //凡是contians,notContains,equals,notEquals + if(variable.equalsIgnoreCase(EngineOperator.OPERATOR_CONTAINS_STRING) + || variable.equalsIgnoreCase(EngineOperator.OPERATOR_UNCONTAINS_STRING) + || variable.equalsIgnoreCase(EngineOperator.OPERATOR_EQUALS_STRING) + || variable.equalsIgnoreCase(EngineOperator.OPERATOR_UNEQUALS_STRING)){ + sb.append(operator).append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(variable).append(CommonConst.SYMBOL_COMMA).append(value).append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + }else{ + sb.append(variable).append(operator).append(value); + } + return sb.toString(); + } + + /** + * 处理决策选项 + * @param node + */ + private static void convertDecision(EngineNode node){ + String nodeJson = node.getNodeJson(); + if(StringUtil.isValidStr(nodeJson)){ + JSONObject jsonObject = JSONObject.parseObject(nodeJson); + if(jsonObject.containsKey("inputs")){ + //获取变量个数 + int inputs = jsonObject.getInteger("inputs"); + switch (inputs) { + case 1: + //单个决策变量 + handleSingleDecisionVariable(node,jsonObject); + break; + case 2: + //两个决策变量 + handleDoubleDecisionVariables(node,jsonObject); + break; + case 3: + //三个或以上决策变量 + handleMoreThanTripleDecisionVariables(node,jsonObject); + break; + default: + break; + } + } + } + } + + /** + * 决策节点单个决策变量解析 + * @param engineNode + * @param jsonObject + */ + private static void handleSingleDecisionVariable(EngineNode engineNode,JSONObject jsonObject){ + JSONObject resultJson = new JSONObject(); + JSONArray realConditions = new JSONArray(); + int conditionType = jsonObject.getIntValue("condition_type"); + if(conditionType == 2){ + engineNode.setNodeScript(engineNode.getNodeJson()); + }else if(conditionType == 1){ + //获取条件 + JSONArray conditions = jsonObject.getJSONArray("conditions"); + if(null != conditions && !conditions.isEmpty()){ + int size = conditions.size(); + JSONObject condition = null; + for (int i = 0; i < size; i++) { + condition = conditions.getJSONObject(i); + //获取formula + JSONArray subArray = condition.getJSONArray("formula"); + if(null != subArray && !subArray.isEmpty()){ + JSONObject result = new JSONObject(); + result.put("result", condition.get("result")); + result.put("resultKey", condition.get("resultKey")); + int subSize = subArray.size(); + JSONObject subJson = null; + StringBuffer expression = new StringBuffer(); + for (int j = 0; j < subSize; j++) { + subJson = subArray.getJSONObject(j); + if(j != 0){ + expression.append(CommonConst.SYMBOL_BLANK); + if(EngineOperator.OPERATOR_AND_STRING_RELATION.equalsIgnoreCase(subArray.getJSONObject(j).getString("sign"))){ + expression.append(EngineOperator.OPERATOR_AND_RELATION); + }else if(EngineOperator.OPERATOR_OR_STRING_RELATION.equalsIgnoreCase(subArray.getJSONObject(j).getString("sign"))){ + expression.append(EngineOperator.OPERATOR_OR_RELATION); + } + expression.append(CommonConst.SYMBOL_BLANK); + } + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + String operator = subJson.getString("operator"); + if(jsonObject.getJSONArray("input").getJSONObject(0).getIntValue("field_type") == 2){ + expression.append(operator); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT+subJson.getString("field_code")+EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); + expression.append("'"+subJson.get("result")+"'"); + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + }else{ + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT+subJson.getString("field_code")+EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_BLANK); + expression.append(operator); + expression.append(CommonConst.SYMBOL_BLANK); + expression.append(subJson.get("result")); + } + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } + result.put("formula", expression.toString()); + realConditions.add(result); + } + } + resultJson.put("inputs", jsonObject.getIntValue("inputs")); + resultJson.put("condition_type", jsonObject.getIntValue("condition_type")); + resultJson.put("input", jsonObject.getJSONArray("input")); + resultJson.put("output", jsonObject.getJSONObject("output")); + resultJson.put("conditions", realConditions); + } + engineNode.setNodeScript(resultJson.toString()); + } + } + + /** + * 处理两个决策变量 + * @param engineNode + * @param jsonObject + */ + private static void handleDoubleDecisionVariables(EngineNode engineNode,JSONObject jsonObject){ + JSONObject resultJson = new JSONObject(); + JSONArray resultArray = new JSONArray(); + //获取类型 + int conditionType = jsonObject.getIntValue("condition_type"); + //获取条件 + JSONArray conditions = jsonObject.getJSONArray("conditions"); + //判断输出字段类型 + JSONArray inputArray = jsonObject.getJSONArray("input"); + Map inputFieldTypeMap = new HashMap(); + if(inputArray != null && !inputArray.isEmpty()){ + for (int i = 0; i < inputArray.size(); i++) { + inputFieldTypeMap.put(inputArray.getJSONObject(i).getString("field_code"), inputArray.getJSONObject(i).getIntValue("field_type")); + } + } + if(null != conditions && !conditions.isEmpty()){ + if(conditionType == 1){ + int size = conditions.size(); + JSONObject condition = null; + for (int i = 0; i < size; i++) { + condition = conditions.getJSONObject(i); + //获取result + Object result = condition.get("result"); + Object resultKey = condition.get("resultKey"); + JSONObject formula = condition.getJSONObject("formula"); + StringBuffer expression = new StringBuffer(); + //eg:(#{a}>3 && #{b} <45) + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + + //字段一是数字 + if(inputFieldTypeMap.get(formula.getString("field_code1")) == 1){ + expression.append(JevalUtil.getNumericInterval(formula.getString("expression1"), formula.getString("field_code1"))); + } + + //字段1是枚举 + if(inputFieldTypeMap.get(formula.getString("field_code1")) == 3){ + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT); + expression.append(formula.getString("field_code1")); + expression.append(EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(EngineOperator.OPERATOR_EQUALS_RELATION); + expression.append(formula.getString("expression1")); + } + + //字段1是字符串 + if(inputFieldTypeMap.get(formula.getString("field_code1")) == 2){ + expression.append(EngineOperator.OPERATOR_EQUALS_STRING); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT); + expression.append(formula.getString("field_code1")); + expression.append(EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); + expression.append("'"+formula.getString("expression1")+"'"); + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } + + expression.append(CommonConst.SYMBOL_BLANK); + expression.append(EngineOperator.OPERATOR_AND_RELATION); + expression.append(CommonConst.SYMBOL_BLANK); + + //字段2是数字 + if(inputFieldTypeMap.get(formula.getString("field_code2")) == 1){ + expression.append(JevalUtil.getNumericInterval(formula.getString("expression2"), formula.getString("field_code2"))); + } + + //字段3是枚举 + if(inputFieldTypeMap.get(formula.getString("field_code2")) == 3){ + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT); + expression.append(formula.getString("field_code2")); + expression.append(EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(EngineOperator.OPERATOR_EQUALS_RELATION); + expression.append(formula.getString("expression2")); + } + + //字段2是字符串 + if(inputFieldTypeMap.get(formula.getString("field_code2")) == 2){ + expression.append(EngineOperator.OPERATOR_EQUALS_STRING); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT); + expression.append(formula.getString("field_code2")); + expression.append(EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); + expression.append("'"+formula.getString("expression2")+"'"); + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } + + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + + JSONObject resultSubJson = new JSONObject(); + resultSubJson.put("result", result); + resultSubJson.put("resultKey", resultKey); + resultSubJson.put("formula", expression.toString()); + resultArray.add(resultSubJson); + } + resultJson.put("inputs", jsonObject.getIntValue("inputs")); + resultJson.put("condition_type", jsonObject.getIntValue("condition_type")); + resultJson.put("input", jsonObject.getJSONArray("input")); + resultJson.put("output", jsonObject.getJSONObject("output")); + resultJson.put("conditions", resultArray); + engineNode.setNodeScript(resultJson.toString()); + }else{ + //公式 + engineNode.setNodeScript(jsonObject.toString()); + } + } + } + + /** + * 处理三个或以上决策变量 + * @param engineNode + * @param jsonObject + */ + private static void handleMoreThanTripleDecisionVariables(EngineNode engineNode,JSONObject jsonObject){ + engineNode.setNodeScript(jsonObject.toString()); + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtilV2.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtilV2.java new file mode 100644 index 0000000..3ea9a6d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineNodeUtilV2.java @@ -0,0 +1,438 @@ +package com.fibo.ddp.common.service.enginex.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineOperator; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +public class EngineNodeUtilV2 { + + //校验规则集节点是否选择了终止条件的规则 + public static boolean checkRuleNodeUnTerminal(EngineNode node, JSONObject terminationInfo){ + // 终止规则选择后,终止条件为必填 +// if (node.getNodeType()==2){ + //规则集类型 + JSONArray selectedRule = terminationInfo.getJSONArray("selectedRule"); + if(selectedRule == null || selectedRule.isEmpty()){ + return true; + } +// } + return false; + } + + // 规则集表达式转换 + public static void convertRule(EngineNode node) { + if(StringUtil.isBlank(node.getNodeJson())){ + return; + } + // 初始化nodeScript + JSONObject nodeScript = JSONObject.parseObject(node.getNodeJson()); + node.setNodeScript(nodeScript.toJSONString()); + + JSONObject nodeJson = JSONObject.parseObject(node.getNodeJson()); + JSONObject terminationInfo = nodeJson.getJSONObject("terminationInfo"); + +// JSONArray selectedRule = terminationInfo.getJSONArray("selectedRule"); + // 对于规则集节点终止规则选择后,终止条件为必填 + if(terminationInfo==null||checkRuleNodeUnTerminal(node,terminationInfo)){ + return; + } + JSONArray conditions = terminationInfo.getJSONArray("conditions"); + if(conditions == null || conditions.isEmpty()){ + return; + } + Map fieldTypeMap = new HashMap<>(); + StringBuffer formula = new StringBuffer(); + for(int i = 0; i < conditions.size(); i++){ + JSONObject jsonObject = conditions.getJSONObject(i); + if (StringUtils.isBlank(jsonObject.getString("operator"))) { + continue; + } + fieldTypeMap.put(jsonObject.getString("fieldCode"),jsonObject.getInteger("valueType")); + formula.append(convertRuleTerminalFormula(jsonObject)); + // 最后一个不拼接 + if(i < conditions.size() - 1){ + formula.append(jsonObject.getString("relativeOperator")); + } + } + + // 覆盖nodeScript的conditions + JSONObject scriptTerminationInfo = nodeScript.getJSONObject("terminationInfo"); + scriptTerminationInfo.put("conditions", formula.toString()); + scriptTerminationInfo.put("fieldTypeMap", fieldTypeMap); + node.setNodeScript(nodeScript.toJSONString()); + } + + // 规则集终止条件表达式转换 + private static String convertRuleTerminalFormula(JSONObject formula) { + String fieldCode = formula.getString("fieldCode"); + String operator = formula.getString("operator"); + Object value = formula.get("value"); + int valueType = formula.getInteger("valueType"); + + StringBuffer expression = new StringBuffer(); + + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + switch (valueType) { + case 1: + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(operator); + expression.append(value); + break; + case 2: + operator = operator.replace("==", "equals") + .replace("!=", "notEquals"); + + expression.append(operator); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); // "," + expression.append("'" + value + "'"); // "'value'" + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + break; + default: + break; + } + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + + return expression.toString(); + } + + // 处理分群 V2 设置节点的 nodeScript + public static void convertClassifyV2(EngineNode node) { + + // 读取 nodeJson + String nodeJson = node.getNodeJson(); + + if (StringUtil.isValidStr(nodeJson)) { + + JSONObject jsonObject; + try { + jsonObject = JSONObject.parseObject(nodeJson); + } catch (com.alibaba.fastjson.JSONException e) { + // 此处可能会报 JSON转换异常 + throw new ApiException(ErrorCodeEnum.JSON_CAST_EXCEPTION.getCode(), ErrorCodeEnum.JSON_CAST_EXCEPTION.getMessage()); + } + + if (jsonObject != null && !jsonObject.isEmpty()) { + JSONArray conditions = jsonObject.getJSONArray("conditions"); + JSONArray fields = jsonObject.getJSONArray("fields"); + + if (null != conditions && !conditions.isEmpty()) { + JSONArray conditionArray = processClassifyConditionsV2(conditions, fields); + JSONObject resultjson = new JSONObject(); + + resultjson.put("fields", fields); + resultjson.put("conditions", conditionArray); + + node.setNodeScript(resultjson.toString()); // 设置 nodeScript + } + } + } + } + + + // 处理分群条件 + private static JSONArray processClassifyConditionsV2(JSONArray conditions, JSONArray fields) { + + JSONArray resultArray = new JSONArray(); // conditions的内容:数组 + JSONObject condition = null; + JSONObject resultJson = null; + + String nextNode = ""; + + // 循环 每一个分组 + for (int i = 0; i < conditions.size(); i++) { + + condition = conditions.getJSONObject(i); + + //获取nextNode,如果nextNode为空,则跳过 { 连线的时候才设置 } + nextNode = condition.getString("nextNode"); + + if (null == nextNode || CommonConst.STRING_EMPTY.equals(nextNode)) { + continue; + } else { + + // 开始解析 此分组里面的 formulas + JSONArray formulas = condition.getJSONArray("formulas"); + if (formulas != null && !formulas.isEmpty()) { + + resultJson = new JSONObject(); + resultJson.put("nextNode", nextNode); + resultJson.put("formula", processClassifyFormulasV2(formulas, fields)); // 设置nodeScript中formula的内容 + resultArray.add(resultJson); + } else { + resultJson = new JSONObject(); + resultJson.put("nextNode", nextNode); + resultJson.put("formula", ""); + resultArray.add(resultJson); + } + } + } + return resultArray; + } + + + // 处理分群公式(设置nodeScript中formula的内容) + private static String processClassifyFormulasV2(JSONArray formulas, JSONArray fields) { + + int size = formulas.size(); + + if (size == 1) { + return convertFormula(formulas.getJSONObject(0), fields); + } + + StringBuffer sb = new StringBuffer(); + JSONObject formula = null; + + for (int i = 0; i < size; i++) { + formula = formulas.getJSONObject(i); + + sb.append(convertFormula(formula, fields)); + // 最后一个不拼接 与或 连接符 + if (i < size - 1) { + sb.append(formula.getString("relative_operator")); + } + } + return sb.toString(); + } + + + // 转化公式 返回示例:(#{versionCode} >= 18) + private static String convertFormula(JSONObject formula, JSONArray fields) { + String fieldCode = formula.getString("field_code"); + String operator = formula.getString("operator"); + Object value = formula.get("value"); + + int valueType = 0; + for(int i = 0; i < fields.size(); i++){ + JSONObject jsonObject = fields.getJSONObject(i); + if(jsonObject.getString("fieldCode").equals(fieldCode)){ + valueType = jsonObject.getIntValue("valueType"); + } + } + + StringBuffer expression = new StringBuffer(); + + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + switch (valueType) { + case 1: + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(operator); + expression.append(value); + break; + case 2: + + operator = operator.replace("==", "equals") + .replace("!=", "notEquals"); + + expression.append(operator); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); // "," + expression.append("'" + value + "'"); // "'value'" + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + break; + default: + break; + } + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + + return expression.toString(); + } + + + // 特殊处理字符串函数(等于不等于,包含不包含) + private static String convertOperator(String fieldCode, String operator, Object value) { + StringBuffer sb = new StringBuffer(); + + // contians, notContains, equals, notEquals + // 示例: .... 或 fieldCode==value + if (fieldCode.equalsIgnoreCase(EngineOperator.OPERATOR_CONTAINS_STRING) + || fieldCode.equalsIgnoreCase(EngineOperator.OPERATOR_UNCONTAINS_STRING) + || fieldCode.equalsIgnoreCase(EngineOperator.OPERATOR_EQUALS_STRING) + || fieldCode.equalsIgnoreCase(EngineOperator.OPERATOR_UNEQUALS_STRING)) { + + sb.append(operator).append(EngineOperator.OPERATOR_LEFT_PARENTHESES); + sb.append(fieldCode).append(CommonConst.SYMBOL_COMMA).append(value).append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); + } else { + sb.append(fieldCode).append(operator).append(value); + } + return sb.toString(); + } + + + /** + * 处理决策选项 + * + * @param node + */ + public static void convertDecisionV2(EngineNode node) { + String nodeJson = node.getNodeJson(); + + if (nodeJson == null || nodeJson.trim().length() == 0) { + return; + } + + // JSONObject jsonObject = JSONObject.parseObject(nodeJson); + JSONObject jsonObject; + try { + jsonObject = JSONObject.parseObject(nodeJson); + } catch (com.alibaba.fastjson.JSONException e) { + // 此处可能会报 JSON转换异常 + throw new ApiException(ErrorCodeEnum.JSON_CAST_EXCEPTION.getCode(), ErrorCodeEnum.JSON_CAST_EXCEPTION.getMessage()); + } + + handleDecisionVariable(node, jsonObject); + +/* + if (jsonObject.containsKey("inputs")) { + //获取变量个数 + int inputs = jsonObject.getInteger("inputs"); + switch (inputs) { + case 1: + //单个决策变量 + handleSingleDecisionVariable(node, jsonObject); + break; + case 2: + //两个决策变量 + handleDoubleDecisionVariables(node, jsonObject); + break; + case 3: + //三个或以上决策变量 + handleMoreThanTripleDecisionVariables(node, jsonObject); + break; + default: + break; + } + } +*/ + + + } + + private static void handleDecisionVariable(EngineNode engineNode, JSONObject jsonObject) { + + JSONObject resultJson = new JSONObject(); + JSONArray realConditions = new JSONArray(); + + int conditionType = jsonObject.getIntValue("condition_type"); + + if (conditionType == 2) { + // conditionType 为 2 ,nodeJson 直接放入 nodeScript + engineNode.setNodeScript(engineNode.getNodeJson()); + } else if (conditionType == 1) { + + // 获取条件 + JSONArray conditions = jsonObject.getJSONArray("conditions"); + + if (null != conditions && !conditions.isEmpty()) { + int size = conditions.size(); + JSONObject condition = null; + + for (int i = 0; i < size; i++) { + condition = conditions.getJSONObject(i); + // 获取formula + JSONArray subArray = condition.getJSONArray("formula"); + if (null != subArray && !subArray.isEmpty()) { + JSONObject result = new JSONObject(); + result.put("result", condition.get("result")); + result.put("resultKey", condition.get("resultKey")); + int subSize = subArray.size(); + JSONObject subJson = null; + StringBuffer expression = new StringBuffer(); + + for (int j = 0; j < subSize; j++) { + subJson = subArray.getJSONObject(j); + String fieldCode = subJson.getString("field_code"); + // 字段存值类型,待选(0),数值型(1),字符型(2),枚举型(3),小数型(4) + int type = subJson.getInteger("valueType"); + + String operator = subJson.getString("operator"); + + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + switch (type) { + case 1: + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(operator); + expression.append(subJson.getString("result")); + break; + case 2: + + operator = operator.replace("==", "equals") + .replace("!=", "notEquals"); + + expression.append(operator); + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + fieldCode + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); // "," + expression.append("'" + subJson.getString("result") + "'"); // "'value'" + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + break; + default: + break; + } + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + + if (j < subSize - 1) { + expression.append(subJson.getString("sign")); + } + + /* + if (j != 0) { + expression.append(CommonConst.SYMBOL_BLANK); // " " + if (EngineOperator.OPERATOR_AND_STRING_RELATION.equalsIgnoreCase(subArray.getJSONObject(j).getString("sign"))) { // "AND" + expression.append(EngineOperator.OPERATOR_AND_RELATION); // "&&" + } else if (EngineOperator.OPERATOR_OR_STRING_RELATION.equalsIgnoreCase(subArray.getJSONObject(j).getString("sign"))) { // "OR" + expression.append(EngineOperator.OPERATOR_OR_RELATION); // "||" + } + expression.append(CommonConst.SYMBOL_BLANK); // " " + } + + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + String operator = subJson.getString("operator"); + + if (jsonObject.getJSONArray("input").getJSONObject(0).getIntValue("field_type") == 2) { // 数值型 + expression.append(operator); // ">", "<","==","!=" + expression.append(EngineOperator.OPERATOR_LEFT_PARENTHESES); // "(" + // "#{versionCode}" + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + subJson.getString("field_code") + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_COMMA); // "," + expression.append("'" + subJson.get("result") + "'"); + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + } else { + expression.append(EngineOperator.OPERATOR_VARIABLE_LEFT + subJson.getString("field_code") + EngineOperator.OPERATOR_VARIABLE_RIGHT); + expression.append(CommonConst.SYMBOL_BLANK); // " " + expression.append(operator); + expression.append(CommonConst.SYMBOL_BLANK); // " " + expression.append(subJson.get("result")); + } + expression.append(EngineOperator.OPERATOR_RIGHT_PARENTHESES); // ")" + */ + + } + + result.put("formula", expression.toString()); + realConditions.add(result); + } + } + + // resultJson.put("inputs", jsonObject.getIntValue("inputs")); + } + resultJson.put("condition_type", jsonObject.getIntValue("condition_type")); + resultJson.put("input", jsonObject.getJSONArray("input")); + resultJson.put("output", jsonObject.getJSONObject("output")); + resultJson.put("conditions", realConditions); + engineNode.setNodeScript(resultJson.toString()); + } + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineUtil.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineUtil.java new file mode 100644 index 0000000..4577907 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/enginex/util/EngineUtil.java @@ -0,0 +1,65 @@ +package com.fibo.ddp.common.service.enginex.util; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +public class EngineUtil { + + public static Map convertNodeList2Map(List nodes){ + Map nodeMap = new HashMap<>(); + if(CollectionUtil.isNotNullOrEmpty(nodes)){ + for (EngineNode engineNode : nodes) { + nodeMap.put(engineNode.getNodeId(), engineNode); + } + } + return nodeMap; + } + + + /** + * 将nodeList转化为Map,以nodeCode做Key + * @param nodes + * @return + */ + public static Map convertNodeList2MapNodeCodeKey(List nodes){ + Map nodeMap = new HashMap(); + if(CollectionUtil.isNotNullOrEmpty(nodes)){ + for (EngineNode engineNode : nodes) { + nodeMap.put(engineNode.getNodeCode(), engineNode); + } + } + return nodeMap; + } + + public static List getUpdateParentIdNodes(EngineNode engineNode,List nodeList){ + Map nodeMap = EngineUtil.convertNodeList2MapNodeCodeKey(nodeList); + //获取当前节点的nextNodes + String nextNodes = engineNode.getNextNodes(); + List resultNodes = new ArrayList(); + if(StringUtil.isValidStr(nextNodes)){ + String[] nextNodeCodes = nextNodes.split(CommonConst.SYMBOL_COMMA); + EngineNode nextNode = null; + for (String nextNodeCode : nextNodeCodes) { + nextNode = nodeMap.get(nextNodeCode); + + String parentId = nextNode.getParentId(); + if(parentId.contains(CommonConst.SYMBOL_COMMA)){ + List parentIdList = Arrays.asList(parentId.split(CommonConst.SYMBOL_COMMA)); + parentIdList = parentIdList.stream().filter(item -> !item.equals(engineNode.getNodeId().toString())).collect(Collectors.toList()); + parentId = StringUtils.join(parentIdList, CommonConst.SYMBOL_COMMA); + } else { + parentId = null; + } + nextNode.setParentId(parentId); + resultNodes.add(nextNode); + } + } + return resultNodes; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/IMonitorService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/IMonitorService.java new file mode 100644 index 0000000..f9717b7 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/IMonitorService.java @@ -0,0 +1,44 @@ +package com.fibo.ddp.common.service.monitor.decisionflow; + +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import com.fibo.ddp.common.model.monitor.decisionflow.DecisionFlowRequestDTO; + +import java.util.List; +import java.util.Map; + +public interface IMonitorService { + /** + * 查询交通方式编码 + * @return 编码 + */ + String getStorageType(); + + List getEngineResultSetBySegment(Map map); + + /** + * 根绝hbaseRowKey + * 取 Hbase表monitor_decision_flow中对应所有数据 + * (主要用到决策流的快照snopshot列和执行过程process列中数据用于展示) + * @param param + * @return + */ + List getResultDecisionFlowDetail(DecisionFlowRequestDTO param); + + /** + * 根据hbaseRowKey + * 取Hbase表monitor_node 中对应的所有数据 + * (主要用到节点监控信息中快照snopshot列和执行结果result 用于 节点监控信息展示) + * @param param + * @return + */ + List getResultNodeDetail(DecisionFlowRequestDTO param); + + /** + * 根据hbaseRowkey + * 取Hbase表monitor_strategy 中对应的所有数据 + * (主要用到策略监控信息中快照snopshot列和执行结果result 用于 策略监控信息展示) + * @param param + * @return + */ + List getResultStrategyDetail(DecisionFlowRequestDTO param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorMysqlVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorMysqlVersionServiceImpl.java new file mode 100644 index 0000000..97064a9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorMysqlVersionServiceImpl.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.service.monitor.decisionflow.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fibo.ddp.common.dao.enginex.risk.EngineResultSetMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorEngineMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorNodeMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import com.fibo.ddp.common.model.monitor.decisionflow.DecisionFlowRequestDTO; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorEngine; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.service.monitor.decisionflow.IMonitorService; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Service("monitorMysqlVersionServiceImpl") +public class MonitorMysqlVersionServiceImpl implements IMonitorService { + + @Resource + public TMonitorEngineMapper monitorEngineMapper; + @Resource + public EngineResultSetMapper resultSetMapper; + @Resource + public TMonitorNodeMapper monitorNodeMapper; + @Resource + public TMonitorStrategyMapper monitorStrategyMapper; + + @Override + public String getStorageType() { + return MonitorStorageType.Mysql; + } + + @Override + public List getEngineResultSetBySegment(Map map) { + return resultSetMapper.getEngineResultSetBySegment(map); + } + + @Override + public List getResultDecisionFlowDetail(DecisionFlowRequestDTO param) { + if(param!=null && StringUtil.isBlank(param.getResultId())){ + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("monitor_parent_id",param.getResultId()); + List monitorEngines = monitorEngineMapper.selectList(queryWrapper); + return monitorEngines; + } + + @Override + public List getResultNodeDetail(DecisionFlowRequestDTO param) { + if(param!=null && StringUtil.isBlank(param.getMonitorParentId())){ + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("monitor_parent_id",param.getMonitorParentId()); + queryWrapper.eq("node_id",param.getNodeId()); + List monitorNodes = monitorNodeMapper.selectList(queryWrapper); + return monitorNodes; + } + + @Override + public List getResultStrategyDetail(DecisionFlowRequestDTO param) { + if(param!=null && StringUtil.isBlank(param.getMonitorParentId())){ + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("monitor_parent_id",param.getMonitorParentId()); + queryWrapper.eq("node_id",param.getNodeId()); + queryWrapper.eq("strategy_id",param.getStrategyId()); + List monitorStrategies = monitorStrategyMapper.selectList(queryWrapper); + return monitorStrategies; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorServiceImpl.java new file mode 100644 index 0000000..caa8bd1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/decisionflow/impl/MonitorServiceImpl.java @@ -0,0 +1,77 @@ +package com.fibo.ddp.common.service.monitor.decisionflow.impl; + +import com.fibo.ddp.common.dao.enginex.risk.EngineResultSetMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.MonitorDecisionFlowHbaseMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.MonitorNodeHbaseMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.MonitorStrategyHbaseMapper; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import com.fibo.ddp.common.model.monitor.decisionflow.DecisionFlowRequestDTO; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorDecisionFlow; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.service.monitor.decisionflow.IMonitorService; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.util.Bytes; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Service("monitorServiceImpl") +public class MonitorServiceImpl implements IMonitorService { + + @Autowired + public HbaseTemplate hbaseTemplate; + @Resource + public EngineResultSetMapper resultSetMapper; + + @Override + public String getStorageType() { + return MonitorStorageType.HBase; + } + + @Override + public List getEngineResultSetBySegment(Map map) { + return resultSetMapper.getEngineResultSetBySegment(map); + } + + @Override + public List getResultDecisionFlowDetail(DecisionFlowRequestDTO param) { + Scan scan = new Scan(Bytes.toBytes(param.getHbaseRowKey()),Bytes.toBytes(param.getHbaseRowKey())); + //根据条件查询Hbase表中信息。 + List monitorDecisionFlows = hbaseTemplate.find( + Constants.MonitorDecisionFlow.TABLE_NAME, + scan, new MonitorDecisionFlowHbaseMapper()); + return monitorDecisionFlows; + } + + @Override + public List getResultNodeDetail(DecisionFlowRequestDTO param) { + Scan scan = new Scan(Bytes.toBytes(param.getHbaseRowKey()),Bytes.toBytes(param.getHbaseRowKey())); +// Scan scan = new Scan(); + //根绝条件查询Hbase表中信息 + List monitorNodes = hbaseTemplate.find( + Constants.MonitorNode.TABLE_NAME, + scan,new MonitorNodeHbaseMapper()); + return monitorNodes; + } + + @Override + public List getResultStrategyDetail(DecisionFlowRequestDTO param) { + Scan scan = new Scan(Bytes.toBytes(param.getHbaseRowKey()),Bytes.toBytes(param.getHbaseRowKey())); +// Scan scan = new Scan(); + //根绝条件查询Hbase表中信息 + List monitorStrategies = hbaseTemplate.find( + Constants.MonitorStrategy.TABLE_NAME, + scan,new MonitorStrategyHbaseMapper()); + //返回 + + return monitorStrategies; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLog.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLog.java new file mode 100644 index 0000000..ef0f378 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLog.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.monitor.logger; + +import java.lang.annotation.*; + +/** + * ClassName:ArchivesLog
+ * Description: 日志操作类型注解.
+ */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ArchivesLog { + + public String operationType() default ""; + + public String operationName() default ""; + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLogAspect.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLogAspect.java new file mode 100644 index 0000000..6d09f09 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/ArchivesLogAspect.java @@ -0,0 +1,150 @@ +package com.fibo.ddp.common.service.monitor.logger; + +import com.fibo.ddp.common.dao.monitor.logger.LoggerMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.monitor.logger.Logger; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.util.RequestUtil; +import com.fibo.ddp.common.utils.constant.OpTypeEnum; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Date; +import java.util.Map; + +@Aspect +@Component +public class ArchivesLogAspect { + + @Resource + private LoggerMapper loggerMapper; + + private Date startTime; // 开始时间 + private Date endTime; // 结束时间 + private HttpServletRequest request = null; + + @Pointcut("@annotation(com.fibo.ddp.common.service.monitor.logger.ArchivesLog))") + public void controllerAspect() { + } + + @Before("controllerAspect()") + public void doBefore() { + request = getHttpServletRequest(); + startTime = new Date(); + } + + @AfterReturning(pointcut="controllerAspect()", returning="returnValue") + public void doAfter(JoinPoint joinPoint,Object returnValue) { + handleLog(joinPoint,null,returnValue); + } + + @AfterThrowing(value="controllerAspect()",throwing="e") + public void doAfter(JoinPoint joinPoint, Exception e) { + handleLog(joinPoint, e,null); + } + + + /** + * @Description: 方法调用后触发 记录结束时间 + * + * @param joinPoint + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void handleLog(JoinPoint joinPoint,Exception e,Object retValue) { + try { + SysUser sysUser = SessionManager.getLoginAccount(); + String targetName = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + Object[] arguments = joinPoint.getArgs(); + Class targetClass = Class.forName(targetName); + Method[] methods = targetClass.getMethods(); + String operationName = ""; + for (Method method : methods) { + if (method.getName().equals(methodName)) { + Class[] clazzs = method.getParameterTypes(); + if (clazzs!=null&&clazzs.length == arguments.length&&method.getAnnotation(ArchivesLog.class)!=null) { + operationName = method.getAnnotation(ArchivesLog.class).operationType(); + break; + } + } + } + + endTime = new Date(); + Logger log = new Logger(); + log.setStartTime(startTime); + log.setEndTime(endTime); + if(sysUser !=null){ + log.setOpUserId(sysUser.getUserId()); + log.setOrganId(sysUser.getOrganId()); + } + if (request.getScheme()!=null){ + log.setRequestPath(request.getRequestURL().toString()); + }else { + log.setRequestPath("npe"); + } + log.setMethod(methodName); + + //获取请求参数 + if(!operationName.equals("登入")){ + Map map = request.getParameterMap(); + StringBuffer sb = new StringBuffer(); + sb.append("{"); + for(String name : map.keySet()){ + String[] values=map.get(name); + String val = Arrays.toString(values); + sb.append(name+"="+val.substring(1,val.length()-1)).append(","); + } + sb = sb.deleteCharAt(sb.length()-1); + sb.append("}"); + log.setRequestParam(sb.toString()); + } + + //获取响应参数 + if(e !=null){ + log.setResponseParam(e.getMessage()); + }else{ + if(retValue!=null){ + log.setResponseParam(retValue.toString()); + } + } + + for (OpTypeEnum examType : OpTypeEnum.values()) { + if (operationName.equals(examType.getType()) ) { + log.setOpType(examType.getValue()); + } + } + log.setOpName(operationName); + log.setIp(RequestUtil.getClientIP(request)); + loggerMapper.insert(log); + + } catch (ClassNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (SecurityException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + + /** + * @Description: 获取request + * + * @param + * @return HttpServletRequest + */ + public HttpServletRequest getHttpServletRequest(){ + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes)ra; + HttpServletRequest request = sra.getRequest(); + return request; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/LogService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/LogService.java new file mode 100644 index 0000000..5419f9d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/LogService.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.service.monitor.logger; + +import com.fibo.ddp.common.model.monitor.logger.Logger; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * ClassName:LogService
+ * Description:日志接口 + * */ +public interface LogService { + + /** + * getLogList :(获取日志集合) + * + * @param param 参数集合 + * @return + * */ + public List getLogList(Map param); + + + /** + * findById :(根据id获取日志) + * + * @param id 日志记录id + * @return + * */ + public Logger findById(Long id); + + /** + * 查询最后登录时间 + * @param userId + * @return + */ + public List getLastLoginInfo(Long userId); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/impl/LogServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/impl/LogServiceImpl.java new file mode 100644 index 0000000..ade94b3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/logger/impl/LogServiceImpl.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.service.monitor.logger.impl; + +import com.fibo.ddp.common.dao.monitor.logger.LoggerMapper; +import com.fibo.ddp.common.model.monitor.logger.Logger; +import com.fibo.ddp.common.service.monitor.logger.LogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * ClassName:LogService
+ * Description:日志接口实现 + * */ +@Service +public class LogServiceImpl implements LogService { + + @Resource + public LoggerMapper loggerMapper; + + @Override + public List getLogList(Map param) { + // TODO Auto-generated method stub + return loggerMapper.getLogList(param); + } + + @Override + public Logger findById(Long id) { + // TODO Auto-generated method stub + return loggerMapper.selectById(id); + } + + @Override + public List getLastLoginInfo(Long userId) { + return loggerMapper.getLastLoginInfo(userId); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/IMonitorCenterService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/IMonitorCenterService.java new file mode 100644 index 0000000..127f1b8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/IMonitorCenterService.java @@ -0,0 +1,31 @@ +package com.fibo.ddp.common.service.monitor.runner; + +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; + +import java.util.List; +import java.util.Map; + +/** + * 监控中心服务相关 + */ +public interface IMonitorCenterService { + /** + * 查询存储方式编码 + * @return 编码 + */ + String getStorageType(); + + /** + * 组装决策流监控 业务信息 存入Mysql/Hbase + * @param inputParam 全量入参变量池 + * @param engine 引擎信息 + * @param engineVersion 引擎版本信息 + * @param outMap 输出变量池 + * @param paramJson 参数map + * @param resultId 结果集表id + */ + void monitorDecisionFlow(Map inputParam, Engine engine, EngineVersion engineVersion, List engineNodeList, Map outMap, Map paramJson, Integer resultId); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCenterFactoryRunner.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCenterFactoryRunner.java new file mode 100644 index 0000000..d4f505c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCenterFactoryRunner.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.common.service.monitor.runner; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class MonitorCenterFactoryRunner implements ApplicationContextAware{ + private static Map monitorCenterDiffStorageBeanMap; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map map = applicationContext.getBeansOfType(IMonitorCenterService.class); + monitorCenterDiffStorageBeanMap = new HashMap<>(); + map.forEach((key,value)->monitorCenterDiffStorageBeanMap.put(value.getStorageType(),value)); + } + + public static T getMonitorCenterServiceImp(String storageType){ + return (T)monitorCenterDiffStorageBeanMap.get(storageType); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCommonService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCommonService.java new file mode 100644 index 0000000..8dd52be --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/MonitorCommonService.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.monitor.runner; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; + +import java.util.List; +import java.util.Map; + +public interface MonitorCommonService { + /** + * 组装该节点监控信息部分数据 + * @param inputParam + * @param engineNode + * @param outMap + * @param monitorNodeInfoList + */ + public void buildMonitorNode(Map inputParam, EngineNode engineNode, Map outMap, List monitorNodeInfoList); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IFeatureRecordService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IFeatureRecordService.java new file mode 100644 index 0000000..cc51646 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IFeatureRecordService.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase; + +import com.fibo.ddp.common.model.enginex.risk.Engine; + +import java.util.Map; + +public interface IFeatureRecordService { + /** + * 全量指标入库 + * @param featureMaps 执行前后指标map + * @param engine 引擎节点 + * @param paramJson 整个执行器方法的入参 + */ + void recordAllFeature(Map> featureMaps, Engine engine, Map paramJson); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IHbaseUserInfoService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IHbaseUserInfoService.java new file mode 100644 index 0000000..8bd45b8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IHbaseUserInfoService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase; + +import com.fibo.ddp.common.model.monitor.decisionflow.UserInfo; + +/** + * user_info Hbase服务 + */ +public interface IHbaseUserInfoService { + + /** + * 将userInfo 写入Hbase + * @param userInfo + * @return + */ + boolean dropUserInfoTemplateToHbase(UserInfo userInfo); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorDecisionFlow.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorDecisionFlow.java new file mode 100644 index 0000000..bd99344 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorDecisionFlow.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorDecisionFlow; + +/** + * 决策流监控 monitor_decision_flow Hbase服务 + */ +public interface IMonitorDecisionFlow { + /** + * 将MonitorDecisionFlow 写入Hbase + * @param monitorDecisionFlow + * @return + */ + boolean putMonitorDecisionFlowToHbase(MonitorDecisionFlow monitorDecisionFlow); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorNode.java new file mode 100644 index 0000000..6055a4a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorNode.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; + +public interface IMonitorNode { + /** + * 将MonitorDecisionFlow 写入Hbase + * @param monitorNode + * @return + */ + boolean putMonitorNodeToHbase(MonitorNode monitorNode); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorStrategyService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorStrategyService.java new file mode 100644 index 0000000..760e1cd --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/IMonitorStrategyService.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; + +public interface IMonitorStrategyService { + /** + * 将MonitorStrategy 写入Hbase + * @param monitorStrategy + * @return + */ + boolean putMonitorStrategyToHbase(MonitorStrategy monitorStrategy); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/HbaseUserInfoServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/HbaseUserInfoServiceImpl.java new file mode 100644 index 0000000..30bc568 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/HbaseUserInfoServiceImpl.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.UserInfo; +import com.fibo.ddp.common.service.monitor.runner.hbase.IHbaseUserInfoService; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import groovy.util.logging.Slf4j; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Random; + +@Slf4j +@Service("hbaseUserInfoServiceImpl") +public class HbaseUserInfoServiceImpl implements IHbaseUserInfoService { + /** + * Hbase客户端 + */ + private final HbaseTemplate hbaseTemplate; + + private static final Logger logger = LoggerFactory.getLogger(HbaseUserInfoServiceImpl.class); + + + @Autowired + public HbaseUserInfoServiceImpl(HbaseTemplate hbaseTemplate){ + this.hbaseTemplate = hbaseTemplate; + } + + @Override + public boolean dropUserInfoTemplateToHbase(UserInfo userInfo) { + if(null== hbaseTemplate){ + return false; + } + int random = new Random(10000).nextInt(); + Put put = new Put(Bytes.toBytes(new Date().getTime()+random)); + put.addColumn(Bytes.toBytes(Constants.UserInfoTable.FAMILY_BASE_INFO),Bytes.toBytes(Constants.UserInfoTable.BASEINFO),Bytes.toBytes(userInfo.getBaseInfo().getBaseInfo())); +// System.setProperty("hadoop.home.dir", "/usr/local/hadoop/"); + hbaseTemplate.saveOrUpdate(Constants.UserInfoTable.TABLE_NAME,put); + logger.info("=====================================================String is good:{}",put); + return false; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IFeatureRecordServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IFeatureRecordServiceImpl.java new file mode 100644 index 0000000..f0f7b98 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IFeatureRecordServiceImpl.java @@ -0,0 +1,103 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.service.monitor.runner.hbase.IFeatureRecordService; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.fibo.ddp.common.utils.constant.monitor.RowKeyUtil; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +@Service("iFeatureRecordServiceImpl") +public class IFeatureRecordServiceImpl implements IFeatureRecordService { + + /** + * Hbase客户端 + */ + private final HbaseTemplate hbaseTemplate; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + private static final Logger logger = LoggerFactory.getLogger(IFeatureRecordServiceImpl.class); + + @Autowired + public IFeatureRecordServiceImpl(HbaseTemplate hbaseTemplate) { + this.hbaseTemplate = hbaseTemplate; + } + + @Override + public void recordAllFeature(Map> featureMaps, Engine engine, Map paramJson) { + CompletableFuture.runAsync(() -> { + try { + Map beforeMap = featureMaps.get("before"); + Map afterMap = featureMaps.get("after"); + String EngineVersionId = paramJson.get("versionId") + ""; + if (null == hbaseTemplate) { + logger.info("===================================recordAllFeature==hbase客户端连接中断"); + return; + } + //生成行键 + String rowKeyStr = null; + rowKeyStr = RowKeyUtil.formatLastUpdate(new Date().getTime()); + // 加校验,该行键是否已经存在,已经存在返回false,打印日志,行键已经存在 + try { + if (hbaseTemplate.getConnection().getTable(TableName.valueOf(Constants.RunnerFeatureRecord.TABLE_NAME)).exists(new Get(Bytes.toBytes(rowKeyStr)))) { + logger.info("===================================recordAllFeature,行键:{} 已经存在!", rowKeyStr); + return; + } + } catch (Exception e) { + logger.error("=============================recordAllFeature,异常信息:{}", e.getMessage()); + } + Put put = new Put(Bytes.toBytes(rowKeyStr)); + //动态增加执行前指标集 + for (Map.Entry entry : beforeMap.entrySet()) { + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.BEFORE_FEATURE), + Bytes.toBytes(entry.getKey()), + Bytes.toBytes(entry.getValue() + "")); + logger.info("====================================recordAllFeature=执行前指标:key,{},value,{}", entry.getKey(), entry.getValue()); + } + //动态增加执行后指标集 + for (Map.Entry entry : afterMap.entrySet()) { + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.AFTER_FEATURE), + Bytes.toBytes(entry.getKey()), + Bytes.toBytes(entry.getValue() + "")); + logger.info("====================================recordAllFeature=执行后指标:key,{},value,{}", entry.getKey(), entry.getValue()); + } + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.BASE_INFO), + Bytes.toBytes(Constants.RunnerFeatureRecord.BUSINESS_ID), + Bytes.toBytes(paramJson.get("pid") + "")); + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.BASE_INFO), + Bytes.toBytes(Constants.RunnerFeatureRecord.ENGINE_ID), + Bytes.toBytes(engine.getId())); + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.BASE_INFO), + Bytes.toBytes(Constants.RunnerFeatureRecord.ENGINE_NAME), + Bytes.toBytes(engine.getName())); + put.addColumn( + Bytes.toBytes(Constants.RunnerFeatureRecord.BASE_INFO), + Bytes.toBytes(Constants.RunnerFeatureRecord.ENGINE_VERSION_ID), + Bytes.toBytes(EngineVersionId)); + logger.info("====================================recordAllFeature=即将插入数据,{}", put); + hbaseTemplate.saveOrUpdate(Constants.RunnerFeatureRecord.TABLE_NAME, put); + logger.info("====================================recordAllFeature=写入成功!!!!!!!!!!!!"); + paramJson.remove("versionId"); + } catch (Exception e) { + logger.info("=============recordAllFeature:全量指标入库出错:{}", e); + } + }, threadPoolTaskExecutor); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorDecisionFlowImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorDecisionFlowImpl.java new file mode 100644 index 0000000..55e2a4f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorDecisionFlowImpl.java @@ -0,0 +1,85 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorDecisionFlow; +import com.fibo.ddp.common.service.monitor.runner.hbase.IMonitorDecisionFlow; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 决策流监控 写入Hbase表 + */ +@Service("iMonitorDecisionFlowImpl") +public class IMonitorDecisionFlowImpl implements IMonitorDecisionFlow { + /** + * Hbase客户端 + */ + private final HbaseTemplate hbaseTemplate; + private static final Logger logger = LoggerFactory.getLogger(IMonitorDecisionFlowImpl.class); + + + @Autowired + public IMonitorDecisionFlowImpl(HbaseTemplate hbaseTemplate){ + this.hbaseTemplate = hbaseTemplate; + } + + + @Override + public boolean putMonitorDecisionFlowToHbase(MonitorDecisionFlow monitorDecisionFlow) { + if(null== hbaseTemplate){ + logger.info("===================================hbase客户端连接中断"); + return false; + } + //生成行键 + String rowKeyStr = monitorDecisionFlow.getRowKey(); + //todo 加校验,该行键是否已经存在,已经存在返回false,打印日志,行键已经存在 + try { + if(hbaseTemplate.getConnection().getTable(TableName.valueOf(Constants.MonitorDecisionFlow.TABLE_NAME)).exists(new Get(Bytes.toBytes(rowKeyStr)))){ + logger.info("=============================Rowkey:{} 已经存在!",rowKeyStr); + return false; + } + } catch (Exception e) { + logger.error("=============================putMonitorDecisionFlowToHbase"); + } + Put put = new Put(Bytes.toBytes(rowKeyStr)); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.PARAMS), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getMonitorInfo().getParams()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.SNAPSHOT), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getMonitorInfo().getSnapshot()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.PROCESS), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getMonitorInfo().getProcess()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.BUSINESS_ID), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getBaseInfo().getBusinessId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.ENGINE_NAME), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getBaseInfo().getEngineName()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.ENGINE_VERSION_ID), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getBaseInfo().getEngineVersionId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorDecisionFlow.BASE_INFO), + Bytes.toBytes(Constants.MonitorDecisionFlow.ENGINE_INFO), + Bytes.toBytes(JSON.toJSONString(monitorDecisionFlow.getBaseInfo().getEngineInfo()))); + hbaseTemplate.saveOrUpdate(Constants.MonitorDecisionFlow.TABLE_NAME,put); + logger.info("===================================================== Hbase数据写入成功:{}",put); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorNodeImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorNodeImpl.java new file mode 100644 index 0000000..3234ef9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorNodeImpl.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.IMonitorNode; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service("iMonitorNodeImpl") +public class IMonitorNodeImpl implements IMonitorNode { + /** + * Hbase客户端 + */ + private final HbaseTemplate hbaseTemplate; + private static final Logger logger = LoggerFactory.getLogger(IMonitorNodeImpl.class); + + + @Autowired + public IMonitorNodeImpl(HbaseTemplate hbaseTemplate){ + this.hbaseTemplate = hbaseTemplate; + } + + @Override + public boolean putMonitorNodeToHbase(MonitorNode monitorNode) { + if(null== hbaseTemplate){ + logger.info("===================================hbase客户端连接中断"); + return false; + } + //生成行键 + String rowKeyStr = monitorNode.getRowKey(); +// rowKeyStr = RowKeyUtil.formatLastUpdate(new Date().getTime()); + //todo 加校验,该行键是否已经存在,已经存在返回false,打印日志,行键已经存在 + try { + if(hbaseTemplate.getConnection().getTable(TableName.valueOf(Constants.MonitorNode.TABLE_NAME)).exists(new Get(Bytes.toBytes(rowKeyStr)))){ + logger.info("==============================行键:{} 已经存在!",rowKeyStr); + return false; + } + } catch (Exception e) { + logger.error("=============================putMonitorNodeToHbase:{}",e.getMessage()); + } + Put put = new Put(Bytes.toBytes(rowKeyStr)); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.PARAMS), + Bytes.toBytes(JSON.toJSONString(monitorNode.getMonitorInfo().getParams()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.SNAPSHOT), + Bytes.toBytes(JSON.toJSONString(monitorNode.getMonitorInfo().getSnapshot()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorNode.RESULT), + Bytes.toBytes(JSON.toJSONString(monitorNode.getMonitorInfo().getResult()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.BUSINESS_ID), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getBusinessId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_ID), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getNodeId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_NAME), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getNodeName()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_TYPE), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getNodeType()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.NODE_INFO), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getNodeInfo()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.ENGINE_VERSION_ID), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getEngineVersionId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorNode.BASE_INFO), + Bytes.toBytes(Constants.MonitorNode.ENGINE_INFO), + Bytes.toBytes(JSON.toJSONString(monitorNode.getBaseInfo().getEngineInfo()))); + hbaseTemplate.saveOrUpdate(Constants.MonitorNode.TABLE_NAME,put); + logger.info("=================================>putMonitorNodeToHbase: Hbase数据写入成功:{}",put); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorStrategyImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorStrategyImpl.java new file mode 100644 index 0000000..7288ff6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/IMonitorStrategyImpl.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.service.monitor.runner.hbase.IMonitorStrategyService; +import com.fibo.ddp.common.utils.constant.monitor.Constants; +import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service("iMonitorStrategyImpl") +public class IMonitorStrategyImpl implements IMonitorStrategyService { + + /** + * Hbase客户端 + */ + private final HbaseTemplate hbaseTemplate; + private static final Logger logger = LoggerFactory.getLogger(IMonitorNodeImpl.class); + + + @Autowired + public IMonitorStrategyImpl(HbaseTemplate hbaseTemplate){ + this.hbaseTemplate = hbaseTemplate; + } + @Override + public boolean putMonitorStrategyToHbase(MonitorStrategy monitorStrategy) { + if(null== hbaseTemplate){ + logger.info("putMonitorStrategyToHbase===================================hbase客户端连接中断"); + return false; + } + //生成行键 + String rowKeyStr = monitorStrategy.getRowKey(); +//// rowKeyStr = RowKeyUtil.formatLastUpdate(new Date().getTime()); +// //todo 加校验,该行键是否已经存在,已经存在返回false,打印日志,行键已经存在 + try { + if(hbaseTemplate.getConnection().getTable(TableName.valueOf(Constants.MonitorStrategy.TABLE_NAME)).exists(new Get(Bytes.toBytes(rowKeyStr)))){ + logger.info("putMonitorStrategyToHbase==============================Rowkey:{} 已经存在!",rowKeyStr); + return false; + } + } catch (Exception e) { + logger.error("putMonitorStrategyToHbase=============================异常信息:{}",e.getMessage()); + } + Put put = new Put(Bytes.toBytes(rowKeyStr)); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorStrategy.PARAMS), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getMonitorInfo().getParams()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorStrategy.SNAPSHOT), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getMonitorInfo().getSnapshot()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.MONITOR_INFO), + Bytes.toBytes(Constants.MonitorStrategy.RESULT), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getMonitorInfo().getResult()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.BUSINESS_ID), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getBusinessId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.NODE_ID), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getNodeId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.NODE_TYPE), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getNodeType()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_ID), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getStrategyId()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_NAME), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getStrategyName()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.STRATEGY_TYPE), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getStrategyType()))); + put.addColumn( + Bytes.toBytes(Constants.MonitorStrategy.BASE_INFO), + Bytes.toBytes(Constants.MonitorStrategy.ENGINE_VERSION_ID), + Bytes.toBytes(JSON.toJSONString(monitorStrategy.getBaseInfo().getEngineVersionId()))); + hbaseTemplate.saveOrUpdate(Constants.MonitorStrategy.TABLE_NAME,put); + logger.info("putMonitorStrategyToHbase=================================>监控中心-策略监控信息-Hbase数据写入成功:{}",put); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/MonitorCenterServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/MonitorCenterServiceImpl.java new file mode 100644 index 0000000..92b9515 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/impl/MonitorCenterServiceImpl.java @@ -0,0 +1,187 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.fibo.ddp.common.dao.enginex.risk.EngineResultSetMapper; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorDecisionFlow; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.IMonitorCenterService; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.impl.MonitorBlackOrWhiteNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.impl.MonitorDecisionTablesNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.impl.MonitorRuleSetNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.impl.MonitorScorecardNode; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import com.fibo.ddp.common.utils.constant.monitor.RowKeyUtil; +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +@Service("monitorCenterServiceImpl") +public class MonitorCenterServiceImpl implements IMonitorCenterService { + + private static final Logger logger = LoggerFactory.getLogger(MonitorCenterServiceImpl.class); + + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private IMonitorDecisionFlowImpl iMonitorDecisionFlow; + @Autowired + private IMonitorNodeImpl iMonitorNode; + @Autowired + private MonitorScorecardNode monitorScorecardNode; + @Autowired + private MonitorRuleSetNode monitorRuleSetNode; + @Autowired + private MonitorBlackOrWhiteNode monitorBlackOrWhiteNode; + @Autowired + private MonitorDecisionTablesNode monitorDecisionTablesNode; + @Resource + public EngineResultSetMapper resultSetMapper; + + + @Override + public String getStorageType() { + return MonitorStorageType.HBase; + } + + @Override + public void monitorDecisionFlow(Map inputParam, Engine engine, EngineVersion engineVersion, List engineNodeList, Map outMap, Map paramJson, Integer resultId) { + CompletableFuture.runAsync(()->{ + try { + MonitorDecisionFlow.MonitorInfo monitorInfo = new MonitorDecisionFlow.MonitorInfo( + inputParam, + engineNodeList, + (List)outMap.get("executedNodes")); + MonitorDecisionFlow.BaseInfo baseInfo = new MonitorDecisionFlow.BaseInfo( + (String) paramJson.get("pid"), + engine.getName(), + engineVersion.getVersionId()+"", + engineVersion); + //生成行键 + String rowKeyStr = RowKeyUtil.formatLastUpdate(new Date().getTime()); + //传递到节点监控。用于节点监控行键生成 + outMap.put("monitorDecisionFlow",rowKeyStr); + MonitorDecisionFlow monitorDecisionFlow = new MonitorDecisionFlow(rowKeyStr,monitorInfo,baseInfo); + logger.info("=================================决策流监控:{}", JSON.toJSONString(monitorDecisionFlow)); + //todo 异步写入Hbase + iMonitorDecisionFlow.putMonitorDecisionFlowToHbase(monitorDecisionFlow); + updateResultSet(resultId,rowKeyStr); + outMap.remove("executedNodes"); + //todo 组装节点监控 Hbase节点业务模型 并存入hbase + monitorNode(engine,engineVersion,outMap); + } catch (Exception e) { + logger.info("==============监控中心========监控信息入库出错:{}",e); + } + },threadPoolTaskExecutor); + } + /** + * 反写t_resultset表中hbase_row_key字段 + * @param resultId + * @param rowKeyStr + */ + private void updateResultSet(Integer resultId, String rowKeyStr) { + resultSetMapper.updateResultById(resultId,rowKeyStr); + } + + /** + * 组装节点监控 Hbase节点业务模型 并存入hbase + * @param engine + * @param engineVersion + * @param outMap + */ + private void monitorNode(Engine engine, EngineVersion engineVersion, Map outMap) { + if(outMap.containsKey("monitorNodes")){ + List monitorNodeInfoList = (List)outMap.get("monitorNodes"); + logger.info("=============================monitorNode:{}", JSONArray.toJSONString(monitorNodeInfoList)); + //循环拿出list中的数据,重新组装业务模型,插入Hbase表中 + monitorNodeInfoList.stream().forEach(item->{ + MonitorNode monitorNode = new MonitorNode(); + //监控信息组装 + MonitorNode.MonitorInfo monitorInfo = new MonitorNode.MonitorInfo(); + monitorInfo.setParams(item.getMonitorInfo().getParams()); + monitorInfo.setResult(item.getMonitorInfo().getResult()); + monitorInfo.setSnapshot(item.getMonitorInfo().getSnapshot()); + //基本信息组装 + MonitorNode.BaseInfo baseInfo = new MonitorNode.BaseInfo(); + baseInfo.setEngineVersionId(engineVersion.getVersionId()+""); + baseInfo.setNodeId(item.getBaseInfo().getNodeId()); + baseInfo.setNodeName(item.getBaseInfo().getNodeName()); + baseInfo.setNodeType(item.getBaseInfo().getNodeType()); + baseInfo.setNodeInfo(item.getBaseInfo().getNodeInfo()); + baseInfo.setEngineInfo(engineVersion); + monitorNode.setMonitorInfo(monitorInfo); + monitorNode.setBaseInfo(baseInfo); + //todo 获取行键 ,行键生成策略 hkey+nodeId + if(outMap.containsKey("monitorDecisionFlow")){ + String rowKey = outMap.get("monitorDecisionFlow")+""; + monitorNode.setRowKey(rowKey+item.getBaseInfo().getNodeId()); + } + //根绝节点类型拆分出策略层面的数据,组装策略监控信息业务模型 + buildMonitorStrategyModel(monitorNode,outMap); + iMonitorNode.putMonitorNodeToHbase(monitorNode); + }); + outMap.remove("monitorDecisionFlow"); + } + } + /** + * 根绝节点类型拆分出策略层面的数据,组装策略监控信息业务模型 + * 并写入Hbase + * @param monitorNode + * @Param outMap 输出变量池 + */ + public void buildMonitorStrategyModel(MonitorNode monitorNode, Map outMap) { + String nodeType = monitorNode.getBaseInfo().getNodeType(); + switch(Integer.valueOf(StringEscapeUtils.unescapeJava(nodeType))){ + case 2: + //规则 + monitorRuleSetNode.createMonitorStrategy(monitorNode,outMap); + break; + case 3: + //分组 + break; + case 4: + //评分卡 + monitorScorecardNode.createMonitorStrategy(monitorNode,outMap); + break; + case 5: + //黑名单 + monitorBlackOrWhiteNode.createMonitorStrategy(monitorNode,outMap); + break; + case 6: + //白名单 + monitorBlackOrWhiteNode.createMonitorStrategy(monitorNode,outMap); + break; + case 7: + //沙盒比例 + break; + case 9: + //决策选项 + break; + case 14: + //子引擎 + break; + case 15: + //模型 + break; + case 16: + //决策表 + monitorDecisionTablesNode.createMonitorStrategy(monitorNode,outMap); + break; + default: + break; + } + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/MonitorService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/MonitorService.java new file mode 100644 index 0000000..8874ae8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/MonitorService.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; + +import java.util.Map; + +/** + * 监控信息组装 + */ +public interface MonitorService { + + /** + * 策略层面监控信息组装入库 + * @param monitorNode + * @param outMap + */ + void createMonitorStrategy(MonitorNode monitorNode, Map outMap); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorBlackOrWhiteNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorBlackOrWhiteNode.java new file mode 100644 index 0000000..f877735 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorBlackOrWhiteNode.java @@ -0,0 +1,70 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.impl.IMonitorStrategyImpl; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorBlackOrWhiteNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private IMonitorStrategyImpl iMonitorStrategy; + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //名单库需要继续 + /* logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」参数:{}",monitorNode); + MonitorStrategy monitorStrategy = new MonitorStrategy(); + MonitorStrategy.MonitorInfo monitorInfo = new MonitorStrategy.MonitorInfo(); + //策略快照 根绝评分卡id,去查对应的字段。 + if(outMap.containsKey("strategySnopshot")){ + String snopshot = outMap.get("strategySnopshot")+""; + monitorInfo.setSnapshot(JSONObject.parseObject(snopshot)); + outMap.remove("strategySnopshot"); + } + JSONArray jsonArray = JSONArray.parseArray(monitorInfo.getSnapshot().get("strategySnopshot")+""); + for (Object object:jsonArray) { + JSONObject jsonObject = JSONObject.parseObject(object+""); + MonitorStrategy monitorStrategy1 = new MonitorStrategy(); + MonitorStrategy.MonitorInfo monitorInfo1 = new MonitorStrategy.MonitorInfo(); + //全量入参 + monitorInfo1.setParams(monitorNode.getMonitorInfo().getParams()); + //策略快照信息(名单库) + monitorInfo1.setSnapshot(jsonObject); + //输出结果 + monitorInfo1.setResult(monitorNode.getMonitorInfo().getResult()); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorInfo); + MonitorStrategy.BaseInfo baseInfo = new MonitorStrategy.BaseInfo(); + //策略ID 即 名单库Id + String listDBID = jsonObject.get("id")+""; + baseInfo.setStrategyId(listDBID); + //策略名称 + baseInfo.setStrategyName(jsonObject.get("listName")+""); + //策略类型 + baseInfo.setStrategyType(jsonObject.get("listType")+""); + //业务id + baseInfo.setBusinessId(monitorNode.getBaseInfo().getBusinessId()); + //节点id + baseInfo.setNodeId(monitorNode.getBaseInfo().getNodeId()); + //节点类型 + baseInfo.setNodeType(monitorNode.getBaseInfo().getNodeType()); + //引擎版本id + baseInfo.setEngineVersionId(monitorNode.getBaseInfo().getEngineVersionId()); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」baseInfo:{}",baseInfo); + monitorStrategy1.setBaseInfo(baseInfo); + monitorStrategy1.setMonitorInfo(monitorInfo1); + //行键生成 节点层面的行键+评分卡Id + String rowKeyStr = monitorNode.getRowKey()+listDBID; + monitorStrategy1.setRowKey(rowKeyStr); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」行键:{}",rowKeyStr); + iMonitorStrategy.putMonitorStrategyToHbase(monitorStrategy1); + }*/ + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorChildEngineNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorChildEngineNode.java new file mode 100644 index 0000000..d3020a3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorChildEngineNode.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorChildEngineNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorCommonServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorCommonServiceImpl.java new file mode 100644 index 0000000..136476b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorCommonServiceImpl.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl;//package com.baoying.enginex.executor.monitor.mybatis.hbase.service.node.service.impl; +// +// +//import com.baoying.enginex.executor.datamanage.model.Field; +//import com.baoying.enginex.executor.node.service.CommonService; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +//import java.util.Map; +// +// +//@Service +//public class MonitorCommonServiceImpl implements CommonService { +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// +// @Override +// public boolean getFieldByIds(List ids, Map inputParam) { +// return false; +// } +// +// @Override +// public boolean getEngineField(List fields, Map inputParam) { +// return false; +// } +// +// @Override +// public void getFieldResult(Map inputParam) { +// +// } +//} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionOptionsNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionOptionsNode.java new file mode 100644 index 0000000..59959f3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionOptionsNode.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 决策选项节点 + */ +@Service +public class MonitorDecisionOptionsNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //决策选项不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionTablesNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionTablesNode.java new file mode 100644 index 0000000..47a7373 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorDecisionTablesNode.java @@ -0,0 +1,76 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.service.monitor.runner.hbase.impl.IMonitorStrategyImpl; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import com.fibo.ddp.common.service.strategyx.decisiontable.impl.DecisionTablesServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorDecisionTablesNode implements MonitorService { + private static final Logger logger = LoggerFactory.getLogger(DecisionTablesServiceImpl.class); + @Autowired + private IMonitorStrategyImpl iMonitorStrategy; + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //根据快照中数据的个数进行确定存取条数。目前决策表只能选择一个,此处数组是预留防止以后多个的情况 + //决策表 + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」参数:{},{}",monitorNode,JSONObject.toJSONString(outMap.get("strategySnopshot"))); + MonitorStrategy.MonitorInfo monitorInfo = new MonitorStrategy.MonitorInfo(); + if(outMap.containsKey("strategySnapshot")){ + String snopshot = outMap.get("strategySnapshot")+""; + monitorInfo.setSnapshot(JSONObject.parseObject(snopshot)); + outMap.remove("strategySnapshot"); + } + JSONArray jsonArray = JSONArray.parseArray(monitorInfo.getSnapshot().get("snapshot")+""); + for (Object object:jsonArray) { + if(object==null){ + continue; + } + MonitorStrategy monitorStrategy1 = new MonitorStrategy(); + //1.节点监控JSONObject信息中拿出策略层面的信息 + MonitorStrategy.MonitorInfo monitorInfo1 = new MonitorStrategy.MonitorInfo(); + JSONObject jsonObject = JSONObject.parseObject(object+""); + //策略快照 + monitorInfo1.setSnapshot(jsonObject); + //全量入参 + monitorInfo1.setParams(monitorNode.getMonitorInfo().getParams()); + //决策表结果 + monitorInfo1.setResult(monitorNode.getMonitorInfo().getResult()); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorInfo1); + MonitorStrategy.BaseInfo baseInfo = new MonitorStrategy.BaseInfo(); + //策略ID 即 决策表版本id + String ruleVersionId = jsonObject.get("id")+""; + baseInfo.setStrategyId(ruleVersionId); + //策略名称 决策表名称 + baseInfo.setStrategyName(monitorNode.getMonitorInfo().getSnapshot().getString("name")); + //策略类型 + baseInfo.setStrategyType(monitorNode.getBaseInfo().getNodeType()); + //业务id + baseInfo.setBusinessId(monitorNode.getBaseInfo().getBusinessId()); + //节点id + baseInfo.setNodeId(monitorNode.getBaseInfo().getNodeId()); + //节点类型 + baseInfo.setNodeType(monitorNode.getBaseInfo().getNodeType()); + //引擎版本id + baseInfo.setEngineVersionId(monitorNode.getBaseInfo().getEngineVersionId()); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」baseInfo:{}",baseInfo); + monitorStrategy1.setBaseInfo(baseInfo); + monitorStrategy1.setMonitorInfo(monitorInfo1); + //行键生成 节点层面的行键+决策表版本Id + String rowKeyStr = monitorNode.getRowKey()+ruleVersionId; + monitorStrategy1.setRowKey(rowKeyStr); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」行键:{}",rowKeyStr); + iMonitorStrategy.putMonitorStrategyToHbase(monitorStrategy1); + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorGroupNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorGroupNode.java new file mode 100644 index 0000000..f755ce1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorGroupNode.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorGroupNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //策略层面分组先不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorModelNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorModelNode.java new file mode 100644 index 0000000..9749746 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorModelNode.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorModelNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //模型先不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorRuleSetNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorRuleSetNode.java new file mode 100644 index 0000000..9960ea0 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorRuleSetNode.java @@ -0,0 +1,86 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.service.monitor.runner.hbase.impl.IMonitorStrategyImpl; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorRuleSetNode implements MonitorService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private IMonitorStrategyImpl iMonitorStrategy; + @Autowired + private RuleService ruleService; + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //根据快照中数据的个数进行确定存取条数。 + //规则 + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」参数:{},{}",monitorNode,JSONObject.toJSONString(outMap.get("strategySnopshot"))); + MonitorStrategy monitorStrategy = new MonitorStrategy(); + MonitorStrategy.MonitorInfo monitorInfo = new MonitorStrategy.MonitorInfo(); + if(outMap.containsKey("strategySnopshot")){ + String snopshot = outMap.get("strategySnopshot")+""; + monitorInfo.setSnapshot(JSONObject.parseObject(snopshot)); + outMap.remove("strategySnopshot"); + } + + + JSONArray jsonArray = JSONArray.parseArray(monitorInfo.getSnapshot().get("snopshot")+""); + + for (Object object:jsonArray) { + MonitorStrategy monitorStrategy1 = new MonitorStrategy(); + //1.节点监控JSONObject信息中拿出策略层面的信息 + MonitorStrategy.MonitorInfo monitorInfo1 = new MonitorStrategy.MonitorInfo(); + JSONObject jsonObject = JSONObject.parseObject(object+""); + if(jsonObject==null){ + return; + } + //策略快照 + monitorInfo1.setSnapshot(jsonObject); + //全量入参 + monitorInfo1.setParams(monitorNode.getMonitorInfo().getParams()); + //详细得分情况 + JSONObject scoreDetail = new JSONObject(); + scoreDetail.put("ruleResultList",monitorNode.getMonitorInfo().getResult().get("ruleResultList")); + monitorInfo1.setResult(scoreDetail); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorInfo1); + MonitorStrategy.BaseInfo baseInfo = new MonitorStrategy.BaseInfo(); + //策略ID 即 规则版本id + String ruleVersionId = jsonObject.get("id")+""; + baseInfo.setStrategyId(ruleVersionId); + //策略名称 规则版本描述 + baseInfo.setStrategyName(monitorNode.getMonitorInfo().getSnapshot().getString("name")); + //策略类型 + baseInfo.setStrategyType(monitorNode.getBaseInfo().getNodeType()); + //业务id + baseInfo.setBusinessId(monitorNode.getBaseInfo().getBusinessId()); + //节点id + baseInfo.setNodeId(monitorNode.getBaseInfo().getNodeId()); + //节点类型 + baseInfo.setNodeType(monitorNode.getBaseInfo().getNodeType()); + //引擎版本id + baseInfo.setEngineVersionId(monitorNode.getBaseInfo().getEngineVersionId()); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」baseInfo:{}",baseInfo); + monitorStrategy1.setBaseInfo(baseInfo); + monitorStrategy1.setMonitorInfo(monitorInfo1); + //行键生成 节点层面的行键+规则版本Id + String rowKeyStr = monitorNode.getRowKey()+ruleVersionId; + monitorStrategy1.setRowKey(rowKeyStr); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」行键:{}",rowKeyStr); + iMonitorStrategy.putMonitorStrategyToHbase(monitorStrategy1); + } + + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorSandboxProportionNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorSandboxProportionNode.java new file mode 100644 index 0000000..713f1cb --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorSandboxProportionNode.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorSandboxProportionNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + //不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorScorecardNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorScorecardNode.java new file mode 100644 index 0000000..62abe4b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/hbase/node/impl/MonitorScorecardNode.java @@ -0,0 +1,70 @@ +package com.fibo.ddp.common.service.monitor.runner.hbase.node.impl; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorStrategy; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.fibo.ddp.common.service.monitor.runner.hbase.impl.IMonitorStrategyImpl; +import com.fibo.ddp.common.service.monitor.runner.hbase.node.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorScorecardNode implements MonitorService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private IMonitorStrategyImpl iMonitorStrategy; + + @Override + public void createMonitorStrategy(MonitorNode monitorNode, Map outMap) { + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」参数:{}",monitorNode); + MonitorStrategy monitorStrategy = new MonitorStrategy(); + MonitorStrategy.MonitorInfo monitorInfo = new MonitorStrategy.MonitorInfo(); + //策略快照 根绝评分卡id,去查对应的字段。 + if(outMap.containsKey("strategySnopshot")){ + String snopshot = outMap.get("strategySnopshot")+""; + monitorInfo.setSnapshot(JSONObject.parseObject(snopshot)); + outMap.remove("strategySnopshot"); + } + ScorecardVo scorecardVo = JSONObject.parseObject(JSONObject.toJSONString(monitorInfo.getSnapshot()),ScorecardVo.class); + if(scorecardVo==null){ + return; + } +// monitorInfo.setSnapshot(JSONObject.parseObject(JSONObject.toJSONString(scorecardVo.getVersionList().get(0)))); + //全量入参 + monitorInfo.setParams(monitorNode.getMonitorInfo().getParams()); + //详细得分情况 + JSONObject scoreDetail = new JSONObject(); + scoreDetail.put("scoreDetail",monitorNode.getMonitorInfo().getResult().get("scoreDetail")); + monitorInfo.setResult(scoreDetail); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorInfo); + MonitorStrategy.BaseInfo baseInfo = new MonitorStrategy.BaseInfo(); + //策略ID 即 评分卡版本Id + baseInfo.setStrategyId(scorecardVo.getId()+""); + //策略名称 + baseInfo.setStrategyName(scorecardVo.getName()+""); + //策略类型 + baseInfo.setStrategyType(monitorNode.getBaseInfo().getNodeType()); + //业务id + baseInfo.setBusinessId(monitorNode.getBaseInfo().getBusinessId()); + //节点id + baseInfo.setNodeId(monitorNode.getBaseInfo().getNodeId()); + //节点类型 + baseInfo.setNodeType(monitorNode.getBaseInfo().getNodeType()); + //引擎版本id + baseInfo.setEngineVersionId(monitorNode.getBaseInfo().getEngineVersionId()); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」baseInfo:{}",baseInfo); + monitorStrategy.setBaseInfo(baseInfo); + monitorStrategy.setMonitorInfo(monitorInfo); + //行键生成 节点层面的行键+评分卡Id + String rowKeyStr = monitorNode.getRowKey()+scorecardVo.getId(); + monitorStrategy.setRowKey(rowKeyStr); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」行键:{}",rowKeyStr); + iMonitorStrategy.putMonitorStrategyToHbase(monitorStrategy); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/impl/MonitorCommonServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/impl/MonitorCommonServiceImpl.java new file mode 100644 index 0000000..ed3c64c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/impl/MonitorCommonServiceImpl.java @@ -0,0 +1,68 @@ +package com.fibo.ddp.common.service.monitor.runner.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.monitor.runner.MonitorCommonService; +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class MonitorCommonServiceImpl implements MonitorCommonService { + + private static final Logger logger = LoggerFactory.getLogger(MonitorCommonServiceImpl.class); + + /** + * 组装该节点监控信息部分数据 + * @param inputParam + * @param engineNode + * @param outMap + * @param monitorNodeInfoList + */ + @Override + public void buildMonitorNode(Map inputParam, EngineNode engineNode, Map outMap, List monitorNodeInfoList) { + try { + MonitorNode.MonitorInfo monitorInfo = new MonitorNode.MonitorInfo(); + MonitorNode.BaseInfo baseInfo = new MonitorNode.BaseInfo(); + //输出变量池 节点快照(节点配置,不同节点的配置获取情况不同,一般直接拿nodeJson) + if(outMap.containsKey("nodeSnapshot")){ + JSONObject snapshot= null; + try { + snapshot = JSONObject.parseObject(StringEscapeUtils.unescapeJava(JSON.toJSONString(outMap.get("nodeSnapshot")))); + } catch (Exception e) { + snapshot = JSON.parseObject(outMap.get("nodeSnapshot")+""); + } + monitorInfo.setSnapshot(snapshot); + outMap.remove("nodeSnapshot"); + } + //输出变量池 获取节点输出结果(不同节点类型的输出结果不同) + if(outMap.containsKey("nodeResult")){ + JSONObject result=JSONObject.parseObject(StringEscapeUtils.unescapeJava(JSON.toJSONString(outMap.get("nodeResult")))); + monitorInfo.setResult(result); + outMap.remove("nodeResult"); + } + //输出变量池 获取节点基本信息(节点执行的实现方法中添加) + if(outMap.containsKey("nodeInfo")){ + JSONObject nodeInfo=(JSONObject) outMap.get("nodeInfo"); + baseInfo.setNodeInfo(JSON.toJSONString(nodeInfo.get("engineNode"))); + baseInfo.setNodeId(JSON.toJSONString(nodeInfo.get("nodeId"))); + baseInfo.setNodeType(JSON.toJSONString(nodeInfo.get("nodeType"))); + baseInfo.setNodeName(JSON.toJSONString(nodeInfo.get("nodeName"))); + outMap.remove("nodeInfo"); + } + monitorInfo.setParams(inputParam); + MonitorNode monitorNode = new MonitorNode(); + monitorNode.setMonitorInfo(monitorInfo); + monitorNode.setBaseInfo(baseInfo); + monitorNodeInfoList.add(monitorNode); + } catch (Exception e) { + logger.info("============================监控中心===组装该节点监控信息部分数据=====:{}",e); + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/impl/MonitorCenterMysqlServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/impl/MonitorCenterMysqlServiceImpl.java new file mode 100644 index 0000000..21c8b20 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/impl/MonitorCenterMysqlServiceImpl.java @@ -0,0 +1,171 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorEngineMapper; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorNodeMapper; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorEngine; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.IMonitorCenterService; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.impl.*; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** + * 决策流监控 mysql存储实现类 + */ +@Service +public class MonitorCenterMysqlServiceImpl implements IMonitorCenterService { + + private static final Logger logger = LoggerFactory.getLogger(MonitorCenterMysqlServiceImpl.class); + + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private TMonitorEngineMapper monitorEngineMapper; + @Autowired + private TMonitorNodeMapper monitorNodeMapper; + @Autowired + private MonitorMysqlRuleSetNode monitorMysqlRuleSetNode; + @Autowired + private MonitorMysqlScorecardNode monitorMysqlScorecardNode; + @Autowired + private MonitorMysqlDecisionTablesNode monitorMysqlDecisionTablesNode; + @Autowired + private MonitorMysqlBlackOrWhiteNode monitorMysqlBlackOrWhiteNode; + @Autowired + private MonitorMysqlDecisionTreeNode monitorMysqlDecisionTreeNode; + + @Override + public String getStorageType() { + return MonitorStorageType.Mysql; + } + + @Override + public void monitorDecisionFlow(Map inputParam, Engine engine, EngineVersion engineVersion, List engineNodeList, Map outMap, Map paramJson, Integer resultId) { + CompletableFuture.runAsync(()->{ + try { + //组装插入实体类信息 + TMonitorEngine monitorEngine = new TMonitorEngine(); + monitorEngine.setBusinessId((String) paramJson.get("pid")); + monitorEngine.setMonitorParentId(resultId+""); + monitorEngine.setOrganId(engine.getOrganId()); + monitorEngine.setEngineId(engine.getId()); + monitorEngine.setEngineName(engine.getName()); + monitorEngine.setEngineVersionId(engineVersion.getVersionId()); + monitorEngine.setProcess(outMap.get("executedNodes")+""); + monitorEngine.setSnapshot(JSON.toJSONString(engineNodeList)); + monitorEngine.setInput(JSON.toJSONString(inputParam)); + //todo 异步写入mysql + monitorEngineMapper.insert(monitorEngine); + outMap.remove("executedNodes"); + //todo 组装节点监控 mysql节点业务模型 并存入mysql + monitorNode(engine,engineVersion,outMap,monitorEngine); + } catch (Exception e) { + logger.info("==============监控中心========监控信息入库出错:{}",e); + } + },threadPoolTaskExecutor); + } + + + /** + * 组装节点监控 Hbase节点业务模型 并存入hbase + * @param engine + * @param engineVersion + * @param outMap + * @param monitorEngine + */ + private void monitorNode(Engine engine, EngineVersion engineVersion, Map outMap,TMonitorEngine monitorEngine) { + if(outMap.containsKey("monitorNodes")){ + List monitorNodeInfoList = (List)outMap.get("monitorNodes"); + logger.debug("=============================monitorNode:{}", JSONArray.toJSONString(monitorNodeInfoList)); + //循环拿出list中的数据,重新组装业务模型,插入Hbase表中 + monitorNodeInfoList.stream().forEach(item->{ + //组装节点层面 插入实体类信息 + TMonitorNode monitorNode = new TMonitorNode(); + monitorNode.setBusinessId(item.getBaseInfo().getBusinessId()); + monitorNode.setOrganId(engine.getOrganId()); + monitorNode.setEngineId(engine.getId()); + monitorNode.setEngineVersionId(engineVersion.getVersionId()); + monitorNode.setMonitorParentId(monitorEngine.getId()+""); + monitorNode.setNodeId(Long.valueOf(item.getBaseInfo().getNodeId())); + monitorNode.setNodeName(item.getBaseInfo().getNodeName()); + monitorNode.setNodeType(item.getBaseInfo().getNodeType()); + monitorNode.setSnapshot(JSON.toJSONString(item.getMonitorInfo().getSnapshot())); + monitorNode.setInput(JSON.toJSONString(item.getMonitorInfo().getParams())); + monitorNode.setOutput(JSON.toJSONString(item.getMonitorInfo().getResult())); + monitorNode.setCreateTime(LocalDateTime.now()); + monitorNodeMapper.insert(monitorNode); + //根绝节点类型拆分出策略层面的数据,组装策略监控信息业务模型 + buildMonitorStrategyModel(monitorNode,outMap); + }); + outMap.remove("monitorDecisionFlow"); + } + } + /** + * 根绝节点类型拆分出策略层面的数据,组装策略监控信息业务模型 + * 并写入Hbase + * @param monitorNode + * @Param outMap 输出变量池 + */ + public void buildMonitorStrategyModel(TMonitorNode monitorNode, Map outMap) { + String nodeType = monitorNode.getNodeType(); + switch(Integer.valueOf(StringEscapeUtils.unescapeJava(nodeType))){ + case 2: + //规则 + monitorMysqlRuleSetNode.createMonitorStrategy(monitorNode,outMap); + break; + case 3: + //分组 + break; + case 4: + //评分卡 + monitorMysqlScorecardNode.createMonitorStrategy(monitorNode,outMap); + break; + case 5: + //黑名单 + monitorMysqlBlackOrWhiteNode.createMonitorStrategy(monitorNode,outMap); + break; + case 6: + //白名单 + monitorMysqlBlackOrWhiteNode.createMonitorStrategy(monitorNode,outMap); + break; + case 7: + //沙盒比例 + break; + case 9: + //决策选项 + break; + case 14: + //子引擎 + break; + case 15: + //模型 + break; + case 16: + //决策表 + monitorMysqlDecisionTablesNode.createMonitorStrategy(monitorNode,outMap); + break; + case 17: + //决策树 + monitorMysqlDecisionTreeNode.createMonitorStrategy(monitorNode,outMap); + break; + default: + break; + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/MonitorMysqlService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/MonitorMysqlService.java new file mode 100644 index 0000000..0d91c87 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/MonitorMysqlService.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; + +import java.util.Map; + +/** + * 监控信息组装 + */ +public interface MonitorMysqlService { + + /** + * 策略层面监控信息组装入库 + * @param monitorNode + * @param outMap + */ + void createMonitorStrategy(TMonitorNode monitorNode, Map outMap); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorCommonServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorCommonServiceImpl.java new file mode 100644 index 0000000..f59c895 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorCommonServiceImpl.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl;//package com.baoying.enginex.executor.monitor.mybatis.hbase.service.node.service.impl; +// +// +//import com.baoying.enginex.executor.datamanage.model.Field; +//import com.baoying.enginex.executor.node.service.CommonService; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +//import java.util.Map; +// +// +//@Service +//public class MonitorCommonServiceImpl implements CommonService { +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// +// @Override +// public boolean getFieldByIds(List ids, Map inputParam) { +// return false; +// } +// +// @Override +// public boolean getEngineField(List fields, Map inputParam) { +// return false; +// } +// +// @Override +// public void getFieldResult(Map inputParam) { +// +// } +//} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlBlackOrWhiteNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlBlackOrWhiteNode.java new file mode 100644 index 0000000..1272469 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlBlackOrWhiteNode.java @@ -0,0 +1,75 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Map; + +@Service +public class MonitorMysqlBlackOrWhiteNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //名单库需要继续 + //根据快照中数据的个数进行确定存取条数。 + //决策表 + logger.info("MonitorMysqlBlackOrWhiteNode============================「监控中心-策略监控信息」参数:{},{}",monitorNode, JSONObject.toJSONString(outMap.get("strategySnopshot"))); + if(!outMap.containsKey("strategySnapshot")){ + return; + } + JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(outMap.get("strategySnapshot"))); + outMap.remove("strategySnapshot"); + for (Object object:jsonArray) { + if(object==null){ + continue; + } + TMonitorStrategy monitorStrategy1 = new TMonitorStrategy(); + //1.节点监控JSONObject信息中拿出策略层面的信息 + JSONObject jsonObject = JSONObject.parseObject(object+""); + //策略快照 + monitorStrategy1.setSnapshot(jsonObject.toString()); + //全量入参 + monitorStrategy1.setInput(monitorNode.getInput()); + //决策表结果 + monitorStrategy1.setOutput(monitorNode.getOutput()); + logger.info("MonitorMysqlBlackOrWhiteNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorStrategy1); + //策略ID 即 决策表版本id + String ruleVersionId = jsonObject.get("id")+""; + monitorStrategy1.setStrategyId(Long.valueOf(ruleVersionId)); + //策略名称 决策表名称 + monitorStrategy1.setStrategyName(JSONObject.parseObject(monitorNode.getSnapshot()).getString("name")); + //策略类型 + monitorStrategy1.setStrategyType(monitorNode.getNodeType()); + //业务id + monitorStrategy1.setBusinessId(monitorNode.getBusinessId()); + //节点id + monitorStrategy1.setNodeId(monitorNode.getNodeId()); + //节点类型 + monitorStrategy1.setNodeType(monitorNode.getNodeType()); + //引擎版本id + monitorStrategy1.setEngineVersionId(monitorNode.getEngineVersionId()); + logger.info("MonitorMysqlBlackOrWhiteNode============================「监控中心-策略监控信息」baseInfo:{}",monitorStrategy1); + //组织id + monitorStrategy1.setOrganId(monitorNode.getOrganId()); + //时间 + monitorStrategy1.setCreateTime(LocalDateTime.now()); + monitorStrategy1.setMonitorParentId(monitorNode.getId()+""); + monitorStrategy1.setEngineId(monitorNode.getEngineId()); + monitorStrategyMapper.insert(monitorStrategy1); + } + + + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlChildEngineNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlChildEngineNode.java new file mode 100644 index 0000000..febad05 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlChildEngineNode.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorMysqlChildEngineNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionOptionsNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionOptionsNode.java new file mode 100644 index 0000000..2ff722b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionOptionsNode.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 决策选项节点 + */ +@Service +public class MonitorMysqlDecisionOptionsNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //决策选项不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTablesNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTablesNode.java new file mode 100644 index 0000000..37fa6f4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTablesNode.java @@ -0,0 +1,122 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class MonitorMysqlDecisionTablesNode implements MonitorMysqlService { + private static final Logger logger = LoggerFactory.getLogger(MonitorMysqlDecisionTablesNode.class); + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + + @Autowired + private DecisionTablesService decisionTablesService; + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //根据快照中数据的个数进行确定存取条数。目前决策表只能选择一个,此处数组是预留防止以后多个的情况 + //决策表 + logger.info("MonitorMysqlDecisionTablesNode============================「监控中心-策略监控信息」参数:{},{}", monitorNode, JSONObject.toJSONString(outMap.get("strategySnopshot"))); + if (!outMap.containsKey("decisionTableStrategy")) { + return; + } + JSONArray jsonArray = JSONArray.parseArray(JSONObject.parseObject(outMap.get("decisionTableStrategy") + "").get("snapshot") + ""); + outMap.remove("decisionTableStrategy"); + for (Object object : jsonArray) { + if (object == null) { + continue; + } + TMonitorStrategy monitorStrategy1 = new TMonitorStrategy(); + //1.节点监控JSONObject信息中拿出策略层面的信息 + JSONObject jsonObject = JSONObject.parseObject(object + ""); + //策略快照 + monitorStrategy1.setSnapshot(jsonObject.toString()); + //全量入参 + monitorStrategy1.setInput(monitorNode.getInput()); + //执行结果全量输出 + monitorStrategy1.setOutput(monitorNode.getOutput()); + logger.info("MonitorMysqlDecisionTablesNode============================「监控中心-策略监控信息」monitorInfo:{}", monitorStrategy1); + //策略ID 即 决策表版本id + String ruleVersionId = jsonObject.get("id") + ""; + String decisionTableId = jsonObject.getString("decisionTablesId"); + monitorStrategy1.setStrategyId(Long.valueOf(ruleVersionId)); + String result = getResult(monitorNode.getOutput(), decisionTableId); + //决策表执行结果 + monitorStrategy1.setResult(result); + //获取对应决策表的名称 + String name = getStrategyName(decisionTableId); + //策略名称 决策表名称 + monitorStrategy1.setStrategyName(name); + //策略类型 + monitorStrategy1.setStrategyType(monitorNode.getNodeType()); + //业务id + monitorStrategy1.setBusinessId(monitorNode.getBusinessId()); + //节点id + monitorStrategy1.setNodeId(monitorNode.getNodeId()); + //节点类型 + monitorStrategy1.setNodeType(monitorNode.getNodeType()); + //引擎版本id + monitorStrategy1.setEngineVersionId(monitorNode.getEngineVersionId()); + logger.info("MonitorMysqlDecisionTablesNode============================「监控中心-策略监控信息」baseInfo:{}", monitorStrategy1); + //组织id + monitorStrategy1.setOrganId(monitorNode.getOrganId()); + //时间 + monitorStrategy1.setCreateTime(LocalDateTime.now()); + monitorStrategy1.setMonitorParentId(monitorNode.getId() + ""); + monitorStrategy1.setEngineId(monitorNode.getEngineId()); + monitorStrategyMapper.insert(monitorStrategy1); + } + } + + /** + * 根据决策表id 查询决策表名称 + * @param decisionTablesId + * @return + */ + private String getStrategyName(String decisionTablesId) { + DecisionTables decisionTables = decisionTablesService.getById(decisionTablesId); + return decisionTables==null?null:decisionTables.getName(); + } + + + /** + * 根据决策表id 去全量执行结果中匹配 + * 匹配出对应的决策表的 执行结果 + * + * @param output + * @param ruleVersionId + * @return + */ + private static String getResult(String output, String ruleVersionId) { + if (!StringUtils.isEmpty(output) && !StringUtils.isEmpty(ruleVersionId)) { + JSONObject resultJsonObject = JSONObject.parseObject(output); + JSONArray allResults = JSONArray.parseArray(resultJsonObject.getString("result")); + List one = allResults.stream().filter( + object -> ruleVersionId.equals(JSONObject.parseObject(JSON.toJSONString(object)).getString("decisionTablesId"))).collect(Collectors.toList()); + + if(one.size()==1){ + Object strategyResultJson = one.get(0); + JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(strategyResultJson)); + return jsonObject.getString("result"); + } + } + return null; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTreeNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTreeNode.java new file mode 100644 index 0000000..f908c11 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlDecisionTreeNode.java @@ -0,0 +1,71 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Map; + +@Service +public class MonitorMysqlDecisionTreeNode implements MonitorMysqlService { + private static final Logger logger = LoggerFactory.getLogger(MonitorMysqlDecisionTreeNode.class); + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //根据快照中数据的个数进行确定存取条数。目前决策表只能选择一个,此处数组是预留防止以后多个的情况 + //决策表 + logger.info("MonitorMysqlDecisionTreeNode============================「监控中心-策略监控信息」参数:{},{}",monitorNode, JSONObject.toJSONString(outMap.get("strategySnopshot"))); + if(!outMap.containsKey("decisionTreeStrategy")){ + return; + } + JSONArray jsonArray = JSONArray.parseArray(JSONObject.parseObject(outMap.get("decisionTreeStrategy")+"").get("snapshot")+""); + outMap.remove("decisionTreeStrategy"); + for (Object object:jsonArray) { + if(object==null){ + continue; + } + TMonitorStrategy monitorStrategy1 = new TMonitorStrategy(); + //1.节点监控JSONObject信息中拿出策略层面的信息 + JSONObject jsonObject = JSONObject.parseObject(object+""); + //策略快照 + monitorStrategy1.setSnapshot(jsonObject.toString()); + //全量入参 + monitorStrategy1.setInput(monitorNode.getInput()); + //决策表结果 + monitorStrategy1.setOutput(monitorNode.getOutput()); + logger.info("MonitorMysqlDecisionTreeNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorStrategy1); + //策略ID 即 决策表版本id + String ruleVersionId = jsonObject.get("id")+""; + monitorStrategy1.setStrategyId(Long.valueOf(ruleVersionId)); + //策略名称 决策表名称 + monitorStrategy1.setStrategyName(JSONObject.parseObject(monitorNode.getSnapshot()).getString("name")); + //策略类型 + monitorStrategy1.setStrategyType(monitorNode.getNodeType()); + //业务id + monitorStrategy1.setBusinessId(monitorNode.getBusinessId()); + //节点id + monitorStrategy1.setNodeId(monitorNode.getNodeId()); + //节点类型 + monitorStrategy1.setNodeType(monitorNode.getNodeType()); + //引擎版本id + monitorStrategy1.setEngineVersionId(monitorNode.getEngineVersionId()); + logger.info("MonitorMysqlDecisionTreeNode============================「监控中心-策略监控信息」baseInfo:{}",monitorStrategy1); + //组织id + monitorStrategy1.setOrganId(monitorNode.getOrganId()); + //时间 + monitorStrategy1.setCreateTime(LocalDateTime.now()); + monitorStrategy1.setMonitorParentId(monitorNode.getId()+""); + monitorStrategy1.setEngineId(monitorNode.getEngineId()); + monitorStrategyMapper.insert(monitorStrategy1); + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlGroupNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlGroupNode.java new file mode 100644 index 0000000..f105571 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlGroupNode.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorMysqlGroupNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //策略层面分组先不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlModelNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlModelNode.java new file mode 100644 index 0000000..bb73b93 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlModelNode.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorMysqlModelNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //模型先不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlRuleSetNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlRuleSetNode.java new file mode 100644 index 0000000..5390b07 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlRuleSetNode.java @@ -0,0 +1,124 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class MonitorMysqlRuleSetNode implements MonitorMysqlService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + @Autowired + private RuleService ruleService; + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + JSONObject nodeJson = JSONObject.parseObject(monitorNode.getSnapshot()); + //根据快照中数据的个数进行确定存取条数。 + //规则 + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」参数:{},{}",monitorNode,JSONObject.toJSONString(outMap.get("strategySnopshot"))); + if(!outMap.containsKey("strategySnopshot")){ + logger.info("该规则没有对应的快照信息"); + return; + } + JSONArray jsonArray = JSONArray.parseArray(JSONObject.parseObject(outMap.get("strategySnopshot")+"").get("snopshot")+""); + outMap.remove("strategySnopshot"); + if(jsonArray == null){ + return; + } + logger.info("================================================ mysql策略 条数: ======================={}",jsonArray.size()); + for (Object object:jsonArray) { + //1.节点监控JSONObject信息中拿出策略层面的信息 + TMonitorStrategy monitorStrategy = new TMonitorStrategy(); + JSONObject jsonObject = JSONObject.parseObject(object+""); + if(jsonObject==null){ + return; + } + //策略快照 + monitorStrategy.setSnapshot(jsonObject.toString()); + //全量入参 + monitorStrategy.setInput(monitorNode.getInput()); + //详细得分情况 + JSONObject scoreDetail = new JSONObject(); + scoreDetail.put("ruleResultList", JSON.parseObject(monitorNode.getOutput()).get("ruleResultList")); + //策略ID 即 规则版本id + String ruleVersionId = jsonObject.get("id")+""; + //输出匹配过滤 +// RuleInfo ruleInfo = matchOutPut(ruleVersionId,ruleVersionId); + monitorStrategy.setOutput(scoreDetail.toJSONString()); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorStrategy); + RuleInfo ruleInfo = getRuleInfo(nodeJson,ruleVersionId); + monitorStrategy.setStrategyId(Long.valueOf(ruleVersionId)); + //策略名称 规则版本描述 + monitorStrategy.setStrategyName(ruleInfo.getName()); + //策略类型 + monitorStrategy.setStrategyType(monitorNode.getNodeType()); + //业务id + monitorStrategy.setBusinessId(monitorNode.getBusinessId()); + //节点id + monitorStrategy.setNodeId(monitorNode.getNodeId()); + //节点类型 + monitorStrategy.setNodeType(monitorNode.getNodeType()); + //引擎版本id + monitorStrategy.setEngineVersionId(monitorNode.getEngineVersionId()); + monitorStrategy.setMonitorParentId(monitorNode.getId()+""); + monitorStrategy.setEngineId(monitorNode.getOrganId()); + monitorStrategy.setOrganId(monitorNode.getOrganId()); + logger.info("MonitorMysqlRuleSetNode============================「监控中心-策略监控信息」baseInfo:{}",monitorStrategy); + monitorStrategyMapper.insert(monitorStrategy); + } + } + + /** + * 匹配获取规则 + * @param nodeJson + * @param ruleVersionId + * @return + */ + private RuleInfo getRuleInfo(JSONObject nodeJson, String ruleVersionId) { + int groupType = nodeJson.getInteger("groupType") == null ? Constants.ruleNode.EXECUTEGROUP : nodeJson.getInteger("groupType"); + RuleInfo ruleInfo = new RuleInfo(); + // 互斥组(串行) + if (groupType == Constants.ruleNode.MUTEXGROUP) { + JSONArray jsonArray1 = nodeJson.getJSONObject("mutexGroup").getJSONArray("rules"); + ruleInfo = getRuleFromJsonArray(jsonArray1,ruleVersionId); + } + // 执行组(并行) + else if (groupType == Constants.ruleNode.EXECUTEGROUP) { + JSONArray jsonArray1 = nodeJson.getJSONObject("executeGroup").getJSONArray("rules"); + ruleInfo = getRuleFromJsonArray(jsonArray1,ruleVersionId); + } + return ruleInfo; + } + + private RuleInfo getRuleFromJsonArray(JSONArray jsonArray,String ruleVersionId) { + List ruleIds = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject ruleObj = jsonArray.getJSONObject(i); + Long versionId = ruleObj.getLong("ruleVersionId"); + if(versionId.longValue()==Long.valueOf(ruleVersionId).longValue()){ + Long ruleId = ruleObj.getLong("id"); + ruleIds.add(ruleId); + } + } + List ruleInfoList = ruleService.getRuleList(ruleIds); + return ruleInfoList.get(0); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlSandboxProportionNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlSandboxProportionNode.java new file mode 100644 index 0000000..076e271 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlSandboxProportionNode.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class MonitorMysqlSandboxProportionNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + //不需要记录 + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlScorecardNode.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlScorecardNode.java new file mode 100644 index 0000000..9a27e9f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/monitor/runner/mysql/node/impl/MonitorMysqlScorecardNode.java @@ -0,0 +1,72 @@ +package com.fibo.ddp.common.service.monitor.runner.mysql.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.monitor.decisionflow.TMonitorStrategyMapper; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorNode; +import com.fibo.ddp.common.model.monitor.decisionflow.TMonitorStrategy; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.service.monitor.runner.mysql.node.MonitorMysqlService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Map; + +@Service +public class MonitorMysqlScorecardNode implements MonitorMysqlService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private TMonitorStrategyMapper monitorStrategyMapper; + + @Override + public void createMonitorStrategy(TMonitorNode monitorNode, Map outMap) { + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」参数:{}",monitorNode); + //策略快照 根绝评分卡id,去查对应的字段。 + if(!outMap.containsKey("scorecardStrategy")){ + return; + } + ScorecardVersionVo scorecardVo = JSONObject.parseObject(JSONObject.toJSONString(JSONObject.parseObject(outMap.get("scorecardStrategy")+"")),ScorecardVersionVo.class); + outMap.remove("scorecardStrategy"); + if(scorecardVo==null){ + return; + } + TMonitorStrategy monitorStrategy = new TMonitorStrategy(); +// monitorInfo.setSnapshot(JSONObject.parseObject(JSONObject.toJSONString(scorecardVo.getVersionList().get(0)))); + //全量入参 + monitorStrategy.setInput(monitorNode.getInput()); + //详细得分情况 + JSONObject scoreDetail = new JSONObject(); + scoreDetail.put("scoreDetail", JSON.parseObject(monitorNode.getOutput()).get("scoreDetail")); + monitorStrategy.setOutput(scoreDetail.toString()); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」monitorInfo:{}",monitorNode); + //策略ID 即 评分卡版本Id + monitorStrategy.setStrategyId(scorecardVo.getId()); + //策略名称 + monitorStrategy.setStrategyName(scorecardVo.getDescription()+""); + //策略类型 + monitorStrategy.setStrategyType(monitorNode.getNodeType()); + //业务id + monitorStrategy.setBusinessId(monitorNode.getBusinessId()); + //节点id + monitorStrategy.setNodeId(monitorNode.getNodeId()); + //节点类型 + monitorStrategy.setNodeType(monitorNode.getNodeType()); + //引擎版本id + monitorStrategy.setEngineVersionId(monitorNode.getEngineVersionId()); + logger.info("MonitorMysqlScorecardNode============================「监控中心-策略监控信息」baseInfo:{}",monitorNode); + //快照 + monitorStrategy.setSnapshot(JSON.toJSONString(scorecardVo)); + //组织id + monitorStrategy.setOrganId(monitorNode.getOrganId()); + //时间 + monitorStrategy.setCreateTime(LocalDateTime.now()); + monitorStrategy.setMonitorParentId(monitorNode.getId()+""); + monitorStrategy.setEngineId(monitorNode.getEngineId()); + monitorStrategy.setCreateTime(LocalDateTime.now()); + monitorStrategyMapper.insert(monitorStrategy); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisManager.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisManager.java new file mode 100644 index 0000000..51b7d2f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisManager.java @@ -0,0 +1,864 @@ +package com.fibo.ddp.common.service.redis; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.PropertyNamingStrategy; +import com.alibaba.fastjson.parser.ParserConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.*; + +import java.util.*; + +@Component +@Slf4j +public class RedisManager { + + // 0-表示永远不过期 + private int expire = 0; + + @Autowired + private JedisPool jedisPool; + + public RedisManager() {} + + /** + * @Title: init + * @Description: 初始化方法,用来初始化 + * @param 设定文件 + * @return void 返回类型 + * @throws + */ + public void init() { + } + + /** + * @Title: get + * @Description: 根据key来获得一条特定的缓存数据 + * @param @inputParam key 序列化后的key + * @param @return 设定文件 + * @return byte[] 返回类型 + * @throws + */ + public byte[] get(byte[] key) { + byte[] value = null; + Jedis jedis =null; + try { + jedis = jedisPool.getResource(); + value = jedis.get(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + jedis.close(); + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + + /** + * @Title: get + * @Description: 根据key来获得一条特定的缓存数据 + * @param @inputParam key string类型的key + * @param @return 设定文件 + * @return String 返回类型 + * @throws + */ + public String get(String key) { + String value = null; + Jedis jedis = jedisPool.getResource(); + try { + value = jedis.get(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * @Title: set + * @Description: 向redis数据库中缓存数据,key,value都为byte[](已经序列化) + * @param @inputParam key + * @param @inputParam value + * @param @return 设定文件 + * @return byte[] 返回类型 + * @throws + */ + public byte[] set(byte[] key, byte[] value) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.set(key, value); + if (this.expire != 0) { + jedis.expire(key, this.expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * @Title: set + * @Description: 向redis数据库中缓存数据,key,value为字符串类型,缓存时间为永不过期 + * @param @inputParam key + * @param @inputParam value + * @param @return 设定文件 + * @return String 返回类型 + * @throws + */ + public String set(String key, String value) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.set(key, value); + if (this.expire != 0) { + jedis.expire(key, this.expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * @Title: set + * @Description: 向redis数据库中缓存数据,key,value都为byte[](已经序列化) + * @param @inputParam key + * @param @inputParam value + * @param @inputParam expire 0为永不过期,其他时间则会设置对应的过期时间 + * @param @return 设定文件 + * @return byte[] 返回类型 + * @throws + */ + public byte[] set(byte[] key, byte[] value, int expire) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.set(key, value); + if (expire != 0) { + jedis.expire(key, expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * @Title: set + * @Description: 向redis数据库中缓存数据,key,value都为字符串的类型 + * @param @inputParam key + * @param @inputParam value + * @param @inputParam expire 0为永不过期,其他时间则会设置对应的过期时间 + * @param @return 设定文件 + * @return String 返回类型 + * @throws + */ + public String set(String key, String value, int expire) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.set(key, value); + if (expire != 0) { + jedis.expire(key, expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * @Title: del + * @Description: 根据byte数组(已经序列化的key)来删除redis数据库中缓存的数据 + * @param @inputParam key 设定文件 + * @return void 返回类型 + * @throws + */ + public void del(byte[] key) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.del(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + } + + /** + * @Title: del + * @Description: 根据特定的string类型的key来删除redis数据库中的缓存数据 + * @param @inputParam key 设定文件 + * @return void 返回类型 + * @throws + */ + public void del(String key) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.del(key); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } + + /** + * @Title: flushDB + * @Description: 清除指定redis数据库中的数据 + * @param 设定文件 + * @return void 返回类型 + * @throws + */ + public void flushDB() { + Jedis jedis = jedisPool.getResource(); + try { + jedis.flushDB(); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + } + + /** + * @Title: dbSize + * @Description: 获得redis缓存数据的大小 + * @param @return 设定文件 + * @return Long 返回类型 + * @throws + */ + public Long dbSize() { + Long dbSize = 0L; + Jedis jedis = jedisPool.getResource(); + try { + dbSize = jedis.dbSize(); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return dbSize; + } + + /** + * @Title: keys + * @Description: 根据泛型来查询所有符合泛型的缓存数据 + * @param @inputParam pattern + * @param @return 设定文件 + * @return Set 返回类型 + * @throws + */ + public Set keys(String pattern) { + Set keys = null; + Jedis jedis = jedisPool.getResource(); + try { + keys = jedis.keys(pattern.getBytes()); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return keys; + } + + /** + * @Title: dels + * @Description: 根据提供的泛型来删除reids中缓存的数据 + * @param @inputParam pattern 设定文件 + * @return void 返回类型 + * @throws + */ + public void dels(String pattern) { + Set keys = null; + Jedis jedis = jedisPool.getResource(); + try { + keys = jedis.keys(pattern.getBytes()); + Iterator ito = keys.iterator(); + while (ito.hasNext()) { + jedis.del(ito.next()); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + } + + + + // ------------------------------------ 缓存改造 ----------------------------------- + + /** + * hash类型 添加键值对 + * + * @param key + * @param field + * @param value + * @return + */ + public Long hset(String key, String field, String value) { + Jedis jedis = jedisPool.getResource(); + Long result = null; + try { + result = jedis.hset(key, field, value); + if (this.expire != 0) { + jedis.expire(key, this.expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * hash类型 获取所有键值对 + * + * @param key + * @return + */ + public Map hgetAll(String key) { + Map value = null; + Jedis jedis = jedisPool.getResource(); + try { + value = jedis.hgetAll(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + public ScanResult scan(String cursor, ScanParams params) { + ScanResult value = null; + Jedis jedis = jedisPool.getResource(); + try { + value = jedis.scan(cursor, params); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + public List scan(String key) { + List result = null; + // 游标初始值为0 + String cursor = ScanParams.SCAN_POINTER_START; + ScanParams scanParams = new ScanParams(); + scanParams.match(key);// pattern + scanParams.count(1000); + while (true) { + //使用scan命令获取数据,使用cursor游标记录位置,下次循环使用 + ScanResult scanResult = scan(cursor, scanParams); + cursor = scanResult.getStringCursor();// 返回0 说明遍历完成 + List list = scanResult.getResult(); + if (result == null) { + result = new ArrayList<>(); + } + result.addAll(list); + if ("0".equals(cursor)) { + break; + } + } + return result; + } + + /** + * hash类型 模糊查询 + * + * @param keyPattern + * @param clazz + * @param + * @return + */ + public List scanHash(String keyPattern, Class clazz) { + List result = null; + List keys = scan(keyPattern); + for (String key : keys) { + Map map = hgetAll(key); + if (result == null) { + result = new ArrayList<>(); + } + result.add(JSONObject.parseObject(JSONObject.toJSONString(map), clazz)); + } + return result; + } + + /** + * list类型 从尾部添加元素 + * + * @param key + * @param strings + * @return + */ + public Long rpush(String key, String... strings) { + Jedis jedis = jedisPool.getResource(); + Long result = null; + try { + result = jedis.rpush(key, strings); + if (this.expire != 0) { + jedis.expire(key, this.expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * list类型 获取链表中从start到end的元素的值 + * (start、end可为负数,若为-1则表示链表尾部的元素) + * + * @param key + * @param start + * @param end + * @return + */ + public List lrange(String key, long start, long end) { + Jedis jedis = jedisPool.getResource(); + List result = null; + try { + result = jedis.lrange(key, 0, -1); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * set类型 添加成员 + * + * @param key + * @param members + * @return + */ + public Long sadd(String key, String... members) { + Jedis jedis = jedisPool.getResource(); + Long result = null; + try { + result = jedis.sadd(key, members); + if (this.expire != 0) { + jedis.expire(key, this.expire); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * set类型 删除成员 + * + * @param key + * @param members + * @return + */ + public Long srem(String key, String... members) { + Jedis jedis = jedisPool.getResource(); + Long result = null; + try { + result = jedis.srem(key, members); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * set类型 获取所有的成员 + * + * @param key + * @return + */ + public Set smembers(String key) { + Jedis jedis = jedisPool.getResource(); + Set result = null; + try { + result = jedis.smembers(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return result; + } + + /** + * 根据主键查询对象 + * + * @param key + * @param clazz + * @param + * @return + */ + public T getByPrimaryKey(String key, Class clazz) { + long start = System.currentTimeMillis(); + ParserConfig.getGlobalInstance().propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; + T result = null; + Map map = hgetAll(key); + if (map != null) { + result = JSONObject.parseObject(JSONObject.toJSONString(map), clazz); + } + long end = System.currentTimeMillis(); + log.debug("============= getByPrimaryKey ======== 耗时:" + (end -start)); + return result; + } + + /** + * 根据外键查询对应的集合 + * + * @param key + * @param clazz + * @param + * @return + */ + public List getByForeignKey(String key, Class clazz) { + long start = System.currentTimeMillis(); + ParserConfig.getGlobalInstance().propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; + List result = null; + Set members = smembers(key); + if (members != null) { + result = hgetAllBatchByPrimaryKeys(new ArrayList<>(members), clazz); + } + long end = System.currentTimeMillis(); + log.debug("============= getByForeignKey ======== 耗时:" + (end -start)); + return result; + } + + /** + * pipeline批量获取hash数据 + * + * @param keys 主键列表 + * @param clazz + * @param + * @return + */ + public List hgetAllBatchByPrimaryKeys(List keys, Class clazz) { + long start = System.currentTimeMillis(); + Jedis jedis = jedisPool.getResource(); + List result = null; + try { + Pipeline pipelined = jedis.pipelined(); + for (String key : keys) { + pipelined.hgetAll(key); + } + // 阻塞拿到所有返回信息 + List objectList = pipelined.syncAndReturnAll(); + + for (Object object : objectList) { + if (result == null) { + result = new ArrayList<>(); + } + result.add(JSONObject.parseObject(JSONObject.toJSONString(object), clazz)); + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + long end = System.currentTimeMillis(); + log.debug("============= hgetAllBatchByPrimaryKeys ======== 耗时:" + (end -start)); + return result; + } + + /** + * pipeline批量获取hash数据 + * @param keys 外键列表 + * @param clazz + * @param + * @return + */ + public List hgetAllBatchByForeignKeys(List keys, Class clazz) { + long start = System.currentTimeMillis(); + List result = null; + for (String key : keys) { + List keyResult = getByForeignKey(key, clazz); + if(keyResult == null){ + continue; + } + if (result == null) { + result = new ArrayList<>(); + } + result.addAll(keyResult); + } + long end = System.currentTimeMillis(); + log.debug("============= hgetAllBatchByForeignKeys ======== 耗时:" + (end -start)); + return result; + } + + /** + * pipeline批量获取string数据 + * + * @param keys 主键列表 + * @param clazz + * @param + * @return + */ + public List getAllBatchByPrimaryKeys(List keys, Class clazz) { + long start = System.currentTimeMillis(); + Jedis jedis = jedisPool.getResource(); + List result = null; + try { + Pipeline pipelined = jedis.pipelined(); + for (String key : keys) { + pipelined.get(key); + } + // 阻塞拿到所有返回信息 + List objectList = pipelined.syncAndReturnAll(); + + for (Object object : objectList) { + if (object != null) { + if (result == null) { + result = new ArrayList<>(); + } + result.add(JSONObject.parseObject(object.toString(), clazz)); + } + } + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + long end = System.currentTimeMillis(); + log.debug("============= getAllBatchByPrimaryKeys ======== 耗时:" + (end - start)); + return result; + } + + /** + * pipeline批量插入string数据 + * + * @param + * @param + * @param + * @return + */ + public void setAllBatchByPrimaryKeys(Map data, int seconds) { + long start = System.currentTimeMillis(); + Jedis jedis = jedisPool.getResource(); + try { + Pipeline pipelined = jedis.pipelined(); + for (Map.Entry entry : data.entrySet()) { + pipelined.set(entry.getKey(), entry.getValue()); + pipelined.expire(entry.getKey(), seconds); + } + // 阻塞拿到所有返回信息 + List objectList = pipelined.syncAndReturnAll(); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + long end = System.currentTimeMillis(); + log.debug("============= setAllBatchByPrimaryKeys ======== 耗时:" + (end - start)); + return; + } + + /** + * @param @inputParam dictKey string类型的key + * @param @return 设定文件 + * @return String 返回类型 + * @throws + * @Title: Hget + * @Description: 根据key来获得一条特定的缓存数据 + */ + public String hsetnx(String key,String field,String value) { + Jedis jedis = jedisPool.getResource(); + try { + jedis.hsetnx(key, field, value); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + /** + * 获取key的剩余过期时间,单位秒 + * + * @param key + * @return + */ + public Long ttl(String key) { + Long value = null; + Jedis jedis = jedisPool.getResource(); + try { + value = jedis.ttl(key); + } catch (Exception e) { + //释放redis对象 + jedisPool.returnBrokenResource(jedis); + e.printStackTrace(); + } finally { + //返还到连接池 + if (jedis != null) { + jedisPool.returnResource(jedis); + } + } + return value; + } + + public void subscribe(JedisPubSub jedisPubSub, String channel) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.subscribe(jedisPubSub, channel); + } catch (Exception e) { + log.error("redis订阅异常:channel:{}", channel, e); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } + + public void publish(String channel, String message) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.publish(channel, message); + } catch (Exception e) { + log.error("redis发送消息异常", e); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisUtils.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisUtils.java new file mode 100644 index 0000000..b880d81 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/redis/RedisUtils.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.common.service.redis; + + +import com.fibo.ddp.common.dao.canal.TableEnum; + +import java.util.List; +import java.util.stream.Collectors; + +public class RedisUtils { + + /** + * 获取主键redis key + * @param tableName + * @param primaryId + * @return + */ + public static String getPrimaryKey(String tableName, Object primaryId){ + String key = "primary_key" + ":" + tableName + ":" + primaryId; + return key; + } + + public static String getPrimaryKey(TableEnum tableEnum, Object primaryId){ + return getPrimaryKey(tableEnum.getTableName(), primaryId); + } + + public static List getPrimaryKey(TableEnum tableEnum, List primaryIds){ + List keys = primaryIds.stream().map(item -> getPrimaryKey(tableEnum, item)).collect(Collectors.toList()); + return keys; + } + + /** + * 获取外键redis key + * @param tableName + * @param foreignId + * @return + */ + public static String getForeignKey(String tableName, Object foreignId){ + String key = "foreign_key" + ":" + tableName + ":" + foreignId; + return key; + } + + public static String getForeignKey(TableEnum tableEnum, Object foreignId){ + return getForeignKey(tableEnum.getTableName(), foreignId); + } + + public static List getForeignKey(TableEnum tableEnum, List foreignIds){ + List keys = foreignIds.stream().map(item -> getForeignKey(tableEnum, item)).collect(Collectors.toList()); + return keys; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/ModelsService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/ModelsService.java new file mode 100644 index 0000000..c9ab312 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/ModelsService.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.service.strategyx.aimodel; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; + +import java.util.List; + +public interface ModelsService extends IService { + + /** + * 获取组织下所有模型信息 + * @param organId + * @return + */ + List getModelsListByOrganId(Integer organId, String searchString); + + boolean checkNameNotRepeat(MachineLearningModels models); + + List queryFieldEnByModelsId(Integer id); + + // runner + MachineLearningModels selectById(Integer id); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/PMMLExecutor.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/PMMLExecutor.java new file mode 100644 index 0000000..413496d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/PMMLExecutor.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.service.strategyx.aimodel.PMMLExecutor; + +import org.jpmml.evaluator.Evaluator; + +import java.util.List; +import java.util.Map; + +public interface PMMLExecutor { + + Evaluator loadPmml(String filePath); + + double predict(Evaluator evaluator, Map input); + + List parseField(Evaluator evaluator); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/impl/PMMLExecutorRFImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/impl/PMMLExecutorRFImpl.java new file mode 100644 index 0000000..f027731 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/PMMLExecutor/impl/PMMLExecutorRFImpl.java @@ -0,0 +1,98 @@ +package com.fibo.ddp.common.service.strategyx.aimodel.PMMLExecutor.impl; + +import com.fibo.ddp.common.service.strategyx.aimodel.PMMLExecutor.PMMLExecutor; +import org.dmg.pmml.FieldName; +import org.dmg.pmml.PMML; +import org.jpmml.evaluator.*; +import org.jpmml.model.PMMLUtil; +import org.springframework.stereotype.Component; +import org.xml.sax.SAXException; + +import javax.xml.bind.JAXBException; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Component +public class PMMLExecutorRFImpl implements PMMLExecutor { + + @Override + public Evaluator loadPmml(String filePath) { +// String filePath = "D:\\models\\model_RF.pmml"; + PMML pmml = new PMML(); + InputStream inputStream = null; + + try { + inputStream = new FileInputStream(filePath); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + + if (inputStream == null) { + return null; + } + + InputStream is = inputStream; + try { + pmml = PMMLUtil.unmarshal(is); + } catch (SAXException e) { + e.printStackTrace(); + } catch (JAXBException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance(); + Evaluator evaluator = modelEvaluatorFactory.newModelEvaluator(pmml); + pmml = null; + return evaluator; + } + + @Override + public double predict(Evaluator evaluator, Map input) { + List inputFields = evaluator.getInputFields(); + Map arguments = new LinkedHashMap<>(); + for (InputField inputField : inputFields) { + FieldName inputFieldName = inputField.getName(); + Object rawValue = input.get(inputFieldName.getValue()); + FieldValue inputFieldValue = inputField.prepare(rawValue); + arguments.put(inputFieldName, inputFieldValue); + } + + Map results = evaluator.evaluate(arguments); + List targetFields = evaluator.getTargetFields(); + + TargetField targetField = targetFields.get(0); + FieldName targetFieldName = targetField.getName(); + + Object targetFieldValue = results.get(targetFieldName); + System.out.println("target: " + targetFieldName.getValue() + ", value: " + targetFieldValue); + + double value_1 = 0.0f; + if (targetFieldValue instanceof ProbabilityDistribution) { + value_1 = ((ProbabilityDistribution) targetFieldValue).getValue("1"); + } + return value_1; + } + + @Override + public List parseField(Evaluator evaluator) { + List fieldList = new ArrayList<>(); + List inputFields = evaluator.getInputFields(); + for (InputField inputField : inputFields) { + FieldName inputFieldName = inputField.getName(); + fieldList.add(inputFieldName.getValue()); + } + return fieldList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/impl/ModelsServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/impl/ModelsServiceImpl.java new file mode 100644 index 0000000..d2dd9ed --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/aimodel/impl/ModelsServiceImpl.java @@ -0,0 +1,90 @@ +package com.fibo.ddp.common.service.strategyx.aimodel.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.aimodel.MachineLearningModelsMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.aimodel.ModelsService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.exception.ApiException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +public class ModelsServiceImpl extends ServiceImpl implements ModelsService { + + @Autowired + private MachineLearningModelsMapper machineLearningModelsMapper; + @Resource + private FieldService fieldService; + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getModelsListByOrganId(Integer organId, String searchString) { + return machineLearningModelsMapper.getModelsListByOrganId(organId, searchString); + } + + @Override + public boolean checkNameNotRepeat(MachineLearningModels models) { + if (models == null || "".equals(models) || StringUtils.isBlank(models.getModelName())) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + MachineLearningModels machineLearningModels = new MachineLearningModels(); + machineLearningModels.setModelName(models.getModelName()); + machineLearningModels.setStatus(1); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(machineLearningModels); + if (models.getId() != null) { + wrapper.ne(MachineLearningModels::getId, models.getId()); + } + int count = this.count(wrapper); + if (count > 0) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), "模型名称重复"); + } + return true; + } + + @Override + public List queryFieldEnByModelsId(Integer id) { + Set fieldEns = new HashSet<>(); + MachineLearningModels models = machineLearningModelsMapper.selectById(id); + if (models != null && models.getMappingField() != null && !"".equals(models.getMappingField())) { + String[] split = models.getMappingField().split(","); + for (String s : split) { + fieldEns.add(fieldService.getFieldEnById(Long.valueOf(s))); + } + } + return new ArrayList<>(fieldEns); + } + + @Override + public MachineLearningModels selectById(Integer id) { + MachineLearningModels machineLearningModels = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_MACHINE_LEARNING_MODELS, id); + machineLearningModels = redisManager.getByPrimaryKey(key, MachineLearningModels.class); + } else { + machineLearningModels = this.selectById(id); + } + + return machineLearningModels; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleConditionService.java new file mode 100644 index 0000000..a523128 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleConditionService.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.service.strategyx.baserule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleCondition; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * (BaseRuleCondition)表服务接口 + * + * @since 2021-12-27 09:46:43 + */ +public interface BaseRuleConditionService extends IService { + + BaseRuleCondition queryByRuleId(Long ruleId); + + boolean saveConditionTree(BaseRuleCondition condition, Long ruleId); + + @Transactional + BaseRuleCondition updateCondition(Long ruleId, BaseRuleCondition condition); + + @Transactional + boolean deleteConditionByRuleId(Long ruleId); + + boolean deleteConditionByRuleIds(List ruleIds); + + BaseRuleCondition assemble(List list); + + List disassemble(BaseRuleCondition vo, Long ruleId); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleService.java new file mode 100644 index 0000000..e4dca0f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/BaseRuleService.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.service.strategyx.baserule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; + +import java.util.List; + +/** + * (BaseRule)表服务接口 + * @since 2021-12-27 09:46:42 + */ +public interface BaseRuleService extends IService{ + + BaseRule queryById(Long id); + + boolean insertBaseRule(BaseRule baseRule); + + boolean insertBaseRuleList(List list); + + boolean deleteBaseRule(Long id); + + boolean deleteBaseRuleByIds(List ids); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleConditionServiceImpl.java new file mode 100644 index 0000000..222b45a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleConditionServiceImpl.java @@ -0,0 +1,263 @@ +package com.fibo.ddp.common.service.strategyx.baserule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.baserule.BaseRuleConditionMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleCondition; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; +import com.fibo.ddp.common.service.strategyx.baserule.BaseRuleConditionService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleLoopGroupActionService; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import com.fibo.ddp.common.utils.constant.strategyx.CondConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * (BaseRuleCondition)表服务实现类 + * + * @author jgp + * @since 2021-12-27 09:46:43 + */ +@Service("baseRuleConditionService") +public class BaseRuleConditionServiceImpl extends ServiceImpl implements BaseRuleConditionService { + @Resource + private BaseRuleConditionMapper baseRuleConditionMapper; + @Resource + private RuleLoopGroupActionService loopGroupActionService; + + @Override + public BaseRuleCondition queryByRuleId(Long ruleId) { + if (ruleId == null) { + return null; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BaseRuleCondition::getRuleId, ruleId); + List list = this.list(wrapper); + BaseRuleCondition result = assemble(list); + return result; + } + + @Override + @Transactional + public boolean saveConditionTree(BaseRuleCondition condition, Long ruleId) { + if (condition == null || ruleId == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "存储条件失败:参数错误"); + } + boolean result = false; + this.deleteConditionByRuleId(ruleId); + Long parentId = CondConst.DEFAULT_CONDITION_PARENT_ID; + condition.setParentId(parentId); + List conditionList = disassemble(condition, ruleId); + result = this.saveOrUpdateBatch(conditionList); + if (result) { + List actions = new ArrayList<>(); + for (BaseRuleCondition ruleCondition : conditionList) { + List loopGroupActions = ruleCondition.getLoopGroupActions(); + if (CollectionUtils.isNotEmpty(loopGroupActions)) { + actions.addAll(loopGroupActions); + } + } + if (CollectionUtils.isNotEmpty(actions)) { + result = loopGroupActionService.saveBatch(actions); + } + } + if (!result) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "条件区域存储失败"); + } + return result; + } + + /** + * 修改规则条件 + * + * @param condition + * @return + */ + @Override + @Transactional + public BaseRuleCondition updateCondition(Long ruleId, BaseRuleCondition condition) { + if (ruleId == null) { + return null; + } + //删除一个规则下的所有条件 + boolean delete = this.deleteConditionByRuleId(ruleId); + BaseRuleCondition check = null; + if (!delete) { + check = this.queryByRuleId(ruleId); + } + //插入条件树 + if ((delete || check == null) && condition != null) { + this.saveConditionTree(condition, ruleId); + } + return this.queryByRuleId(ruleId); + } + + /** + * 删除根据规则id规则条件 + * + * @param ruleId + * @return + */ + @Override + @Transactional + public boolean deleteConditionByRuleId(Long ruleId) { + if (ruleId == null) { + return false; + } + //删除循环动作子表中的内容 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BaseRuleCondition::getRuleId, ruleId); + wrapper.eq(BaseRuleCondition::getLogic, CondConst.CondLogic.LOOP_RULE_LOGICAL); + List conditionList = baseRuleConditionMapper.selectList(wrapper); + for (BaseRuleCondition condition : conditionList) { + loopGroupActionService.deleteLoopGroupByForId(condition.getId()); + } + //删除条件表内容 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BaseRuleCondition::getRuleId, ruleId); + int delete = baseRuleConditionMapper.delete(queryWrapper); + return delete > 0; + } + + @Override + public boolean deleteConditionByRuleIds(List ruleIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(BaseRuleCondition::getRuleId, ruleIds); + wrapper.eq(BaseRuleCondition::getLogic, CondConst.CondLogic.LOOP_RULE_LOGICAL); + List conditionList = baseRuleConditionMapper.selectList(wrapper); + for (BaseRuleCondition condition : conditionList) { + loopGroupActionService.deleteLoopGroupByForId(condition.getId()); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(BaseRuleCondition::getRuleId, ruleIds); + int delete = baseRuleConditionMapper.delete(queryWrapper); + return delete > 0; + } + + @Override + //装配方法,将规则条件List装配成一个规则树并返回 + public BaseRuleCondition assemble(List list) { + BaseRuleCondition root = null; + //获取根节点,根节点只有一个的时候进行操作,并且返回拼装好的规则树,否则返回null + List collect = list.stream().filter(item -> { + return item.getParentId() == CondConst.DEFAULT_CONDITION_PARENT_ID; + }).collect(Collectors.toList()); + if (collect.size() == 1) { + root = collect.get(0); + BaseRuleCondition ruleTree = coupling(list, root); + return ruleTree; + } + return null; + } + + @Override + public List disassemble(BaseRuleCondition condition, Long ruleId) { + condition.setParentId(CondConst.DEFAULT_CONDITION_PARENT_ID); + List decoupling = this.decoupling(condition, ruleId); + return decoupling; + } + + + //耦合方法:将规则节点列表耦合规则树(),循环规则的子节点需要去查循环表获取 + private BaseRuleCondition coupling(List list, BaseRuleCondition root) { + List children = new ArrayList<>(); + for (BaseRuleCondition condition : list) { + //处理root的子节点 + if (!root.getId().equals(condition.getParentId())) { + continue; + } + BaseRuleCondition coupCond = coupling(list, condition); + String logic = root.getLogic(); + if (StringUtils.isNotBlank(logic)) { + switch (logic) { + //当root为for节点,则此子节点需要拼上循环动作 + case CondConst.CondLogic.LOOP_RULE_LOGICAL: + List loopList = loopGroupActionService.getRuleLoopList(root.getId(), condition.getId()); + coupCond.setLoopGroupActions(loopList); + if (condition.getCondType() == CondConst.CondType.LOOP_RULE_RESULT_CONDITION) { + root.setLoopResultCondition(coupCond); + continue; + } + break; + //当root为条件组节点,则此子节点需要拼上条件组结果 + case CondConst.CondLogic.CONDITION_GROUP_LOGICAL: + if (condition.getCondType() == CondConst.CondType.CONDITION_GROUP_RESULT_CONDITION) { + root.setCondGroupResultCondition(coupCond); + continue; + } + break; + default: + break; + } + } + children.add(coupCond); + } + root.setChildren(children); + return root; + } + + //解耦方法:将规则树解耦为节点列表 + private List decoupling(BaseRuleCondition condition, Long ruleId) { + //设置雪花id + if (condition.getId() == null || !ruleId.equals(condition.getRuleId())) { + condition.setId(SnowFlakUtil.snowflakeId()); + } + //设置ruleId + condition.setRuleId(ruleId); + List resultList = new ArrayList<>(); + List children = condition.getChildren(); + //处理条件树根节点的子条件 + if (children != null && children.size() > 0) { + for (int i = 0; i < children.size(); i++) { + BaseRuleCondition child = children.get(i); + //设置父id + child.setParentId(condition.getId()); + List childList = decoupling(child, ruleId); + resultList.addAll(childList); + } + } + resultList.add(condition); + //处理for条件的结果条件 + Integer conditionType = condition.getCondType(); + if (conditionType == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "存储条件失败,条件类型不能为空"); + } + switch (conditionType) { + case CondConst.CondType.LOOP_RULE_ROOT: + BaseRuleCondition loopResult = condition.getLoopResultCondition(); + loopResult.setRuleId(ruleId); + List loopResultList = decoupling(loopResult, ruleId); + resultList.addAll(loopResultList); + break; + case CondConst.CondType.CONDITION_GROUP_ROOT: + BaseRuleCondition condGroupResult = condition.getCondGroupResultCondition(); + condGroupResult.setRuleId(ruleId); + List condGroupResultList = decoupling(condGroupResult, ruleId); + resultList.addAll(condGroupResultList); + break; + case CondConst.CondType.LOOP_RULE_RESULT_CONDITION: + List loopGroupActions = condition.getLoopGroupActions(); + if (CollectionUtils.isNotEmpty(loopGroupActions)) { + for (RuleLoopGroupAction action : loopGroupActions) { + action.setConditionForId(condition.getParentId()); + action.setConditionGroupId(condition.getId()); + } + } + break; + case CondConst.CondType.CONDITION_GROUP_RESULT_CONDITION: + + break; + } + return resultList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleServiceImpl.java new file mode 100644 index 0000000..4a0d049 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/baserule/impl/BaseRuleServiceImpl.java @@ -0,0 +1,106 @@ +package com.fibo.ddp.common.service.strategyx.baserule.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.baserule.BaseRuleMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleCondition; +import com.fibo.ddp.common.service.strategyx.baserule.BaseRuleConditionService; +import com.fibo.ddp.common.service.strategyx.baserule.BaseRuleService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (BaseRule)表服务实现类 + * + * @author jgp + * @since 2021-12-27 09:46:43 + */ +@Service("baseRuleService") +public class BaseRuleServiceImpl extends ServiceImpl implements BaseRuleService { + @Resource + private BaseRuleMapper baseRuleMapper; + @Autowired + private BaseRuleConditionService conditionService; + + @Override + public BaseRule queryById(Long id) { + if (id == null) { + return null; + } + BaseRule baseRule = baseRuleMapper.selectById(id); + BaseRuleCondition baseRuleCondition = conditionService.queryByRuleId(id); + baseRule.setConditionTree(baseRuleCondition); + return baseRule; + + } + + @Override + @Transactional + public boolean insertBaseRule(BaseRule baseRule) { + if (baseRule == null + || StringUtils.isBlank(baseRule.getRuleType()) + || baseRule.getConditionTree() == null) { + return false; + } + boolean save = false; + if (baseRule.getId() == null) { + //如果没有分配id + long newId = SnowFlakUtil.snowflakeId(); + baseRule.setId(newId); + } + save = this.save(baseRule); + if (save) { + save = conditionService.saveConditionTree(baseRule.getConditionTree(), baseRule.getId()); + } + return save; + } + + @Override + public boolean insertBaseRuleList(List list) { + if (CollectionUtils.isEmpty(list)) { + return true; + } + for (BaseRule baseRule : list) { + if (!this.insertBaseRule(baseRule)) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "插入规则块失败"); + } + } + return true; + } + + @Override + @Transactional + public boolean deleteBaseRule(Long id) { + if (id == null) { + return true; + } + boolean result = this.removeById(id); + if (result) { + if (!conditionService.deleteConditionByRuleId(id)) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "删除规则条件表失败"); + } + } + return result; + } + + @Override + public boolean deleteBaseRuleByIds(List ids) { + boolean result = this.removeByIds(ids); + if (result) { + if (!conditionService.deleteConditionByRuleIds(ids)) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "删除规则条件表失败"); + } + } + return result; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ConditionAndOutPutService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ConditionAndOutPutService.java new file mode 100644 index 0000000..a8cd46d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ConditionAndOutPutService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.fibo.ddp.common.model.strategyx.collectionrule.ConditionAndOutPut; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ConditionAndOutPutService { + + List queryByListOpVersion(ListOperationVersion version); + + boolean addBatch(ListOperationVersion version, List conditionAndOutPutList); + + boolean updateBatch(ListOperationVersion version, List conditionAndOutPutList); + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationBlockService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationBlockService.java new file mode 100644 index 0000000..2cb35f9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationBlockService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationBlock; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ListOperationBlockService extends IService { + + List queryByVersion(ListOperationVersion version); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationConditionService.java new file mode 100644 index 0000000..bcf8f2c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationConditionService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationCondition; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ListOperationConditionService extends IService { + + List queryByVersion(ListOperationVersion version); + + Long recursionSave(ListOperationCondition condition, ListOperationVersion version, Long blockId); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationFilterConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationFilterConditionService.java new file mode 100644 index 0000000..ae3b0d1 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationFilterConditionService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationFilterCondition; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ListOperationFilterConditionService extends IService { + + List queryByVersion(ListOperationVersion version); + + Long recursionSave(ListOperationFilterCondition condition, ListOperationVersion version, Long blockId); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationOutputService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationOutputService.java new file mode 100644 index 0000000..c4601b7 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationOutputService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationOutput; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ListOperationOutputService extends IService { + + List queryByVersion(ListOperationVersion version); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationService.java new file mode 100644 index 0000000..77fe61c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationService.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperation; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface ListOperationService extends IService { + + ListOperation queryById(Long id); + + PageInfo queryByEntity(QueryListParam listParam); + + ListOperation insert(ListOperation listOperation); + + ListOperation update(ListOperation listOperation); + + boolean updateStatus(List ids, Integer status); + + boolean updateFolder(List ids, Long folderId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationVersionService.java new file mode 100644 index 0000000..ead3f62 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/ListOperationVersionService.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; + +import java.util.List; + +public interface ListOperationVersionService extends IService { + + List queryListByListOpId(Long listOpId); + + ListOperationVersion queryById(Long id); + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + + boolean addVersion(ListOperationVersion version); + + boolean copyVersion(ListOperationVersion version); + + boolean updateVersion(ListOperationVersion version); + + boolean updateStatus(StatusParam statusParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ConditionAndOutPutServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ConditionAndOutPutServiceImpl.java new file mode 100644 index 0000000..53b2802 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ConditionAndOutPutServiceImpl.java @@ -0,0 +1,195 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.fibo.ddp.common.model.strategyx.collectionrule.*; +import com.fibo.ddp.common.service.strategyx.collectionrule.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class ConditionAndOutPutServiceImpl implements ConditionAndOutPutService { + @Resource + private ListOperationConditionService conditionService; + @Resource + private ListOperationOutputService outputService; + @Resource + private ListOperationBlockService blockService; + @Resource + private ListOperationFilterConditionService filterConditionService; + @Override + public List queryByListOpVersion(ListOperationVersion version) { + List resultList = new ArrayList<>(); + Map map = new HashMap<>(); + List blocks = blockService.queryByVersion(version); + if (blocks==null||blocks.isEmpty()){ + return resultList; + } + ConditionAndOutPut conditionAndOutPut = null; + for (ListOperationBlock block : blocks) { + conditionAndOutPut = new ConditionAndOutPut(); + conditionAndOutPut.setListOperationBlock(block); + map.put(block.getId(),conditionAndOutPut); + } + List conditions = conditionService.queryByVersion(version); + List outputs = outputService.queryByVersion(version); + boolean haveOut = !(outputs == null || outputs.isEmpty()); + Map> outPutMap = null; + if (haveOut) { + outPutMap = outputs.stream().collect(Collectors.groupingBy(item -> { + return item.getListOpBlockId()+"_"+item.getOutputType()+"_"+item.getListOpConditionId(); + })); + //将默认输出写入 + if (outPutMap != null && !outPutMap.isEmpty()) { + for (Map.Entry> entry : outPutMap.entrySet()) { + String[] keyArray = entry.getKey().split("_"); + Long key = Long.valueOf(keyArray[0]); + //查找到对应块则存入信息 + if ("3".equals(keyArray[1])&&map.containsKey(key)){ + map.get(key).setDefaultOutput(entry.getValue()); + } + } + } + } + if (conditions == null || conditions.isEmpty()) { + return resultList; + } + for (ListOperationCondition condition : conditions) { + if (!map.containsKey(condition.getListOpBlockId())){ + continue; + } + conditionAndOutPut = map.get(condition.getListOpBlockId()); + conditionAndOutPut.setCondition(condition); + if (haveOut) { + List successList = outPutMap.get(condition.getListOpBlockId() + "_1_" + condition.getId()); + if (successList!=null){ + conditionAndOutPut.setSuccessOutput(successList); + } + List fails = outPutMap.get(condition.getListOpBlockId() + "_2_" + condition.getId()); + if (fails!=null){ + conditionAndOutPut.setFailOutput(fails); + } + + } + } + List filterConditions = filterConditionService.queryByVersion(version); + if (filterConditions!=null&&!filterConditions.isEmpty()){ + for (ListOperationFilterCondition condition : filterConditions) { + if (!map.containsKey(condition.getListOpBlockId())){ + continue; + } + conditionAndOutPut = map.get(condition.getListOpBlockId()); + conditionAndOutPut.setFilterCondition(condition); + } + } + resultList.addAll(map.values()); + return resultList; + } + + @Override + @Transactional + public boolean addBatch(ListOperationVersion version, List conditionAndOutPutList) { + if (conditionAndOutPutList == null || conditionAndOutPutList.isEmpty()) { + return true; + } + List outputs = new ArrayList<>(); + for (ConditionAndOutPut conditionAndOutPut : conditionAndOutPutList) { + ListOperationBlock block = conditionAndOutPut.getListOperationBlock(); + block.setListOpVersionId(version.getId()); + //存入块 + blockService.save(block); + ListOperationFilterCondition filterCondition = conditionAndOutPut.getFilterCondition(); + if (filterCondition != null) { + filterCondition.setParentId(0L); + filterConditionService.recursionSave(filterCondition,version,block.getId()); + } + ListOperationCondition condition = conditionAndOutPut.getCondition(); + Long conditionId = 0L; + if (condition != null) { + condition.setParentId(0L); + conditionId = conditionService.recursionSave(condition,version,block.getId()); + List successOutput = conditionAndOutPut.getSuccessOutput(); + if (successOutput != null && !successOutput.isEmpty()) { + for (ListOperationOutput output : successOutput) { + output.setListOpBlockId(block.getId()); + output.setListOpConditionId(conditionId); + output.setListOpVersionId(version.getId()); + output.setOutputType(1); + } + outputs.addAll(successOutput); + } + List failOutput = conditionAndOutPut.getFailOutput(); + if (failOutput != null && !failOutput.isEmpty()) { + for (ListOperationOutput output : failOutput) { + output.setListOpBlockId(block.getId()); + output.setListOpConditionId(conditionId); + output.setListOpVersionId(version.getId()); + output.setOutputType(2); + } + outputs.addAll(failOutput); + } + }else { + List defaultOutput = conditionAndOutPut.getDefaultOutput(); + if (defaultOutput != null && !defaultOutput.isEmpty()) { + for (ListOperationOutput output : defaultOutput) { + output.setListOpBlockId(block.getId()); + output.setListOpConditionId(conditionId); + output.setListOpVersionId(version.getId()); + output.setOutputType(3); + } + outputs.addAll(defaultOutput); + } + } + + } + if (!outputs.isEmpty()){ + outputService.saveBatch(outputs); + } + return true; + } + + @Override + @Transactional + public boolean updateBatch(ListOperationVersion version, List conditionAndOutPutList) { + this.deleteByVersionId(version.getId()); + return this.addBatch(version,conditionAndOutPutList); + } + + @Override + @Transactional + public boolean deleteByVersionId(Long versionId) { + conditionService.deleteByVersionId(versionId); + blockService.deleteByVersionId(versionId); + outputService.deleteByVersionId(versionId); + filterConditionService.deleteByVersionId(versionId); + return true; + } + + +// +// //解耦方法:将规则树解耦为节点列表 +// private List decoupling(ListOperationCondition condition, Long versionId, boolean needTempId) { +// List list = new ArrayList<>(); +// List children = condition.getChildren(); +// if (children != null && children.size() > 0) { +// for (int i = 0; i < children.size(); i++) { +// ListOperationCondition child = children.get(i); +// if (needTempId) { +// child.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); +// child.setTempParentId(condition.getInsertTempId()); +// } +// List childList = decoupling(child, versionId, needTempId); +// list.addAll(childList); +// } +// } +// condition.setDataCleanVersionId(versionId); +// list.add(condition); +// return list; +// } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationBlockServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationBlockServiceImpl.java new file mode 100644 index 0000000..010c6da --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationBlockServiceImpl.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationBlockMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationBlock; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationBlockService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service("listOperationBlockService") +public class ListOperationBlockServiceImpl extends ServiceImpl implements ListOperationBlockService { + @Resource + private ListOperationBlockMapper listOperationBlockMapper; + + @Override + public List queryByVersion(ListOperationVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationBlock::getListOpVersionId,version.getId()); + return listOperationBlockMapper.selectList(wrapper); + } + + @Override + public boolean deleteByVersionId(Long versionId) { + if (versionId==null){ + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationBlock::getListOpVersionId,versionId); + listOperationBlockMapper.delete(wrapper); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationConditionServiceImpl.java new file mode 100644 index 0000000..79a12b8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationConditionServiceImpl.java @@ -0,0 +1,80 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationConditionMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationCondition; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationConditionService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service("listOperationConditionService") +public class ListOperationConditionServiceImpl extends ServiceImpl implements ListOperationConditionService { + @Resource + private ListOperationConditionMapper listOperationConditionMapper; + + @Override + public List queryByVersion(ListOperationVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationCondition::getListOpVersionId, version.getId()); + wrapper.eq(ListOperationCondition::getListOpId, version.getListOpId()); + List result = null; + List list = this.list(wrapper); + if (list != null && !list.isEmpty()) { + result = assembleConditionTree(list, 0L); + } + return result; + } + + @Override + @Transactional + public Long recursionSave(ListOperationCondition condition,ListOperationVersion version,Long blockId) { + condition.setListOpId(version.getListOpId()); + condition.setListOpVersionId(version.getId()); + condition.setListOpBlockId(blockId); + boolean save = this.save(condition); + Long id = condition.getId(); + List children = condition.getChildren(); + if (save && children != null && !children.isEmpty()){ + List batchCondition = new ArrayList<>(); + for (ListOperationCondition child : children) { + child.setParentId(id); + if (child.getChildren()!=null){ + recursionSave(child,version,blockId); + }else { + batchCondition.add(child); + } + } + if (!batchCondition.isEmpty()){ + this.saveBatch(batchCondition); + } + } + return id; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationCondition::getListOpVersionId,versionId); + return this.remove(wrapper); + } + + + public List assembleConditionTree(List list, long parentId) { + List result = new ArrayList<>(); + ListOperationCondition operationCondition; + for (ListOperationCondition condition : list) { + if (condition.getParentId()!=null && condition.getParentId() == parentId) { + operationCondition = condition; + operationCondition.setChildren(assembleConditionTree(list, condition.getId())); + result.add(operationCondition); + } + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationFilterConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationFilterConditionServiceImpl.java new file mode 100644 index 0000000..f45b3ce --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationFilterConditionServiceImpl.java @@ -0,0 +1,80 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationFilterConditionMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationFilterCondition; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationFilterConditionService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service("listOperationFilterConditionService") +public class ListOperationFilterConditionServiceImpl extends ServiceImpl implements ListOperationFilterConditionService { + @Resource + private ListOperationFilterConditionMapper listOperationFilterConditionMapper; + + @Override + public List queryByVersion(ListOperationVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationFilterCondition::getListOpVersionId, version.getId()); + wrapper.eq(ListOperationFilterCondition::getListOpId, version.getListOpId()); + List result = null; + List list = this.list(wrapper); + if (list != null && !list.isEmpty()) { + result = assembleConditionTree(list, 0L); + } + return result; + } + + @Override + @Transactional + public Long recursionSave(ListOperationFilterCondition condition,ListOperationVersion version,Long blockId) { + condition.setListOpId(version.getListOpId()); + condition.setListOpVersionId(version.getId()); + condition.setListOpBlockId(blockId); + boolean save = this.save(condition); + Long id = condition.getId(); + List children = condition.getChildren(); + if (save && children != null && !children.isEmpty()){ + List batchCondition = new ArrayList<>(); + for (ListOperationFilterCondition child : children) { + child.setParentId(id); + if (child.getChildren()!=null){ + recursionSave(child,version,blockId); + }else { + batchCondition.add(child); + } + } + if (!batchCondition.isEmpty()){ + this.saveBatch(batchCondition); + } + } + return id; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationFilterCondition::getListOpVersionId,versionId); + return this.remove(wrapper); + } + + + public List assembleConditionTree(List list, long parentId) { + List result = new ArrayList<>(); + ListOperationFilterCondition operationCondition; + for (ListOperationFilterCondition condition : list) { + if (condition.getParentId()!=null && condition.getParentId() == parentId) { + operationCondition = condition; + operationCondition.setChildren(assembleConditionTree(list, condition.getId())); + result.add(operationCondition); + } + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationOutputServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationOutputServiceImpl.java new file mode 100644 index 0000000..f4e914c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationOutputServiceImpl.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationOutputMapper; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationOutput; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationOutputService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service("listOperationOutputService") +public class ListOperationOutputServiceImpl extends ServiceImpl implements ListOperationOutputService { + @Resource + private ListOperationOutputMapper listOperationOutputMapper; + + @Override + public List queryByVersion(ListOperationVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationOutput::getListOpVersionId,version.getId()); + List result = this.list(wrapper); + return result; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ListOperationOutput::getListOpVersionId,versionId); + return this.remove(wrapper); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationServiceImpl.java new file mode 100644 index 0000000..fcefb0b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationServiceImpl.java @@ -0,0 +1,209 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperation; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationService; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationVersionService; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +@Service("listOperationService") +public class ListOperationServiceImpl extends ServiceImpl implements ListOperationService { + @Resource + private ListOperationMapper listOperationMapper; + @Resource + private ListOperationVersionService versionService; + @Resource + private SysUserMapper sysUserMapper; + @Override + public ListOperation queryById(Long id) { + if (id==null){ + return null; + } + ListOperation operation = this.getById(id); + if (operation==null){ + return null; + } + operation.setVersionList(versionService.queryListByListOpId(id)); + return operation; + } + + @Override + public PageInfo queryByEntity(QueryListParam listParam) { + ListOperation query = listParam.getEntity(); + Integer pageNum = listParam.getPageNum(); + Integer pageSize = listParam.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = createWrapper(query); + List operationList = listOperationMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(operationList); + + //TODO 循环查用户表,待优化 + for (ListOperation operation : operationList) { + if (operation != null && operation.getCreateUserId() != null) { + operation.setCreateUserName(sysUserMapper.findNickNameById(operation.getCreateUserId())); + operation.setVersionList(versionService.queryListByListOpId(operation.getId())); + } + } + return pageInfo; + } + + @Override + @Transactional + public ListOperation insert(ListOperation listOperation) { + //初始化基本参数 + listOperation = initParam(listOperation); + //插入并获取insert后实体对象返回id + boolean save = this.save(listOperation); + if (!save) { + throw new ApiException(ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getCode(), ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getMessage()); + } + Long listOpId = listOperation.getId(); + List versionList = listOperation.getVersionList(); + for (ListOperationVersion versionVo : versionList) { + versionVo.setListOpId(listOpId); + } + versionService.addVersionList(versionList); + return this.queryById(listOpId); + } + + + @Override + @Transactional + public ListOperation update(ListOperation listOperation) { + if (listOperation.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + SysUser sysUser = SessionManager.getLoginAccount(); + listOperation.setUpdateUserId(sysUser.getUserId()); + ListOperation updateOperation = new ListOperation(); + BeanUtils.copyProperties(listOperation, updateOperation); + //修改主表 + boolean updateResult = this.updateById(updateOperation); + if (listOperation.getStartTime()==null||listOperation.getEndTime()==null){ + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + + wrapper.set(ListOperation::getStartTime, listOperation.getStartTime()); + wrapper.set(ListOperation::getEndTime, listOperation.getEndTime()); + wrapper.eq(ListOperation::getId, listOperation.getId()); + updateResult = this.update(wrapper); + } + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Long listOpId = updateOperation.getId(); + List versionList = listOperation.getVersionList(); + if (versionList != null && versionList.size() > 0) { + versionService.updateVersion(versionList.get(0)); + } + return this.queryById(listOpId); + } + + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ListOperation::getId, ids); + ListOperation operation = new ListOperation(); + operation.setStatus(status); + int updateNum = listOperationMapper.update(operation, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + @Transactional + public boolean updateFolder(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ListOperation::getId, ids); + ListOperation operation = new ListOperation(); + operation.setFolderId(folderId); + int updateNum = listOperationMapper.update(operation, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + + private LambdaQueryWrapper createWrapper(ListOperation query) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query!=null){ + if (query.getOpType()!=null){ + wrapper.eq(ListOperation::getOpType,query.getOpType()); + } + if (query.getFolderId()!=null){ + wrapper.eq(ListOperation::getFolderId,query.getFolderId()); + } + if (query.getName() != null) { + wrapper.like(ListOperation::getName, query.getName()); + } + if (query.getCode() != null) { + wrapper.like(ListOperation::getCode, query.getCode()); + } + if (query.getStartTime()!=null){ + wrapper.le(ListOperation::getStartTime,query.getStartTime()); + wrapper.ge(ListOperation::getEndTime,query.getStartTime()); + } + } + wrapper.ne(ListOperation::getStatus,-1); + wrapper.eq(ListOperation::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc( ListOperation::getId); + return wrapper; + } + + + //新插入数据的准备工作 + private ListOperation initParam(ListOperation listOperation) { + this.checkUniqueness(listOperation); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + listOperation.setCreateUserId(sysUser.getUserId()); + listOperation.setOrganId(sysUser.getOrganId()); + listOperation.setUpdateUserId(sysUser.getUserId()); + //加入状态信息 + listOperation.setStatus(StatusConst.STATUS_ENABLED); + return listOperation; + } + + //唯一性检查 + private boolean checkUniqueness(ListOperation listOperation) { + ListOperation decisionTree = new ListOperation(); + decisionTree.setName(listOperation.getName()); + ListOperation info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.LIST_OPERATION_NAME_REPEAT.getCode(), ErrorCodeEnum.LIST_OPERATION_NAME_REPEAT.getMessage()); + } + decisionTree.setName(null); + decisionTree.setCode(listOperation.getCode()); + info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.LIST_OPERATION_Code_REPEAT.getCode(), ErrorCodeEnum.LIST_OPERATION_Code_REPEAT.getMessage()); + } + return true; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationVersionServiceImpl.java new file mode 100644 index 0000000..34febec --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/collectionrule/impl/ListOperationVersionServiceImpl.java @@ -0,0 +1,180 @@ +package com.fibo.ddp.common.service.strategyx.collectionrule.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.collectionrule.ListOperationVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ConditionAndOutPut; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.collectionrule.ConditionAndOutPutService; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationConditionService; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationOutputService; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationVersionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +@Service("listOperationVersionService") +@Slf4j +public class ListOperationVersionServiceImpl extends ServiceImpl implements ListOperationVersionService { + @Resource + private ListOperationVersionMapper listOperationVersionMapper; + + @Resource + private ListOperationConditionService conditionService; + + @Resource + private ListOperationOutputService outputService; + + @Resource + private ConditionAndOutPutService conditionAndOutPutService; + + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Override + public List queryListByListOpId(Long listOpId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ListOperationVersion::getListOpId, listOpId); + queryWrapper.eq(ListOperationVersion::getStatus, 1); + queryWrapper.orderByDesc(ListOperationVersion::getId); + List versionList = listOperationVersionMapper.selectList(queryWrapper); + if (versionList==null||versionList.isEmpty()){ + return versionList; + } + for (ListOperationVersion version : versionList) { + //查询版本内部信息 + version.setConditionAndOutPutList(conditionAndOutPutService.queryByListOpVersion(version)); + } + return versionList; + } + + @Override + public ListOperationVersion queryById(Long id) { + ListOperationVersion version = this.getById(id); + if (version == null) { + return null; + } + //条件与输出 + version.setConditionAndOutPutList(conditionAndOutPutService.queryByListOpVersion(version)); + return version; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + return null; + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (ListOperationVersion version : versionList) { + boolean b = addVersion(version); + if (b) { + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(ListOperationVersion version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode() == null) { + version.setVersionCode("V:0"); + } + if (version.getDescription() == null) { + version.setDescription("初始版本"); + } + int insert = listOperationVersionMapper.insert(version); + if (insert > 0) { + boolean result = this.addVersionDetail(version); + if (result) { + saveSnapshot(version.getId()); + } + return true; + } else { + log.error("新增决策树版本失败{}", version); + } + return false; + } + + @Transactional + public boolean addVersionDetail(ListOperationVersion version) { + List conditionAndOutPutList = version.getConditionAndOutPutList(); + if (conditionAndOutPutList==null||conditionAndOutPutList.isEmpty()){ + return true; + } + return conditionAndOutPutService.addBatch(version,conditionAndOutPutList); + } + + @Override + @Transactional + public boolean copyVersion(ListOperationVersion version) { + ListOperationVersion versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(ListOperationVersion version) { + Long versionId = version.getId(); + if (versionId == null) { + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + listOperationVersionMapper.updateById(version); + //todo 修改版本之下的 信息 + boolean b = conditionAndOutPutService.updateBatch(version, version.getConditionAndOutPutList()); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(ListOperationVersion::getId, statusParam.getIds()); + updateWrapper.eq(ListOperationVersion::getListOpId, statusParam.getStrategyId()); + ListOperationVersion version = new ListOperationVersion(); + version.setStatus(statusParam.getStatus()); + boolean update = this.update(version, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId) { + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + ListOperationVersion version = queryById(versionId); + version.setSnapshot(null); + wrapper.eq(ListOperationVersion::getId, versionId).set(ListOperationVersion::getSnapshot, JSON.toJSONString(version)); + listOperationVersionMapper.update(null, wrapper); + } + }); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanBlockService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanBlockService.java new file mode 100644 index 0000000..baaebfe --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanBlockService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanBlock; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +import java.util.List; + +public interface DataCleanBlockService extends IService { + + List queryByVersion(DataCleanVersion version); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionAndOutPutService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionAndOutPutService.java new file mode 100644 index 0000000..f3ed862 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionAndOutPutService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanConditionAndOutPut; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +import java.util.List; + +public interface DataCleanConditionAndOutPutService { + + List queryByListOpVersion(DataCleanVersion version); + + boolean addBatch(DataCleanVersion version, List conditionAndOutPutList); + + boolean updateBatch(DataCleanVersion version, List conditionAndOutPutList); + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionService.java new file mode 100644 index 0000000..1d1e12f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanConditionService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanCondition; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +import java.util.List; + +public interface DataCleanConditionService extends IService { + + List queryByVersion(DataCleanVersion version); + + Long recursionSave(DataCleanCondition condition, DataCleanVersion version, Long blockId); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanFilterConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanFilterConditionService.java new file mode 100644 index 0000000..fc3454e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanFilterConditionService.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.model.strategyx.dataclean.FilterCondEnum; + +import java.util.List; + +public interface DataCleanFilterConditionService extends IService { + + List queryByVersion(DataCleanVersion version); + + Long recursionSave(DataCleanFilterCondition condition, DataCleanVersion version, Long blockId, FilterCondEnum filterType); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOriginalDataOpService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOriginalDataOpService.java new file mode 100644 index 0000000..f4c7a92 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOriginalDataOpService.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOriginalDataOp; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +/** + * (DataCleanOriginalDataOp)表服务接口 + * + * @author makejava + * @since 2022-03-21 11:15:04 + */ +public interface DataCleanOriginalDataOpService extends IService { + + DataCleanOriginalDataOp queryByDataCleanVersion(DataCleanVersion version); + + void addOriginalDataOp(DataCleanOriginalDataOp originalDataOp); + + void updateDataOp(DataCleanVersion version, DataCleanOriginalDataOp originalDataOp); +} + diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOutputService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOutputService.java new file mode 100644 index 0000000..3cfdd33 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanOutputService.java @@ -0,0 +1,14 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOutput; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +import java.util.List; + +public interface DataCleanOutputService extends IService { + + List queryByVersion(DataCleanVersion version); + + boolean deleteByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanService.java new file mode 100644 index 0000000..78cc8ed --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanService.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataClean; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface DataCleanService extends IService { + + DataClean queryById(Long id); + + PageInfo queryByEntity(QueryListParam queryParam); + + DataClean queryByCode(String code,String versionCode); + + DataClean insert(DataClean dataClean); + + DataClean update(DataClean dataClean); + + boolean updateStatus(List ids, Integer status); + + boolean updateFolder(List ids, Long folderId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanVersionService.java new file mode 100644 index 0000000..51dbd59 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/DataCleanVersionService.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.service.strategyx.dataclean; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; + +import java.util.List; + +public interface DataCleanVersionService extends IService { + + List queryListByListOpId(Long listOpId); + + DataCleanVersion queryById(Long id,boolean needCache); + + + DataCleanVersion queryByCode(Long dataCleanId ,String code); + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + + boolean addVersion(DataCleanVersion version); + + boolean copyVersion(DataCleanVersion version); + + boolean updateVersion(DataCleanVersion version); + + boolean updateStatus(StatusParam statusParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanBlockServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanBlockServiceImpl.java new file mode 100644 index 0000000..1cb54eb --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanBlockServiceImpl.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanBlockMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanBlock; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanBlockService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service("dataCleanBlockService") +public class DataCleanBlockServiceImpl extends ServiceImpl implements DataCleanBlockService { + @Resource + private DataCleanBlockMapper dataCleanBlockMapper; + + @Override + public List queryByVersion(DataCleanVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanBlock::getDataCleanVersionId,version.getId()); + return dataCleanBlockMapper.selectList(wrapper); + } + + @Override + public boolean deleteByVersionId(Long versionId) { + if (versionId==null){ + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanBlock::getDataCleanVersionId,versionId); + dataCleanBlockMapper.delete(wrapper); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionAndOutPutServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionAndOutPutServiceImpl.java new file mode 100644 index 0000000..381e40b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionAndOutPutServiceImpl.java @@ -0,0 +1,206 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.fibo.ddp.common.model.strategyx.dataclean.*; +import com.fibo.ddp.common.service.strategyx.dataclean.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class DataCleanConditionAndOutPutServiceImpl implements DataCleanConditionAndOutPutService { + @Resource + private DataCleanConditionService conditionService; + @Resource + private DataCleanOutputService outputService; + @Resource + private DataCleanBlockService blockService; + @Resource + private DataCleanFilterConditionService filterConditionService; + @Override + public List queryByListOpVersion(DataCleanVersion version) { + List resultList = new ArrayList<>(); + Map map = new HashMap<>(); + List blocks = blockService.queryByVersion(version); + if (blocks==null||blocks.isEmpty()){ + return resultList; + } + DataCleanConditionAndOutPut conditionAndOutPut = null; + for (DataCleanBlock block : blocks) { + conditionAndOutPut = new DataCleanConditionAndOutPut(); + conditionAndOutPut.setDataCleanBlock(block); + map.put(block.getId(),conditionAndOutPut); + } + List conditions = conditionService.queryByVersion(version); + List outputs = outputService.queryByVersion(version); + boolean haveOut = !(outputs == null || outputs.isEmpty()); + Map> outPutMap = null; + if (haveOut) { + outPutMap = outputs.stream().collect(Collectors.groupingBy(item -> { + return item.getDataCleanBlockId()+"_"+item.getOutputType()+"_"+item.getDataCleanConditionId(); + })); + //将默认输出写入 + if (outPutMap != null && !outPutMap.isEmpty()) { + for (Map.Entry> entry : outPutMap.entrySet()) { + String[] keyArray = entry.getKey().split("_"); + Long key = Long.valueOf(keyArray[0]); + //查找到对应块则存入信息 + if ("3".equals(keyArray[1])&&map.containsKey(key)){ + map.get(key).setDefaultOutput(entry.getValue()); + } + } + } + } + if (conditions == null || conditions.isEmpty()) { + return resultList; + } + for (DataCleanCondition condition : conditions) { + if (!map.containsKey(condition.getDataCleanBlockId())){ + continue; + } + conditionAndOutPut = map.get(condition.getDataCleanBlockId()); + conditionAndOutPut.setCondition(condition); + if (haveOut) { + List successList = outPutMap.get(condition.getDataCleanBlockId() + "_1_" + condition.getId()); + if (successList!=null){ + conditionAndOutPut.setSuccessOutput(successList); + } + List fails = outPutMap.get(condition.getDataCleanBlockId() + "_2_" + condition.getId()); + if (fails!=null){ + conditionAndOutPut.setFailOutput(fails); + } + + } + } + List filterConditions = filterConditionService.queryByVersion(version); + if (filterConditions!=null&&!filterConditions.isEmpty()){ + for (DataCleanFilterCondition condition : filterConditions) { + if (!map.containsKey(condition.getDataCleanBlockId())){ + continue; + } + //设置过滤条件 + conditionAndOutPut = map.get(condition.getDataCleanBlockId()); + if (FilterCondEnum.INPUT_FILTER.getCode().equals(condition.getFilterType())){ + conditionAndOutPut.setInputFilterCondition(condition); + }else if (FilterCondEnum.RESULT_FILTER.getCode().equals(condition.getFilterType())){ + conditionAndOutPut.setResultFilterCondition(condition); + } + } + } + resultList.addAll(map.values()); + return resultList; + } + + @Override + @Transactional + public boolean addBatch(DataCleanVersion version, List conditionAndOutPutList) { + if (conditionAndOutPutList == null || conditionAndOutPutList.isEmpty()) { + return true; + } + List outputs = new ArrayList<>(); + for (DataCleanConditionAndOutPut conditionAndOutPut : conditionAndOutPutList) { + DataCleanBlock block = conditionAndOutPut.getDataCleanBlock(); + block.setDataCleanVersionId(version.getId()); + //存入块 + blockService.save(block); + DataCleanFilterCondition inputFilterCondition = conditionAndOutPut.getInputFilterCondition(); + if (inputFilterCondition != null) { + inputFilterCondition.setParentId(0L); + filterConditionService.recursionSave(inputFilterCondition,version,block.getId(),FilterCondEnum.INPUT_FILTER); + } + DataCleanFilterCondition resultFilterCondition = conditionAndOutPut.getResultFilterCondition(); + if (resultFilterCondition != null) { + resultFilterCondition.setParentId(0L); + filterConditionService.recursionSave(resultFilterCondition,version,block.getId(),FilterCondEnum.RESULT_FILTER); + } + + DataCleanCondition condition = conditionAndOutPut.getCondition(); + Long conditionId = 0L; + if (condition != null) { + condition.setParentId(0L); + conditionId = conditionService.recursionSave(condition,version,block.getId()); + List successOutput = conditionAndOutPut.getSuccessOutput(); + if (successOutput != null && !successOutput.isEmpty()) { + for (DataCleanOutput output : successOutput) { + output.setDataCleanBlockId(block.getId()); + output.setDataCleanConditionId(conditionId); + output.setDataCleanVersionId(version.getId()); + output.setOutputType(1); + } + outputs.addAll(successOutput); + } + List failOutput = conditionAndOutPut.getFailOutput(); + if (failOutput != null && !failOutput.isEmpty()) { + for (DataCleanOutput output : failOutput) { + output.setDataCleanBlockId(block.getId()); + output.setDataCleanConditionId(conditionId); + output.setDataCleanVersionId(version.getId()); + output.setOutputType(2); + } + outputs.addAll(failOutput); + } + }else { + List defaultOutput = conditionAndOutPut.getDefaultOutput(); + if (defaultOutput != null && !defaultOutput.isEmpty()) { + for (DataCleanOutput output : defaultOutput) { + output.setDataCleanBlockId(block.getId()); + output.setDataCleanConditionId(conditionId); + output.setDataCleanVersionId(version.getId()); + output.setOutputType(3); + } + outputs.addAll(defaultOutput); + } + } + + } + if (!outputs.isEmpty()){ + outputService.saveBatch(outputs); + } + return true; + } + + @Override + @Transactional + public boolean updateBatch(DataCleanVersion version, List conditionAndOutPutList) { + this.deleteByVersionId(version.getId()); + return this.addBatch(version,conditionAndOutPutList); + } + + @Override + @Transactional + public boolean deleteByVersionId(Long versionId) { + conditionService.deleteByVersionId(versionId); + blockService.deleteByVersionId(versionId); + outputService.deleteByVersionId(versionId); + filterConditionService.deleteByVersionId(versionId); + return true; + } + + +// +// //解耦方法:将规则树解耦为节点列表 +// private List decoupling(DataCleanCondition condition, Long versionId, boolean needTempId) { +// List list = new ArrayList<>(); +// List children = condition.getChildren(); +// if (children != null && children.size() > 0) { +// for (int i = 0; i < children.size(); i++) { +// DataCleanCondition child = children.get(i); +// if (needTempId) { +// child.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); +// child.setTempParentId(condition.getInsertTempId()); +// } +// List childList = decoupling(child, versionId, needTempId); +// list.addAll(childList); +// } +// } +// condition.setDataCleanVersionId(versionId); +// list.add(condition); +// return list; +// } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionServiceImpl.java new file mode 100644 index 0000000..40116ff --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanConditionServiceImpl.java @@ -0,0 +1,80 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanConditionMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanCondition; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanConditionService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service("dataCleanConditionService") +public class DataCleanConditionServiceImpl extends ServiceImpl implements DataCleanConditionService { + @Resource + private DataCleanConditionMapper dataCleanConditionMapper; + + @Override + public List queryByVersion(DataCleanVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanCondition::getDataCleanVersionId, version.getId()); + wrapper.eq(DataCleanCondition::getDataCleanId, version.getDataCleanId()); + List result = null; + List list = this.list(wrapper); + if (list != null && !list.isEmpty()) { + result = assembleConditionTree(list, 0L); + } + return result; + } + + @Override + @Transactional + public Long recursionSave(DataCleanCondition condition,DataCleanVersion version,Long blockId) { + condition.setDataCleanId(version.getDataCleanId()); + condition.setDataCleanVersionId(version.getId()); + condition.setDataCleanBlockId(blockId); + boolean save = this.save(condition); + Long id = condition.getId(); + List children = condition.getChildren(); + if (save && children != null && !children.isEmpty()){ + List batchCondition = new ArrayList<>(); + for (DataCleanCondition child : children) { + child.setParentId(id); + if (child.getChildren()!=null){ + recursionSave(child,version,blockId); + }else { + batchCondition.add(child); + } + } + if (!batchCondition.isEmpty()){ + this.saveBatch(batchCondition); + } + } + return id; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanCondition::getDataCleanVersionId,versionId); + return this.remove(wrapper); + } + + + public List assembleConditionTree(List list, long parentId) { + List result = new ArrayList<>(); + DataCleanCondition operationCondition; + for (DataCleanCondition condition : list) { + if (condition.getParentId()!=null && condition.getParentId() == parentId) { + operationCondition = condition; + operationCondition.setChildren(assembleConditionTree(list, condition.getId())); + result.add(operationCondition); + } + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanFilterConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanFilterConditionServiceImpl.java new file mode 100644 index 0000000..be93d90 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanFilterConditionServiceImpl.java @@ -0,0 +1,83 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanFilterConditionMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.model.strategyx.dataclean.FilterCondEnum; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanFilterConditionService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service("dataCleanFilterConditionService") +public class DataCleanFilterConditionServiceImpl extends ServiceImpl implements DataCleanFilterConditionService { + @Resource + private DataCleanFilterConditionMapper dataCleanFilterConditionMapper; + + @Override + public List queryByVersion(DataCleanVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanFilterCondition::getDataCleanVersionId, version.getId()); + wrapper.eq(DataCleanFilterCondition::getDataCleanId, version.getDataCleanId()); + List result = null; + List list = this.list(wrapper); + if (list != null && !list.isEmpty()) { + result = assembleConditionTree(list, 0L); + } + return result; + } + + @Override + @Transactional + public Long recursionSave(DataCleanFilterCondition condition, DataCleanVersion version, Long blockId, FilterCondEnum filterType) { + condition.setDataCleanId(version.getDataCleanId()); + condition.setDataCleanVersionId(version.getId()); + condition.setDataCleanBlockId(blockId); + condition.setFilterType(filterType.getCode()); + boolean save = this.save(condition); + Long id = condition.getId(); + List children = condition.getChildren(); + if (save && children != null && !children.isEmpty()){ + List batchCondition = new ArrayList<>(); + for (DataCleanFilterCondition child : children) { + child.setParentId(id); + child.setFilterType(filterType.getCode()); + if (child.getChildren()!=null){ + recursionSave(child,version,blockId, filterType); + }else { + batchCondition.add(child); + } + } + if (!batchCondition.isEmpty()){ + this.saveBatch(batchCondition); + } + } + return id; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanFilterCondition::getDataCleanVersionId,versionId); + return this.remove(wrapper); + } + + + public List assembleConditionTree(List list, long parentId) { + List result = new ArrayList<>(); + DataCleanFilterCondition operationCondition; + for (DataCleanFilterCondition condition : list) { + if (condition.getParentId()!=null && condition.getParentId() == parentId) { + operationCondition = condition; + operationCondition.setChildren(assembleConditionTree(list, condition.getId())); + result.add(operationCondition); + } + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOriginalDataOpServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOriginalDataOpServiceImpl.java new file mode 100644 index 0000000..c0e2201 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOriginalDataOpServiceImpl.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanOriginalDataOpMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOriginalDataOp; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanOriginalDataOpService; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * (DataCleanOriginalDataOp)表服务实现类 + * + * @author makejava + * @since 2022-03-21 11:15:09 + */ +@Service("dataCleanOriginalDataOpService") +public class DataCleanOriginalDataOpServiceImpl extends ServiceImpl implements DataCleanOriginalDataOpService { + + @Override + public DataCleanOriginalDataOp queryByDataCleanVersion(DataCleanVersion version) { + Long versionId = version.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanOriginalDataOp::getDataCleanVersionId, versionId); + List list = this.list(wrapper); + List collect = list.stream().filter(item -> { + return item.getParentId() == 0; + }).collect(Collectors.toList()); + DataCleanOriginalDataOp root = null; + if (CollectionUtils.isNotEmpty(collect)) { + root = collect.get(0); + assemble(root, list); + } + return root; + } + + @Override + @Transactional + public void addOriginalDataOp(DataCleanOriginalDataOp originalDataOp) { + if (originalDataOp == null) { + return; + } + this.save(originalDataOp); + Long id = originalDataOp.getId(); + Long dataCleanVersionId = originalDataOp.getDataCleanVersionId(); + DataCleanOriginalDataOp child = originalDataOp.getChild(); + if (child != null) { + child.setParentId(id); + child.setDataCleanVersionId(dataCleanVersionId); + } + } + + @Override + @Transactional + public void updateDataOp(DataCleanVersion version, DataCleanOriginalDataOp originalDataOp) { + Long versionId = version.getId(); + this.deleteByVersion(version); + originalDataOp.setDataCleanVersionId(versionId); + originalDataOp.setParentId(0L); + this.addOriginalDataOp(originalDataOp); + } + @Transactional + public void deleteByVersion(DataCleanVersion version) { + Long versionId = version.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanOriginalDataOp::getDataCleanVersionId,versionId); + this.remove(wrapper); + } + + + private void assemble(DataCleanOriginalDataOp root, List list) { + for (DataCleanOriginalDataOp op : list) { + if (root.getId().equals(op.getParentId())) { + root.setChild(op); + assemble(op, list); + break; + } + } + } + + ; +} + diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOutputServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOutputServiceImpl.java new file mode 100644 index 0000000..13bf12b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanOutputServiceImpl.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanOutputMapper; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOutput; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanOutputService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service("dataCleanOutputService") +public class DataCleanOutputServiceImpl extends ServiceImpl implements DataCleanOutputService { + @Resource + private DataCleanOutputMapper dtaCleanOutputMapper; + + @Override + public List queryByVersion(DataCleanVersion version) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanOutput::getDataCleanVersionId,version.getId()); + List result = this.list(wrapper); + return result; + } + + @Override + public boolean deleteByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanOutput::getDataCleanVersionId,versionId); + return this.remove(wrapper); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanServiceImpl.java new file mode 100644 index 0000000..b42bd64 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanServiceImpl.java @@ -0,0 +1,279 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataClean; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanService; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Service("dataCleanService") +@Slf4j +public class DataCleanServiceImpl extends ServiceImpl implements DataCleanService { + @Resource + private DataCleanMapper dataCleanMapper; + @Resource + private DataCleanVersionService versionService; + @Resource + private SysUserMapper sysUserMapper; + @Autowired + private RedisManager redisManager; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + private final String dataCleanCachePrefix = Constants.cacheConf.cachePrefix + "dataCleanCache:"; + + private static Cache dataCleanVersionCache = Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.SECONDS) + .expireAfterAccess(30, TimeUnit.SECONDS) + .build(); + + + @Override + public DataClean queryByCode(String code,String versionCode) { + DataClean dataClean = null; + String redisKey = dataCleanCachePrefix + code+":"+versionCode; + + DataClean localCache = dataCleanVersionCache.getIfPresent(redisKey); + if(localCache != null){ + // 从本地缓存获取 + return localCache; + } else { + String dataCleanJson = redisManager.get(redisKey); + if (StringUtils.isNotBlank(dataCleanJson)) { + try { + dataClean = JSON.parseObject(dataCleanJson, DataClean.class); + if (dataClean != null && code.equals(dataClean.getCode())) { + // 更新本地缓存 + dataCleanVersionCache.put(redisKey, dataClean); + return dataClean; + } + } catch (Exception e) { + log.error("缓存版本信息错误,key:{},value:{}", redisKey, dataCleanJson); + } + } + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataClean::getCode,code); + wrapper.eq(DataClean::getStatus,1); + dataClean = this.getOne(wrapper); + //条件与输出 + if (dataClean == null) { + return null; + } + DataCleanVersion dataCleanVersion = versionService.queryByCode(dataClean.getId(), versionCode); + dataClean.setVersionList(Arrays.asList(dataCleanVersion)); + //查出结果后,放入缓存设置过期时间为120秒 + redisManager.set(redisKey, JSON.toJSONString(dataClean), Constants.cacheConf.cacheSecond); + return dataClean; + } + + + @Override + public DataClean queryById(Long id) { + if (id==null){ + return null; + } + DataClean operation = this.getById(id); + if (operation==null){ + return null; + } + operation.setVersionList(versionService.queryListByListOpId(id)); + return operation; + } + + @Override + public PageInfo queryByEntity(QueryListParam queryParam) { + DataClean query = queryParam.getEntity(); + Integer pageNum = queryParam.getPageNum(); + Integer pageSize = queryParam.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = createWrapper(query); + List operationList = dataCleanMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(operationList); + + //TODO 循环查用户表,待优化 + for (DataClean operation : operationList) { + if (operation != null && operation.getCreateUserId() != null) { + operation.setCreateUserName(sysUserMapper.findNickNameById(operation.getCreateUserId())); + operation.setVersionList(versionService.queryListByListOpId(operation.getId())); + } + } + return pageInfo; + } + + @Override + @Transactional + public DataClean insert(DataClean dataClean) { + //初始化基本参数 + dataClean = initParam(dataClean); + //插入并获取insert后实体对象返回id + boolean save = this.save(dataClean); + if (!save) { + throw new ApiException(ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getCode(), ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getMessage()); + } + Long listOpId = dataClean.getId(); + List versionList = dataClean.getVersionList(); + for (DataCleanVersion versionVo : versionList) { + versionVo.setDataCleanId(listOpId); + } + versionService.addVersionList(versionList); + return this.queryById(listOpId); + } + + + @Override + @Transactional + public DataClean update(DataClean dataClean) { + if (dataClean.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + SysUser sysUser = SessionManager.getLoginAccount(); + dataClean.setUpdateUserId(sysUser.getUserId()); + DataClean updateOperation = new DataClean(); + BeanUtils.copyProperties(dataClean, updateOperation); + //修改主表 + boolean updateResult = this.updateById(updateOperation); + if (dataClean.getStartTime()==null||dataClean.getEndTime()==null){ + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + + wrapper.set(DataClean::getStartTime, dataClean.getStartTime()); + wrapper.set(DataClean::getEndTime, dataClean.getEndTime()); + wrapper.eq(DataClean::getId, dataClean.getId()); + updateResult = this.update(wrapper); + } + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Long listOpId = updateOperation.getId(); + List versionList = dataClean.getVersionList(); + if (versionList != null && versionList.size() > 0) { + versionService.updateVersion(versionList.get(0)); + } + return this.queryById(listOpId); + } + + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DataClean::getId, ids); + DataClean operation = new DataClean(); + operation.setStatus(status); + int updateNum = dataCleanMapper.update(operation, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + @Transactional + public boolean updateFolder(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DataClean::getId, ids); + DataClean operation = new DataClean(); + operation.setFolderId(folderId); + int updateNum = dataCleanMapper.update(operation, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + + private LambdaQueryWrapper createWrapper(DataClean query) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query!=null){ + if (query.getOpType()!=null){ + wrapper.eq(DataClean::getOpType,query.getOpType()); + } + if (query.getFolderId()!=null){ + wrapper.eq(DataClean::getFolderId,query.getFolderId()); + } + if (query.getName() != null) { + wrapper.like(DataClean::getName, query.getName()); + } + if (query.getCode() != null) { + wrapper.like(DataClean::getCode, query.getCode()); + } + if (query.getStartTime()!=null){ + wrapper.le(DataClean::getStartTime,query.getStartTime()); + wrapper.ge(DataClean::getEndTime,query.getStartTime()); + } + } + wrapper.ne(DataClean::getStatus,-1); + wrapper.eq(DataClean::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc( DataClean::getId); + return wrapper; + } + + + //新插入数据的准备工作 + private DataClean initParam(DataClean dataClean) { + this.checkUniqueness(dataClean); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + dataClean.setCreateUserId(sysUser.getUserId()); + dataClean.setOrganId(sysUser.getOrganId()); + dataClean.setUpdateUserId(sysUser.getUserId()); + //加入状态信息 + dataClean.setStatus(StatusConst.STATUS_ENABLED); + return dataClean; + } + + //唯一性检查 + private boolean checkUniqueness(DataClean dataClean) { + DataClean decisionTree = new DataClean(); + decisionTree.setName(dataClean.getName()); + DataClean info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.LIST_OPERATION_NAME_REPEAT.getCode(), ErrorCodeEnum.LIST_OPERATION_NAME_REPEAT.getMessage()); + } + decisionTree.setName(null); + decisionTree.setCode(dataClean.getCode()); + info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.LIST_OPERATION_Code_REPEAT.getCode(), ErrorCodeEnum.LIST_OPERATION_Code_REPEAT.getMessage()); + } + return true; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanVersionServiceImpl.java new file mode 100644 index 0000000..989447a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/dataclean/impl/DataCleanVersionServiceImpl.java @@ -0,0 +1,258 @@ +package com.fibo.ddp.common.service.strategyx.dataclean.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.dataclean.DataCleanVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanConditionAndOutPut; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOriginalDataOp; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanConditionAndOutPutService; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanOriginalDataOpService; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Service("dataCleanVersionService") +@Slf4j +public class DataCleanVersionServiceImpl extends ServiceImpl implements DataCleanVersionService { + @Resource + private DataCleanVersionMapper dataCleanVersionMapper; + + @Resource + private DataCleanConditionAndOutPutService dataCleanConditionAndOutPutService; + + @Resource + private DataCleanOriginalDataOpService originalDataOpService; + + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Autowired + private RedisManager redisManager; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + private final String versionCachePrefix = Constants.cacheConf.cachePrefix + "dataCleanVersionCache:"; + + private static Cache dataCleanVersionCache = Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.SECONDS) + .expireAfterAccess(30, TimeUnit.SECONDS) + .build(); + + @Override + public List queryListByListOpId(Long listOpId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataCleanVersion::getDataCleanId, listOpId); + queryWrapper.eq(DataCleanVersion::getStatus, 1); + queryWrapper.orderByDesc(DataCleanVersion::getId); + List versionList = dataCleanVersionMapper.selectList(queryWrapper); + if (versionList==null||versionList.isEmpty()){ + return versionList; + } + for (DataCleanVersion version : versionList) { + //查询版本内部信息 + version.setOriginalDataOp(originalDataOpService.queryByDataCleanVersion(version)); + version.setConditionAndOutPutList(dataCleanConditionAndOutPutService.queryByListOpVersion(version)); + } + return versionList; + } + + @Override + public DataCleanVersion queryById(Long id,boolean needCache) { + DataCleanVersion version = null; + String redisKey = versionCachePrefix + id; + if (needCache){ + DataCleanVersion localCache = dataCleanVersionCache.getIfPresent(redisKey); + if(localCache != null){ + // 从本地缓存获取 + return localCache; + } else { + String versionJson = redisManager.get(redisKey); + if (StringUtils.isNotBlank(versionJson)) { + try { + version = JSON.parseObject(versionJson, DataCleanVersion.class); + if (version != null && id.equals(version.getId())) { + // 更新本地缓存 + dataCleanVersionCache.put(redisKey, version); + return version; + } + } catch (Exception e) { + log.error("缓存版本信息错误,key:{},value:{}", redisKey, versionJson); + } + } + } + + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + String key = RedisUtils.getPrimaryKey(TableEnum.T_DATA_CLEAN_VERSION, id); + version = redisManager.getByPrimaryKey(key, DataCleanVersion.class); + } else { + version = this.getById(id); + } + //条件与输出 + if (version == null) { + return null; + } + //条件与输出 + version.setOriginalDataOp(originalDataOpService.queryByDataCleanVersion(version)); + version.setConditionAndOutPutList(dataCleanConditionAndOutPutService.queryByListOpVersion(version)); + //查出结果后,放入缓存设置过期时间为120秒 + redisManager.set(redisKey, JSON.toJSONString(version), Constants.cacheConf.cacheSecond); + }else { + version = this.getById(id); + version.setOriginalDataOp(originalDataOpService.queryByDataCleanVersion(version)); + version.setConditionAndOutPutList(dataCleanConditionAndOutPutService.queryByListOpVersion(version)); + } + return version; + + } + + @Override + public DataCleanVersion queryByCode(Long dataCleanId,String code) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DataCleanVersion::getDataCleanId,dataCleanId); + wrapper.eq(DataCleanVersion::getVersionCode,code); + wrapper.eq(DataCleanVersion::getStatus,1); + DataCleanVersion version = this.getOne(wrapper); + version.setOriginalDataOp(originalDataOpService.queryByDataCleanVersion(version)); + version.setConditionAndOutPutList(dataCleanConditionAndOutPutService.queryByListOpVersion(version)); + return version; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + return null; + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (DataCleanVersion version : versionList) { + boolean b = addVersion(version); + if (b) { + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(DataCleanVersion version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode() == null) { + version.setVersionCode("V:0"); + } + if (version.getDescription() == null) { + version.setDescription("初始版本"); + } + int insert = dataCleanVersionMapper.insert(version); + if (insert > 0) { + boolean result = this.addVersionDetail(version); + if (result) { + saveSnapshot(version.getId()); + } + return true; + } else { + log.error("新增清洗数据版本失败{}", version); + } + return false; + } + + @Transactional + public boolean addVersionDetail(DataCleanVersion version) { + List conditionAndOutPutList = version.getConditionAndOutPutList(); + DataCleanOriginalDataOp originalDataOp = version.getOriginalDataOp(); + originalDataOp.setParentId(0L); + originalDataOp.setDataCleanVersionId(version.getId()); + originalDataOpService.addOriginalDataOp(originalDataOp); + if (CollectionUtils.isNotEmpty(conditionAndOutPutList)){ + dataCleanConditionAndOutPutService.addBatch(version,conditionAndOutPutList); + } + return true; + } + + @Override + @Transactional + public boolean copyVersion(DataCleanVersion version) { + DataCleanVersion versionVo = this.queryById(version.getId(),false); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(DataCleanVersion version) { + Long versionId = version.getId(); + if (versionId == null) { + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + dataCleanVersionMapper.updateById(version); + DataCleanOriginalDataOp originalDataOp = version.getOriginalDataOp(); + originalDataOpService.updateDataOp(version,originalDataOp); + //todo 修改版本之下的 信息 + boolean b = dataCleanConditionAndOutPutService.updateBatch(version, version.getConditionAndOutPutList()); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(DataCleanVersion::getId, statusParam.getIds()); + updateWrapper.eq(DataCleanVersion::getDataCleanId, statusParam.getStrategyId()); + DataCleanVersion version = new DataCleanVersion(); + version.setStatus(statusParam.getStatus()); + boolean update = this.update(version, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId) { + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + DataCleanVersion version = queryById(versionId,false); + version.setSnapshot(null); + wrapper.eq(DataCleanVersion::getId, versionId).set(DataCleanVersion::getSnapshot, JSON.toJSONString(version)); + dataCleanVersionMapper.update(null, wrapper); + } + }); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailConditionService.java new file mode 100644 index 0000000..1d5ec63 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailConditionService.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetailCondition; + +import java.util.List; + +/** + * (DecisionTablesDetailCondition)表服务接口 + */ +public interface DecisionTablesDetailConditionService extends IService { + List updateDecisionTablesDetailCondition(Long detailId, List list); + List insertDecisionTablesDetailCondition(Long detailId, List list); + boolean deleteByDecisionTablesDetailId(List detailIds); + + // runner + List queryByDecisionTablesDetailId(Long detailId); + List queryFieldEnByDetailIds(List detailIds); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailService.java new file mode 100644 index 0000000..4a9bf77 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesDetailService.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetail; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesDetailVo; + +import java.util.List; + +/** + * (DecisionTablesDetail)表服务接口 + */ +public interface DecisionTablesDetailService extends IService { + boolean insertDecisionTablesDetail(Long decisionTablesVersionId, List list, Integer dimensionality); + List updateDecisionTablesDetail(Long decisionTablesVersionId, List list, Integer dimensionality); + boolean deleteByDecisionTablesVersionId(Long decisionTablesVersionId, Integer dimensionality); + + // runner + List queryByDecisionTablesVersionId(Long decisionTablesVersionId, Integer dimensionality); + List queryFieldIdByDecisionTablesVersionId(Long decisionTablesId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesResultService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesResultService.java new file mode 100644 index 0000000..8977ad7 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesResultService.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesResult; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesResultVo; + +/** + * (DecisionTablesResult)表服务接口 + */ +public interface DecisionTablesResultService extends IService { + DecisionTablesResultVo updateDecisionTablesResult(Long decisionTablesVersionId, DecisionTablesResultVo resultVo); + DecisionTablesResultVo insertDecisionTablesResult(Long decisionTablesVersionId, DecisionTablesResultVo insert); + boolean deleteByDecisionTablesVersionId(Long DecisionTablesVersionId); + + // runner + DecisionTablesResultVo queryByDecisionTablesVersionId(Long decisionTablesVersionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesService.java new file mode 100644 index 0000000..31e636b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesService.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import com.fibo.ddp.common.model.strategyx.decisiontable.request.DecisionTablesListParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +/** + * (DecisionTables)表服务接口 + */ +public interface DecisionTablesService extends IService { + + DecisionTablesVo queryById(Long id); + + PageInfo queryByEntity(DecisionTablesListParam listParam); + + DecisionTablesVo insertDecisionTables(DecisionTablesVo decisionTablesVo); + + DecisionTablesVo updateDecisionTables(DecisionTablesVo decisionTablesVo); + + boolean updateStatus(List ids, Integer status); + + boolean updateParent(List ids, Long folderId); + + List queryFieldEnByDecisionTablesVersionId(Long decisionTablesId); + + // runner + DecisionTablesVo queryByVersionId(Long id); + + List setOutput(Long decisionTablesId, Map map); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesVersionService.java new file mode 100644 index 0000000..ae0797c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/DecisionTablesVersionService.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesVersion; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; + +import java.io.Serializable; +import java.util.List; + +/** + * (DecisionTablesVersion)表服务接口 + */ +public interface DecisionTablesVersionService extends IService { + + List queryVersionListByDecisionTablesId(Serializable decisionTablesId); + + List queryFieldEnByVersionId(Long versionId); + int addVersionList(List versionList); + + boolean addVersion(DecisionTablesVersionVo version); + boolean copyVersion(DecisionTablesVersionVo version); + + boolean updateVersion(DecisionTablesVersionVo version); + + boolean updateStatus(StatusParam statusParam); + + // runner + DecisionTablesVersionVo queryById(Long id); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailConditionServiceImpl.java new file mode 100644 index 0000000..8649d89 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailConditionServiceImpl.java @@ -0,0 +1,123 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontable.DecisionTablesDetailConditionMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetailCondition; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailConditionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * (DecisionTablesDetailCondition)表服务实现类 + */ +@Service("decisionTablesDetailConditionService") +public class DecisionTablesDetailConditionServiceImpl extends ServiceImpl implements DecisionTablesDetailConditionService { + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public List queryByDecisionTablesDetailId(Long detailId) { +// if (detailId==null){ +// return null; +// } +// DecisionTablesDetailCondition query = new DecisionTablesDetailCondition(); +// query.setDetailId(detailId); +// List list = this.list(new QueryWrapper<>(query)); +// return list; +// } + + @Override + public List queryByDecisionTablesDetailId(Long detailId) { + if (detailId==null){ + return null; + } + + List list = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TABLES_DETAIL_CONDITION, detailId); + list = redisManager.getByForeignKey(key, DecisionTablesDetailCondition.class); + } else { + DecisionTablesDetailCondition query = new DecisionTablesDetailCondition(); + query.setDetailId(detailId); + list = this.list(new QueryWrapper<>(query)); + } + + return list; + } + + @Override + public List updateDecisionTablesDetailCondition(Long detailId, List list) { + return null; + } + + @Override + public List insertDecisionTablesDetailCondition(Long detailId, List list) { + if (detailId==null||list==null||list.isEmpty()){ + return null; + } + for (DecisionTablesDetailCondition condition : list) { + condition.setDetailId(detailId); + } + boolean b = this.saveBatch(list); + if (b){ + return this.queryByDecisionTablesDetailId(detailId); + } + return null; + } + + @Override + public boolean deleteByDecisionTablesDetailId(List detailIds) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DecisionTablesDetailCondition::getDetailId,detailIds); + return this.remove(wrapper); +// int result = decisionTablesDetailConditionMapper.deleteByDetailIds(detailIds); +// return result>0?true:false; + } + + @Override + public List queryFieldEnByDetailIds(List detailIds) { + if (detailIds==null||detailIds.isEmpty()){ + return null; + } + List list = new ArrayList<>(); + Set fieldEns = new HashSet<>(); + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + for (Long detailId : detailIds) { + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TABLES_DETAIL_CONDITION, detailId); + list.addAll(redisManager.getByForeignKey(key, DecisionTablesDetailCondition.class)); + } + } else { + LambdaQueryWrapper conditionWrapper = new LambdaQueryWrapper<>(); + conditionWrapper.in(DecisionTablesDetailCondition::getDetailId, detailIds); + list = this.list(conditionWrapper); + } + for (DecisionTablesDetailCondition condition : list) { + if (condition.getVariableType()==null||condition.getVariableType()==1){ + continue; + } + if (condition.getVariableType() == 2) { + fieldEns.add(condition.getFieldValue()); + } else if (condition.getVariableType() == 3) { + fieldEns.addAll(CustomValueUtils.getFieldEnSet(condition.getFieldValue())); + } + } + return new ArrayList<>(fieldEns); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailServiceImpl.java new file mode 100644 index 0000000..a93464e --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesDetailServiceImpl.java @@ -0,0 +1,338 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontable.DecisionTablesDetailMapper; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetail; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesDetailVo; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailConditionService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.DecisionTablesDetailConst; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * (DecisionTablesDetail)表服务实现类 + * + * @author jgp + * @since 2021-04-12 17:58:46 + */ +@Service("decisionTablesDetailService") +public class DecisionTablesDetailServiceImpl extends ServiceImpl implements DecisionTablesDetailService { + @Resource + private DecisionTablesDetailMapper decisionTablesDetailMapper; + @Resource + private DecisionTablesDetailConditionService conditionService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + @Autowired + private FieldService fieldService; + +// @Override +// public List queryByDecisionTablesVersionId(Long decisionTablesVersionId, Integer dimensionality) { +// +// DecisionTablesDetail query = new DecisionTablesDetail(); +// query.setVersionId(decisionTablesVersionId); +// query.setDimensionality(dimensionality); +// QueryWrapper queryWrapper = new QueryWrapper<>(query); +// List list = decisionTablesDetailMapper.selectList(queryWrapper); +// +// if (list == null || list.isEmpty()) { +// return null; +// } +// List result = this.assemble(list); +// return result; +// } + + @Override + public List queryByDecisionTablesVersionId(Long decisionTablesVersionId, Integer dimensionality) { + List list = null; + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TABLES_DETAIL, decisionTablesVersionId); + list = redisManager.getByForeignKey(key, DecisionTablesDetail.class); + list = list.stream().filter(item -> item.getDimensionality().intValue() == dimensionality).collect(Collectors.toList()); + } else { + DecisionTablesDetail query = new DecisionTablesDetail(); + query.setVersionId(decisionTablesVersionId); + query.setDimensionality(dimensionality); + QueryWrapper queryWrapper = new QueryWrapper<>(query); + list = decisionTablesDetailMapper.selectList(queryWrapper); + } + + if (list == null || list.isEmpty()) { + return null; + } + List result = this.assemble(list); + return result; + } + + + @Override + @Transactional + public boolean insertDecisionTablesDetail(Long decisionTablesVersionId, List list, Integer dimensionality) { + if (decisionTablesVersionId == null || list == null || list.isEmpty()) { + return false; + } + Long parentId = DecisionTablesDetailConst.ROOT_PARENT_ID; + + List detailList = this.disassemble(list, decisionTablesVersionId, true, dimensionality); + + List rootList = detailList.stream().filter(detail -> { + return detail.getParentId() == parentId; + }).collect(Collectors.toList()); + for (DecisionTablesDetail root : rootList) { + boolean saveResult = this.save(detailList, root); + } + return true; + } + + @Override + @Transactional + public List updateDecisionTablesDetail(Long decisionTablesId, List list, Integer dimensionality) { + if (decisionTablesId == null || dimensionality == null) { + return null; + } + boolean delete = this.deleteByDecisionTablesVersionId(decisionTablesId, dimensionality); + if (delete && list != null && list.size() > 0) { + this.insertDecisionTablesDetail(decisionTablesId, list, dimensionality); + } + return this.queryByDecisionTablesVersionId(decisionTablesId, dimensionality); + } + + @Override + @Transactional + public boolean deleteByDecisionTablesVersionId(Long decisionTablesVersionId, Integer dimensionality) { + if (decisionTablesVersionId == null || dimensionality == null) { + return false; + } + DecisionTablesDetail detail = new DecisionTablesDetail(); + detail.setVersionId(decisionTablesVersionId); + detail.setDimensionality(dimensionality); + QueryWrapper queryWrapper = new QueryWrapper<>(detail); + List details = this.list(queryWrapper); + List ids = new ArrayList<>(); + for (DecisionTablesDetail d : details) { + ids.add(d.getId()); + } + conditionService.deleteByDecisionTablesDetailId(ids); + boolean remove = this.remove(queryWrapper); + if (!remove) { + List list = this.list(queryWrapper); + if (list != null && !list.isEmpty()) { + return false; + } + } + return true; + } + + + //装配方法,将规则条件List装配成一个规则树并返回 + public List assemble(List list) { + //转换为Vo + List detailVoList = transferToVoList(list); + for (DecisionTablesDetailVo detailVo : detailVoList) { + detailVo.setConditionList(conditionService.queryByDecisionTablesDetailId(detailVo.getId())); + } + //获取根节点列表并且返回拼装好的规则树 + List rootList = detailVoList.stream().filter(detail -> { + return detail.getParentId() != null && detail.getParentId() == DecisionTablesDetailConst.ROOT_PARENT_ID; + }).collect(Collectors.toList()); + if (rootList != null && !rootList.isEmpty()) { + List result = new ArrayList<>(); + for (DecisionTablesDetailVo root : rootList) { + DecisionTablesDetailVo detailTree = coupling(detailVoList, root); + result.add(detailTree); + } + return result; + } + return null; + } + + + // 拆解方法,将规则条件Vo转换未规则条件list + public List disassemble(List list, Long decisionTablesVersionId, boolean needTempId, Integer dimensionality) { + if (list == null) { + return null; + } + List result = new ArrayList<>(); + if (needTempId) { + for (DecisionTablesDetailVo vo : list) { + vo.setParentId(DecisionTablesDetailConst.ROOT_PARENT_ID); + vo.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + List voList = decoupling(vo, decisionTablesVersionId, needTempId); + result.addAll(transferToInfoList(voList)); + } + } + for (DecisionTablesDetail detail : result) { + detail.setDimensionality(dimensionality); + } + return result; + } + + //存储 + @Transactional + public boolean save(List list, DecisionTablesDetail root) { + String tempId = root.getInsertTempId(); +// String content = fittingContent(root); +// root.setContent(content); + boolean insert = this.save(root); + + if (!insert) { + return false; + } + Long id = root.getId(); + conditionService.insertDecisionTablesDetailCondition(id, root.getConditionList()); + for (int i = 0; i < list.size(); i++) { + DecisionTablesDetail info = list.get(i); + if (tempId.equals(info.getTempParentId())) { + info.setParentId(id); + save(list, info); + } + } + return true; + } + + //耦合方法:将规则节点列表耦合规则树() + private DecisionTablesDetailVo coupling(List list, DecisionTablesDetailVo root) { + List children = new ArrayList<>(); + for (DecisionTablesDetailVo rc : list) { + if (root.getId().equals(rc.getParentId())) { + DecisionTablesDetailVo rcVo = coupling(list, rc); + children.add(rcVo); + } + } + root.setChildren(children); + return root; + } + + //解耦方法:将规则树解耦为节点列表 + private List decoupling(DecisionTablesDetailVo vo, Long decisionTablesVersionId, boolean needTempId) { + List list = new ArrayList<>(); + List children = vo.getChildren(); + if (children != null && children.size() > 0) { + for (int i = 0; i < children.size(); i++) { + DecisionTablesDetailVo child = children.get(i); + if (needTempId) { + child.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + child.setTempParentId(vo.getInsertTempId()); + } + List childList = decoupling(child, decisionTablesVersionId, needTempId); + list.addAll(childList); + } + } + vo.setVersionId(decisionTablesVersionId); + list.add(vo); + return list; + } + + //List转换为List + private List transferToVoList(List list) { + List voList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + DecisionTablesDetailVo vo = new DecisionTablesDetailVo(); + BeanUtils.copyProperties(list.get(i), vo); + vo.setContent(null); + vo.setTempParentId(null); + vo.setInsertTempId(null); + voList.add(vo); + } + return voList; + } + + //List转换为List + private List transferToInfoList(List list) { + List detailList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + DecisionTablesDetail detail = new DecisionTablesDetail(); + BeanUtils.copyProperties(list.get(i), detail); + detailList.add(detail); + } + return detailList; + } + +// private String fittingContent(DecisionTablesDetail detail){ +// if (detail==null){ +// return null; +// } +// Long fieldId = detail.getFieldId(); +// List conditionList = detail.getConditionList(); +// Integer valueType = detail.getValueType(); +// String logical = detail.getLogical(); +// if (fieldId==null||conditionList==null||conditionList.isEmpty()){ +// return null; +// } +// if (valueType==null){ +// throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getVersionCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); +// } +// String fieldName = fieldMapper.findFieldNameById(fieldId); +// String condition = "("; +// if (valueType==2||valueType==5){ +// for (int i = 0; i < conditionList.size(); i++) { +// DecisionTablesDetailCondition cond = conditionList.get(i); +// condition += "(this['"+fieldName+"']"+cond.getOperator(); +// if (cond.getVariableType()!=null&&cond.getVariableType()==2){ +// condition+="this['"+cond.getFieldValue()+"']"; +// }else { +// condition+="\""+cond.getFieldValue()+"\")"; +// } +// if (i queryFieldIdByDecisionTablesVersionId(Long decisionTablesVersionId) { + List fieldIdList = null; + Set set = new HashSet(); + List list = new ArrayList<>(); + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TABLES_DETAIL, decisionTablesVersionId); + list.addAll(redisManager.getByForeignKey(key, DecisionTablesDetail.class)); + } else { + list.addAll(this.list(new QueryWrapper().lambda().eq(DecisionTablesDetail::getVersionId, decisionTablesVersionId))); + } + if (list != null) { + set.addAll(list.stream().map(item -> item.getFieldId()).collect(Collectors.toSet())); + List fieldEns = conditionService.queryFieldEnByDetailIds(list.stream().map(item -> item.getId()).collect(Collectors.toList())); + if (fieldEns != null && !fieldEns.isEmpty()) { + List fieldList = fieldService.selectFieldListByEns(fieldEns); + set.addAll(fieldList.stream().map(item -> item.getId()).collect(Collectors.toSet())); + } + } + fieldIdList = new ArrayList<>(set); + return fieldIdList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesResultServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesResultServiceImpl.java new file mode 100644 index 0000000..06e860b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesResultServiceImpl.java @@ -0,0 +1,135 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontable.DecisionTablesResultMapper; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesResult; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesResultVo; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesResultService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * (DecisionTablesResult)表服务实现类 + */ +@Service("decisionTablesResultService") +public class DecisionTablesResultServiceImpl extends ServiceImpl implements DecisionTablesResultService { + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public DecisionTablesResultVo queryByDecisionTablesVersionId(Long decisionTablesVersionId) { +// if (decisionTablesVersionId==null){ +// return null; +// } +// DecisionTablesResult query = new DecisionTablesResult(); +// query.setVersionId(decisionTablesVersionId); +// DecisionTablesResult result = this.getOne(new QueryWrapper<>(query)); +// if (result!=null){ +// return transferToVo(result); +// } +// return null; +// } + + @Override + public DecisionTablesResultVo queryByDecisionTablesVersionId(Long decisionTablesVersionId) { + if (decisionTablesVersionId==null){ + return null; + } + + DecisionTablesResult result = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TABLES_RESULT, decisionTablesVersionId); + List resultList = redisManager.getByForeignKey(key, DecisionTablesResult.class); + if(resultList != null){ + result = resultList.get(0); + } + } else { + DecisionTablesResult query = new DecisionTablesResult(); + query.setVersionId(decisionTablesVersionId); + result = this.getOne(new QueryWrapper<>(query)); + } + + DecisionTablesResultVo decisionTablesResultVo = transferToVo(result); + return decisionTablesResultVo; + } + + @Override + @Transactional + public DecisionTablesResultVo updateDecisionTablesResult(Long decisionTablesVersionId, DecisionTablesResultVo resultVo) { + + boolean delete = this.deleteByDecisionTablesVersionId(decisionTablesVersionId); + if (delete){ + this.insertDecisionTablesResult(decisionTablesVersionId,resultVo); + } + return this.queryByDecisionTablesVersionId(decisionTablesVersionId); + } + + @Override + @Transactional + public DecisionTablesResultVo insertDecisionTablesResult(Long decisionTablesVersionId, DecisionTablesResultVo insert) { + if (decisionTablesVersionId==null||insert==null){ + return null; + } + DecisionTablesResult resultInfo = transferToInfo(insert); + resultInfo.setVersionId(decisionTablesVersionId); + boolean save = this.save(resultInfo); + if (save){ + return transferToVo(resultInfo); + } + return null; + } + + @Override + @Transactional + public boolean deleteByDecisionTablesVersionId(Long decisionTablesVersionId) { + if (decisionTablesVersionId!=null){ + DecisionTablesResult result = new DecisionTablesResult(); + result.setVersionId(decisionTablesVersionId); + boolean remove = this.remove(new QueryWrapper<>(result)); + if (!remove){ + List list = this.list(new QueryWrapper<>(result)); + if (list!=null&&list.size()!=0){ + return false; + } + } + } + return true; + } + + private DecisionTablesResult transferToInfo(DecisionTablesResultVo vo){ + DecisionTablesResult resultInfo = new DecisionTablesResult(); + BeanUtils.copyProperties(vo,resultInfo); + JSONArray resultList = vo.getResultList(); + resultInfo.setRows(resultList.size()); + JSONArray childList = JSON.parseArray(JSON.toJSONString(resultList.get(0))); + resultInfo.setColumns(childList.size()); + String resultValue = JSON.toJSONString(resultList); + resultInfo.setResultValue(resultValue); + return resultInfo; + } + private DecisionTablesResultVo transferToVo(DecisionTablesResult info){ + DecisionTablesResultVo resultVo = new DecisionTablesResultVo(); + BeanUtils.copyProperties(info,resultVo); + String resultValue = info.getResultValue(); + JSONArray resultArray = JSON.parseArray(resultValue); + resultVo.setResultList(resultArray); + return resultVo; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesServiceImpl.java new file mode 100644 index 0000000..acccfe8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesServiceImpl.java @@ -0,0 +1,262 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontable.DecisionTablesMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTables; +import com.fibo.ddp.common.model.strategyx.decisiontable.request.DecisionTablesListParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * (DecisionTables)表服务实现类 + */ +@Service("decisionTablesService") +public class DecisionTablesServiceImpl extends ServiceImpl implements DecisionTablesService { + @Resource + private DecisionTablesMapper decisionTablesMapper; + @Resource + private DecisionTablesVersionService versionService; + @Resource + private SysUserMapper sysUserMapper; + @Autowired + private RedisManager redisManager; + @Resource + private StrategyOutputService outputService; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public DecisionTablesVo queryById(Long id) { + //查询决策表主表信息 + DecisionTables decisionTables = this.getById(id); + if (decisionTables == null) { + return null; + } + DecisionTablesVo decisionTablesVo = new DecisionTablesVo(); + BeanUtils.copyProperties(decisionTables, decisionTablesVo); + decisionTablesVo.setDecisionTablesVersionList(versionService.queryVersionListByDecisionTablesId(id)); + return decisionTablesVo; + } + + @Override + public PageInfo queryByEntity(DecisionTablesListParam listParam) { + DecisionTables query = listParam.getDecisionTables(); + Integer pageNum = listParam.getPageNum(); + Integer pageSize = listParam.getPageSize(); + if (query != null && query.getName() != null && !"".equals(query.getName())) { + query.setName("%" + query.getName() + "%"); + } + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaUpdateWrapper wrapper = createWrapper(query); + List decisionTables = decisionTablesMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(decisionTables); + + //TODO 循环查用户表,待优化 + for (DecisionTables decisionTable : decisionTables) { + if (decisionTable != null && decisionTable.getCreator() != null) { + decisionTable.setCreatorName(sysUserMapper.findNickNameById(decisionTable.getCreator())); + decisionTable.setDecisionTablesVersionList(versionService.queryVersionListByDecisionTablesId(decisionTable.getId())); + } + } + return pageInfo; + } + + @Override + @Transactional + public DecisionTablesVo insertDecisionTables(DecisionTablesVo decisionTablesVo) { + //初始化基本参数 + DecisionTablesVo vo = initParam(decisionTablesVo); + //拷贝VO到Info对象 + DecisionTables decisionTables = new DecisionTables(); + BeanUtils.copyProperties(vo, decisionTables); + //插入并获取insert后实体对象返回id + boolean save = this.save(decisionTables); + if (!save) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_SAVE_ERROR.getCode(), ErrorCodeEnum.DECISION_TABLES_SAVE_ERROR.getMessage()); + } + Long decisionTablesId = decisionTables.getId(); + List versionList = decisionTablesVo.getDecisionTablesVersionList(); + if (versionList != null && versionList.size() > 0) { + for (DecisionTablesVersionVo versionVo : versionList) { + versionVo.setDecisionTablesId(decisionTablesId); + } + versionService.addVersionList(versionList); + } + return this.queryById(decisionTablesId); + } + + + @Override + @Transactional + public DecisionTablesVo updateDecisionTables(DecisionTablesVo vo) { + if (vo.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setModifier(sysUser.getUserId()); + DecisionTables decisionTables = new DecisionTables(); + BeanUtils.copyProperties(vo, decisionTables); + //修改主表 + boolean updateResult = this.updateById(decisionTables); + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + Long decisionTablesId = decisionTables.getId(); + List versionList = vo.getDecisionTablesVersionList(); + if (versionList != null && versionList.size() > 0) { + versionService.updateVersion(versionList.get(0)); + } + return this.queryById(decisionTablesId); + } + + /** + * 通过主键修改状态,支持批量 + * + * @param ids 主键id集合 + * @param status 状态代号 + * @return + */ + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DecisionTables::getId, ids); + DecisionTables decisionTables = new DecisionTables(); + decisionTables.setStatus(status); + return this.update(decisionTables, wrapper); + } + + @Override + public boolean updateParent(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DecisionTables::getId, ids).set(DecisionTables::getParentId, folderId); + DecisionTables decisionTables = new DecisionTables(); + decisionTables.setParentId(folderId); + return this.update(decisionTables, wrapper); + } + + @Override + public List queryFieldEnByDecisionTablesVersionId(Long decisionTablesVersionId) { + return versionService.queryFieldEnByVersionId(decisionTablesVersionId); + } + + private LambdaUpdateWrapper createWrapper(DecisionTables entity) { + SysUser loginAccount = SessionManager.getLoginAccount(); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(DecisionTables::getOrganId,loginAccount.getOrganId()); + wrapper.orderByDesc(DecisionTables::getId); + if (entity == null) { + wrapper.ne(DecisionTables::getStatus, StatusConst.STATUS_DELETE); + return wrapper; + } + if (StringUtils.isNotBlank(entity.getCode())){ + wrapper.eq(DecisionTables::getCode,entity.getCode()); + } + if (StringUtils.isNotBlank(entity.getName())) { + wrapper.like(DecisionTables::getName, entity.getName()); + } + if (CollectionUtils.isNotEmpty(entity.getParentIds())) { + wrapper.in(DecisionTables::getParentId, entity.getParentIds()); + } else if (entity.getParentId() != null) { + wrapper.eq(DecisionTables::getParentId, entity.getParentId()); + } + if (entity.getStatus() != null){ + wrapper.eq(DecisionTables::getStatus,entity.getStatus()); + }else { + wrapper.ne(DecisionTables::getStatus, StatusConst.STATUS_DELETE); + } + return wrapper; + } + + //唯一性检查 + private boolean checkUniqueness(DecisionTablesVo vo) { + DecisionTables decisionTables = new DecisionTables(); + decisionTables.setName(vo.getName()); + DecisionTables info = this.getOne(new QueryWrapper<>(decisionTables)); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getMessage()); + } + decisionTables.setName(null); + decisionTables.setCode(vo.getCode()); + info = this.getOne(new QueryWrapper<>(decisionTables)); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getMessage()); + } + return true; + } + + //新插入数据的准备工作 + private DecisionTablesVo initParam(DecisionTablesVo vo) { + this.checkUniqueness(vo); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setCreator(sysUser.getUserId()); + vo.setOrganId(sysUser.getOrganId()); + vo.setModifier(sysUser.getUserId()); + //加入状态信息 + vo.setStatus(StatusConst.STATUS_ENABLED); + return vo; + } + + @Override + public DecisionTablesVo queryByVersionId(Long id) { + //查询版本 + DecisionTablesVersionVo versionVo = versionService.queryById(id); + + //根据版本信息查询决策表主表信息 + DecisionTables decisionTables = null; + Long decisionTablesId = versionVo.getDecisionTablesId(); + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_DECISION_TABLES, decisionTablesId); + decisionTables = redisManager.getByPrimaryKey(key, DecisionTables.class); + } else { + decisionTables = this.getById(decisionTablesId); + } + if (decisionTables == null) { + return null; + } + + DecisionTablesVo decisionTablesVo = new DecisionTablesVo(); + BeanUtils.copyProperties(decisionTables, decisionTablesVo); + decisionTablesVo.setExecuteVersion(versionVo); + return decisionTablesVo; + } + + @Override + public List setOutput(Long decisionTablesVersionId, Map map) { + return outputService.setOutput(new StrategyOutput(decisionTablesVersionId, StrategyType.DECISION_TABLES),map); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesVersionServiceImpl.java new file mode 100644 index 0000000..30f1c59 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontable/impl/DecisionTablesVersionServiceImpl.java @@ -0,0 +1,278 @@ +package com.fibo.ddp.common.service.strategyx.decisiontable.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontable.DecisionTablesVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetail; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetailCondition; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesVersion; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesResultVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailConditionService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesResultService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.DecisionTablesDetailConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * (DecisionTablesVersion)表服务实现类 + */ +@Service("tDecisionTablesVersionService") +public class DecisionTablesVersionServiceImpl extends ServiceImpl implements DecisionTablesVersionService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private DecisionTablesVersionMapper versionMapper; + @Resource + private DecisionTablesDetailService detailService; + @Resource + private DecisionTablesDetailConditionService conditionService; + @Resource + private DecisionTablesResultService resultService; + @Resource + private StrategyOutputService outputService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List queryVersionListByDecisionTablesId(Serializable decisionTablesId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DecisionTablesVersion::getDecisionTablesId,decisionTablesId); + queryWrapper.eq(DecisionTablesVersion::getStatus,1); + queryWrapper.orderByDesc(DecisionTablesVersion::getId); + List ruleVersionList = versionMapper.selectList(queryWrapper); + List DecisionTablesVersionVoList = new ArrayList<>(); + for (DecisionTablesVersion ruleVersion : ruleVersionList) { + DecisionTablesVersionVo versionVo = new DecisionTablesVersionVo(); + BeanUtils.copyProperties(ruleVersion,versionVo); + DecisionTablesVersionVoList.add(versionVo); + } + return DecisionTablesVersionVoList; + } + +// @Override +// public DecisionTablesVersionVo queryById(Long id) { +// DecisionTablesVersion version = this.getById(id); +// DecisionTablesVersionVo decisionTablesVersionVo = new DecisionTablesVersionVo(); +// BeanUtils.copyProperties(version,decisionTablesVersionVo); +// +// decisionTablesVersionVo.setLeftDetailVo(detailService.queryByDecisionTablesVersionId(id, DecisionTablesDetailConst.LEFT_DETAIL_NUM)); +// decisionTablesVersionVo.setTopDetailVo(detailService.queryByDecisionTablesVersionId(id, DecisionTablesDetailConst.TOP_DETAIL_NUM)); +// +// //查询结果集表 +// DecisionTablesResultVo resultList = resultService.queryByDecisionTablesVersionId(id); +// decisionTablesVersionVo.setResultSet(resultList); +// //查询策略输出 +// List strategyOutputs = outputService.queryByTactics(new StrategyOutput(id, StrategyType.DECISION_TABLES)); +// decisionTablesVersionVo.setStrategyOutputList(strategyOutputs); +// return decisionTablesVersionVo; +// } + + @Override + public DecisionTablesVersionVo queryById(Long id) { + DecisionTablesVersion version = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_DECISION_TABLES_VERSION, id); + version = redisManager.getByPrimaryKey(key, DecisionTablesVersion.class); + } else { + version = this.getById(id); + } + + DecisionTablesVersionVo decisionTablesVersionVo = new DecisionTablesVersionVo(); + BeanUtils.copyProperties(version,decisionTablesVersionVo); + + decisionTablesVersionVo.setLeftDetailVo(detailService.queryByDecisionTablesVersionId(id, DecisionTablesDetailConst.LEFT_DETAIL_NUM)); + decisionTablesVersionVo.setTopDetailVo(detailService.queryByDecisionTablesVersionId(id, DecisionTablesDetailConst.TOP_DETAIL_NUM)); + + //查询结果集表 + DecisionTablesResultVo resultList = resultService.queryByDecisionTablesVersionId(id); + decisionTablesVersionVo.setResultSet(resultList); + //查询策略输出 + List strategyOutputs = outputService.queryByTactics(new StrategyOutput(id, StrategyType.DECISION_TABLES)); + decisionTablesVersionVo.setStrategyOutputList(strategyOutputs); + return decisionTablesVersionVo; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + Set fieldEns = new HashSet<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DecisionTablesDetail::getVersionId,versionId); + List list = detailService.list(queryWrapper); + Set detailIds = new HashSet<>(); + for (DecisionTablesDetail detail : list) { + if (detail.getFieldEn().contains(".") && !detail.getFieldEn().startsWith("%")) { + fieldEns.add(detail.getFieldEn().split("\\.")[0]); + } else { + fieldEns.add(detail.getFieldEn()); + } + } + LambdaQueryWrapper conditionWrapper = new LambdaQueryWrapper<>(); + if (detailIds.size()>0){ + conditionWrapper.in(DecisionTablesDetailCondition::getDetailId,detailIds); + List conditionList = conditionService.list(conditionWrapper); + for (DecisionTablesDetailCondition condition : conditionList) { + if (condition.getVariableType()==null||condition.getVariableType()==1){ + continue; + } + if (condition.getVariableType()==2){ + String fieldValue = condition.getFieldValue(); + if (fieldValue.contains(".") && !fieldValue.startsWith("%")) { + fieldEns.add(fieldValue.split("\\.")[0]); + } else { + fieldEns.add(fieldValue); + } + }else if (condition.getVariableType()==3){ + fieldEns.addAll( CustomValueUtils.getFieldEnSet(condition.getFieldValue())); + } + } + + } + return new ArrayList<>(fieldEns); + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (DecisionTablesVersionVo versionVo : versionList) { + boolean b = addVersion(versionVo); + if (b){ + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(DecisionTablesVersionVo version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode()==null){ + version.setVersionCode("V:0"); + } + if (version.getDescription()==null){ + version.setDescription("初始版本"); + } + int insert = versionMapper.insert(version); + if (insert>0){ + boolean result = this.addVersionDetail(version); + if (result){ + saveSnapshot(version.getId()); + } + return true; + }else { + logger.error("新增决策表版本失败{}",version); + } + return false; + } + @Transactional + public boolean addVersionDetail(DecisionTablesVersionVo version){ + //插入子表(detail表)数据 + detailService.insertDecisionTablesDetail(version.getId(), version.getLeftDetailVo(), DecisionTablesDetailConst.LEFT_DETAIL_NUM); + detailService.insertDecisionTablesDetail(version.getId(), version.getTopDetailVo(), DecisionTablesDetailConst.TOP_DETAIL_NUM); + //插入子表(result表)数据 + resultService.insertDecisionTablesResult(version.getId(), version.getResultSet()); + //插入子表(tactics_output表)数据 + + //添加输出字段 + List strategyOutputList = version.getStrategyOutputList(); + if (strategyOutputList !=null&& strategyOutputList.size()>0){ + outputService.insertTacticsOutput(version.getId(), strategyOutputList); + } + return true; + } + + @Override + @Transactional + public boolean copyVersion(DecisionTablesVersionVo version) { + DecisionTablesVersionVo versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(DecisionTablesVersionVo version) { + Long versionId = version.getId(); + if (versionId==null){ + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + versionMapper.updateById(version); + //修改条件表 + detailService.updateDecisionTablesDetail(version.getId(), version.getLeftDetailVo(), DecisionTablesDetailConst.LEFT_DETAIL_NUM); + detailService.updateDecisionTablesDetail(version.getId(), version.getTopDetailVo(), DecisionTablesDetailConst.TOP_DETAIL_NUM); + resultService.updateDecisionTablesResult(version.getId(),version.getResultSet()); + //修改策略输出 + outputService.updateTacticsOutput(versionId,version.getStrategyOutputList(), StrategyType.DECISION_TABLES); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(DecisionTablesVersion::getId,statusParam.getIds()); + updateWrapper.eq(DecisionTablesVersion::getDecisionTablesId,statusParam.getStrategyId()); + DecisionTablesVersion ruleVersion = new DecisionTablesVersion(); + ruleVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(ruleVersion, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId){ +// threadPoolTaskExecutor.execute(new Runnable() { +// @Override +// public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + DecisionTablesVersionVo versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(DecisionTablesVersion::getId,versionId).set(DecisionTablesVersion::getSnapshot, JSON.toJSONString(versionVo)); + versionMapper.update(null,wrapper); +// } +// }); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailConditionService.java new file mode 100644 index 0000000..734b293 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailConditionService.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetailCondition; + +import java.util.Collection; +import java.util.List; + +public interface DecisionTreeDetailConditionService extends IService { + + boolean addDecisionTreeDetailCondition(Long detailId, List conditionList); + + boolean removeByDecisionTreeDetailId(List detailIds); + + // runner + List queryByDecisionTreeDetailId(Long detailId); + + List queryFieldEnByDetailIds(Collection detailIds); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailService.java new file mode 100644 index 0000000..100eb7d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeDetailService.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetail; + +import java.util.List; + +public interface DecisionTreeDetailService extends IService { + + boolean addDecisionTreeDetailList(Long versionId, List list); + + boolean updateByVersionId(Long versionId, List list); + + // runner + List queryByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeService.java new file mode 100644 index 0000000..b0279e4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeService.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTree; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +public interface DecisionTreeService extends IService { + + DecisionTreeVo queryById(Long id); + + PageInfo queryByEntity(QueryListParam listParam); + + DecisionTreeVo insertDecisionTree(DecisionTreeVo decisionTreeVo); + + DecisionTreeVo updateDecisionTree(DecisionTreeVo decisionTreeVo); + + boolean updateStatus(List ids, Integer status); + + boolean updateFolder(List ids, Long folderId); + + List queryFieldEnByVersionId(Long versionId); + + // runner + DecisionTreeVo queryExecuteDecisionTree(Long id, Long versionId); + + List setOutput(Long versionId, Map map); + + List getNodeFieldIds(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeVersionService.java new file mode 100644 index 0000000..5635d82 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/DecisionTreeVersionService.java @@ -0,0 +1,31 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeVersion; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; + +import java.util.List; + +public interface DecisionTreeVersionService extends IService { + + List queryFieldEnByVersionId(Long versionId); + + List queryVersionListByDecisionTreeId(Long decisionTreeId); + + int addVersionList(List versionList); + + boolean addVersion(DecisionTreeVersionVo version); + + boolean copyVersion(DecisionTreeVersionVo version); + + boolean updateVersion(DecisionTreeVersionVo version); + + boolean updateStatus(StatusParam statusParam); + + // runner + DecisionTreeVersionVo queryById(Long id); + + List queryFieldEnByVersionIdRunner(Long versionId); +} + diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailConditionServiceImpl.java new file mode 100644 index 0000000..8d485ad --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailConditionServiceImpl.java @@ -0,0 +1,104 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontree.DecisionTreeDetailConditionMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetailCondition; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeDetailConditionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service("decisionTreeDetailConditionService") +public class DecisionTreeDetailConditionServiceImpl extends ServiceImpl implements DecisionTreeDetailConditionService { + + @Autowired + private DecisionTreeDetailConditionMapper conditionMapper; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public List queryByDecisionTreeDetailId(Long detailId) { +// if (detailId == null) { +// return null; +// } +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(DecisionTreeDetailCondition::getDetailId, detailId); +// return conditionMapper.selectList(wrapper); +// } + + @Override + public List queryByDecisionTreeDetailId(Long detailId) { + if (detailId == null) { + return null; + } + List list = null; + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TREE_DETAIL_CONDITION, detailId); + list = redisManager.getByForeignKey(key, DecisionTreeDetailCondition.class); + } else { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DecisionTreeDetailCondition::getDetailId, detailId); + list = conditionMapper.selectList(wrapper); + } + return list; + } + + @Override + public boolean addDecisionTreeDetailCondition(Long detailId, List list) { + if (detailId == null || list == null || list.isEmpty()) { + return false; + } + for (DecisionTreeDetailCondition condition : list) { + condition.setDetailId(detailId); + } + return this.saveBatch(list); + } + + @Override + public boolean removeByDecisionTreeDetailId(List detailIds) { + if (detailIds == null || detailIds.isEmpty()) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(DecisionTreeDetailCondition::getDetailId, detailIds); + int delete = conditionMapper.delete(wrapper); + return delete > 0 ? true : false; + } + + @Override + public List queryFieldEnByDetailIds(Collection detailIds) { + if (detailIds==null||detailIds.isEmpty()){ + return null; + } + List list = new ArrayList<>(); + Set fieldEns = new HashSet<>(); + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + for (Long detailId : detailIds) { + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TREE_DETAIL_CONDITION, detailId); + list.addAll(redisManager.getByForeignKey(key, DecisionTreeDetailCondition.class)); + } + } else { + LambdaQueryWrapper conditionWrapper = new LambdaQueryWrapper<>(); + conditionWrapper.in(DecisionTreeDetailCondition::getDetailId, detailIds); + list = this.list(conditionWrapper); + } + for (DecisionTreeDetailCondition condition : list) { + if (condition.getVariableType() == 2) { + fieldEns.add(condition.getFieldValue()); + } else if (condition.getVariableType() == 3) { + fieldEns.addAll(CustomValueUtils.getFieldEnSet(condition.getFieldValue())); + } + } + return new ArrayList<>(fieldEns); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailServiceImpl.java new file mode 100644 index 0000000..ebd8b92 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeDetailServiceImpl.java @@ -0,0 +1,213 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontree.DecisionTreeDetailMapper; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetail; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeDetailConditionService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeDetailService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service("decisionTreeDetailService") +public class DecisionTreeDetailServiceImpl extends ServiceImpl implements DecisionTreeDetailService { + + @Autowired + private DecisionTreeDetailMapper detailMapper; + @Autowired + private DecisionTreeDetailConditionService conditionService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public List queryByVersionId(Long versionId) { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(DecisionTreeDetail::getDecisionTreeVersionId, versionId); +// List list = detailMapper.selectList(wrapper); +// if (list == null || list.isEmpty()) { +// return null; +// } +// return this.assemble(list); +// } + + @Override + public List queryByVersionId(Long versionId) { + List list; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TREE_DETAIL, versionId); + list = redisManager.getByForeignKey(key, DecisionTreeDetail.class); + } else { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DecisionTreeDetail::getDecisionTreeVersionId, versionId); + list = detailMapper.selectList(wrapper); + } + if (list == null || list.isEmpty()) { + return null; + } + return this.assemble(list); + } + + @Override + @Transactional + public boolean addDecisionTreeDetailList(Long versionId, List list) { + if (versionId == null || list == null || list.isEmpty()) { + return false; + } + Long parentId = 0L; + + List detailList = this.disassemble(list, versionId, true); + + List rootList = detailList.stream().filter(detail -> { + return detail.getParentId() == parentId; + }).collect(Collectors.toList()); + for (DecisionTreeDetail root : rootList) { + boolean saveResult = this.save(detailList, root); + } + return true; + } + + @Override + @Transactional + public boolean updateByVersionId(Long versionId, List list) { + if (versionId == null || list == null || list.isEmpty()) { + return false; + } + boolean delete = this.deleteByVersionId(versionId); + if (delete && list != null && list.size() > 0) { + this.addDecisionTreeDetailList(versionId, list); + } + return false; + } + + @Transactional + public boolean deleteByVersionId(Long decisionTreeVersionId) { + if (decisionTreeVersionId == null) { + return false; + } + DecisionTreeDetail detail = new DecisionTreeDetail(); + detail.setDecisionTreeVersionId(decisionTreeVersionId); + QueryWrapper queryWrapper = new QueryWrapper<>(detail); + List details = this.list(queryWrapper); + List ids = new ArrayList<>(); + for (DecisionTreeDetail d : details) { + ids.add(d.getId()); + } + conditionService.removeByDecisionTreeDetailId(ids); + boolean remove = this.remove(queryWrapper); + if (!remove) { + List list = this.list(queryWrapper); + if (list != null && !list.isEmpty()) { + return false; + } + } + return true; + } + + + //装配方法 + public List assemble(List list) { + //转换为Vo + for (DecisionTreeDetail detail : list) { + detail.setConditionList(conditionService.queryByDecisionTreeDetailId(detail.getId())); + } + //获取根节点列表并且返回拼装好的规则树 + List rootList = list.stream().filter(detail -> { + return detail.getParentId() != null && detail.getParentId() == 0L; + }).collect(Collectors.toList()); + if (rootList != null && !rootList.isEmpty()) { + List result = new ArrayList<>(); + for (DecisionTreeDetail root : rootList) { + DecisionTreeDetail detailTree = coupling(list, root); + result.add(detailTree); + } + return result; + } + return null; + } + + + // 拆解方法 + public List disassemble(List list, Long decisionTreeVersionId, boolean needTempId) { + if (list == null || list.isEmpty()) { + return null; + } + List result = new ArrayList<>(); + if (needTempId) { + for (DecisionTreeDetail detail : list) { + detail.setParentId(0L); + detail.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + List voList = decoupling(detail, decisionTreeVersionId, needTempId); + result.addAll(voList); + } + } + return result; + } + + //存储 + @Transactional + public boolean save(List list, DecisionTreeDetail root) { + String tempId = root.getInsertTempId(); + boolean insert = this.save(root); + Long id = root.getId(); + if (!insert || id == null) { + return false; + } + conditionService.addDecisionTreeDetailCondition(id, root.getConditionList()); + for (int i = 0; i < list.size(); i++) { + DecisionTreeDetail info = list.get(i); + if (tempId.equals(info.getTempParentId())) { + info.setParentId(id); + save(list, info); + } + } + return true; + } + + //耦合方法:将规则节点列表耦合规则树() + private DecisionTreeDetail coupling(List list, DecisionTreeDetail root) { + List children = new ArrayList<>(); + for (DecisionTreeDetail detail : list) { + if (root.getId().equals(detail.getParentId())) { + DecisionTreeDetail coup = coupling(list, detail); + children.add(coup); + } + } + root.setChildren(children); + return root; + } + + //解耦方法:将规则树解耦为节点列表 + private List decoupling(DecisionTreeDetail detail, Long decisionTreeVersionId, boolean needTempId) { + List list = new ArrayList<>(); + List children = detail.getChildren(); + if (children != null && children.size() > 0) { + for (int i = 0; i < children.size(); i++) { + DecisionTreeDetail child = children.get(i); + if (needTempId) { + child.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + child.setTempParentId(detail.getInsertTempId()); + } + List childList = decoupling(child, decisionTreeVersionId, needTempId); + list.addAll(childList); + } + } + detail.setDecisionTreeVersionId(decisionTreeVersionId); + list.add(detail); + return list; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeServiceImpl.java new file mode 100644 index 0000000..c323e75 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeServiceImpl.java @@ -0,0 +1,276 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontree.DecisionTreeMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTree; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +@Service("decisionTreeService") +public class DecisionTreeServiceImpl extends ServiceImpl implements DecisionTreeService { + + @Autowired + private DecisionTreeMapper decisionTreeMapper; + @Autowired + private DecisionTreeVersionService versionService; + @Resource + private SysUserMapper sysUserMapper; + @Autowired + private StrategyOutputService outputService; + @Autowired + private FieldService fieldService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public DecisionTreeVo queryById(Long id) { + DecisionTree decisionTree = decisionTreeMapper.selectById(id); + if (decisionTree == null) { + return null; + } + DecisionTreeVo decisionTreeVo = new DecisionTreeVo(); + BeanUtils.copyProperties(decisionTree, decisionTreeVo); + decisionTreeVo.setVersionList(versionService.queryVersionListByDecisionTreeId(id)); + return decisionTreeVo; + } + + @Override + public PageInfo queryByEntity(QueryListParam listParam) { + DecisionTreeVo query = listParam.getEntity(); + Integer pageNum = listParam.getPageNum(); + Integer pageSize = listParam.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = createWrapper(query); + List decisionTreeList = decisionTreeMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(decisionTreeList); + + //TODO 循环查用户表,待优化 + for (DecisionTree tree : decisionTreeList) { + if (tree != null && tree.getCreateUserId() != null) { + tree.setCreatorName(sysUserMapper.findNickNameById(tree.getCreateUserId())); + tree.setVersionList(versionService.queryVersionListByDecisionTreeId(tree.getId())); + } + } + return pageInfo; + } + + @Override + @Transactional + public DecisionTreeVo insertDecisionTree(DecisionTreeVo decisionTreeVo) { + //初始化基本参数 + DecisionTreeVo vo = initParam(decisionTreeVo); + //拷贝VO到Info对象 + DecisionTree decisionTree = new DecisionTree(); + BeanUtils.copyProperties(vo, decisionTree); + //插入并获取insert后实体对象返回id + boolean save = this.save(decisionTree); + if (!save) { + throw new ApiException(ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getCode(), ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getMessage()); + } + Long decisionTreeId = decisionTree.getId(); + List versionList = decisionTreeVo.getVersionList(); + if (versionList != null && versionList.size() > 0) { + for (DecisionTreeVersionVo versionVo : versionList) { + versionVo.setDecisionTreeId(decisionTreeId); + } + versionService.addVersionList(versionList); + } + return this.queryById(decisionTreeId); + } + + @Override + @Transactional + public DecisionTreeVo updateDecisionTree(DecisionTreeVo vo) { + if (vo.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setUpdateUserId(sysUser.getUserId()); + DecisionTree decisionTree = new DecisionTree(); + BeanUtils.copyProperties(vo, decisionTree); + //修改主表 + boolean updateResult = this.updateById(decisionTree); + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Long decisionTreeId = decisionTree.getId(); + List versionList = vo.getVersionList(); + if (versionList != null && versionList.size() > 0) { + versionService.updateVersion(versionList.get(0)); + } + return this.queryById(decisionTreeId); + } + + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DecisionTree::getId, ids); + DecisionTree decisionTree = new DecisionTree(); + decisionTree.setStatus(status); + int updateNum = decisionTreeMapper.update(decisionTree, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + @Transactional + public boolean updateFolder(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(DecisionTree::getId, ids); + DecisionTree decisionTree = new DecisionTree(); + decisionTree.setFolderId(folderId); + int updateNum = decisionTreeMapper.update(decisionTree, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + return versionService.queryFieldEnByVersionId(versionId); + } + + private LambdaQueryWrapper createWrapper(DecisionTree query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query!=null){ + if (query.getName() != null) { + wrapper.like(DecisionTree::getName, query.getName()); + } + if (query.getCode() != null) { + wrapper.like(DecisionTree::getCode, query.getCode()); + } + if (query.getFolderId()!=null){ + wrapper.eq(DecisionTree::getFolderId,query.getFolderId()); + } + } + wrapper.ne(DecisionTree::getStatus,-1); + wrapper.eq(DecisionTree::getOrganId,SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc(DecisionTree::getUpdateTime, DecisionTree::getCreateTime, DecisionTree::getId); + return wrapper; + } + + //新插入数据的准备工作 + private DecisionTreeVo initParam(DecisionTreeVo vo) { + this.checkUniqueness(vo); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setCreateUserId(sysUser.getUserId()); + vo.setOrganId(sysUser.getOrganId()); + vo.setUpdateUserId(sysUser.getUserId()); + //加入状态信息 + vo.setStatus(StatusConst.STATUS_ENABLED); + return vo; + } + + //唯一性检查 + private boolean checkUniqueness(DecisionTreeVo vo) { + DecisionTree decisionTree = new DecisionTree(); + decisionTree.setName(vo.getName()); + DecisionTree info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getMessage()); + } + decisionTree.setName(null); + decisionTree.setCode(vo.getCode()); + info = this.getOne(new QueryWrapper<>(decisionTree), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getMessage()); + } + return true; + } + + @Override + public DecisionTreeVo queryExecuteDecisionTree(Long id, Long versionId) { + if (versionId==null){ + return null; + } + DecisionTreeVersionVo versionVo = versionService.queryById(versionId); + if (versionVo==null){ + return null; + } + if (id==null){ + id= versionVo.getDecisionTreeId(); + }else if (id!=versionVo.getDecisionTreeId()){ + return null; + } + DecisionTree decisionTree; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_DECISION_TREE, id); + decisionTree = redisManager.getByPrimaryKey(key, DecisionTree.class); + } else { + decisionTree = decisionTreeMapper.selectById(id); + } + if (decisionTree == null) { + return null; + } + DecisionTreeVo decisionTreeVo = new DecisionTreeVo(); + BeanUtils.copyProperties(decisionTree, decisionTreeVo); + decisionTreeVo.setExecuteVersion(versionVo); + return decisionTreeVo; + } + + @Override + public List setOutput(Long versionId, Map map) { + return outputService.setOutput(new StrategyOutput(versionId, StrategyType.DECISION_TREE),map); + } + + @Override + public List getNodeFieldIds(Long versionId) { + List list = versionService.queryFieldEnByVersionIdRunner(versionId); + List fieldList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + fieldList = fieldService.selectFieldListByEns(list); + }else { + fieldList = fieldService.selectFieldListByEns(list); + } + Iterator iterator = fieldList.iterator(); + List ids = new ArrayList<>(); + while (iterator.hasNext()){ + ids.add(iterator.next().getId()); + } + return ids; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeVersionServiceImpl.java new file mode 100644 index 0000000..e95c08c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/decisiontree/impl/DecisionTreeVersionServiceImpl.java @@ -0,0 +1,285 @@ +package com.fibo.ddp.common.service.strategyx.decisiontree.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.decisiontree.DecisionTreeVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetail; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetailCondition; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeVersion; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeDetailConditionService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeDetailService; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service("decisionTreeVersionService") +public class DecisionTreeVersionServiceImpl extends ServiceImpl implements DecisionTreeVersionService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private DecisionTreeVersionMapper versionMapper; + @Autowired + private DecisionTreeDetailService detailService; + @Autowired + private DecisionTreeDetailConditionService conditionService; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private StrategyOutputService outputService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public DecisionTreeVersionVo queryById(Long id) { +// DecisionTreeVersion version = this.getById(id); +// if (version == null) { +// return null; +// } +// DecisionTreeVersionVo decisionTreeVersionVo = new DecisionTreeVersionVo(); +// BeanUtils.copyProperties(version, decisionTreeVersionVo); +// //查询详情 +// decisionTreeVersionVo.setDetailList(detailService.queryByVersionId(id)); +// //查询策略输出 +// List strategyOutputs = outputService.queryByTactics(new StrategyOutput(id, StrategyType.DECISION_TREE)); +// decisionTreeVersionVo.setStrategyOutputList(strategyOutputs); +// return decisionTreeVersionVo; +// } + + @Override + public DecisionTreeVersionVo queryById(Long id) { + DecisionTreeVersion version ; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_DECISION_TREE_VERSION, id); + version = redisManager.getByPrimaryKey(key, DecisionTreeVersion.class); + } else { + version = this.getById(id); + } + if (version == null) { + return null; + } + DecisionTreeVersionVo decisionTreeVersionVo = new DecisionTreeVersionVo(); + BeanUtils.copyProperties(version, decisionTreeVersionVo); + //查询详情 + decisionTreeVersionVo.setDetailList(detailService.queryByVersionId(id)); + //查询策略输出 + List strategyOutputs = outputService.queryByTactics(new StrategyOutput(id, StrategyType.DECISION_TREE)); + decisionTreeVersionVo.setStrategyOutputList(strategyOutputs); + return decisionTreeVersionVo; + } + + @Override + public List queryVersionListByDecisionTreeId(Long decisionTreeId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DecisionTreeVersion::getDecisionTreeId, decisionTreeId); + queryWrapper.eq(DecisionTreeVersion::getStatus, 1); + queryWrapper.orderByDesc(DecisionTreeVersion::getId); + List ruleVersionList = versionMapper.selectList(queryWrapper); + List DecisionTreeVersionVoList = new ArrayList<>(); + for (DecisionTreeVersion ruleVersion : ruleVersionList) { + DecisionTreeVersionVo versionVo = new DecisionTreeVersionVo(); + BeanUtils.copyProperties(ruleVersion, versionVo); + DecisionTreeVersionVoList.add(versionVo); + } + return DecisionTreeVersionVoList; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + Set fieldEns = new HashSet<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DecisionTreeDetail::getDecisionTreeVersionId, versionId); + List list = detailService.list(queryWrapper); + Set detailIds = new HashSet<>(); + for (DecisionTreeDetail detail : list) { + if (detail.getFieldEn().contains(".") && !detail.getFieldEn().startsWith("%")) { + fieldEns.add(detail.getFieldEn().split("\\.")[0]); + } else { + fieldEns.add(detail.getFieldEn()); + } +// fieldEns.add(detail.getFieldEn()); +// detailIds.add(detail.getUserId()); + } + LambdaQueryWrapper conditionWrapper = new LambdaQueryWrapper<>(); + if (detailIds.size() > 0) { + conditionWrapper.in(DecisionTreeDetailCondition::getDetailId, detailIds); + List conditionList = conditionService.list(conditionWrapper); + for (DecisionTreeDetailCondition condition : conditionList) { + if (condition.getVariableType() == null || condition.getVariableType() == 1) { + continue; + } + if (condition.getVariableType() == 2) { +// fieldEns.add(condition.getFieldValue()); + String fieldValue = condition.getFieldValue(); + if (fieldValue.contains(".") && !fieldValue.startsWith("%")) { + fieldEns.add(fieldValue.split("\\.")[0]); + } else { + fieldEns.add(fieldValue); + } + } else if (condition.getVariableType() == 3) { + fieldEns.addAll(CustomValueUtils.getFieldEnSet(condition.getFieldValue())); + } + } + } + return new ArrayList<>(fieldEns); + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (DecisionTreeVersionVo versionVo : versionList) { + boolean b = addVersion(versionVo); + if (b) { + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(DecisionTreeVersionVo version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode() == null) { + version.setVersionCode("V:0"); + } + if (version.getDescription() == null) { + version.setDescription("初始版本"); + } + int insert = versionMapper.insert(version); + if (insert > 0) { + boolean result = this.addVersionDetail(version); + if (result) { + saveSnapshot(version.getId()); + } + return true; + } else { + logger.error("新增决策树版本失败{}", version); + } + return false; + } + + @Transactional + public boolean addVersionDetail(DecisionTreeVersionVo version) { + //插入子表(detail表)数据 + boolean b = detailService.addDecisionTreeDetailList(version.getId(), version.getDetailList()); + //添加输出字段 + List strategyOutputList = version.getStrategyOutputList(); + if (strategyOutputList != null && strategyOutputList.size() > 0) { + outputService.insertTacticsOutput(version.getId(), strategyOutputList); + } + return true; + } + + @Override + @Transactional + public boolean copyVersion(DecisionTreeVersionVo version) { + DecisionTreeVersionVo versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(DecisionTreeVersionVo version) { + Long versionId = version.getId(); + if (versionId == null) { + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + versionMapper.updateById(version); + //修改条件表 + detailService.updateByVersionId(versionId, version.getDetailList()); + //修改策略输出 + outputService.updateTacticsOutput(versionId, version.getStrategyOutputList(), StrategyType.DECISION_TREE); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(DecisionTreeVersion::getId, statusParam.getIds()); + updateWrapper.eq(DecisionTreeVersion::getDecisionTreeId, statusParam.getStrategyId()); + DecisionTreeVersion ruleVersion = new DecisionTreeVersion(); + ruleVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(ruleVersion, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId) { + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + DecisionTreeVersionVo versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(DecisionTreeVersion::getId, versionId).set(DecisionTreeVersion::getSnapshot, JSON.toJSONString(versionVo)); + versionMapper.update(null, wrapper); + } + }); + return true; + } + + @Override + public List queryFieldEnByVersionIdRunner(Long versionId) { + Set fieldEns = new HashSet<>(); + + List list = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_DECISION_TREE_DETAIL, versionId); + list = redisManager.getByForeignKey(key, DecisionTreeDetail.class); + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DecisionTreeDetail::getDecisionTreeVersionId, versionId); + list = detailService.list(queryWrapper); + } + if(list != null&&!list.isEmpty()){ + Set detailIds = new HashSet<>(); + for (DecisionTreeDetail detail : list) { + fieldEns.add(detail.getFieldEn()); + detailIds.add(detail.getId()); + } + fieldEns.addAll(conditionService.queryFieldEnByDetailIds(detailIds)); + } + return new ArrayList<>(fieldEns); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleConditionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleConditionService.java new file mode 100644 index 0000000..f739085 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleConditionService.java @@ -0,0 +1,34 @@ +package com.fibo.ddp.common.service.strategyx.guiderule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; + +import java.util.List; + +/** + * (RuleConditionInfo)表服务接口 + */ +public interface RuleConditionService extends IService { + + /** + * 新增数据 + * @param ruleConditionVo 实例对象 + * @return 实例对象 + */ + RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId); + + RuleConditionVo updateRuleCondition(Long ruleId, RuleConditionVo ruleConditionVo); + + boolean deleteRuleCondition(Long ruleId, Long versionId); + + + RuleConditionVo assemble(List list); + + List disassemble(RuleConditionVo vo, Long ruleId, boolean needTempId); + + // runner + RuleConditionVo queryByVersionId(Long versionId); + + List queryFieldEnByVersionIds(List versionIds); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleLoopGroupActionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleLoopGroupActionService.java new file mode 100644 index 0000000..69f08f9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleLoopGroupActionService.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.service.strategyx.guiderule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; + +import java.util.List; + +/** + * (RuleLoopGroupAction)表服务接口 + */ +public interface RuleLoopGroupActionService extends IService { + + boolean addLoopGroupList(Long forId, Long conditionId, List loopGroupActions); + boolean deleteLoopGroupByForId(Long forId); + + // runner + List getRuleLoopList(Long forId, Long conditionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleService.java new file mode 100644 index 0000000..8e78269 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleService.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.common.service.strategyx.guiderule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.request.RuleListParamV2; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +public interface RuleService extends IService { + + /** + * 通过ID查询单条数据 + * @param id 主键 + * @return 实例对象 + */ + RuleVo queryById(Long id, Integer difficulty); + + /** + * 根据实体类条件查询 + * @param ruleListParam + * @return + */ + PageInfo queryByEntity(RuleListParamV2 ruleListParam); + + /** + * 新增数据 + * @param rule 实例对象 + * @return 实例对象 + */ + RuleVo insertRuleInfo(RuleVo rule); + + /** + * 修改数据 + * @param rule 实例对象 + * @return 实例对象 + */ + RuleVo updateRuleInfo(RuleVo rule); + + boolean updateStatus(List ids, Integer status); + + boolean updateParent(List ids, Long parentId); + + // runner + List setComplexRuleOutput(Long versionId, Map temp, Map input, String outType); + + List setBaseRuleOutput(Long ruleId, Map input); + + List getRuleList(List ruleIds); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleVersionService.java new file mode 100644 index 0000000..27e42d9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/RuleVersionService.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.common.service.strategyx.guiderule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; + +import java.util.List; + +public interface RuleVersionService extends IService { + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + boolean addVersion(RuleVersionVo version); + + boolean copyVersion(RuleVersionVo version); + + boolean updateVersion(RuleVersionVo version); + + boolean updateStatus(StatusParam statusParam); + + // runner + RuleVersionVo queryById(Long id); + + List queryVersionListByRuleId(Long ruleId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleConditionServiceImpl.java new file mode 100644 index 0000000..becf7e4 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleConditionServiceImpl.java @@ -0,0 +1,404 @@ +package com.fibo.ddp.common.service.strategyx.guiderule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.guiderule.RuleConditionInfoMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleConditionService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleLoopGroupActionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConditionConst; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * (RuleConditionInfo)表服务实现类 + */ +@Service("ruleConditionService2") +public class RuleConditionServiceImpl extends ServiceImpl implements RuleConditionService { + @Resource + private RuleConditionInfoMapper ruleConditionInfoMapper; + + @Resource + private RuleLoopGroupActionService loopGroupActionService; + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + +// /** +// * 查询整个规则的节点并且装配成树 +// * +// * @param versionId 规则版本id +// * @return +// */ +// @Override +// public RuleConditionVo queryByVersionId(Long versionId) { +// if (versionId == null) { +// return null; +// } +// //构造查询条件,查询条件列表 +// RuleConditionVo result = null; +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(RuleConditionInfo::getVersionId,versionId); +// List ruleConditionInfoList = ruleConditionInfoMapper.selectList(queryWrapper); +// //组装为需要的树形结构 +// if (ruleConditionInfoList != null) { +// result = this.assemble(ruleConditionInfoList); +// } +// return result; +// } + + @Override + public RuleConditionVo queryByVersionId(Long versionId) { + if (versionId == null) { + return null; + } + //构造查询条件,查询条件列表 + RuleConditionVo result = null; + + List ruleConditionInfoList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_RULE_CONDITION, versionId); + ruleConditionInfoList = redisManager.getByForeignKey(key, RuleConditionInfo.class); + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(RuleConditionInfo::getVersionId, versionId); + ruleConditionInfoList = ruleConditionInfoMapper.selectList(queryWrapper); + } + + //组装为需要的树形结构 + if (ruleConditionInfoList != null) { + result = this.assemble(ruleConditionInfoList); + } + return result; + } + + /** + * 新增数据 + * + * @param ruleConditionVo 实例对象 + * @return 实例对象 + */ + @Override + @Transactional + public RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId) { + if (ruleConditionVo == null || ruleId == null) { + return null; + } + Long versionId = ruleConditionVo.getVersionId(); + if (versionId==null){ + versionId=0L; + } + Long parentId = RuleConditionConst.DEFAULT_CONDITION_PARENT_ID; + //将插入的条件树拆解 + List list = this.disassemble(ruleConditionVo, ruleId, true); + for (RuleConditionInfo info : list) { + info.setVersionId(versionId); + } + //找出唯一根节点 + RuleConditionInfo root = null; + for (RuleConditionInfo info : list) { + if (info.getParentId() == parentId) { + root = info; + break; + } + } + //递归插入所有数据 + boolean saveResult = this.save(list, root); + if (!saveResult) { + return null; + } + return null; + } + + /** + * 修改规则条件 + * + * @param ruleConditionVo + * @return + */ + @Override + @Transactional + public RuleConditionVo updateRuleCondition(Long ruleId, RuleConditionVo ruleConditionVo) { + if (ruleId == null) { + return null; + } + //删除一个规则下的所有条件 + boolean delete = this.deleteRuleCondition(ruleId,ruleConditionVo.getVersionId()); + RuleConditionVo ruleCondition = null; + if (!delete) { + ruleCondition = this.queryByVersionId(ruleConditionVo.getVersionId()); + } + //插入条件树 + if ((delete || ruleCondition == null) && ruleConditionVo != null) { + RuleConditionVo insertResult = this.insertRuleCondition(ruleConditionVo, ruleId); + return insertResult; + } + return null; + } + + /** + * 删除根据规则id规则条件 + * + * @param ruleId + * @return + */ + @Override + @Transactional + public boolean deleteRuleCondition(Long ruleId,Long versionId) { + if (ruleId == null) { + return false; + } + //删除循环动作子表中的内容 + RuleConditionInfo info = new RuleConditionInfo(); + if (ruleId!=null){ + info.setRuleId(ruleId); + } + info.setVersionId(versionId); + info.setLogical(RuleConditionConst.LOOP_RULE_LOGICAL); + List ruleConditionInfoList = ruleConditionInfoMapper.selectList(new QueryWrapper<>(info)); + for (RuleConditionInfo ruleConditionInfo : ruleConditionInfoList) { + loopGroupActionService.deleteLoopGroupByForId(ruleConditionInfo.getId()); + } + //删除条件表内容 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(RuleConditionInfo::getVersionId,versionId); + if (ruleId!=null){ + queryWrapper.eq(RuleConditionInfo::getRuleId,ruleId); + } + int delete = ruleConditionInfoMapper.delete(queryWrapper); + return delete > 0 ? true : false; + } + + + //装配方法,将规则条件List装配成一个规则树并返回 + @Override + public RuleConditionVo assemble(List list) { + RuleConditionVo root = null; + //转换为Vo + List rcVoList = transferToVoList(list); + //获取根节点,根节点只有一个的时候进行操作,并且返回拼装好的规则树,否则返回null + List collect = rcVoList.stream().filter(rc -> { + return rc.getParentId() == RuleConditionConst.DEFAULT_CONDITION_PARENT_ID; + }).collect(Collectors.toList()); + if (collect.size() == 1) { + root = collect.get(0); + RuleConditionVo ruleTree = coupling(rcVoList, root); + return ruleTree; + } + return null; + } + + + // 拆解方法,将规则条件Vo转换未规则条件list + @Override + public List disassemble(RuleConditionVo vo, Long ruleId, boolean needTempId) { + if (vo == null) { + return null; + } + if (needTempId) { + vo.setParentId(RuleConditionConst.DEFAULT_CONDITION_PARENT_ID); + vo.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + } + List voList = decoupling(vo, ruleId, needTempId); + List ruleConditionInfoList = transferToInfoList(voList); + return ruleConditionInfoList; + } + + //存储 + @Transactional + public boolean save(List list, RuleConditionInfo root) { + String tempId = root.getInsertTempId(); + //保存根节点 + int insert = ruleConditionInfoMapper.insert(root); + if (insert <= 0) { + return false; + } + Long id = root.getId(); + for (int i = 0; i < list.size(); i++) { + RuleConditionInfo info = list.get(i); + //保存根节点的子节点 + if (tempId.equals(info.getTempParentId())) { + info.setParentId(id); + //递归保存每个节点和子节点 + save(list, info); + //对有动作的循环条件保存循环动作表内容 + if (root.getLogical()!=null&&RuleConditionConst.LOOP_RULE_LOGICAL.equals(root.getLogical())&&info.getLoopGroupActions()!=null){ + loopGroupActionService.addLoopGroupList(id,info.getId(),info.getLoopGroupActions()); + } + } + } + return true; + } + + //耦合方法:将规则节点列表耦合规则树(),循环规则的子节点需要去查循环表获取 + private RuleConditionVo coupling(List list, RuleConditionVo root) { + List children = new ArrayList<>(); + for (RuleConditionVo rc : list) { + //处理root的子节点 + if (root.getId().equals(rc.getParentId())) { + RuleConditionVo rcVo = coupling(list, rc); + String logical = root.getLogical(); + + if (logical!=null&&!"".equals(logical)){ + switch (logical){ + //当root为for节点,则此子节点需要拼上循环动作 + case RuleConditionConst.LOOP_RULE_LOGICAL: + List loopList = loopGroupActionService.getRuleLoopList(root.getId(),rc.getId()); + rcVo.setLoopGroupActions(loopList); + if (rc.getConditionType()==RuleConditionConst.LOOP_RULE_RESULT_CONDITION){ + root.setLoopResultCondition(rcVo); + continue; + } + break; + //当root为条件组节点,则此子节点需要拼上条件组结果 + case RuleConditionConst.CONDITION_GROUP_LOGICAL: + if (rc.getConditionType()==RuleConditionConst.CONDITION_GROUP_RESULT_CONDITION){ + root.setCondGroupResultCondition(rcVo); + continue; + } + break; + + + + } + + } +// if (root.getLogical() != null && RuleConditionConst.LOOP_RULE_LOGICAL.equals(root.getLogical())) { +// List loopList = loopGroupActionService.getRuleLoopList(root.getUserId(),rc.getUserId()); +// rcVo.setLoopGroupActions(loopList); +// if (rc.getConditionType()==RuleConditionConst.LOOP_RULE_RESULT_CONDITION){ +// root.setLoopResultCondition(rcVo); +// continue; +// } +// } + // + children.add(rcVo); + } + } + root.setChildren(children); + return root; + } + + //解耦方法:将规则树解耦为节点列表 + private List decoupling(RuleConditionVo vo, Long ruleId, boolean needTempId) { + List list = new ArrayList<>(); + List children = vo.getChildren(); + + //处理条件树根节点的子条件 + if (children != null && children.size() > 0) { + for (int i = 0; i < children.size(); i++) { + RuleConditionVo child = children.get(i); + if (needTempId) { + child.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + child.setTempParentId(vo.getInsertTempId()); + } + List childList = decoupling(child, ruleId, needTempId); + list.addAll(childList); + } + } + vo.setRuleId(ruleId); + list.add(vo); + //处理for条件的结果条件 + Integer conditionType = vo.getConditionType(); + if (conditionType!=null){ + switch (conditionType){ + case RuleConditionConst.LOOP_RULE_ROOT: + RuleConditionVo loopResult = vo.getLoopResultCondition(); + loopResult.setRuleId(ruleId); + loopResult.setTempParentId(vo.getInsertTempId()); + loopResult.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + List loopResultList = decoupling(loopResult, ruleId, needTempId); + list.addAll(loopResultList); + break; + case RuleConditionConst.CONDITION_GROUP_ROOT: + RuleConditionVo condGroupResult = vo.getCondGroupResultCondition(); + condGroupResult.setRuleId(ruleId); + condGroupResult.setTempParentId(vo.getInsertTempId()); + condGroupResult.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); + List condGroupResultList = decoupling(condGroupResult, ruleId, needTempId); + list.addAll(condGroupResultList); + break; + } + } +// if (vo.getConditionType()==RuleConditionConst.LOOP_RULE_ROOT){ +// RuleConditionVo loopResult = vo.getLoopResultCondition(); +// loopResult.setRuleId(ruleId); +// loopResult.setTempParentId(vo.getInsertTempId()); +// loopResult.setInsertTempId(UUID.randomUUID().toString().replace("-", "")); +// List loopResultList = decoupling(loopResult, ruleId, needTempId); +// list.addAll(loopResultList); +// } + return list; + } + + //List转换为List + private List transferToVoList(List list) { + List rcVoList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + RuleConditionVo rcVo = new RuleConditionVo(); + BeanUtils.copyProperties(list.get(i), rcVo); + rcVoList.add(rcVo); + } + return rcVoList; + } + + //List转换为List + private List transferToInfoList(List list) { + List rcList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + RuleConditionInfo rc = new RuleConditionInfo(); + BeanUtils.copyProperties(list.get(i), rc); + rcList.add(rc); + } + return rcList; + } + + @Override + public List queryFieldEnByVersionIds(List versionIds) { + List ruleConditions = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + List keys = RedisUtils.getForeignKey(TableEnum.T_RULE_CONDITION, versionIds); + ruleConditions = redisManager.hgetAllBatchByForeignKeys(keys, RuleConditionInfo.class); + + ruleConditions = ruleConditions.stream() + .filter(item -> StringUtils.isNotBlank(item.getFieldEn()) && !"1".equals(item.getFieldType())) + .collect(Collectors.toList()); + + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(RuleConditionInfo::getVersionId,versionIds); + queryWrapper.isNotNull(RuleConditionInfo::getFieldEn); + queryWrapper.ne(RuleConditionInfo::getFieldType,1); + queryWrapper.select(RuleConditionInfo::getFieldEn); + ruleConditions = ruleConditionInfoMapper.selectList(queryWrapper); + } + + List result = new ArrayList<>(); + if (ruleConditions != null){ + for (RuleConditionInfo condition : ruleConditions) { + result.add(condition.getFieldEn()); + } + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleLoopGroupActionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleLoopGroupActionServiceImpl.java new file mode 100644 index 0000000..86b2e6c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleLoopGroupActionServiceImpl.java @@ -0,0 +1,85 @@ +package com.fibo.ddp.common.service.strategyx.guiderule.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.guiderule.RuleLoopGroupActionMapper; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleLoopGroupActionService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * (RuleLoopGroupAction)表服务实现类 + */ +@Service("ruleLoopGroupActionService") +public class RuleLoopGroupActionServiceImpl extends ServiceImpl implements RuleLoopGroupActionService { + @Resource + private RuleLoopGroupActionMapper ruleLoopGroupActionMapper; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public List getRuleLoopList(Long forId, Long conditionId) { +// RuleLoopGroupAction ruleLoopGroupAction = new RuleLoopGroupAction(); +// ruleLoopGroupAction.setConditionForId(forId); +// ruleLoopGroupAction.setConditionGroupId(conditionId); +// List loopList = ruleLoopGroupActionMapper.selectList(new QueryWrapper<>(ruleLoopGroupAction)); +// if (loopList==null){ +// loopList = new ArrayList<>(); +// } +// return loopList; +// } + + @Override + public List getRuleLoopList(Long forId, Long conditionId) { + List loopList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_RULE_LOOP_GROUP_ACTION, forId); + loopList = redisManager.getByForeignKey(key, RuleLoopGroupAction.class); + loopList = loopList.stream().filter(item -> item.getConditionGroupId().equals(conditionId)).collect(Collectors.toList()); + } else { + RuleLoopGroupAction ruleLoopGroupAction = new RuleLoopGroupAction(); + ruleLoopGroupAction.setConditionForId(forId); + ruleLoopGroupAction.setConditionGroupId(conditionId); + loopList = ruleLoopGroupActionMapper.selectList(new QueryWrapper<>(ruleLoopGroupAction)); + } + + if (loopList==null){ + loopList = new ArrayList<>(); + } + return loopList; + } + + @Override + public boolean addLoopGroupList(Long forId,Long conditionId, List loopGroupActions) { + for (RuleLoopGroupAction loopGroupAction : loopGroupActions) { + loopGroupAction.setConditionForId(forId); + loopGroupAction.setConditionGroupId(conditionId); + } + boolean add = this.saveBatch(loopGroupActions); + return add; + } + + @Override + public boolean deleteLoopGroupByForId(Long forId) { + if (forId==null){ + return false; + } + RuleLoopGroupAction ruleLoopGroupAction = new RuleLoopGroupAction(); + ruleLoopGroupAction.setConditionForId(forId); + ruleLoopGroupActionMapper.delete(new QueryWrapper<>(ruleLoopGroupAction)); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleServiceImpl.java new file mode 100644 index 0000000..6d5640f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleServiceImpl.java @@ -0,0 +1,318 @@ +package com.fibo.ddp.common.service.strategyx.guiderule.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.guiderule.RuleInfoMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.request.RuleListParamV2; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVo; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 组织规则维护表(RuleInfo)表服务实现类 + */ +@Service("ruleService2") +public class RuleServiceImpl extends ServiceImpl implements RuleService { + @Resource + private RuleInfoMapper ruleInfoMapper; + + @Autowired + private RuleVersionService versionService; + + @Resource + private StrategyOutputService outputService; + + @Resource + private SysUserMapper sysUserMapper; + + @Resource + private RuleScriptVersionService ruleScriptVersionService; + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public RuleVo queryById(Long id, Integer difficulty) { + //查询规则 + RuleInfo ruleInfo = ruleInfoMapper.selectById(id); + if (ruleInfo == null) { + return null; + } + RuleVo ruleVo = new RuleVo(); + BeanUtils.copyProperties(ruleInfo, ruleVo); + List strategyOutputList = new ArrayList<>(); + if (difficulty == null || (difficulty != 1 && difficulty != 2 && difficulty != 3)) { + difficulty = ruleInfo.getDifficulty(); + } + switch (difficulty) { + case 2: + //查询版本 + List ruleVersionList = versionService.queryVersionListByRuleId(id); + ruleVo.setRuleVersionList(ruleVersionList); + break; + case 3: + //脚本规则集 + List ruleScriptVersionList = ruleScriptVersionService.queryVersionListByRuleId(id); + ruleVo.setRuleScriptVersionList(ruleScriptVersionList); + break; + } + return ruleVo; + } + + @Override + public PageInfo queryByEntity(RuleListParamV2 ruleListParam) { + + RuleInfo query = ruleListParam.getRuleInfo(); + Integer pageNum = ruleListParam.getPageNum(); + Integer pageSize = ruleListParam.getPageSize(); + if (query != null && query.getName() != null && !"".equals(query.getName())) { + query.setName("%" + query.getName() + "%"); + } + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + query.setOrganId(SessionManager.getLoginAccount().getOrganId()); + List ruleInfoList = ruleInfoMapper.queryRuleList(query); + PageInfo pageInfo = new PageInfo(ruleInfoList); + + //TODO 循环查用户表,待优化 + for (RuleInfo info : ruleInfoList) { + if (info != null && info.getAuthor() != null) { + info.setAuthorName(sysUserMapper.findNickNameById(info.getAuthor())); + } + } + return pageInfo; + } + + + @Override + @Transactional + public RuleVo insertRuleInfo(RuleVo vo) { + Integer difficulty = vo.getDifficulty(); + if (difficulty == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + //初始化基本参数 + RuleVo ruleVo = initParam(vo); + //拷贝VO到Info对象 + RuleInfo ruleInfo = new RuleInfo(); + BeanUtils.copyProperties(ruleVo, ruleInfo); + //插入并获取insert后实体对象返回id + boolean save = this.save(ruleInfo); + if (!save) { + throw new ApiException(ErrorCodeEnum.RULE_SAVE_ERROR.getCode(), ErrorCodeEnum.RULE_SAVE_ERROR.getMessage()); + } + Long ruleId = ruleInfo.getId(); + + switch (difficulty) { + case 2: + //插入版本表数据 + List ruleVersionList = ruleVo.getRuleVersionList(); + if (ruleVersionList != null && ruleVersionList.size() > 0) { + for (RuleVersionVo ruleVersionVo : ruleVersionList) { + ruleVersionVo.setRuleId(ruleId); + } + versionService.addVersionList(ruleVersionList); + } + ruleVo.setRuleVersionList(versionService.queryVersionListByRuleId(vo.getId())); + break; + case 3: + //脚本规则集插入版本表 + List ruleScriptVersionList = ruleVo.getRuleScriptVersionList(); + if (ruleScriptVersionList!=null&&ruleScriptVersionList.size()>0){ + for (RuleScriptVersion ruleScriptVersion : ruleScriptVersionList) { + ruleScriptVersion.setRuleId(ruleId); + } + ruleScriptVersionService.addVersionList(ruleScriptVersionList); + } + ruleVo.setRuleScriptVersionList(ruleScriptVersionService.queryVersionListByRuleId(ruleId)); +// ruleVo.setRuleVersionList(ruleScriptVersionService.queryVersionListByRuleId(ruleId)); + break; + } + return ruleVo; + } + + /** + * 修改数据 + * + * @param vo 实例对象 + * @return 实例对象 + */ + @Override + @Transactional + public RuleVo updateRuleInfo(RuleVo vo) { + if (vo.getId() == null || vo.getDifficulty() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Integer difficulty = vo.getDifficulty(); + RuleInfo ruleInfo = new RuleInfo(); + BeanUtils.copyProperties(vo, ruleInfo); + boolean updateResult = this.updateById(ruleInfo); + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + Long ruleId = vo.getId(); + switch (difficulty) { + case 2: + List ruleVersionList = vo.getRuleVersionList(); + if (ruleVersionList != null && ruleVersionList.size() > 0) { + RuleVersionVo ruleVersionVo = ruleVersionList.get(0); + ruleVersionVo.setRuleId(vo.getId()); + versionService.updateVersion(ruleVersionVo); + } + vo.setRuleVersionList(versionService.queryVersionListByRuleId(ruleId)); + break; + case 3: + //脚本规则集插入版本表 + List ruleScriptVersionList = vo.getRuleScriptVersionList(); + if (ruleScriptVersionList!=null&&ruleScriptVersionList.size()>0){ + RuleScriptVersion ruleScriptVersion = ruleScriptVersionList.get(0); + ruleScriptVersion.setRuleId(ruleId); + ruleScriptVersionService.updateVersion(ruleScriptVersion); + } + vo.setRuleScriptVersionList(ruleScriptVersionService.queryVersionListByRuleId(ruleId)); +// vo.setRuleVersionList(ruleScriptVersionService.queryVersionListByRuleId(ruleId)); + break; + } + return vo; + } + + /** + * 通过主键修改状态,支持批量 + * + * @param ids 主键id集合 + * @param status 状态代号 + * @return + */ + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(RuleInfo::getId, ids); + RuleInfo info = new RuleInfo(); + info.setStatus(status); + return this.update(info, wrapper); + } + + @Override + @Transactional + public boolean updateParent(List ids, Long parentId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(RuleInfo::getId, ids); + RuleInfo info = new RuleInfo(); + info.setParentId(parentId); + return this.update(info, wrapper); + } + + //唯一性检查 + private boolean checkUniqueness(RuleVo vo) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(RuleInfo::getName, vo.getName()); + queryWrapper.ne(RuleInfo::getStatus, -1); + queryWrapper.eq(RuleInfo::getOrganId, SessionManager.getLoginAccount().getOrganId()); + queryWrapper.and(wrapper -> wrapper.eq(RuleInfo::getName, vo.getName()).or().eq(RuleInfo::getCode, vo.getCode())); + RuleInfo info = this.getOne(queryWrapper); + if (info != null) { + if (info.getCode().equals(vo.getCode())) { + throw new ApiException(ErrorCodeEnum.RULE_CODE_REPEAT.getCode(), ErrorCodeEnum.RULE_CODE_REPEAT.getMessage()); + } else if (info.getName().equals(vo.getName())) { + throw new ApiException(ErrorCodeEnum.RULE_NAME_REPEAT.getCode(), ErrorCodeEnum.RULE_NAME_REPEAT.getMessage()); + } + } + return true; + } + + //新插入数据的准备工作 + private RuleVo initParam(RuleVo vo) { + this.checkUniqueness(vo); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setUserId(sysUser.getUserId()); + vo.setOrganId(sysUser.getOrganId()); + vo.setAuthor(sysUser.getUserId()); + //加入状态信息 + vo.setType(RuleConst.TYPE_ORGAN); + vo.setStatus(RuleConst.STATUS_ENABLED); + //加入规则类型 + if (vo == null || vo.getRuleAudit() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + switch (vo.getRuleAudit()) { + case RuleConst.RULE_AUDIT_TERMINATION: + vo.setRuleType(RuleConst.RULE_TYPE_TERMINATION); + break; + case RuleConst.RULE_AUDIT_SCORING: + vo.setRuleType(RuleConst.RULE_TYPE_SCORING); + break; + default: + vo.setRuleType(RuleConst.RULE_TYPE_TERMINATION); + } + + return vo; + } + + @Override + public List setComplexRuleOutput(Long versionId, Map temp, Map input, String outType) { + List jsonObjectList = outputService.setOutput(new StrategyOutput(versionId, StrategyType.COMPLEX_RULE,outType), temp); + for (JSONObject jsonObject : jsonObjectList) { + input.putAll(jsonObject); + } + return jsonObjectList; + } + + @Override + public List setBaseRuleOutput(Long ruleId, Map input) { + List jsonObjectList = outputService.setOutput(new StrategyOutput(ruleId, StrategyType.BASE_RULE), input); + return jsonObjectList; + } + + @Override + public List getRuleList(List ruleIds) { + if(!CollectionUtil.isNotNullOrEmpty(ruleIds)){ + return null; + } + List ruleInfoList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + List keys = RedisUtils.getPrimaryKey(TableEnum.T_RULE, ruleIds); + ruleInfoList = redisManager.hgetAllBatchByPrimaryKeys(keys, RuleInfo.class); + } else { + ruleInfoList = ruleInfoMapper.getRuleList(ruleIds); + } + return ruleInfoList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleVersionServiceImpl.java new file mode 100644 index 0000000..a3d4478 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/guiderule/impl/RuleVersionServiceImpl.java @@ -0,0 +1,278 @@ +package com.fibo.ddp.common.service.strategyx.guiderule.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.datax.datamanage.FieldMapper; +import com.fibo.ddp.common.dao.strategyx.guiderule.RuleVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleConditionService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +public class RuleVersionServiceImpl extends ServiceImpl implements RuleVersionService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private RuleVersionMapper versionMapper; + @Autowired + private RuleConditionService conditionService; + @Autowired + private StrategyOutputService outputService; + @Autowired + private FieldMapper fieldMapper; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public RuleVersionVo queryById(Long id) { +// RuleVersion ruleVersion = versionMapper.selectById(id); +// RuleVersionVo result = new RuleVersionVo(); +// if (ruleVersion==null){ +// return result; +// } +// BeanUtils.copyProperties(ruleVersion,result); +// //查询ruleCondition组装成树形结构 +// RuleConditionVo ruleConditionVo = conditionService.queryByVersionId(id); +// List strategyOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.SUCCESS_OUT)); +// List failOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.FAIL_OUT)); +// result.setRuleConditionVo(ruleConditionVo); +// result.setStrategyOutputList(strategyOutputList); +// result.setFailOutputList(failOutputList); +// return result; +// } + + @Override + public RuleVersionVo queryById(Long id) { + RuleVersion ruleVersion = null; + if (Constants.switchFlag.ON.equals(cacheSwitch)) { + String key = RedisUtils.getPrimaryKey(TableEnum.T_RULE_VERSION, id); + ruleVersion = redisManager.getByPrimaryKey(key, RuleVersion.class); + } else { + ruleVersion = versionMapper.selectById(id); + } + + RuleVersionVo result = new RuleVersionVo(); + if (ruleVersion == null) { + return result; + } + BeanUtils.copyProperties(ruleVersion, result); + //查询ruleCondition组装成树形结构 + RuleConditionVo ruleConditionVo = conditionService.queryByVersionId(id); + List strategyOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.SUCCESS_OUT)); + List failOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.FAIL_OUT)); + result.setRuleConditionVo(ruleConditionVo); + result.setStrategyOutputList(strategyOutputList); + result.setFailOutputList(failOutputList); + return result; + } + +// @Override +// public List queryVersionListByRuleId(Long RuleId) { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(RuleVersion::getRuleId,RuleId); +// queryWrapper.eq(RuleVersion::getStatus,1); +// queryWrapper.orderByDesc(RuleVersion::getId); +// List ruleVersionList = versionMapper.selectList(queryWrapper); +// List ruleVersionVoList = new ArrayList<>(); +// for (RuleVersion ruleVersion : ruleVersionList) { +// RuleVersionVo versionVo = new RuleVersionVo(); +// BeanUtils.copyProperties(ruleVersion,versionVo); +// ruleVersionVoList.add(versionVo); +// } +// return ruleVersionVoList; +// } + + @Override + public List queryVersionListByRuleId(Long ruleId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(RuleVersion::getRuleId,ruleId); + queryWrapper.eq(RuleVersion::getStatus,1); + queryWrapper.orderByDesc(RuleVersion::getUpdateTime); + List ruleVersionList = versionMapper.selectList(queryWrapper); + List ruleVersionVoList = new ArrayList<>(); + for (RuleVersion ruleVersion : ruleVersionList) { + RuleVersionVo versionVo = new RuleVersionVo(); + BeanUtils.copyProperties(ruleVersion,versionVo); + ruleVersionVoList.add(versionVo); + } + return ruleVersionVoList; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + Set fieldEns= new HashSet<>(); + Set fieldIds= new HashSet<>(); + RuleConditionVo ruleConditionVo = conditionService.queryByVersionId(versionId); + List ruleConditionInfoList = conditionService.disassemble(ruleConditionVo, versionId, false); + for (RuleConditionInfo info : ruleConditionInfoList) { + if (info.getFieldEn()!=null&&info.getFieldType()!=1&&!info.getFieldEn().startsWith("%")){ + if (info.getFieldEn().contains(".")){ + fieldEns.add(info.getFieldEn().split("\\.")[0]); + } + else { + fieldEns.add(info.getFieldEn()); + } + }else if(info.getFieldId()!=null){ + fieldIds.add(info.getFieldId()); + } + if (info.getVariableType()!=null){ + if (info.getVariableType()==2&&info.getFieldValue()!=null&&!info.getFieldValue().contains("%")){ + fieldEns.add(info.getFieldValue()); + }else if (info.getVariableType()==3){ + fieldEns.addAll(CustomValueUtils.getFieldEnSet(info.getFieldValue())); + } + } + } + for (Long fieldId : fieldIds) { + String fieldName= fieldMapper.findFieldNameById(fieldId); + fieldEns.add(fieldName); + } + return new ArrayList<>(fieldEns); + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (RuleVersionVo versionVo : versionList) { + boolean b = addVersion(versionVo); + if (b){ + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(RuleVersionVo version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode()==null){ + version.setVersionCode("V:0"); + } + if (version.getDescription()==null){ + version.setDescription("初始版本"); + } + int insert = versionMapper.insert(version); + if (insert>0){ + this.addVersionDetail(version); + this.saveSnapshot(version.getId()); + return true; + }else { + logger.error("新增规则版本失败{}",version); + } + return false; + } + @Transactional + public boolean addVersionDetail(RuleVersionVo version){ + RuleConditionVo ruleConditionVo = version.getRuleConditionVo(); + ruleConditionVo.setVersionId(version.getId()); + //添加条件信息 + conditionService.insertRuleCondition(ruleConditionVo,version.getRuleId()); + //添加输出字段 + List strategyOutputList = version.getStrategyOutputList(); + if (strategyOutputList !=null&& strategyOutputList.size()>0){ + outputService.insertTacticsOutput(version.getId(), strategyOutputList); + } + List failOutputList = version.getFailOutputList(); + if (failOutputList!=null&&failOutputList.size()>0){ + outputService.insertTacticsOutput(version.getId(),failOutputList ); + } + return true; + } + + @Override + @Transactional + public boolean copyVersion(RuleVersionVo version) { + RuleVersionVo versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(RuleVersionVo version) { + Long versionId = version.getId(); + if (versionId==null){ + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + versionMapper.updateById(version); + //修改条件表 + conditionService.updateRuleCondition(version.getRuleId(),version.getRuleConditionVo()); + //修改策略输出 + outputService.updateTacticsOutput(versionId,version.getStrategyOutputList(),version.getFailOutputList(), StrategyType.COMPLEX_RULE); + this.saveSnapshot(versionId); + return true; + } + + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(RuleVersion::getId,statusParam.getIds()); + updateWrapper.eq(RuleVersion::getRuleId,statusParam.getStrategyId()); + RuleVersion ruleVersion = new RuleVersion(); + ruleVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(ruleVersion, updateWrapper); + return update; + } + + + private boolean saveSnapshot(Long versionId){ + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + RuleVersionVo versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(RuleVersion::getId,versionId).set(RuleVersion::getSnapshot, JSON.toJSONString(versionVo)); + versionMapper.update(null,wrapper); + } + }); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/KnowledgeTreeService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/KnowledgeTreeService.java new file mode 100644 index 0000000..6d4b69c --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/KnowledgeTreeService.java @@ -0,0 +1,57 @@ +package com.fibo.ddp.common.service.strategyx.knowledge; + +import com.fibo.ddp.common.model.enginex.risk.request.KnowledgeTreeListParam; +import com.fibo.ddp.common.model.strategyx.knowledge.KnowledgeTree; + +import java.util.List; +import java.util.Map; + +/** + * ClassName:KnowledgeTreeService
+ * Description: 知识库目录接口.
+ * @see + */ +public interface KnowledgeTreeService { + + /** + * getTreeList:(根据父节点id和组织id,查询其下的所有子节点) + * + * @param paramMap 参数集合 + * @return 父节点下的所有子节点 + * */ + public List getTreeList(Map paramMap); + + /** + * findById:(根据id,查询节点记录) + * + * @param id 节点id + * @return + * */ + public KnowledgeTree findById(Long id); + + /** + * insertTree:(新增节点记录) + * + * @param k 节点信息 + * @return + * */ + public boolean insertTree(KnowledgeTree k); + + /** + * updateTree:(修改节点记录) + * + * @param k 节点信息 + * @return + * */ + public boolean updateTree(KnowledgeTree k); + + /** + * getTreeList:(根据父节点id和组织id,查询其下的所有子节点,若节点下规则,则过滤掉) + * + * @param paramMap 参数集合 + * @return 父节点下的所有子节点 + * */ + public List getTreeDataForEngine(Map paramMap); + + List getFolderList(KnowledgeTreeListParam param); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/RuleService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/RuleService.java new file mode 100644 index 0000000..ee0cf20 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/RuleService.java @@ -0,0 +1,22 @@ +package com.fibo.ddp.common.service.strategyx.knowledge; + +import com.fibo.ddp.common.model.strategyx.knowledge.Rule; + +import java.util.List; +import java.util.Map; + +/** + * ClassName:RuleService
+ * Description: 规则接口.
+ * @see + */ +public interface RuleService { + + /** + * getRuleList:(获取规则集合) + * + * @param paramMap 参数集合 + * @return 规则集合 + * */ + public List getRuleList(Map paramMap); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/KnowledgeTreeServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/KnowledgeTreeServiceImpl.java new file mode 100644 index 0000000..678a6a8 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/KnowledgeTreeServiceImpl.java @@ -0,0 +1,187 @@ +package com.fibo.ddp.common.service.strategyx.knowledge.impl; + +import com.fibo.ddp.common.dao.strategyx.knowledge.KnowledgeTreeMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.risk.request.KnowledgeTreeListParam; +import com.fibo.ddp.common.model.strategyx.knowledge.KnowledgeTree; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.knowledge.KnowledgeTreeService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * ClassName:KnowledgeTreeServiceImpl
+ * Description: 知识库目录接口实现类.
+ */ +@Service +public class KnowledgeTreeServiceImpl implements KnowledgeTreeService { + + @Autowired + private KnowledgeTreeMapper knowledgeTreeMapper; + + @Override + public List getTreeList(Map param) { + + try { + if (param.get("parentId").toString().equals("99999999")) { + param.put("parentId", 0); + } + } catch (Exception e) { + } + + // if (this.isBlack(inputParam.get("parentId"))) { + // inputParam.put("parentId", 0); + // } + + if (null == param.get("parentId") || "".equals(param.get("parentId"))) { + param.put("parentId", 0); + } + if (null == param.get("type") || "".equals(param.get("type"))) { + param.put("type", 1); + } + if (null == param.get("status") || "".equals(param.get("status"))) { + param.put("status", new int[]{1}); + } + + if (param.get("treeType") != null && !"".equals(param.get("treeType").toString())) { + String name = param.get("treeType").toString(); + switch (name) { + case "0": + param.put("name", "基础规则集"); + param.put("tree_type", "0"); + break; + case "1": + param.put("name", "评分卡"); + param.put("tree_type", "1"); + break; + case "2": + param.put("name", "回收站"); + param.put("tree_type", "2"); + break; + case "3": + param.put("name", "决策表"); + param.put("tree_type", "3"); + break; + case "4": + param.put("name", "决策树"); + param.put("tree_type", "4"); + break; + case "5": + param.put("name", "复杂规则集合"); + param.put("tree_type", "5"); + break; + case "7": + param.put("name", "脚本规则集"); + param.put("tree_type", "7"); + break; + case "8": + param.put("name", "集合操作"); + param.put("tree_type", "8"); + break; + case "9": + param.put("name", "标签配置"); + param.put("tree_type", "9"); + break; + case "10": + param.put("name", "数据清洗"); + param.put("tree_type", "10"); + break; + default: + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + } else { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + param.putAll(getParam(param)); + param.put("sort", true); + param.put("tree_type", StringUtil.toLongList(param.get("tree_type").toString())); + List klist = knowledgeTreeMapper.getTreeListV2(param); + String engineIdStr = (String) param.get("engineId"); + for (KnowledgeTree knowledgeTree : klist) { + param.put("parentId", knowledgeTree.getId()); + if (!StringUtil.isBlank(engineIdStr) && (int) knowledgeTree.getType() == 1 && knowledgeTree.getTreeType() == 0) { + knowledgeTree.setName(knowledgeTree.getName() + "(通用)"); + } + knowledgeTree.setChildren(getChildren(param)); + } + KnowledgeTree[] kArray = new KnowledgeTree[klist.size()]; + kArray = klist.toArray(kArray); + param.put("children", kArray); + + param.put("id", 99999999); + + ArrayList list = new ArrayList<>(); + list.add(param); + return list; + } + + @Override + public KnowledgeTree findById(Long id) { + // TODO Auto-generated method stub + return knowledgeTreeMapper.selectById(id); + } + + @Override + public boolean insertTree(KnowledgeTree k) { + knowledgeTreeMapper.insert(k); + return true; + } + + @Override + public boolean updateTree(KnowledgeTree k) { + knowledgeTreeMapper.updateById(k); + return true; + } + + + @Override + public List getTreeDataForEngine(Map paramMap) { + // TODO Auto-generated method stub + // return knowledgeTreeMapper.getTreeDataForEngine(paramMap); + return knowledgeTreeMapper.getTreeDataForEngineV2(paramMap); + } + + @Override + public List getFolderList(KnowledgeTreeListParam param) { + SysUser sysUser = SessionManager.getLoginAccount(); + param.setOrganId(sysUser.getOrganId()); + + List list = knowledgeTreeMapper.selectFolderList(param); + return list; + } + + private Map getParam(Map paramMap) { + SysUser sysUser = SessionManager.getLoginAccount(); + paramMap.put("userId", sysUser.getUserId()); + paramMap.put("organId", sysUser.getOrganId()); + return paramMap; + } + + /** + * getChildren:(获取树形节点的子节点信息) + * + * @param param 请求参数集合 + * @return + */ + private KnowledgeTree[] getChildren(Map param) { + List klist = knowledgeTreeMapper.getTreeList(param); + String engineIdStr = (String) param.get("engineId"); + for (KnowledgeTree knowledgeTree : klist) { + param.put("parentId", knowledgeTree.getId()); + if (!StringUtil.isBlank(engineIdStr) && (int) knowledgeTree.getType() == 1 && knowledgeTree.getTreeType() == 0) { + knowledgeTree.setName(knowledgeTree.getName() + "(通用)"); + } + knowledgeTree.setChildren(getChildren(param)); + } + KnowledgeTree[] kArray = new KnowledgeTree[klist.size()]; + kArray = klist.toArray(kArray); + return kArray; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/RuleServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/RuleServiceImpl.java new file mode 100644 index 0000000..3cc4c8f --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/knowledge/impl/RuleServiceImpl.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.service.strategyx.knowledge.impl; + +import com.fibo.ddp.common.dao.strategyx.knowledge.RuleMapper; +import com.fibo.ddp.common.model.strategyx.knowledge.Rule; +import com.fibo.ddp.common.service.strategyx.knowledge.RuleService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * ClassName:RuleServiceImpl
+ * Description: 规则接口实现类.
+ */ +@Service +public class RuleServiceImpl implements RuleService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private RuleMapper ruleMapper; + + @Override + public List getRuleList(Map paramMap) { + return ruleMapper.getRuleList(paramMap); + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbService.java new file mode 100644 index 0000000..31a839b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbService.java @@ -0,0 +1,79 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +public interface ListDbService extends IService { + + /** + * findByUser:(查找用户黑/白名单库列表).
+ * + * @param paramMap 参数集合 + * @return + * */ + public List findByUser(Map paramMap); + + /** + * updateStatus:(单个或批量更新名单状态).
+ * + * @param paramMap 参数集合 + * @return 更新成功 + * */ + public boolean updateStatus(Map paramMap); + + /** + * createListDb:(建黑、白名单库).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean createListDb(ListDb listDb, Map paramMap); + + /** + * findById:(按编号查找名单库实体对象).
+ * + * @param paramMap 参数集合 + * @return + * */ + public ListDb findById(Map paramMap); + + /** + * updateListDb:(修改黑白名单).
+ * + * @param sqlStr 建表sql + * @return 是否成功 + */ + public boolean updateListDb(Map paramMap); + + /** + * isExists:(检索黑(白)名单名称是否存在).
+ * + * @param paramMap 参数集合 + * @return + * */ + public Integer isExists(Map paramMap); + + /** + * findFieldsDbByIds:(找出一批黑(白)名单库id所用到一级字段id,有重复、逗号分隔).
+ * + * @param paramMap 参数集合 + * @return + * */ + public String findFieldsByListDbIds(Map paramMap); + + String upload(HttpServletRequest request, Long id) throws Exception; + + Map getListDbData(ListDbDataParam param); + + // runner + ListDb queryById(Long id); + + List getNodeFieldIds(Long versionId); + + ListDb queryByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbV3Service.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbV3Service.java new file mode 100644 index 0000000..e0f605a --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbV3Service.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; +import com.github.pagehelper.PageInfo; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +public interface ListDbV3Service extends IService { + + boolean updateStatus(List ids, Integer status); + + boolean addListDb(ListDb listDb); + /** + * findById:(按编号查找名单库实体对象).
+ * + * @param paramMap 参数集合 + * @return + * */ + public ListDb findById(Map paramMap); + + public boolean updateListDb(ListDb listDb); + + /** + * isExists:(检索黑(白)名单名称是否存在).
+ * + * @return + * */ + public boolean isExists(ListDb listDb); + + + String upload(HttpServletRequest request, Long id) throws Exception; + + Map getListDbData(ListDbDataParam param); + + ListDb queryById(Long id); + + PageInfo queryByEntity(QueryListParam listParam); + + List queryFieldEnsByListDbIds(Long id); + + boolean updateFolder(List ids, Long folderId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbVersionService.java new file mode 100644 index 0000000..e2227b6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/ListDbVersionService.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; + +import java.util.List; + +public interface ListDbVersionService extends IService { + + ListDbVersion queryById(Long id); + + List queryVersionListByListDbId(Long listDbId); + + int addVersionList(List versionList); + + boolean addVersion(ListDbVersion version); + + boolean copyVersion(ListDbVersion version); + + boolean updateVersion(ListDbVersion version); + + boolean updateStatus(StatusParam StatusParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbServiceImp.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbServiceImp.java new file mode 100644 index 0000000..f829a96 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbServiceImp.java @@ -0,0 +1,361 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.common.ExcelUtil; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbService; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +@Service +public class ListDbServiceImp extends ServiceImpl implements ListDbService { + + @Resource + StrategyOutputService outputService; + @Resource + public ListDbMapper listDbMapper; + @Resource + public SysUserMapper sysUserMapper; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Resource + private ListDbVersionService versionService; + + @Override + public List findByUser(Map paramMap) { + return listDbMapper.findByUser(paramMap); + } + + @Override + public boolean updateStatus(Map paramMap) { + return listDbMapper.updateStatus(paramMap); + } + + @Override + @Transactional + public boolean createListDb(ListDb listDb, Map paramMap) { + + Long organId = SessionManager.getLoginAccount().getOrganId(); + listDbMapper.createListDb(listDb); + Long id = listDb.getId(); + + String listType = (String) paramMap.get("listType"); + String tableName = "organ"+"_"+organId+"_"+listType+"_"+id; + String sqlStr = "CREATE TABLE "+ tableName + "(" + + " `id` int(11) NOT NULL AUTO_INCREMENT comment 'id'," ; + //生成表字段 + String tableColumn = String.valueOf(paramMap.get("tableColumn")); + String arrayTableColumn[] = tableColumn.split(","); + int arrayTC[] = new int[arrayTableColumn.length]; + for(int i=0;i indexMap = new HashMap(); + + //循环生成索引列 + String queryField = String.valueOf(paramMap.get("queryField")); + String arrayQueryField[] = queryField.split(","); + int arrayQF[] = new int[arrayQueryField.length]; + + int arrayTC2[] = new int[arrayTableColumn.length]; + String indexStr = ""; + for(int i=0;i paramMap) { + ListDb listDb = listDbMapper.findById(paramMap); + listDb.setNickName(sysUserMapper.findNickNameById(listDb.getUserId())); + List strategyOutputs = outputService.queryByTactics(new StrategyOutput(listDb.getId(), StrategyType.LIST_DB)); + listDb.setStrategyOutputList(strategyOutputs); + return listDb; + } + + @Override + public boolean updateListDb(Map paramMap) { + boolean b = listDbMapper.updateListDb(paramMap); + ListDb listDb = new ListDb(); + try { + BeanUtils.populate(listDb,paramMap); + } catch (IllegalAccessException|InvocationTargetException e) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + List strategyOutputList = JSONArray.parseArray(JSON.toJSONString(listDb.getStrategyOutputList()), StrategyOutput.class); + outputService.updateTacticsOutput(listDb.getId(), strategyOutputList, StrategyType.LIST_DB); + saveSnapshot(Long.valueOf(paramMap.get("id").toString())); + return b; + } + + /** + * + * Description: 获取jdbc.properties里配置的数据库名 + * @return + * @see + */ + private String getDbName(){ + + ResourceBundle resource = ResourceBundle.getBundle("conf/jdbc"); + String mysqlUrl = resource.getString("mysql.url"); + + + String aArray[]=mysqlUrl.split("/"); + String bArray[]=aArray[3].split("\\?"); + String dbName = bArray[0]; + + return dbName; + } + + @Override + public Integer isExists(Map paramMap) { + return listDbMapper.isExists(paramMap); + } + + @Override + public String findFieldsByListDbIds(Map paramMap) { + return listDbMapper.findFieldsByListDbIds(paramMap); + } + + @Override + public String upload(HttpServletRequest request, Long id) throws Exception { + String result = ""; + //将request变成多部分request + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + //获取multiRequest中所有的文件名 + Iterator iter = multiRequest.getFileNames(); + //遍历所有文件 + while (iter.hasNext()) { + MultipartFile file = multiRequest.getFile(iter.next().toString()); + // 暂存文件到本地 + if (file != null) { + String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/listDbUpload/"; + if (!new File(uploadDir).exists()) { + File dir = new File(uploadDir); + dir.mkdirs(); + } + String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); + String accessUrl = uploadDir + fileName; + // 保存文件 + file.transferTo(new File(accessUrl)); + result = importExcel(accessUrl, id); + } + } + return result; + } + + private String importExcel(String accessUrl, Long id) { + InputStream inputStream = null; + Workbook workbook = null; + Sheet sheet; + try { + inputStream = new FileInputStream(accessUrl); + workbook = WorkbookFactory.create(inputStream); + } catch (Exception e) { + e.printStackTrace(); + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + + int sucRows = 0; // 导入成功行数 + int failRows = 0; // 导入失败行数 + + Long userId = SessionManager.getLoginAccount().getUserId(); + ListDb listDb = listDbMapper.selectById(id); + String tableName = "organ" + "_" + listDb.getOrganId() + "_" + listDb.getListType() + "_" + id; + // 插入多行数据 insertOne into user_info (user_account,user_name,user_age,user_class) values ('00001', '张三 ','20','计算机系'), ('00002', '李四','19','计算机系'); + String sqlStr = "insertOne into " + tableName + "(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, user_id) values "; + + // 只取第一个Sheet页 + sheet = workbook.getSheetAt(0); + if (sheet == null) { + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + + List multiValusArr = new ArrayList<>(); + // 循环行 Row + for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { + try { + Row Row = sheet.getRow(rowNum); + if (Row == null) { + continue; + } + + List valueArr = new ArrayList<>(); + // 循环单元格 Cell + int lastCellNum = Row.getLastCellNum(); + for (int cellNum = 0; cellNum < 20; cellNum++) { + Cell cell = Row.getCell(cellNum); + String cellStr = ExcelUtil.getCellValue(cell).trim(); + valueArr.add("'" + cellStr + "'"); + } + String valueStr = "(" + StringUtils.join(valueArr, ",") + "," + userId + ")"; + multiValusArr.add(valueStr); + + sucRows++; + } catch (Exception e) { + failRows++; + e.printStackTrace(); + } + }// end for Row + + String multiValusStr = StringUtils.join(multiValusArr, ","); + + sqlStr += multiValusStr; + + Map paramMap = new HashMap<>(); + paramMap.put("sqlStr", sqlStr); + listDbMapper.customInsert(paramMap); + + String result = "导入成功" + sucRows + "条,失败" + failRows + "条!"; + + return result; + } + + @Override + public Map getListDbData(ListDbDataParam param) { + Map result = new HashMap<>(); + Long id = param.getId(); + ListDb listDb = listDbMapper.selectById(id); + // 查询语句 + String tableName = "organ" + "_" + listDb.getOrganId() + "_" + listDb.getListType() + "_" + id; + String sqlStr = "select * from " + tableName; + + Map paramMap = new HashMap<>(); + paramMap.put("sqlStr", sqlStr); + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + List> list = listDbMapper.customSelect(paramMap); + PageInfo> pageInfo = new PageInfo<>(list); + pageInfo.setList(null); + result.put("pageInfo", pageInfo); + result.put("list", list); + return result; + } + + private boolean saveSnapshot(Long id) { + HashMap map = new HashMap<>(); + map.put("id",id); + map.put("userId",SessionManager.getLoginAccount().getUserId()); + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + ListDb listDb = findById(map); + listDb.setSnapshot(null); + wrapper.eq(ListDb::getId, id).set(ListDb::getSnapshot, JSON.toJSONString(listDb)); + listDbMapper.update(null, wrapper); + } + }); + return true; + } + + @Override + public ListDb queryByVersionId(Long versionId) { + ListDbVersion version = versionService.queryById(versionId); + Long listDbId = version.getListDbId(); + ListDb listDb = this.getById(listDbId); + listDb.setExecuteVersion(version); + return listDb; + } + + @Override + public ListDb queryById(Long id) { + if (id==null){ + return null; + } + ListDb listDb = this.getById(id); + if (listDb.getOrganId()!= RunnerSessionManager.getSession().getOrganId()){ + return null; + } + List listDbVersions = versionService.queryVersionListByListDbId(id); + List list = new ArrayList<>(); + if (listDbVersions!=null&&!listDbVersions.isEmpty()){ + for (ListDbVersion listDbVersion : listDbVersions) { + list.add(versionService.queryById(listDbVersion.getId())); + } + } + listDb.setVersionList(list); + return listDb; + } + + @Override + public List getNodeFieldIds(Long id) { + ListDb listDb = queryById(id); + String queryField = listDb.getQueryField(); + List list = new ArrayList<>(); + if (StringUtils.isNotBlank(queryField)){ + String[] split = queryField.split(","); + for (String s : split) { + list.add(Long.valueOf(s)); + } + } + return list; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbV3ServiceImp.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbV3ServiceImp.java new file mode 100644 index 0000000..c455715 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbV3ServiceImp.java @@ -0,0 +1,326 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbMapper; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.common.ExcelUtil; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbV3Service; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.*; + +@Service +public class ListDbV3ServiceImp extends ServiceImpl implements ListDbV3Service { + + @Resource + StrategyOutputService outputService; + @Resource + FieldService fieldService; + @Resource + public ListDbMapper listDbMapper; + @Resource + private ListDbVersionService versionService; + @Resource + public SysUserMapper sysUserMapper; + + @Override + public boolean updateStatus(List ids,Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ListDb::getId, ids); + ListDb listDb = new ListDb(); + listDb.setStatus(status); + int updateNum = listDbMapper.update(listDb, wrapper); + return updateNum > 0; + } + + @Override + @Transactional + public boolean addListDb(ListDb listDb) { + this.isExists(listDb); + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + listDb.setUserId(userId); + listDb.setOrganId(organId); + listDb.setStatus(1); + listDbMapper.createListDb(listDb); + versionService.addVersionList(listDb.getVersionList()); + return true; + } + + @Override + public ListDb findById(Map paramMap) { + ListDb listDb = listDbMapper.findById(paramMap); + listDb.setNickName(sysUserMapper.findNickNameById(listDb.getUserId())); + List strategyOutputs = outputService.queryByTactics(new StrategyOutput(listDb.getId(), StrategyType.LIST_DB)); + listDb.setStrategyOutputList(strategyOutputs); + return listDb; + } + + @Override + @Transactional + public boolean updateListDb(ListDb listDb) { + this.isExists(listDb); + Long organId = SessionManager.getLoginAccount().getOrganId(); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(ListDb::getId, listDb.getId()).eq(ListDb::getOrganId, organId); + listDbMapper.update(listDb, wrapper); + for (ListDbVersion listDbVersion : listDb.getVersionList()) { + versionService.updateVersion(listDbVersion); + } + return true; + } + + @Override + public boolean isExists(ListDb listDb) { + if (listDb==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(listDbMapper); + if (listDb.getId()!=null){ + wrapper.ne(ListDb::getId, listDb.getId()); + } + int count = wrapper.eq(ListDb::getListName, listDb.getListName()) + .eq(ListDb::getListCode,listDb.getListCode()) + .eq(ListDb::getOrganId, SessionManager.getLoginAccount().getOrganId()).count(); + if(count > 0){ + throw new ApiException(ErrorCodeEnum.LIST_DB_NAME_REPEAT.getCode(), "名单库名称、代码、类型不能完全相同"); + } + return true; + } + + @Override + public String upload(HttpServletRequest request, Long id) throws Exception { + String result = ""; + //将request变成多部分request + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + //获取multiRequest中所有的文件名 + Iterator iter = multiRequest.getFileNames(); + //遍历所有文件 + while (iter.hasNext()) { + MultipartFile file = multiRequest.getFile(iter.next().toString()); + // 暂存文件到本地 + if (file != null) { + String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/listDbUpload/"; + if (!new File(uploadDir).exists()) { + File dir = new File(uploadDir); + dir.mkdirs(); + } + String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); + String accessUrl = uploadDir + fileName; + // 保存文件 + file.transferTo(new File(accessUrl)); + result = importExcel(accessUrl, id); + } + } + return result; + } + + private String importExcel(String accessUrl, Long id) { + InputStream inputStream = null; + Workbook workbook = null; + Sheet sheet; + try { + inputStream = new FileInputStream(accessUrl); + workbook = WorkbookFactory.create(inputStream); + } catch (Exception e) { + e.printStackTrace(); + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + + int sucRows = 0; // 导入成功行数 + int failRows = 0; // 导入失败行数 + + Long userId = SessionManager.getLoginAccount().getUserId(); + ListDb listDb = listDbMapper.selectById(id); + String tableName = "organ" + "_" + listDb.getOrganId() + "_" + listDb.getListType() + "_" + id; + // 插入多行数据 insertOne into user_info (user_account,user_name,user_age,user_class) values ('00001', '张三 ','20','计算机系'), ('00002', '李四','19','计算机系'); + String sqlStr = "insertOne into " + tableName + "(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, user_id) values "; + + // 只取第一个Sheet页 + sheet = workbook.getSheetAt(0); + if (sheet == null) { + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + + List multiValusArr = new ArrayList<>(); + // 循环行 Row + for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { + try { + Row Row = sheet.getRow(rowNum); + if (Row == null) { + continue; + } + + List valueArr = new ArrayList<>(); + // 循环单元格 Cell + int lastCellNum = Row.getLastCellNum(); + for (int cellNum = 0; cellNum < 20; cellNum++) { + Cell cell = Row.getCell(cellNum); + String cellStr = ExcelUtil.getCellValue(cell).trim(); + valueArr.add("'" + cellStr + "'"); + } + String valueStr = "(" + StringUtils.join(valueArr, ",") + "," + userId + ")"; + multiValusArr.add(valueStr); + + sucRows++; + } catch (Exception e) { + failRows++; + e.printStackTrace(); + } + }// end for Row + + String multiValusStr = StringUtils.join(multiValusArr, ","); + + sqlStr += multiValusStr; + + Map paramMap = new HashMap<>(); + paramMap.put("sqlStr", sqlStr); + listDbMapper.customInsert(paramMap); + + String result = "导入成功" + sucRows + "条,失败" + failRows + "条!"; + + return result; + } + + @Override + public Map getListDbData(ListDbDataParam param) { + Map result = new HashMap<>(); + Long id = param.getId(); + ListDb listDb = listDbMapper.selectById(id); + // 查询语句 + String tableName = "organ" + "_" + listDb.getOrganId() + "_" + listDb.getListType() + "_" + id; + String sqlStr = "select * from " + tableName; + + Map paramMap = new HashMap<>(); + paramMap.put("sqlStr", sqlStr); + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + List> list = listDbMapper.customSelect(paramMap); + PageInfo> pageInfo = new PageInfo<>(list); + pageInfo.setList(null); + result.put("pageInfo", pageInfo); + result.put("list", list); + return result; + } + + @Override + public boolean updateFolder(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ListDb::getId, ids); + ListDb listDb = new ListDb(); + listDb.setFolderId(folderId); + int updateNum = listDbMapper.update(listDb, wrapper); + return updateNum > 0; + } + @Override + public ListDb queryById(Long id) { + if (id==null){ + return null; + } + ListDb listDb = this.getById(id); + if (listDb.getOrganId()!=SessionManager.getLoginAccount().getOrganId()){ + return null; + } + List listDbVersions = versionService.queryVersionListByListDbId(id); + List list = new ArrayList<>(); + if (listDbVersions!=null&&!listDbVersions.isEmpty()){ + for (ListDbVersion listDbVersion : listDbVersions) { + list.add(versionService.queryById(listDbVersion.getId())); + } + } + listDb.setVersionList(list); + return listDb; + } + @Override + public PageInfo queryByEntity(QueryListParam listParam) { + ListDb query = listParam.getEntity(); + Integer pageNum = listParam.getPageNum(); + Integer pageSize = listParam.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = createWrapper(query); + List ListDbs = listDbMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(ListDbs); + + //TODO 循环查用户表,待优化 + for (ListDb listDb : ListDbs) { + if (listDb != null && listDb.getUserId() != null) { + listDb.setNickName(sysUserMapper.findNickNameById(listDb.getUserId())); + listDb.setVersionList(versionService.queryVersionListByListDbId(listDb.getId())); + } + } + return pageInfo; + } + + @Override + public List queryFieldEnsByListDbIds(Long id) { + String idStr = listDbMapper.selectFieldIdsByListDbId(id); + Set fieldEns= new HashSet<>(); + if (idStr!=null&&!"".equals(idStr)){ + String[] split = idStr.split(","); + for (String s : split) { + fieldEns.add(fieldService.getFieldEnById(Long.valueOf(s))); + } + } + return new ArrayList<>(fieldEns); + } + + private LambdaQueryWrapper createWrapper(ListDb query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query!=null){ + if (StringUtils.isNotBlank(query.getListName())) { + wrapper.like(ListDb::getListName, query.getListName()); + } + if (query.getListType() != null) { + wrapper.like(ListDb::getListType, query.getListType()); + } + if (query.getListAttr()!=null){ + wrapper.eq(ListDb::getListAttr,query.getListAttr()); + } + if (query.getDataSource()!=null){ + wrapper.eq(ListDb::getDataSource,query.getDataSource()); + } + if (query.getFolderId()!=null&&query.getFolderId()!=0){ + wrapper.eq(ListDb::getFolderId,query.getFolderId()); + } + if (StringUtils.isNotBlank(query.getListCode())){ + wrapper.like(ListDb::getListCode, query.getListCode()); + } + if (StringUtils.isNotBlank(query.getNodeQuery())&&"1".equals(query.getNodeQuery())){ + wrapper.eq(ListDb::getStatus,1); + } + } + wrapper.ne(ListDb::getStatus,-1); + wrapper.eq(ListDb::getOrganId,SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc(ListDb::getCreated, ListDb::getId); + return wrapper; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbVersionServiceImpl.java new file mode 100644 index 0000000..57d9511 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/listlibrary/impl/ListDbVersionServiceImpl.java @@ -0,0 +1,226 @@ +package com.fibo.ddp.common.service.strategyx.listlibrary.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.ListDbVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("listDbVersionService") +public class ListDbVersionServiceImpl extends ServiceImpl implements ListDbVersionService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private ListDbVersionMapper versionMapper; + @Autowired + private ListDbMapper listDbMapper; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private StrategyOutputService outputService; + + @Override + public ListDbVersion queryById(Long id) { + ListDbVersion version = this.getById(id); + if (version == null) { + return null; + } + //查询策略输出 + List strategyOutputs = outputService.queryByTactics(new StrategyOutput(id, StrategyType.LIST_DB)); + version.setStrategyOutputList(strategyOutputs); + return version; + } + @Override + public List queryVersionListByListDbId(Long listDbId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ListDbVersion::getListDbId, listDbId); + queryWrapper.ne(ListDbVersion::getStatus, -1); + queryWrapper.orderByDesc(ListDbVersion::getId); + List versionList = versionMapper.selectList(queryWrapper); + return versionList; + } + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (ListDbVersion versionVo : versionList) { + boolean b = addVersion(versionVo); + if (b) { + result++; + } + } + return result; + } + + @Transactional + @Override + public boolean addVersion(ListDbVersion version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode() == null) { + version.setVersionCode("V:0"); + } + if (version.getDescription() == null) { + version.setDescription("初始版本"); + } + int insert = versionMapper.insert(version); + if (insert > 0) { + boolean result = this.addVersionDetail(version); + if (result) { + saveSnapshot(version.getId()); + } + return true; + } else { + logger.error("新增名单库版本失败{}", version); + } + return false; + } + @Transactional + public boolean addVersionDetail(ListDbVersion version) { + //添加输出字段 + List strategyOutputList = version.getStrategyOutputList(); + if (strategyOutputList != null && strategyOutputList.size() > 0) { + outputService.insertTacticsOutput(version.getId(), strategyOutputList); + } + //建表 + this.createListDbTable(version); + return true; + } + @Override + @Transactional + public boolean copyVersion(ListDbVersion version) { + ListDbVersion versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(ListDbVersion version) { + Long versionId = version.getId(); + if (versionId == null) { + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + versionMapper.updateById(version); + //修改策略输出 + outputService.updateTacticsOutput(versionId, version.getStrategyOutputList(), StrategyType.LIST_DB); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam StatusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(ListDbVersion::getId, StatusParam.getIds()); + updateWrapper.eq(ListDbVersion::getListDbId, StatusParam.getStrategyId()); + ListDbVersion version = new ListDbVersion(); + version.setStatus(StatusParam.getStatus()); + boolean update = this.update(version, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId) { + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + ListDbVersion versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(ListDbVersion::getId, versionId).set(ListDbVersion::getSnapshot, JSON.toJSONString(versionVo)); + versionMapper.update(null, wrapper); + } + }); + return true; + } + + @Transactional + public boolean createListDbTable(ListDbVersion version) { + + Long organId = SessionManager.getLoginAccount().getOrganId(); + Long id = version.getListDbId(); + Long versionId = version.getId(); + String tableName = "organ"+"_"+organId+"_list_db_"+id+"_"+versionId; + String sqlStr = "CREATE TABLE "+ tableName + "(" + + " `userId` int(11) NOT NULL AUTO_INCREMENT comment 'userId'," ; + //生成表字段 + String tableColumn = version.getTableColumn(); + String arrayTableColumn[] = tableColumn.split(","); + int arrayTC[] = new int[arrayTableColumn.length]; + for(int i=0;i paramMap = new HashMap<>(); + sqlStr += "`user_id` int(11) NOT NULL COMMENT '创建人编号',"+ + "`nick_name` varchar(50) DEFAULT NULL COMMENT '创建人昵称',"+ + "`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',"+ + "PRIMARY KEY (`userId`)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"; + paramMap.put("sqlStr", sqlStr); + + listDbMapper.createTable(paramMap); + + Map indexMap = new HashMap(); + //循环生成索引列 + String queryField = version.getQueryField(); + String arrayQueryField[] = queryField.split(","); + int arrayQF[] = new int[arrayQueryField.length]; + + int arrayTC2[] = new int[arrayTableColumn.length]; + String indexStr = ""; + for(int i=0;i { + + // runner + List getConditionListByDetailId(Integer detailId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDetailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDetailService.java new file mode 100644 index 0000000..d396a6b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDetailService.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.service.strategyx.scorecard; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; + +import java.util.List; + +/** + * 评分卡明细表(ScorecardDetail)表服务接口 + */ +public interface ScorecardDetailService extends IService { + + // runner + List getDetailListByDimensionId(Integer dimensionId); + + List getDetailListByDimensionIds(List dimensionIds); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDimensionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDimensionService.java new file mode 100644 index 0000000..9b98e99 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardDimensionService.java @@ -0,0 +1,12 @@ +package com.fibo.ddp.common.service.strategyx.scorecard; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; + +import java.util.List; + +public interface ScorecardDimensionService extends IService { + + // runner + List getDimensionListByVersionId(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardService.java new file mode 100644 index 0000000..d218f01 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardService.java @@ -0,0 +1,40 @@ +package com.fibo.ddp.common.service.strategyx.scorecard; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.model.strategyx.scorecard.request.ListParam; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +/** + * 评分卡(Scorecard) Service接口 + */ +public interface ScorecardService extends IService { + + // 新增 + Scorecard addScorecard(ScorecardVo scorecardVo); + + // 获取单个信息 + ScorecardVo getScorecardInfo(Long id); + + // 获取列表(分页信息) + PageInfo getScorecardList(ListParam listParam); + + public List getScorecardList(Map paramMap); + + // 修改 + Scorecard updateScorecard(ScorecardVo scorecardVo); + + // 修改状态(ids,status) + void updateScorecardStatus(List ids, Integer status); + +// List queryFieldEnByScorecardId(Integer scorecardId); + + // runner + List setOutput(Long scorecardId, Map map); + ScorecardVo queryExecuteScorecard(Long versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardVersionService.java new file mode 100644 index 0000000..403aae6 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/ScorecardVersionService.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.service.strategyx.scorecard; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardVersion; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; + +import java.util.List; + +/** + * 评分卡(Scorecard) Service接口 + */ +public interface ScorecardVersionService extends IService { + + List queryVersionListByScorecardId(Long scorecardId); + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + boolean addVersion(ScorecardVersionVo version); + + boolean copyVersion(ScorecardVersionVo version); + + boolean updateVersion(ScorecardVersionVo version); + + boolean updateStatus(StatusParam statusParam); + + // runner + ScorecardVersionVo queryById(Long id); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailConditionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailConditionServiceImpl.java new file mode 100644 index 0000000..add0c87 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailConditionServiceImpl.java @@ -0,0 +1,42 @@ +package com.fibo.ddp.common.service.strategyx.scorecard.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardDetailConditionMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetailCondition; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDetailConditionService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 评分卡明细表的condition表(ScorecardDetailCondition)表服务实现类 + */ +@Service +public class ScorecardDetailConditionServiceImpl extends ServiceImpl implements ScorecardDetailConditionService { + + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getConditionListByDetailId(Integer detailId) { + List scorecardDetailConditions = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_SCORECARD_DETAIL_CONDITION, detailId); + scorecardDetailConditions = redisManager.getByForeignKey(key, ScorecardDetailCondition.class); + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ScorecardDetailCondition::getDetailId, detailId); + scorecardDetailConditions = this.list(queryWrapper); + } + return scorecardDetailConditions; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailServiceImpl.java new file mode 100644 index 0000000..d9e5666 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDetailServiceImpl.java @@ -0,0 +1,58 @@ +package com.fibo.ddp.common.service.strategyx.scorecard.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardDetailMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDetailService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 评分卡明细表(ScorecardDetail)表服务实现类 + */ +@Service +public class ScorecardDetailServiceImpl extends ServiceImpl implements ScorecardDetailService { + + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getDetailListByDimensionId(Integer dimensionId) { + List scorecardDetails = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_SCORECARD_DETAIL, dimensionId); + scorecardDetails = redisManager.getByForeignKey(key, ScorecardDetail.class); + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ScorecardDetail::getDimensionId, dimensionId); + scorecardDetails = this.list(queryWrapper); + } + return scorecardDetails; + } + + @Override + public List getDetailListByDimensionIds(List dimensionIds) { + List scorecardDetails = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + List dimensionIdList = dimensionIds.stream().map(item -> Long.valueOf(item)).collect(Collectors.toList()); + List keys = RedisUtils.getForeignKey(TableEnum.T_SCORECARD_DETAIL, dimensionIdList); + scorecardDetails = redisManager.hgetAllBatchByForeignKeys(keys, ScorecardDetail.class); + } else { + LambdaQueryWrapper detailLambdaQueryWrapper = new LambdaQueryWrapper<>(); + detailLambdaQueryWrapper.in(ScorecardDetail::getDimensionId, dimensionIds); + scorecardDetails = this.list(detailLambdaQueryWrapper); + } + return scorecardDetails; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDimensionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDimensionServiceImpl.java new file mode 100644 index 0000000..9b0a802 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardDimensionServiceImpl.java @@ -0,0 +1,39 @@ +package com.fibo.ddp.common.service.strategyx.scorecard.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardDimensionMapper; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDimensionService; +import com.fibo.ddp.common.utils.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ScorecardDimensionServiceImpl extends ServiceImpl implements ScorecardDimensionService { + + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Override + public List getDimensionListByVersionId(Long versionId) { + List dimensionList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_SCORECARD_DIMENSION, versionId); + dimensionList = redisManager.getByForeignKey(key, ScorecardDimension.class); + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ScorecardDimension::getVersionId, versionId); + dimensionList = this.list(queryWrapper); + } + return dimensionList; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardServiceImpl.java new file mode 100644 index 0000000..5044b43 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardServiceImpl.java @@ -0,0 +1,251 @@ +package com.fibo.ddp.common.service.strategyx.scorecard.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.model.strategyx.scorecard.request.ListParam; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 评分卡(Scorecard) Service实现类 + */ +@Service("ScorecardServiceV3") +public class ScorecardServiceImpl extends ServiceImpl implements ScorecardService { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ScorecardVersionService scorecardVersionService;//评分卡版本 + @Autowired + private ScorecardMapper scorecardMapper; + @Resource + private SysUserMapper sysUserMapper; + @Autowired + private StrategyOutputService outputService; + @Autowired + private ScorecardVersionService versionService; + @Autowired + private RedisManager redisManager; + @Value("${switch.use.cache}") + private String cacheSwitch; + + /** + * 新增 + * + * @param scorecardVo + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, isolation = Isolation.REPEATABLE_READ) + public Scorecard addScorecard(ScorecardVo scorecardVo) { + + Scorecard scorecard = new Scorecard(); + BeanUtils.copyProperties(scorecardVo, scorecard); + this.checkUniqueness(scorecard); // 校验评分卡 name versionCode 唯一性 + + SysUser user = SessionManager.getLoginAccount(); + scorecard.setUserId(user.getUserId()); + scorecard.setAuthor(user.getUserId()); + scorecard.setOrganId(user.getOrganId()); + + scorecard.setType(1); // 1表示组织 + scorecard.setStatus(1); + + boolean saveScorecard = this.save(scorecard); + + if (!saveScorecard) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + List versionList = scorecardVo.getVersionList(); + if (versionList!=null&&versionList.size()==1){ + ScorecardVersionVo versionVo = versionList.get(0); + versionVo.setScorecardId(scorecard.getId()); + scorecardVersionService.addVersion(versionVo); + } + ScorecardVo scorecardInfo = this.getScorecardInfo(scorecard.getId()); + return scorecardInfo; + } + + /** + * 获取评分卡详细信息 + * @param id + * @return + */ + @Override + public ScorecardVo getScorecardInfo(Long id) { + ScorecardVo scorecardVo = new ScorecardVo(); + Scorecard scorecard = this.getById(id); + if (scorecard == null) { + throw new ApiException(ErrorCodeEnum.DATA_IS_NOT_EXIST.getCode(), ErrorCodeEnum.DATA_IS_NOT_EXIST.getMessage()); + } + BeanUtils.copyProperties(scorecard, scorecardVo); + scorecardVo.setVersionList(scorecardVersionService.queryVersionListByScorecardId(id.longValue())); + return scorecardVo; + } + + // 获取列表(分页信息) + @Override + public PageInfo getScorecardList(ListParam listParam) { + + LambdaQueryWrapper scorecardQueryWrapper = new LambdaQueryWrapper<>(); + if(listParam.getParentId()!=0){ + scorecardQueryWrapper.eq(Scorecard::getParentId, listParam.getParentId()); + } + + scorecardQueryWrapper.in(Scorecard::getStatus, listParam.getStatus()); + if (listParam.getSearch() && !"".equals(listParam.getValue())) { + scorecardQueryWrapper.like(Scorecard::getName, listParam.getValue()); + } + scorecardQueryWrapper.orderByDesc(Scorecard::getUpdated); + + if (listParam.getPageNum()!=0&&listParam.getPageSize()!=0){ + PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize()); + } + List scorecardList = this.list(scorecardQueryWrapper); + PageInfo pageInfo = new PageInfo<>(scorecardList); + + ArrayList voList = new ArrayList<>(); + for (Scorecard scorecard : scorecardList) { + String nickName = sysUserMapper.findNickNameById(scorecard.getAuthor()); + scorecard.setAuthorName(nickName); + voList.add(scorecard); + } + pageInfo.setList(voList); + return pageInfo; + } + + @Override + public List getScorecardList(Map paramMap) { + return scorecardMapper.getScorecardList(paramMap); + } + + /** + * 修改评分卡 + * + * @param scorecardVo + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, isolation = Isolation.REPEATABLE_READ) + public Scorecard updateScorecard(ScorecardVo scorecardVo) { + if (scorecardVo.getId()==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + scorecardMapper.updateById(scorecardVo); + List versionList = scorecardVo.getVersionList(); + if (versionList!=null&&versionList.size()==1){ + ScorecardVersionVo versionVo = versionList.get(0); + scorecardVersionService.updateVersion(versionVo); + } + + ScorecardVo scorecardInfo = this.getScorecardInfo(scorecardVo.getId()); + return scorecardInfo; + } + + /** + * 修改评分卡 状态 (批量) + * + * @param ids id集合 + * @param status 状态 + */ + @Override + public void updateScorecardStatus(List ids, Integer status) { + + LambdaUpdateWrapper scorecardUpdateWrapper = new LambdaUpdateWrapper<>(); + scorecardUpdateWrapper.in(Scorecard::getId, ids); + scorecardUpdateWrapper.set(Scorecard::getStatus, status); + + boolean update = this.update(scorecardUpdateWrapper); + if (!update) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + } + + /** + * 校验评分卡 name versionCode 唯一性 + * + * @param scorecard Scorecard实体 + */ + private void checkUniqueness(Scorecard scorecard) { + + // 后期可以改为sql语句形式 + // SELECT COUNT(`id`) FROM `t_scorecard` WHERE `name` = #{name}; + LambdaQueryWrapper lqwName = new LambdaQueryWrapper<>(); + lqwName.eq(Scorecard::getName, scorecard.getName()); + if (scorecard.getId() != null) { + lqwName.ne(Scorecard::getId, scorecard.getId()); + } + int countName = this.count(lqwName); + if (countName > 0) { + throw new ApiException(ErrorCodeEnum.SCORECARD_NAME_REPEAT.getCode(), ErrorCodeEnum.SCORECARD_NAME_REPEAT.getMessage()); + } + + // 后期可以改为sql语句形式 + // SELECT COUNT(`id`) FROM `t_scorecard` WHERE `versionCode` = #{versionCode} AND `id` != #{id}; + LambdaQueryWrapper lqwCode = new LambdaQueryWrapper<>(); + lqwCode.eq(Scorecard::getCode, scorecard.getCode()); + if (scorecard.getId() != null) { + lqwCode.ne(Scorecard::getId, scorecard.getId()); + } + int countCode = this.count(lqwCode); + if (countCode > 0) { + throw new ApiException(ErrorCodeEnum.SCORECARD_CODE_REPEAT.getCode(), ErrorCodeEnum.SCORECARD_CODE_REPEAT.getMessage()); + } + } + + @Override + public List setOutput(Long scorecardId, Map map) { + return outputService.setOutput(new StrategyOutput(scorecardId, StrategyType.SCORECARD),map); + } + + @Override + public ScorecardVo queryExecuteScorecard(Long versionId) { + ScorecardVersionVo version = versionService.queryById(versionId); + Long scorecardId = version.getScorecardId(); + + Scorecard scorecard = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_SCORECARD, scorecardId); + scorecard = redisManager.getByPrimaryKey(key, Scorecard.class); + } else { + scorecard = this.getById(scorecardId); + } + ScorecardVo scorecardVo = new ScorecardVo(); + BeanUtils.copyProperties(scorecard, scorecardVo); + scorecardVo.setExecuteVersion(version); + return scorecardVo; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardVersionServiceImpl.java new file mode 100644 index 0000000..183a012 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scorecard/impl/ScorecardVersionServiceImpl.java @@ -0,0 +1,580 @@ +package com.fibo.ddp.common.service.strategyx.scorecard.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.scorecard.ScorecardVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetailCondition; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardVersion; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardDetailVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardDimensionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDetailConditionService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDetailService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDimensionService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.enginex.EngineOperator; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.strategyx.CustomValueUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class ScorecardVersionServiceImpl extends ServiceImpl implements ScorecardVersionService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private ScorecardVersionMapper versionMapper; + + @Autowired + private ScorecardDimensionService scorecardDimensionService; // 维度 + + @Autowired + private ScorecardDetailService scorecardDetailService; // 明细 + + @Autowired + private ScorecardDetailConditionService scorecardDetailConditionService; // Condition + + @Autowired + private FieldService fieldService; // 指标(字段) + + @Autowired + private StrategyOutputService outputService;//自定义输出 + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + +// @Override +// public ScorecardVersionVo queryById(Long id) { +// ScorecardVersion scorecardVersion = versionMapper.selectById(id); +// ScorecardVersionVo result = new ScorecardVersionVo(); +// if (scorecardVersion==null){ +// return result; +// } +// BeanUtils.copyProperties(scorecardVersion,result); +// +// List scorecardDimensionVos = new ArrayList<>(); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(ScorecardDimension::getVersionId, scorecardVersion.getId()); +// List dimensionList = scorecardDimensionService.list(queryWrapper); +// if (dimensionList != null && !dimensionList.isEmpty()) { +// for (ScorecardDimension scorecardDimension : dimensionList) { +// scorecardDimensionVos.add(assemblyScorecardDimensionVo(scorecardDimension)); +// } +// } +// result.setScorecardDimension(scorecardDimensionVos); +// //输出字段 +// List strategyOutputList = outputService.queryByTactics(new StrategyOutput(Long.valueOf(id.toString()), StrategyType.SCORECARD)); +// result.setStrategyOutputList(strategyOutputList); +// return result; +// } + + @Override + public ScorecardVersionVo queryById(Long id) { + ScorecardVersion scorecardVersion = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getPrimaryKey(TableEnum.T_SCORECARD_VERSION, id); + scorecardVersion = redisManager.getByPrimaryKey(key, ScorecardVersion.class); + } else { + scorecardVersion = versionMapper.selectById(id); + } + + ScorecardVersionVo result = new ScorecardVersionVo(); + BeanUtils.copyProperties(scorecardVersion, result); + + List scorecardDimensionVos = new ArrayList<>(); + List dimensionList = scorecardDimensionService.getDimensionListByVersionId(scorecardVersion.getId()); + if (dimensionList != null && !dimensionList.isEmpty()) { + for (ScorecardDimension scorecardDimension : dimensionList) { + scorecardDimensionVos.add(assemblyScorecardDimensionVo(scorecardDimension)); + } + } + result.setScorecardDimension(scorecardDimensionVos); + //输出字段 + List strategyOutputList = outputService.queryByTactics(new StrategyOutput(Long.valueOf(id.toString()), StrategyType.SCORECARD)); + result.setStrategyOutputList(strategyOutputList); + return result; + } + + @Override + public List queryVersionListByScorecardId(Long scorecardId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ScorecardVersion::getScorecardId,scorecardId); + queryWrapper.eq(ScorecardVersion::getStatus,1); + queryWrapper.orderByDesc(ScorecardVersion::getUpdateTime); + List scorecardVersions = versionMapper.selectList(queryWrapper); + List scorecardVersionVoList = new ArrayList<>(); + for (ScorecardVersion scorecardVersion : scorecardVersions) { + ScorecardVersionVo versionVo = new ScorecardVersionVo(); + BeanUtils.copyProperties(scorecardVersion,versionVo); + scorecardVersionVoList.add(versionVo); + } + return scorecardVersionVoList; + } + + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (ScorecardVersionVo versionVo : versionList) { + boolean b = addVersion(versionVo); + if (b){ + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(ScorecardVersionVo versionVo) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + versionVo.setOrganId(loginSysUser.getOrganId()); + versionVo.setCreateUserId(loginSysUser.getUserId()); + versionVo.setUpdateUserId(loginSysUser.getUserId()); + versionVo.setCreateTime(null); + versionVo.setUpdateTime(null); + if (versionVo.getVersionCode()==null){ + versionVo.setVersionCode("V:0"); + } + if (versionVo.getDescription()==null){ + versionVo.setDescription("初始版本"); + } + int insert = versionMapper.insert(versionVo); + if (insert>0){ + this.addVersionDetail(versionVo); + this.saveSnapshot(versionVo.getId()); + return true; + }else { + logger.error("新增评分卡版本失败{}",versionVo); + } + return false; + } + @Transactional + public boolean addVersionDetail(ScorecardVersionVo version){ + List DimensionVos = version.getScorecardDimension(); + for (ScorecardDimensionVo dimensionVo : DimensionVos) { + ScorecardDimension dimension = new ScorecardDimension(); + BeanUtils.copyProperties(dimensionVo, dimension); + dimension.setVersionId(version.getId()); + // 数据库 insertOne(dimension) 之后dimension就有id了 (把id传给子表) + boolean saveDimension = scorecardDimensionService.save(dimension); + if (!saveDimension) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + List detailVos = dimensionVo.getChildren(); // 明细Array + + // 递归 detailVos + recursionOfAdd(detailVos, dimension.getId(), 0); + } + //添加输出字段 + List strategyOutputList = version.getStrategyOutputList(); + if (strategyOutputList !=null&& strategyOutputList.size()>0){ + outputService.insertTacticsOutput(version.getId(), strategyOutputList); + } + return true; + } + @Override + @Transactional + public boolean copyVersion(ScorecardVersionVo version) { + ScorecardVersionVo versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(ScorecardVersionVo version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + versionMapper.updateById(version); + this.cleanScorecardVersion(version); + boolean b = this.addVersionDetail(version); + this.saveSnapshot(version.getId()); + return b; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { +// int result = versionMapper.updateStatus(ids, status); + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(ScorecardVersion::getId,statusParam.getIds()); + updateWrapper.eq(ScorecardVersion::getScorecardId,statusParam.getStrategyId()); + ScorecardVersion scorecardVersion = new ScorecardVersion(); + scorecardVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(scorecardVersion, updateWrapper); + return update; + } + +// /** +// * 组装评分卡维度信息 +// * @param scorecardDimension +// * @return +// */ +// private ScorecardDimensionVo assemblyScorecardDimensionVo(ScorecardDimension scorecardDimension) { +// ScorecardDimensionVo scorecardDimensionVo = new ScorecardDimensionVo(); +// BeanUtils.copyProperties(scorecardDimension, scorecardDimensionVo); +// List children = new ArrayList<>(); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(ScorecardDetail::getDimensionId, scorecardDimension.getId()); +// List scorecardDetails = scorecardDetailService.list(queryWrapper); +// +// List scorecardDetailsGroup = scorecardDetails.stream().filter(item -> item.getParentId().intValue() == 0).collect(Collectors.toList()); +// for (ScorecardDetail scorecardDetail : scorecardDetailsGroup) { +// ScorecardDetailVo scorecardDetailVo = assemblyScorecardDetailVo(scorecardDetail, scorecardDetails); +// children.add(scorecardDetailVo); +// } +// scorecardDimensionVo.setChildren(children); +// return scorecardDimensionVo; +// } + + /** + * 组装评分卡维度信息 + * + * @param scorecardDimension + * @return + */ + private ScorecardDimensionVo assemblyScorecardDimensionVo(ScorecardDimension scorecardDimension) { + ScorecardDimensionVo scorecardDimensionVo = new ScorecardDimensionVo(); + BeanUtils.copyProperties(scorecardDimension, scorecardDimensionVo); + List children = new ArrayList<>(); + + List scorecardDetails = scorecardDetailService.getDetailListByDimensionId(scorecardDimension.getId()); + List scorecardDetailsGroup = scorecardDetails.stream() + .filter(item -> item.getParentId().intValue() == 0).collect(Collectors.toList()); + for (ScorecardDetail scorecardDetail : scorecardDetailsGroup) { + ScorecardDetailVo scorecardDetailVo = assemblyScorecardDetailVo(scorecardDetail, scorecardDetails); + children.add(scorecardDetailVo); + } + scorecardDimensionVo.setChildren(children); + return scorecardDimensionVo; + } + + /** + * 递归组装评分卡明细信息 + * + * @param scorecardDetail + * @param scorecardDetails + * @return + */ + private ScorecardDetailVo assemblyScorecardDetailVo(ScorecardDetail scorecardDetail, List scorecardDetails) { + ScorecardDetailVo scorecardDetailVo = new ScorecardDetailVo(); + BeanUtils.copyProperties(scorecardDetail, scorecardDetailVo); + scorecardDetailVo.setCondition(assemblyCondition(scorecardDetail.getId())); + List children = new ArrayList<>(); + List detailList = scorecardDetails.stream().filter(item -> item.getParentId().equals(scorecardDetail.getId())).collect(Collectors.toList()); + for (ScorecardDetail cardDetail : detailList) { + ScorecardDetailVo cardDetailVo = this.assemblyScorecardDetailVo(cardDetail, scorecardDetails); + children.add(cardDetailVo); + } + scorecardDetailVo.setChildren(children); + + Long userId = SessionManager.getLoginAccount().getUserId(); + HashMap param = new HashMap<>(); + param.put("userId", scorecardDetail.getFieldId()); + param.put("userId", userId); + param.put("engineId", null); + Field field = fieldService.findByFieldId(param); + if (field != null) { + scorecardDetailVo.setFieldName(field.getFieldCn()); + } + + return scorecardDetailVo; + } + +// /** +// * 组装区间信息 +// * +// * @param detailId +// * @return +// */ +// private String assemblyCondition(Integer detailId) { +// String[] conditionArr = new String[]{"(", ")"}; +// +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(ScorecardDetailCondition::getDetailId, detailId); +// List scorecardDetailConditions = scorecardDetailConditionService.list(queryWrapper); +// if (scorecardDetailConditions != null && !scorecardDetailConditions.isEmpty()) { +// for (ScorecardDetailCondition detailCondition : scorecardDetailConditions) { +// String operator = detailCondition.getOperator(); +// if (EngineOperator.OPERATOR_GREATER_RELATION.equals(operator) +// || EngineOperator.OPERATOR_GREATER_EQUALS_RELATION.equals(operator)) { +// conditionArr[0] = convertOperatorToBrackets(operator) + detailCondition.getFieldValue(); +// } else if (EngineOperator.OPERATOR_LESS_RELATION.equals(operator) +// || EngineOperator.OPERATOR_LESS_EQUALS_RELATION.equals(operator)) { +// conditionArr[1] = detailCondition.getFieldValue() + convertOperatorToBrackets(operator); +// } +// } +// } +// String condition = StringUtils.join(conditionArr, CommonConst.SYMBOL_COMMA); +// return condition; +// } + + /** + * 组装区间信息 + * + * @param detailId + * @return + */ + private String assemblyCondition(Integer detailId) { + String[] conditionArr = new String[]{"(", ")"}; + List scorecardDetailConditions = scorecardDetailConditionService.getConditionListByDetailId(detailId); + if (scorecardDetailConditions != null && !scorecardDetailConditions.isEmpty()) { + for (ScorecardDetailCondition detailCondition : scorecardDetailConditions) { + String operator = detailCondition.getOperator(); + if (EngineOperator.OPERATOR_GREATER_RELATION.equals(operator) + || EngineOperator.OPERATOR_GREATER_EQUALS_RELATION.equals(operator)) { + conditionArr[0] = convertOperatorToBrackets(operator) + detailCondition.getFieldValue(); + } else if (EngineOperator.OPERATOR_LESS_RELATION.equals(operator) + || EngineOperator.OPERATOR_LESS_EQUALS_RELATION.equals(operator)) { + conditionArr[1] = detailCondition.getFieldValue() + convertOperatorToBrackets(operator); + } + } + } + String condition = StringUtils.join(conditionArr, CommonConst.SYMBOL_COMMA); + return condition; + } + + /** + * 运算符转换为括号 + * + * @param operator + * @return + */ + private String convertOperatorToBrackets(String operator) { + String brackets = ""; + switch (operator) { + case EngineOperator.OPERATOR_GREATER_RELATION: + brackets = EngineOperator.OPERATOR_LEFT_PARENTHESES; + break; + case EngineOperator.OPERATOR_GREATER_EQUALS_RELATION: + brackets = EngineOperator.OPERATOR_LEFT_BRACKET; + break; + case EngineOperator.OPERATOR_LESS_RELATION: + brackets = EngineOperator.OPERATOR_RIGHT_PARENTHESES; + break; + case EngineOperator.OPERATOR_LESS_EQUALS_RELATION: + brackets = EngineOperator.OPERATOR_RIGHT_BRACKET; + break; + default: + break; + } + return brackets; + } + + /** + * 清除评分卡版本信息 + * @param versionVo + */ + private void cleanScorecardVersion(ScorecardVersionVo versionVo) { + // 删除评分卡主表 + // removeById(scorecardVo.getUserId()); + + // 删除维度信息 + LambdaQueryWrapper dimensionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + dimensionLambdaQueryWrapper.eq(ScorecardDimension::getVersionId, versionVo.getId()); + List scorecardDimensions = scorecardDimensionService.list(dimensionLambdaQueryWrapper); + if (scorecardDimensions == null || scorecardDimensions.isEmpty()) { + return; + } + List dimensionIds = scorecardDimensions.stream().map(item -> item.getId()).collect(Collectors.toList()); + scorecardDimensionService.removeByIds(dimensionIds); + //删除输出字段 + outputService.deleteByTactics(new StrategyOutput(versionVo.getId(), StrategyType.SCORECARD)); + // 删除维度明细信息 + LambdaQueryWrapper detailLambdaQueryWrapper = new LambdaQueryWrapper<>(); + detailLambdaQueryWrapper.in(ScorecardDetail::getDimensionId, dimensionIds); + List scorecardDetails = scorecardDetailService.list(detailLambdaQueryWrapper); + if (scorecardDetails == null || scorecardDetails.isEmpty()) { + return; + } + List detailIds = scorecardDetails.stream().map(item -> item.getId()).collect(Collectors.toList()); + scorecardDetailService.removeByIds(detailIds); + + // 删除维度明细条件信息 + LambdaQueryWrapper conditionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + conditionLambdaQueryWrapper.in(ScorecardDetailCondition::getDetailId, detailIds); + scorecardDetailConditionService.remove(conditionLambdaQueryWrapper); + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + Set fieldEns = new HashSet<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ScorecardDimension::getVersionId, versionId); + queryWrapper.select(ScorecardDimension::getId); + List dimensionList = scorecardDimensionService.list(queryWrapper); + Set dimensionIds = new HashSet<>(); + if (dimensionList!=null&&dimensionList.size()>0){ + for (ScorecardDimension scorecardDimension : dimensionList) { + dimensionIds.add(scorecardDimension.getId()); + } + } + if (dimensionIds.size()>0){ + LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); + detailWrapper.in(ScorecardDetail::getDimensionId,dimensionIds); + List list = scorecardDetailService.list(detailWrapper); + if (list!=null&&list.size()>0){ + for (ScorecardDetail detail : list) { + fieldEns.add(fieldService.getFieldEnById(detail.getFieldId().longValue())); + String custom = detail.getCustom(); + fieldEns.addAll(CustomValueUtils.getFieldEnSet(custom)); + } + } + } + return new ArrayList<>(fieldEns); + } + + private void recursionOfAdd(List detailVos, Integer dimensionId, Integer parentId) { + + if (detailVos == null || detailVos.size() < 1) { + return; + } + + for (ScorecardDetailVo detailVo : detailVos) { + ScorecardDetail detail = new ScorecardDetail(); + BeanUtils.copyProperties(detailVo, detail); + detail.setDimensionId(dimensionId); // 设置 明细表 的 维度id + detail.setParentId(parentId); + + String conditionStr = detailVo.getCondition().replace(" ", ""); // 去掉空格 + if (!conditionStr.matches("^((\\[|\\()(\\d(\\d)*(\\.(\\d)+)?)|\\(),((\\d(\\d)*(\\.(\\d)+)?(\\]|\\)))|\\))$")){ + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(),"区间不正确:"+conditionStr); + } + String[] split = conditionStr.split(","); + if (split[0].length()>1&&split[1].length()>1){ + detail.setLogical("&&"); + }else if (split[0].length()<=1&&split[1].length()<=1){ + logger.error("区间有误,conditionStr:{}", conditionStr); + }else { + detail.setLogical(null); + } + + // 叶子节点和非叶子节点 情况处理 + if (detailVo.getChildren() == null || detailVo.getChildren().size() < 1) { + // 叶子节点 + detail.setType(1); + } else { + // 非叶子节点 + detail.setType(0); + detail.setScore(null); + } + + // 数据库 insertOne(detail) 之后detail就有id了 (把id传给子表) + boolean saveDetail = scorecardDetailService.save(detail); + if (!saveDetail) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + + this.addCondition(conditionStr, detail.getId()); // 处理并添加 Condition + + this.recursionOfAdd(detailVo.getChildren(), dimensionId, detail.getId()); // 递归 树 + } + + } + + /** + * 处理并添加 Condition + * + * @param conditionStr Condition字符串 + * @param detailId 明细id + */ + private void addCondition(String conditionStr, Integer detailId) { + + List conditionList = new ArrayList<>(); // Condition 数组 + if (!conditionStr.matches("^((\\[|\\()(\\d(\\d)*(\\.(\\d)+)?)|\\(),((\\d(\\d)*(\\.(\\d)+)?(\\]|\\)))|\\))$")){ + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(),"区间不正确:"+conditionStr); + } + //修正评分卡逻辑 + String[] strings = conditionStr.split(","); + String left = strings[0]; + String right = strings[1]; + //处理左半边 + if (StringUtils.isNotBlank(left)){ + ScorecardDetailCondition condition = new ScorecardDetailCondition(); + condition.setDetailId(detailId); + if (left.startsWith("(")){ + condition.setOperator(">"); + }else if (left.startsWith("[")){ + condition.setOperator(">="); + } + if (left.length()>1){ + condition.setFieldValue(left.substring(1)); + conditionList.add(condition); + } + + + } + //处理右半边 + if (StringUtils.isNotBlank(right)){ + ScorecardDetailCondition condition = new ScorecardDetailCondition(); + condition.setDetailId(detailId); + if (right.endsWith(")")){ + condition.setOperator("<"); + }else if (right.endsWith("]")){ + condition.setOperator("<="); + } + if (right.length()>1){ + condition.setFieldValue(right.substring(0,right.length()-1)); + conditionList.add(condition); + } + } + + if (conditionList.size()>0){ + boolean saveCondition = scorecardDetailConditionService.saveBatch(conditionList); + if (!saveCondition) { + throw new ApiException(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + } + + } + + private boolean saveSnapshot(Long versionId){ + threadPoolTaskExecutor.execute(new Runnable() { + @Override + public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + ScorecardVersion versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(ScorecardVersion::getId,versionId).set(ScorecardVersion::getSnapshot, JSON.toJSONString(versionVo)); + versionMapper.update(null,wrapper); + } + }); + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/RuleScriptVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/RuleScriptVersionService.java new file mode 100644 index 0000000..d1a3375 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/RuleScriptVersionService.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.service.strategyx.scriptrule; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; + +import java.util.List; + +/** + * (RuleScriptVersion)表服务接口 + */ +public interface RuleScriptVersionService extends IService { + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + + boolean addVersion(RuleScriptVersion version); + + boolean copyVersion(RuleScriptVersion version); + + boolean updateVersion(RuleScriptVersion version); + + boolean updateStatus(StatusParam statusParam); + + // runner + RuleScriptVersion queryById(Long id); + + List queryVersionListByRuleId(Long ruleId); + + List queryFieldEnByVersionIds(List versionId); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/impl/RuleScriptVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/impl/RuleScriptVersionServiceImpl.java new file mode 100644 index 0000000..de22d8b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/scriptrule/impl/RuleScriptVersionServiceImpl.java @@ -0,0 +1,182 @@ +package com.fibo.ddp.common.service.strategyx.scriptrule.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.strategyx.scriptrule.RuleScriptVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * (RuleScriptVersion)表服务实现类 + */ +@Service("ruleScriptVersionService") +public class RuleScriptVersionServiceImpl extends ServiceImpl implements RuleScriptVersionService { + @Resource + private RuleScriptVersionMapper ruleScriptVersionMapper; + + @Override + public RuleScriptVersion queryById(Long id) { + if (id!=null){ + return this.getById(id); + } + return null; + } + + @Override + public List queryVersionListByRuleId(Long ruleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RuleScriptVersion::getRuleId,ruleId); + wrapper.eq(RuleScriptVersion::getStatus,1); + wrapper.orderByDesc(RuleScriptVersion::getId); + List list = this.list(wrapper); + return list; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + Set fieldEnSet = new HashSet<>(); + RuleScriptVersion ruleScriptVersion = this.queryById(versionId); + if (ruleScriptVersion==null){ + return new ArrayList<>(); + } + String scriptContent = ruleScriptVersion.getScriptContent(); + if (StringUtils.isNotBlank(scriptContent)){ + JSONObject jsonObject = JSON.parseObject(scriptContent); + Object farr = jsonObject.get("farr"); + if (farr!=null&&!"".equals(farr)){ + List fieldList = JSONArray.parseArray(JSON.toJSONString(farr), Field.class); + fieldEnSet.addAll(fieldList.stream().map(item->{return item.getFieldEn();}).collect(Collectors.toSet())); + } + } + return new ArrayList<>(fieldEnSet); + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (RuleScriptVersion ruleScriptVersion : versionList) { + boolean b = this.addVersion(ruleScriptVersion); + if (b){ + result++; + } + } + return 0; + } + + @Override + @Transactional + public boolean addVersion(RuleScriptVersion version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode()==null){ + version.setVersionCode("V:0"); + } + if (version.getDescription()==null){ + version.setDescription("初始版本"); + } + int insert = ruleScriptVersionMapper.insert(version); + if (insert>0){ + this.saveSnapshot(version.getId()); + } + return insert>0; + } + + @Override + @Transactional + public boolean copyVersion(RuleScriptVersion version) { + RuleScriptVersion ruleScriptVersion = this.queryById(version.getId()); + ruleScriptVersion.setId(null); + ruleScriptVersion.setVersionCode(version.getVersionCode()); + ruleScriptVersion.setDescription(version.getDescription()); + return this.addVersion(ruleScriptVersion); + } + + @Override + @Transactional + public boolean updateVersion(RuleScriptVersion version) { + Long versionId = version.getId(); + if (versionId==null){ + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + int updateById = ruleScriptVersionMapper.updateById(version); + this.saveSnapshot(versionId); + return updateById>0; + } + + @Override + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(RuleScriptVersion::getId,statusParam.getIds()); + updateWrapper.eq(RuleScriptVersion::getRuleId,statusParam.getStrategyId()); + RuleScriptVersion ruleVersion = new RuleScriptVersion(); + ruleVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(ruleVersion, updateWrapper); + return update; + } + private boolean saveSnapshot(Long versionId){ +// threadPoolTaskExecutor.execute(new Runnable() { +// @Override +// public void run() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + RuleScriptVersion versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(RuleScriptVersion::getId,versionId).set(RuleScriptVersion::getSnapshot, JSON.toJSONString(versionVo)); + ruleScriptVersionMapper.update(null,wrapper); +// } +// }); + return true; + } + + @Override + public List queryFieldEnByVersionIds(List versionIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(RuleScriptVersion::getId,versionIds); + List list = this.list(wrapper); + Set fieldEnSet = new HashSet<>(); + if (list!=null&&!list.isEmpty()){ + for (RuleScriptVersion ruleScriptVersion : list) { + collectFieldEn(ruleScriptVersion,fieldEnSet); + } + } + return new ArrayList<>(fieldEnSet); + } + + private void collectFieldEn(RuleScriptVersion ruleScriptVersion,Set fieldEnSet){ + String scriptContent = ruleScriptVersion.getScriptContent(); + if (StringUtils.isNotBlank(scriptContent)){ + JSONObject jsonObject = JSON.parseObject(scriptContent); + Object farr = jsonObject.get("farr"); + if (farr!=null&&!"".equals(farr)){ + List fieldList = JSONArray.parseArray(JSON.toJSONString(farr), Field.class); + fieldEnSet.addAll(fieldList.stream().map(item->{return item.getFieldEn();}).collect(Collectors.toSet())); + } + } + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/StrategyOutputService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/StrategyOutputService.java new file mode 100644 index 0000000..29f2f70 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/StrategyOutputService.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.service.strategyx.strategyout; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; + +import java.util.List; +import java.util.Map; + +public interface StrategyOutputService extends IService { + + boolean insertTacticsOutput(Long tacticsId, List list); + + boolean insertTacticsOutput(Long tacticsId, List list, String outType); + + boolean updateTacticsOutput(Long tacticsId, List list, String tacticsType); + + boolean updateTacticsOutput(Long tacticsId, List successList, List failList, String tacticsType); + + boolean deleteByTactics(StrategyOutput entity); + + // runner + List queryByTactics(StrategyOutput entity); + + List setOutput(StrategyOutput entity, Map input); + + boolean judgeOutCondition(String condition,Map input); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/impl/StrategyOutputServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/impl/StrategyOutputServiceImpl.java new file mode 100644 index 0000000..6f25893 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/strategyout/impl/StrategyOutputServiceImpl.java @@ -0,0 +1,208 @@ +package com.fibo.ddp.common.service.strategyx.strategyout.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.strategyx.strategyout.StrategyOutputMapper; +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import com.fibo.ddp.common.model.strategyx.strategyout.OutCondition; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class StrategyOutputServiceImpl extends ServiceImpl implements StrategyOutputService { + + @Autowired + private RedisManager redisManager; + + @Value("${switch.use.cache}") + private String cacheSwitch; + + @Transactional + @Override + public boolean insertTacticsOutput(Long tacticsId, List list) { + if (tacticsId == null) { + return false; + } + if (list == null || list.size() == 0) { + return true; + } + for (StrategyOutput strategyOutput : list) { + strategyOutput.setStrategyId(tacticsId); + } + boolean saveResult = this.saveBatch(list); + return saveResult; + } + + @Override + public boolean insertTacticsOutput(Long tacticsId, List list, String outType) { + if (tacticsId == null || StringUtils.isBlank(outType)) { + return false; + } + if (list == null || list.size() == 0) { + return true; + } + for (StrategyOutput strategyOutput : list) { + strategyOutput.setStrategyId(tacticsId); + strategyOutput.setOutType(outType); + } + boolean saveResult = this.saveBatch(list); + return saveResult; + } + +// @Override +// public List queryByTactics(StrategyOutput entity) { +// return this.list(new QueryWrapper<>(entity)); +// } + + @Override + public List queryByTactics(StrategyOutput entity) { + List strategyOutputList = null; + if(Constants.switchFlag.ON.equals(cacheSwitch)){ + String key = RedisUtils.getForeignKey(TableEnum.T_STRATEGY_OUTPUT, entity.getStrategyId()); + strategyOutputList = redisManager.getByForeignKey(key, StrategyOutput.class); + if(strategyOutputList != null){ + strategyOutputList = strategyOutputList.stream().filter(item -> item.getStrategyType().equals(entity.getStrategyType())) + .collect(Collectors.toList()); + } + if (strategyOutputList !=null&&!strategyOutputList.isEmpty()&& StrategyType.COMPLEX_RULE.equals(entity.getVariableType())&&entity.getOutType()!=null){ + //复杂规则需要过滤出类型 + strategyOutputList = strategyOutputList.stream().filter(item ->entity.getOutType().equals( item.getOutType())).collect(Collectors.toList()); + } + } else { + strategyOutputList = this.list(new QueryWrapper<>(entity)); + } + + return strategyOutputList; + } + + @Transactional + @Override + public boolean updateTacticsOutput(Long tacticsId, List list, String tacticsType) { + StrategyOutput strategyOutput = new StrategyOutput(tacticsId, tacticsType); + boolean delete = this.deleteByTactics(strategyOutput); + if (!delete && this.queryByTactics(strategyOutput).size() != 0) { + return false; + } + return this.insertTacticsOutput(tacticsId, list); + } + + @Transactional + @Override + public boolean updateTacticsOutput(Long tacticsId, List successList, List failList, String tacticsType) { + StrategyOutput strategyOutput = new StrategyOutput(tacticsId, tacticsType); + boolean delete = this.deleteByTactics(strategyOutput); + if (!delete && this.queryByTactics(strategyOutput).size() != 0) { + return false; + } + if (successList != null && !successList.isEmpty()) { + this.insertTacticsOutput(tacticsId, successList, StrategyType.OutType.SUCCESS_OUT); + } + if (failList != null && !failList.isEmpty()) { + this.insertTacticsOutput(tacticsId, failList, StrategyType.OutType.FAIL_OUT); + } + return true; + } + + @Transactional + @Override + public boolean deleteByTactics(StrategyOutput entity) { + return this.remove(new QueryWrapper<>(entity)); + } + + //设置输出,传入map向map中放入输出并且返回输出列表 + @Override + public List setOutput(StrategyOutput entity, Map input) { + List strategyOutputList = this.queryByTactics(entity); + List jsonList = new ArrayList<>(); + if (strategyOutputList != null && strategyOutputList.size() > 0) { + for (StrategyOutput strategyOutput : strategyOutputList) { + if (!this.judgeOutCondition(strategyOutput.getOutCondition(),input)){ + continue; + } + JSONObject json = new JSONObject(); + String fieldEn = strategyOutput.getFieldEn(); + String fieldValue = strategyOutput.getFieldValue(); + Object value = fieldValue; + Integer variableType = strategyOutput.getVariableType(); + if (variableType != null) { + switch (variableType) { + case 2: + value = ExecuteUtils.getObjFromMap(input, fieldValue); + break; + case 3: + value = ExecuteUtils.getObjFromScript(input,fieldValue); + break; + } + } + if (value != null ) { + if (!"".equals(value)&&!"'".equals(value)&&value.toString().startsWith("'")&&value.toString().endsWith("'")){ + value = value.toString().substring(1,value.toString().length()-1); + } + json.put(fieldEn, value); + input.put(fieldEn, value); + jsonList.add(json); + } + } + } + return jsonList; + } + + //判断是否符合输出条件 + @Override + public boolean judgeOutCondition(String condition, Map input) { + //条件为空则符合输出 + if (null == condition || "".equals(condition)) { + return true; + } + OutCondition outCondition; + try { + outCondition = JSON.parseObject(condition, OutCondition.class); + }catch (Exception e){ + //字符串转json失败 + return true; + } + String logical = outCondition.getLogical(); + List conditionList = outCondition.getConditionList(); + if (null == logical || null == conditionList||conditionList.size()<1){ + return true; + } + boolean result=false; + switch (logical) { + case "||": + result = false; + for (ExpressionParam expression : conditionList) { + if (ExecuteUtils.getExpressionResult(expression, input)){ + return true; + } + } + break; + case "&&": + result = true; + for (ExpressionParam expression : conditionList) { + if (!ExecuteUtils.getExpressionResult(expression, input)){ + return false; + } + } + break; + } + return result; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagService.java new file mode 100644 index 0000000..e144fd3 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagService.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.service.strategyx.tag; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.tag.Tag; +import com.github.pagehelper.PageInfo; +import java.util.List; + +/** + * (Tag)表服务接口 + * @since 2021-12-31 13:34:00 + */ +public interface TagService extends IService{ + + Tag queryById(Long id); + + PageInfo queryByEntity(QueryListParam listParam); + + Tag insertTag(Tag tag); + + Tag updateTag(Tag tag); + + boolean updateStatus(List ids, Integer status); + + boolean updateFolder(List ids, Long folderId); + + List queryFieldEnByVersionId(Long versionId); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionDetailService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionDetailService.java new file mode 100644 index 0000000..c5bcbeb --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionDetailService.java @@ -0,0 +1,20 @@ +package com.fibo.ddp.common.service.strategyx.tag; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.strategyx.tag.TagVersionDetail; +import java.util.List; + +/** + * (TagVersionDetail)表服务接口 + * @since 2021-12-31 13:34:15 + */ +public interface TagVersionDetailService extends IService{ + + List queryByVersionId(Long versionId); + + List insertList(List list,Long versionId); + List updateList(List list,Long versionId); + boolean deleteList(List list); + boolean deleteById(Long id); + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionService.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionService.java new file mode 100644 index 0000000..c01e727 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/TagVersionService.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.service.strategyx.tag; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.tag.TagVersion; + +import java.util.List; + +/** + * (TagVersion)表服务接口 + * + * @since 2021-12-31 13:34:09 + */ +public interface TagVersionService extends IService { + TagVersion queryById(Long id); + + List queryVersionListByTagId(Long tagId); + + List queryFieldEnByVersionId(Long versionId); + + int addVersionList(List versionList); + + boolean addVersion(TagVersion version); + + boolean copyVersion(TagVersion version); + + boolean updateVersion(TagVersion version); + + boolean updateStatus(StatusParam statusParam); +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagServiceImpl.java new file mode 100644 index 0000000..e75954b --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagServiceImpl.java @@ -0,0 +1,194 @@ +package com.fibo.ddp.common.service.strategyx.tag.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.fibo.ddp.common.dao.authx.system.SysUserMapper; +import com.fibo.ddp.common.dao.strategyx.tag.TagMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.strategyx.tag.Tag; +import com.fibo.ddp.common.model.strategyx.tag.TagVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.tag.TagService; +import com.fibo.ddp.common.service.strategyx.tag.TagVersionService; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageInfo; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (Tag)表服务实现类 + * + * @author jgp + * @since 2021-12-31 13:34:01 + */ +@Service("tagService") +public class TagServiceImpl extends ServiceImpl implements TagService { + @Resource + private TagMapper tagMapper; + @Autowired + private TagVersionService versionService; + @Resource + private SysUserMapper sysUserMapper; + @Override + public Tag queryById(Long id) { + Tag tag = tagMapper.selectById(id); + if (tag != null) { + tag.setVersionList(versionService.queryVersionListByTagId(id)); + } + return tag; + } + + @Override + public PageInfo queryByEntity(QueryListParam listParam) { + Tag query = listParam.getEntity(); + Integer pageNum = listParam.getPageNum(); + Integer pageSize = listParam.getPageSize(); + if (pageNum > 0 && pageSize > 0) { + PageHelper.startPage(pageNum, pageSize); + } + LambdaQueryWrapper wrapper = createWrapper(query); + List tagList = tagMapper.selectList(wrapper); + PageInfo pageInfo = new PageInfo(tagList); + + //TODO 循环查用户表,待优化 + for (Tag tag : tagList) { + if (tag != null && tag.getCreateUserId() != null) { + tag.setCreateUserName(sysUserMapper.findNickNameById(tag.getCreateUserId())); + tag.setVersionList(versionService.queryVersionListByTagId(tag.getId())); + } + } + return pageInfo; + } + + @Override + @Transactional + public Tag insertTag(Tag tag) { + initParam(tag); + boolean save = this.save(tag); + if (!save) { + throw new ApiException(ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getCode(), ErrorCodeEnum.DECISION_TREE_SAVE_ERROR.getMessage()); + } + Long tagId = tag.getId(); + List versionList = tag.getVersionList(); + if (versionList != null && versionList.size() > 0) { + for (TagVersion versionVo : versionList) { + versionVo.setTagId(tagId); + } + versionService.addVersionList(versionList); + } + return this.queryById(tagId); + } + + @Override + @Transactional + public Tag updateTag(Tag tag) { + if (tag.getId() == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + SysUser sysUser = SessionManager.getLoginAccount(); + tag.setUpdateUserId(sysUser.getUserId()); + //修改主表 + boolean updateResult = this.updateById(tag); + if (!updateResult) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Long tagId = tag.getId(); + List versionList = tag.getVersionList(); + if (versionList != null && versionList.size() > 0) { + versionService.updateVersion(versionList.get(0)); + } + return this.queryById(tagId); + } + + @Override + @Transactional + public boolean updateStatus(List ids, Integer status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(Tag::getId, ids); + Tag tag = new Tag(); + tag.setStatus(status); + int updateNum = tagMapper.update(tag, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + @Transactional + public boolean updateFolder(List ids, Long folderId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(Tag::getId, ids); + Tag tag = new Tag(); + tag.setFolderId(folderId); + int updateNum = tagMapper.update(tag, wrapper); + if (updateNum > 0) { + return true; + } + return false; + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + return versionService.queryFieldEnByVersionId(versionId); + } + + private LambdaQueryWrapper createWrapper(Tag query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (query!=null){ + if (query.getTagName() != null) { + wrapper.like(Tag::getTagName, query.getTagName()); + } + if (query.getTagCode() != null) { + wrapper.like(Tag::getTagCode, query.getTagCode()); + } + if (query.getFolderId()!=null){ + wrapper.eq(Tag::getFolderId,query.getFolderId()); + } + } + wrapper.ne(Tag::getStatus,-1); + wrapper.eq(Tag::getOrganId, SessionManager.getLoginAccount().getOrganId()); + wrapper.orderByDesc(Tag::getUpdateTime, Tag::getCreateTime, Tag::getId); + return wrapper; + } + + //新插入数据的准备工作 + private Tag initParam(Tag vo) { + this.checkUniqueness(vo); + //加入用户信息 + SysUser sysUser = SessionManager.getLoginAccount(); + vo.setCreateUserId(sysUser.getUserId()); + vo.setOrganId(sysUser.getOrganId()); + vo.setUpdateUserId(sysUser.getUserId()); + //加入状态信息 + vo.setStatus(StatusConst.STATUS_ENABLED); + return vo; + } + + //唯一性检查 + private boolean checkUniqueness(Tag vo) { + Tag tag = new Tag(); + tag.setTagName(vo.getTagName()); + Tag info = this.getOne(new QueryWrapper<>(tag), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_NAME_REPEAT.getMessage()); + } + tag.setTagName(null); + tag.setTagCode(vo.getTagCode()); + info = this.getOne(new QueryWrapper<>(tag), false); + if (info != null) { + throw new ApiException(ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getCode(), ErrorCodeEnum.DECISION_TABLES_CODE_REPEAT.getMessage()); + } + return true; + } +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionDetailServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionDetailServiceImpl.java new file mode 100644 index 0000000..1d24f5d --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionDetailServiceImpl.java @@ -0,0 +1,130 @@ +package com.fibo.ddp.common.service.strategyx.tag.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.dao.strategyx.tag.TagVersionDetailMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRuleTypeEnum; +import com.fibo.ddp.common.model.strategyx.tag.TagVersionDetail; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.baserule.BaseRuleService; +import com.fibo.ddp.common.service.strategyx.tag.TagVersionDetailService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * (TagVersionDetail)表服务实现类 + * + * @author jgp + * @since 2021-12-31 13:34:15 + */ +@Service("tagVersionDetailService") +public class TagVersionDetailServiceImpl extends ServiceImpl implements TagVersionDetailService { + @Resource + private TagVersionDetailMapper tagVersionDetailMapper; + @Autowired + private BaseRuleService baseRuleService; + + @Override + public List queryByVersionId(Long versionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TagVersionDetail::getTagVersionId, versionId); + List list = this.list(wrapper); + for (TagVersionDetail detail : list) { + BaseRule baseRule = baseRuleService.queryById(detail.getTagRuleId()); + detail.setRule(baseRule); + } + return list; + } + + @Override + @Transactional + public List insertList(List list, Long versionId) { + + SysUser loginAccount = SessionManager.getLoginAccount(); + List rules = new ArrayList<>(); + for (TagVersionDetail detail : list) { + long ruleId = detail.getTagRuleId() == null ? SnowFlakUtil.snowflakeId() : detail.getTagRuleId(); + BaseRule rule = detail.getRule(); + rule.setRuleType(BaseRuleTypeEnum.STRATEGY_TAG_CONDITION.getType()); + rule.setOrganId(loginAccount.getOrganId()); + rule.setCreateUserId(loginAccount.getUserId()); + rule.setId(ruleId); + rules.add(rule); + detail.setOrganId(loginAccount.getOrganId()); + detail.setCreateUserId(loginAccount.getUserId()); + detail.setTagRuleId(ruleId); + detail.setTagVersionId(versionId); + } + boolean b = baseRuleService.insertBaseRuleList(rules); + this.saveOrUpdateBatch(list); + return this.queryByVersionId(versionId); + } + + @Override + @Transactional + public List updateList(List list, Long versionId) { +// Set ids = list.stream().filter(item -> { +// return item.getId() != null; +// }).map(TagVersionDetail::getId).collect(Collectors.toSet()); + + List deleteList = this.queryByVersionId(versionId); +// List deleteList = oldList.stream().filter(item -> { +// return !ids.contains(item.getId()); +// }).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(deleteList)) { + boolean b = this.deleteList(deleteList); + if (!b) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改标签分层错误"); + } + } + return this.insertList(list, versionId); + } + + @Override + public boolean deleteList(List list) { + List deleteIds = new ArrayList<>(); + List deleteRuleIds = new ArrayList<>(); + for (TagVersionDetail detail : list) { + deleteIds.add(detail.getId()); + if (detail.getTagRuleId() != null) { + deleteRuleIds.add(detail.getTagRuleId()); + } + } + boolean result = true; + if (!CollectionUtils.isEmpty(deleteIds)) { + this.removeByIds(deleteIds); + } + if (!CollectionUtils.isEmpty(deleteRuleIds)) { + baseRuleService.deleteBaseRuleByIds(deleteRuleIds); + } + return result; + } + + @Override + @Transactional + public boolean deleteById(Long id) { + TagVersionDetail detail = this.getById(id); + if (detail == null) { + return true; + } + Long ruleId = detail.getTagRuleId(); + if (ruleId != null) { + baseRuleService.deleteBaseRule(id); + } + return false; + } + +} diff --git a/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionServiceImpl.java b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionServiceImpl.java new file mode 100644 index 0000000..2983da9 --- /dev/null +++ b/ddp-common/ddp-service/src/main/java/com/fibo/ddp/common/service/strategyx/tag/impl/TagVersionServiceImpl.java @@ -0,0 +1,173 @@ +package com.fibo.ddp.common.service.strategyx.tag.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.fibo.ddp.common.dao.strategyx.tag.TagVersionMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.baserule.BaseRule; +import com.fibo.ddp.common.model.strategyx.tag.TagVersion; +import com.fibo.ddp.common.model.strategyx.tag.TagVersionDetail; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.tag.TagVersionDetailService; +import com.fibo.ddp.common.service.strategyx.tag.TagVersionService; +import com.fibo.ddp.common.utils.constant.StatusConst; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (TagVersion)表服务实现类 + * + * @author jgp + * @since 2021-12-31 13:34:11 + */ +@Service("tagVersionService") +@Slf4j +public class TagVersionServiceImpl extends ServiceImpl implements TagVersionService { + @Resource + private TagVersionMapper tagVersionMapper; + @Autowired + private TagVersionDetailService detailService; + + @Override + public TagVersion queryById(Long id) { + TagVersion tagVersion = this.getById(id); + if (tagVersion != null) { + List details = detailService.queryByVersionId(id); + tagVersion.setDetailList(details); + } + return tagVersion; + } + + @Override + public List queryVersionListByTagId(Long tagId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TagVersion::getTagId, tagId) + .ne(TagVersion::getStatus, StatusConst.STATUS_DELETE) + .orderByDesc(TagVersion::getId); + return this.list(wrapper); + } + + @Override + public List queryFieldEnByVersionId(Long versionId) { + return null; + } + + @Override + @Transactional + public int addVersionList(List versionList) { + int result = 0; + for (TagVersion version : versionList) { + boolean b = addVersion(version); + if (b) { + result++; + } + } + return result; + } + + @Override + @Transactional + public boolean addVersion(TagVersion version) { + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setOrganId(loginSysUser.getOrganId()); + version.setCreateUserId(loginSysUser.getUserId()); + version.setUpdateUserId(loginSysUser.getUserId()); + version.setCreateTime(null); + version.setUpdateTime(null); + version.setStatus(1); + if (version.getVersionCode() == null) { + version.setVersionCode("V:0"); + } + if (version.getDescription() == null) { + version.setDescription("初始版本"); + } + int insert = tagVersionMapper.insert(version); + if (insert > 0) { + boolean result = this.addVersionDetail(version); + if (result) { + saveSnapshot(version.getId()); + } + return true; + } else { + log.error("新增标签版本失败{}", version); + } + return false; + } + + @Transactional + public boolean addVersionDetail(TagVersion version) { + List detailList = version.getDetailList(); + for (TagVersionDetail detail : detailList) { + detail.setId(null); + detail.setTagVersionId(version.getTagId()); + BaseRule rule = detail.getRule(); + if (rule != null) { + long snowflakeId = SnowFlakUtil.snowflakeId(); + rule.setId(snowflakeId); + detail.setTagRuleId(snowflakeId); + } else { + detail.setTagRuleId(null); + } + } + detailService.insertList(detailList, version.getId()); + return true; + } + + @Override + @Transactional + public boolean copyVersion(TagVersion version) { + TagVersion versionVo = this.queryById(version.getId()); + versionVo.setId(null); + versionVo.setVersionCode(version.getVersionCode()); + versionVo.setDescription(version.getDescription()); + version.setTagId(versionVo.getTagId()); + return this.addVersion(versionVo); + } + + @Override + @Transactional + public boolean updateVersion(TagVersion version) { + Long versionId = version.getId(); + if (versionId == null) { + return false; + } + SysUser loginSysUser = SessionManager.getLoginAccount(); + version.setUpdateUserId(loginSysUser.getUserId()); + //修改版本主表 + tagVersionMapper.updateById(version); + //修改条件表 + detailService.updateList(version.getDetailList(), versionId); + //存快照 + saveSnapshot(version.getId()); + return true; + } + + @Override + @Transactional + public boolean updateStatus(StatusParam statusParam) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.in(TagVersion::getId, statusParam.getIds()); + TagVersion ruleVersion = new TagVersion(); + ruleVersion.setStatus(statusParam.getStatus()); + boolean update = this.update(ruleVersion, updateWrapper); + return update; + } + + private boolean saveSnapshot(Long versionId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + TagVersion versionVo = queryById(versionId); + versionVo.setSnapshot(null); + wrapper.eq(TagVersion::getId, versionId).set(TagVersion::getSnapshot, JSON.toJSONString(versionVo)); + tagVersionMapper.update(null, wrapper); + return true; + } +} diff --git a/ddp-common/ddp-utils/pom.xml b/ddp-common/ddp-utils/pom.xml new file mode 100644 index 0000000..90086a9 --- /dev/null +++ b/ddp-common/ddp-utils/pom.xml @@ -0,0 +1,20 @@ + + + + ddp-common + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + + + org.springframework.boot + spring-boot-starter-websocket + + + ddp-common-utils + + \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/common/MD5.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/common/MD5.java new file mode 100644 index 0000000..a2a7902 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/common/MD5.java @@ -0,0 +1,91 @@ + +package com.fibo.ddp.common.utils.common; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * ClassName:MD5
+ * Description: md5加密工具类.
+ */ +public class MD5 { + /** + * 全局数组 + */ + private static final String[] DIGITS = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "H", "i", + "j", "k", "l", "m", "n", "~", "$", "@", "%", "*", "#", "&", "!" }; + + public MD5() { + } + + /** + * byteToArrayString:(返回形式为数字跟字符串).
+ * @author wz + * @param bByte byte + * @return 返回形式为数字跟字符串 + */ + private static String byteToArrayString(byte bByte) { + int iRet = bByte; + if (iRet < 0) { + iRet += 256; + } + int iD1 = iRet / 32; + int iD2 = iRet % 32; + return DIGITS[iD1] + DIGITS[iD2]; + } + + /** + * byteToNum:(返回形式只为数字).
+ * @param bByte byte + * @return 返回形式只为数字 + */ + private static String byteToNum(byte bByte) { + int iRet = bByte; + System.out.println("iRet1=" + iRet); + if (iRet < 0) { + iRet += 256; + } + return String.valueOf(iRet); + } + + /** + * byteToString:(转换字节数组为16进制字串).
+ * @param bByte byte数组 + * @return 返回转换字节数组为16进制字串 + */ + private static String byteToString(byte[] bByte) { + StringBuffer sBuffer = new StringBuffer(); + for (int i = 0; i < bByte.length; i++) { + sBuffer.append(byteToArrayString(bByte[i])); + } + return sBuffer.toString(); + } + + /** + * GetMD5Code:(md5加密).
+ * @author wz + * @param param 需要加密的字段 + * @return 加密后的字段 + */ + public static String GetMD5Code(String param) { + String resultString = null; + try { + resultString = new String(param); + MessageDigest md = MessageDigest.getInstance("MD5"); + // md.digest() 该函数返回值为存放哈希值结果的byte数组 + resultString = byteToString(md.digest(param.getBytes())); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + return resultString; + } + + +// public static void main(String[] args) { +// MD5 getMD5 = new MD5(); +// System.out.println(getMD5.GetMD5Code("123456")); +// } + +} + diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/AnalyseConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/AnalyseConst.java new file mode 100644 index 0000000..f80337e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/AnalyseConst.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.utils.constant; + +public class AnalyseConst { + //统计维度(1.调用次数 engine_call,2.决策结果 decision_result,3规则命中 rule_hit 4.评分卡 scorecard 5.决策表 decision_tables 6.节点命中 NODE_HIT) + public static final String ENGINE_CALL = "engine_call"; + public static final String DECISION_RESULT = "decision_result"; + public static final String RULE_HIT = "rule_hit"; + public static final String SCORECARD = "scorecard"; + public static final String DECISION_TABLES = "decision_tables"; +// public static final String LIST_DB = "list_db"; + public static final String NODE_HIT = "node_hit"; + public static final String[] KEYS = {ENGINE_CALL,DECISION_RESULT,RULE_HIT,SCORECARD,DECISION_TABLES,NODE_HIT}; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ApprovalConsts.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ApprovalConsts.java new file mode 100644 index 0000000..d4ac3fe --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ApprovalConsts.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.common.utils.constant; + +public class ApprovalConsts { + public static final class ApplyStatus { + public static final int CANCEL = -1;//取消申请 + public static final int WAIT = 0;//待审批 + public static final int PASS = 1;//通过 + public static final int DENY = 2;//拒绝 + } + public static final class ApprovalType { + public static final String DECISION_FLOW_VERSION_DEPLOY = "jclbbbs";//决策流版本部署审批 + } + public static final class ApprovalStatus { + public static final int DELETE = -1;//取消申请 + public static final int OFF = 0;//待审批 + public static final int ON = 1;//通过 + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/CommonConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/CommonConst.java new file mode 100644 index 0000000..5e21a3d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/CommonConst.java @@ -0,0 +1,51 @@ +package com.fibo.ddp.common.utils.constant; + +public class CommonConst { + + /** + * 逗号 + */ + public static final String SYMBOL_COMMA = ","; + + /** + * 单引号 + */ + public static final String SYMBOL_SINGLE_QUOTA = "\'"; + + /** + * 空格 + */ + public static final String SYMBOL_BLANK = " "; + + /** + * 空字符串 + */ + public static final String STRING_EMPTY = ""; + + /** + * 评分卡前缀 + */ + public static final String SCORECARD_STARTION = "sc"; + + /** + * 字段前缀 + */ + public static final String SELF_FIELD_STARTION = "f"; + + /** + * 是否命中 + * */ + public static final String IS_HIT = "是否命中"; + + /** + * 得分 + * */ + public static final String SCORE = "得分"; + /** + * 30分钟(s) + * */ + public static final long MINUTE_30 = 1800000; + + public static String DROOLS_KSESSION_KEY_PREFIX = "DROOLS_KSESSION#"; + public static String JEDIS_KSESSION_KEY_PREFIX = "JEDIS_KSESSION#"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/Constants.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/Constants.java new file mode 100644 index 0000000..1318ed2 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/Constants.java @@ -0,0 +1,41 @@ +package com.fibo.ddp.common.utils.constant; + +/** + * 公共变量约定 + */ +public class Constants { + // token名称 + public static final String SYSTEM_KEY_TOKEN = "token"; + // token时间 单位秒 + public static final Long LOGIN_TOKEN_TIME = 7200L; + // token最大剩余时间,需刷新 单位秒 + public static final Long LOGIN_TOKEN_REFRESH_TIME = 600L; + + // 规则集节点相关常量 + public interface ruleNode { + // 互斥组 + int MUTEXGROUP = 1; + // 执行组 + int EXECUTEGROUP = 2; + } + + public interface switchFlag { + // 开关打开 + String ON = "on"; + // 开关关闭 + String OFF = "off"; + } + + public interface fieldName { + // 字段英文名 + String fieldEn = "field_en"; + //字段中文名 + String fieldCn = "field_cn"; + } + + public interface cacheConf { + // 缓存时间 + int cacheSecond = 120; + String cachePrefix = "runner:cache:"; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeConst.java new file mode 100644 index 0000000..d0f05bc --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeConst.java @@ -0,0 +1,647 @@ +package com.fibo.ddp.common.utils.constant; + +public class OpTypeConst { + + /** + * 登入 + * */ + public static final String LOGIN = "登入"; + + /** + * 登出 + * */ + public static final String LOGOUT = "登出"; + + /** + * 保存菜单 + * */ + public static final String SAVE_MENU = " 保存菜单"; + + /** + * 修改菜单 + * */ + public static final String UPDATE_MENU = "修改菜单"; + + /** + * 删除菜单 + * */ + public static final String DELETE_MENU = " 删除菜单"; + + /** + * 保存相应角色的菜单权限 + * */ + public static final String SAVE_MENU_ROLE = "新增相应角色的菜单权限"; + + /** + * 保存系统菜单 + * */ + public static final String SAVE_SYS_MENU = "新增系统菜单"; + + /** + * 修改系统菜单 + * */ + public static final String UPDATE_SYS_MENU = "修改系统菜单"; + + /** + * 修改评分卡版本状态 + */ + public static final String UPDATE_SYS_MENU_STATUS = "修改评分卡版本状态"; + + /** + * 删除系统菜单 + * */ + public static final String DELETE_SYS_MENU = "删除系统菜单"; + + /** + * 批量删除系统菜单 + * */ + public static final String BATCH_DELETE_SYS_MENU = "批量删除系统菜单"; + + /** + * 保存、修改资源树 + * */ + public static final String SAVE_OR_UPDATE_MENU_ROLE = "保存、修改资源树"; + + /** + * 保存、修改引擎树 + * */ + public static final String SAVE_ROLE_ENGINE = "保存、修改引擎树"; + + /** + * 保存组织信息 + * */ + public static final String SAVE_ORGAN = "保存组织信息"; + + /** + * 修改组织信息 + * */ + public static final String UPDATE_ORGAN = " 修改组织信息"; + + /** + *删除组织信息 + * */ + public static final String DELTET_ORGAN = "删除组织信息"; + + /** + *批量删除组织信息 + * */ + public static final String BATCH_DELTET_ORGAN ="批量删除组织信息"; + + /** + *修改组织状态信息 + * */ + public static final String UPDATE_ORGAN_STATUS ="修改组织状态信息"; + + /** + *保存本组织角色 + * */ + public static final String SAVE_SYS_ROLE ="保存本组织角色"; + + /** + *修改本组织角色 + * */ + public static final String UPDATE_SYS_ROLE ="修改本组织角色"; + + /** + *删除本组织角色 + * */ + public static final String DELETE_SYS_ROLE ="删除本组织角色"; + + /** + *批量删除本组织角色 + * */ + public static final String BATCH_DELETE_SYS_ROLE ="批量删除本组织角色"; + + /** + *保存公司管理员角色 + * */ + public static final String SAVE_ORANG_MANAGER_ROLE ="保存公司管理员角色"; + + /** + *修改本组织角色状态 + * */ + public static final String UPDATE_SYS_ROLE_STATUS ="修改本组织角色状态"; + + /** + *保存用户信息 + * */ + public static final String SAVE_SYS_USER ="保存用户信息"; + + /** + *修改用户信息 + * */ + public static final String UPDATE_SYS_USER ="修改用户信息"; + + /** + *删除用户信息 + * */ + public static final String DELETE_SYS_USER ="删除用户信息"; + + /** + *批量删除用户信息 + * */ + public static final String BATCH_DELETE_SYS_USER ="批量删除用户信息"; + + /** + *修改用户状态 + * */ + public static final String UPDATE_SYS_USER_STATUS ="修改用户状态"; + + /** + *重置用户密码 + * */ + public static final String RESET_PASSWORD ="重置用户密码"; + + /** + *修改用户密码 + * */ + public static final String UPDTE_PASSWORD ="修改用户密码"; + + /** + * 保存字段映射或数据管理目录 + * */ + public static final String SAVE_FILED_TREE = "保存字段映射或数据管理目录"; + + /** + * 修改字段映射或数据管理目录 + * */ + public static final String UPDATE_FILED_TREE = "修改字段映射或数据管理目录"; + + /** + * 保存数据管理中的字段 + * */ + public static final String SAVE_FILED = "保存数据管理中的字段"; + + /** + * 修改数据管理中的字段 + * */ + public static final String UPDATE_FILED= "修改数据管理中的字段"; + + /** + * 修改数据管理中的字段 + * */ + public static final String UPDATE_FILED_STATUS = "修改数据管理中的字段"; + + /** + * 保存字段映射中的字段 + * */ + public static final String SAVE_MAPPING_FILED = "保存字段映射中的字段"; + + /** + * 修改字段映射中的字段 + * */ + public static final String UPDATE_MAPPING_FILED= "修改字段映射中的字段"; + + /** + * 修改字段映射中的字段状态 + * */ + public static final String UPDATE_MAPPING_FILED_STATUS= "修改字段映射中的字段状态"; + + /** + * 更新字段所属文件夹 + */ + public static final String UPDATE_FIELD_FOLDER = "更换字段所属文件夹"; + + /** + * 保存黑白名单 + * */ + public static final String SAVE_BLACK_OR_WHITE_LIST = "保存黑白名单"; + + /** + * 修改黑白名单 + * */ + public static final String UPDATE_BLACK_OR_WHITE_LIST = " 修改黑白名单"; + + /** + * 删除黑白名单 + * */ + public static final String DELETE_BLACK_OR_WHITE_LIST = " 删除黑白名单"; + + /** + * 保存黑白名单库 + * */ + public static final String SAVE_BLACK_OR_WHITE_LIST_DB = " 保存黑白名单库"; + + /** + * 修改黑白名单库 + * */ + public static final String UPDATE_BLACK_OR_WHITE_LIST_DB = "修改黑白名单库"; + + /** + * 保存黑白名单库的状态 + * */ + public static final String SAVE_BLACK_OR_WHITE_LIST_DB_STATUS = "保存黑白名单库的状态"; + + /** + * 更新黑白名单所属文件夹 + */ + public static final String UPDATE_BLACK_OR_WHITE_LIST_DB_FOLDER = "更新黑白名单所属文件夹"; + + + /** + * 保存知识库或规则管理目录 + * */ + public static final String SAVE_KNOWLEDGE_TREE = "保存知识库或规则管理目录"; + + /** + * 修改规则知识库或规则管理目录 + * */ + public static final String UPDATE_KNOWLEDGE_TREE = "修改规则知识库或规则管理目录"; + + /** + * 保存规则 + * */ + public static final String SAVE_RULE = "保存规则"; + + /** + * 修改规则 + * */ + public static final String UPDATE_RULE = "修改规则"; + + /** + * 修改规则状态 + * */ + public static final String UPDATE_RULE_STATUS = "修改规则状态"; + + /** + * 查询简单规则 + * */ + public static final String SELECT_SAMPLE_RULE = "查询简单规则"; + + /** + * 版本规则 + */ + + /** + * 保存评分卡 + * */ + public static final String SAVE_SCORECARD = "保存评分卡"; + + /** + * 修改评分卡 + * */ + public static final String UPDATE_SCORECARD = "修改评分卡"; + + /** + *修改分卡状态 + * */ + public static final String UPDATE_SCORECARD_STATUS = "修改分卡状态"; + + /** + *节点重命名 + * */ + public static final String RENAME_NODE = "节点重命名"; + + /** + *保存节点 + * */ + public static final String SAVE_NODE = "保存节点"; + + /** + *修改节点 + * */ + public static final String UPDATE_NODE = "修改节点"; + + /** + *删除节点 + * */ + public static final String DELETE_NODE ="删除节点"; + + /** + * 批量删除节点 + * */ + public static final String BATCH_DELETE_NODE ="批量删除节点"; + + /** + * 删除节点之间的连线 + * */ + public static final String DELETE_NODE_LINK ="删除节点之间的连线"; + + /** + * 复制节点 + * */ + public static final String COPY_NODE ="复制节点"; + + /** + * 保存引擎 + * */ + public static final String SAVE_ENGINE ="保存引擎"; + + /** + * 保存或修改引擎 + * */ + public static final String UPDATE_ENGINE ="保存或修改引擎"; + + + /** + * 保存版本 + * */ + public static final String SAVE_VERSION ="保存版本"; + + /** + * 修改版本 + * */ + public static final String UPDATE_VERSION ="修改版本"; + + /** + * 删除版本 + * */ + public static final String DELETE_VERSION ="删除版本"; + /** + * 引擎部署 + * */ + public static final String ENGINDE_DEPLOY="引擎部署"; + + /** + * 引擎停止部署 + * */ + public static final String ENGINDE_UNDEPLOY="引擎停止部署"; + /** + * 清空引擎节点 + * */ + public static final String CLEAR_NODE ="清空引擎节点"; + /** + * 添加引擎引用规则关系 + * */ + public static final String ADD_RULE_QUOTES_REL = "添加引擎引用规则关系"; + /** + * 批量修改引擎引用规则状态 + * */ + public static final String BATCH_UPDATE_STATUS_FOR_QUOTES_RULE ="批量修改引擎引用规则状态"; + /** + * 添加引擎引用字段关系 + * */ + public static final String ADD_FIELD_QUOTES_REL = "添加引擎引用字段关系"; + /** + * 数据填写 + * */ + public static final String FILL_DATA="数据填写"; + + /** + * 保存数据源 + */ + public static final String DATA_SOURCE_SAVE = "保存数据源"; + + /** + * 修改数据源 + */ + public static final String DATA_SOURCE_MODIFY = "修改数据源"; + + /** + * 删除数据源 + */ + public static final String DATA_SOURCE_DELETE = "删除数据源"; + + /** + * 新增决策表 + */ + public static final String ADD_DECISION_TABLES = "新增决策表"; + + /** + * 更新决策表 + */ + public static final String UPDATE_DECISION_TABLES = "更新决策表"; + + /** + * 更新决策表状态 + */ + public static final String UPDATE_DECISION_TABLES_STATUS = "更新决策表状态"; + + /** + * 更新决策表所属文件 + */ + public static final String UPDATE_DECISION_TABLES_FOLDER = "更新决策表所属文件"; + + /** + * 新增决策表版本 + */ + public static final String ADD_DECISION_TABLES_VERSION = "新增决策表版本"; + + /** + * 复制决策表版本 + */ + public static final String COPY_DECISION_TABLES_VERSION = "复制决策表版本"; + + /** + * 更新决策表版本 + */ + public static final String UPDATE_DECISION_TABLES_VERSION = "更新决策表版本"; + + /** + * 修改决策表版本状态 + */ + public static final String UPDATE_DECISION_TABLES_VERSION_STATUS = "修改决策表版本状态"; + + /** + * 新增决策树 + */ + public static final String ADD_DECISION_TREE = "新增决策树"; + + /** + * 更新决策树 + */ + public static final String UPDATE_DECISION_TREE = "更新决策树"; + + /** + * 更新决策树状态 + */ + public static final String UPDATE_DECISION_TREE_STATUS = "更新决策树状态"; + + /** + * 更新决策树所属文件夹 + */ + public static final String UPDATE_DECISION_TREE_FOLDER = "更新决策树所属文件夹"; + + /** + * 新增决策树版本 + */ + public static final String ADD_DECISION_TREE_VERSION = "新增决策树版本"; + + + /** + * 复制决策树版本 + */ + public static final String COPY_DECISION_TREE_VERSION = "复制决策树版本"; + + /** + * 修改决策树版本 + */ + public static final String UPDATE_DECISION_TREE_VERSION = "修改决策树版本"; + + /** + * 修改决策树版本状态 + */ + public static final String UPDATE_DECISION_TREE_VERSION_STATUS = "修改决策树版本状态"; + + /** + * 新增接口 + */ + public static final String ADD_INTERFACE = "新增接口"; + + /** + * 删除接口 + */ + public static final String DELETE_INTERFACE = "删除接口"; + + /** + * 修改接口 + */ + public static final String UPDATE_INTERFACE = "修改接口"; + + /** + * 修改接口状态 + */ + public static final String UPDATE_INTERFACE_STATUS = "修改接口状态"; + + /** + * 新增黑白名单版本 + */ + public static final String ADD_BLACK_OR_WHITE_LIST_DB_VERSION = "新增黑白名单版本"; + + /** + * 复制名单库版本 + */ + public static final String COPY_BLACK_OR_WHITE_LIST_DB_VERSION = "复制名单库版本"; + + /** + * 添加模型 + */ + public static final String SAVE_MODELS = "添加模型"; + + /** + * 删除模型 + */ + public static final String DELETE_MODELS = "删除模型"; + + /** + * 修改模型 + */ + public static final String UPDATE_MODELS = "修改模型"; + + /** + * 保存规则版本 + */ + public static final String SAVE_RULE_VERSION = "保存规则版本"; + + /** + * 复制规则版本 + */ + public static final String COPY_RULE_VERSION = "复制规则版本"; + + /** + * 更新规则版本 + */ + public static final String UPDATE_RULE_VERSION = "更新规则版本"; + + /** + * 更新规则版本状态 + */ + public static final String UPDATE_RULE_VERSION_STATUS = "更新规则版本状态"; + + + /** + * 保存脚本规则版本 + */ + public static final String SAVE_RULE_SCRIPT_VERSION = "保存脚本规则版本"; + + /** + * 复制脚本规则版本 + */ + public static final String COPY_RULE_SCRIPT_VERSION = "复制脚本规则版本"; + + /** + * 更新脚本规则版本 + */ + public static final String UPDATE_RULE_SCRIPT_VERSION = "更新规则版本"; + + /** + * 更新脚本规则版本状态 + */ + public static final String UPDATE_RULE_VERSION_SCRIPT_STATUS = "更新规则版本状态"; + + /** + * 新增评分卡版本 + */ + public static final String ADD_SCORECARD_VERSION = "新增评分卡版本"; + + /** + * 复制评分卡版本 + */ + public static final String COPY_SCORECARD_VERSION = "复制评分卡版本"; + + /** + * 修改评分卡版本 + */ + public static final String UPDATE_SCORECARD_VERSION = "修改评分卡版本"; + + /** + * 修改评分卡版本状态 + */ + public static final String UPDATE_SCORECARD_VERSION_STATUS = "修改评分卡版本状态"; + + /** + * 新增业务类型和规则关联 + */ + public static final String BUSINESS_RULE_REL_ADD = "业务类型和规则关联-新增"; + /** + * 编辑业务类型和规则关联 + */ + public static final String BUSINESS_RULE_REL_EDIT = "业务类型和规则关联-编辑"; + /** + * 删除业务类型和规则关联 + */ + public static final String BUSINESS_RULE_REL_DELETE = "业务类型和规则关联-删除"; + /** + * 详情业务类型和规则关联 + */ + public static final String BUSINESS_RULE_REL_DETAIL = "业务类型和规则关联-详情"; + /** + * 分页列表 + */ + public static final String BUSINESS_RULE_REL_PAGE = "业务类型和规则关联-分页查询"; + /** + * 分页列表 + */ + public static final String QUERY_BY_BUSINESSTYPE = "根据业务类型查询对应规则(对外接口)"; + /** + * 新增标签 + */ + public static final String ADD_TAG = "新增标签"; + + /** + * 更新标签 + */ + public static final String UPDATE_TAG = "更新标签"; + + /** + * 更新标签状态 + */ + public static final String UPDATE_TAG_STATUS = "更新标签状态"; + + /** + * 更新标签所属文件夹 + */ + public static final String UPDATE_TAG_FOLDER = "更新标签所属文件夹"; + + /** + * 新增标签版本 + */ + public static final String ADD_TAG_VERSION = "新增标签版本"; + + + /** + * 复制标签版本 + */ + public static final String COPY_TAG_VERSION = "复制标签版本"; + + /** + * 修改标签版本 + */ + public static final String UPDATE_TAG_VERSION = "修改标签版本"; + + /** + * 修改标签版本状态 + */ + public static final String UPDATE_TAG_VERSION_STATUS = "修改标签版本状态"; + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeEnum.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeEnum.java new file mode 100644 index 0000000..fc3856e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/OpTypeEnum.java @@ -0,0 +1,387 @@ +package com.fibo.ddp.common.utils.constant; + +public enum OpTypeEnum { + + /** + * 登入 + * */ + LOGIN ("login",OpTypeConst.LOGIN), + + /** + * 登出 + * */ + LOGOUT("logout",OpTypeConst.LOGOUT), + + /** + * 保存菜单 + * */ + SAVE_MENU("saveMenu",OpTypeConst.SAVE_MENU), + + /** + * 修改菜单 + * */ + UPDATE_MENU("updateMenu",OpTypeConst.UPDATE_MENU), + + /** + * 删除菜单 + * */ + DELETE_MENU("deleteMenu",OpTypeConst.DELETE_MENU), + + + /** + * 保存相应角色的菜单权限 + * */ + SAVE_MENU_ROLE("saveMenuRole",OpTypeConst.SAVE_MENU_ROLE), + + + /** + * 保存系统菜单 + * */ + SAVE_SYS_MENU("saveSysMenu",OpTypeConst.SAVE_SYS_MENU), + + /** + * 修改系统菜单 + * */ + UPDATE_SYS_MENU("updateSysMenu",OpTypeConst.UPDATE_SYS_MENU), + + /** + * 删除系统菜单 + * */ + DELETE_SYS_MENU("deleteSysMenu",OpTypeConst.DELETE_SYS_MENU), + + /** + * 批量删除系统菜单 + * */ + BATCH_DELETE_SYS_MENU("batchDeleteSysMenu",OpTypeConst.BATCH_DELETE_SYS_MENU), + + /** + * 保存、修改资源树 + * */ + SAVE_OR_UPDATE_MENU_ROLE("saveOrUpdateMenuRole",OpTypeConst.SAVE_OR_UPDATE_MENU_ROLE), + + /** + * 保存、修改引擎树 + * */ + SAVE_ROLE_ENGINE("saveRoleEngine",OpTypeConst.SAVE_ROLE_ENGINE), + + /** + * 保存组织信息 + * */ + SAVE_ORGAN("saveOrgan",OpTypeConst.SAVE_ORGAN), + + /** + * 修改组织信息 + * */ + UPDATE_ORGAN("updateOrgan",OpTypeConst.UPDATE_ORGAN), + + /** + *删除组织信息 + * */ + DELTET_ORGAN("deleteOrgan",OpTypeConst.DELTET_ORGAN), + + /** + *批量删除组织信息 + * */ + BATCH_DELTET_ORGAN("batchDeleteOrgan",OpTypeConst.BATCH_DELTET_ORGAN), + + /** + *修改组织状态信息 + * */ + UPDATE_ORGAN_STATUS("updateOrganStatus",OpTypeConst.UPDATE_ORGAN_STATUS), + + /** + *保存本组织角色 + * */ + SAVE_SYS_ROLE("saveSysRole",OpTypeConst.SAVE_SYS_ROLE), + + /** + *修改本组织角色 + * */ + UPDATE_SYS_ROLE("updateSysRole",OpTypeConst.UPDATE_SYS_ROLE), + + /** + *删除本组织角色 + * */ + DELETE_SYS_ROLE("deleteSysRole",OpTypeConst.DELETE_SYS_ROLE), + + /** + *批量删除本组织角色 + * */ + BATCH_DELETE_SYS_ROLE("batchDeleteSysRole",OpTypeConst.BATCH_DELETE_SYS_ROLE), + + /** + *保存公司管理员角色 + * */ + SAVE_ORANG_MANAGER_ROLE("saveOrganManagerRole",OpTypeConst.SAVE_ORANG_MANAGER_ROLE), + + /** + *修改本组织角色状态 + * */ + UPDATE_SYS_ROLE_STATUS("updateSysRoleStatus",OpTypeConst.UPDATE_SYS_ROLE_STATUS), + + /** + *保存用户信息 + * */ + SAVE_SYS_USER("saveSysUser",OpTypeConst.SAVE_SYS_USER), + + /** + *修改用户信息 + * */ + UPDATE_SYS_USER("updateSysUser",OpTypeConst.UPDATE_SYS_USER), + + /** + *删除用户信息 + * */ + DELETE_SYS_USER("deleteSysUser",OpTypeConst.DELETE_SYS_USER), + + /** + *批量删除用户信息 + * */ + BATCH_DELETE_SYS_USER("batchDeleteSysUser",OpTypeConst.BATCH_DELETE_SYS_USER), + + /** + *修改用户状态 + * */ + UPDATE_SYS_USER_STATUS("updateSysUserStatus",OpTypeConst.UPDATE_SYS_USER_STATUS), + + /** + *重置用户密码 + * */ + RESET_PASSWORD("resetPassword",OpTypeConst.RESET_PASSWORD), + + /** + *修改用户密码 + * */ + UPDTE_PASSWORD("updatePassword",OpTypeConst.UPDTE_PASSWORD), + + /** + * 保存字段映射或数据管理目录 + * */ + SAVE_FILED_TREE("saveFieldTree",OpTypeConst.SAVE_FILED_TREE), + + /** + * 修改字段映射或数据管理目录 + * */ + UPDATE_FILED_TREE("updateFieldTree",OpTypeConst.UPDATE_FILED_TREE), + + /** + * 保存数据管理中的字段 + * */ + SAVE_FILED("saveField",OpTypeConst.SAVE_FILED), + + /** + * 修改数据管理中的字段 + * */ + UPDATE_FILED("updateField",OpTypeConst.UPDATE_FILED), + + /** + * 修改数据管理中的字段 + * */ + UPDATE_FILED_STATUS("updateFieldStatus",OpTypeConst.UPDATE_FILED_STATUS), + + /** + * 保存字段映射中的字段 + * */ + SAVE_MAPPING_FILED("saveMappingField",OpTypeConst.SAVE_MAPPING_FILED), + + /** + * 修改字段映射中的字段 + * */ + UPDATE_MAPPING_FILED("updateMappingField",OpTypeConst.UPDATE_MAPPING_FILED), + + /** + * 修改字段映射中的字段状态 + * */ + UPDATE_MAPPING_FILED_STATUS("updateMappingFieldStatus",OpTypeConst.UPDATE_MAPPING_FILED_STATUS), + + /** + * 保存黑白名单 + * */ + SAVE_BLACK_OR_WHITE_LIST("saveBLackOrWhiteList",OpTypeConst.SAVE_BLACK_OR_WHITE_LIST), + + /** + * 修改黑白名单 + * */ + UPDATE_BLACK_OR_WHITE_LIST("updateBLackOrWhiteList",OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST), + + /** + * 删除黑白名单 + * */ + DELETE_BLACK_OR_WHITE_LIST("deleteBLackOrWhiteList",OpTypeConst.DELETE_BLACK_OR_WHITE_LIST), + + /** + * 保存黑白名单库 + * */ + SAVE_BLACK_OR_WHITE_LIST_DB("saveBLackOrWhiteListDB",OpTypeConst.SAVE_BLACK_OR_WHITE_LIST_DB), + + /** + * 修改黑白名单库 + * */ + UPDATE_BLACK_OR_WHITE_LIST_DB("updateBLackOrWhiteListDB",OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB), + + /** + * 保存黑白名单库的状态 + * */ + SAVE_BLACK_OR_WHITE_LIST_DB_STATUS("updateBLackOrWhiteListDBStatus",OpTypeConst.SAVE_BLACK_OR_WHITE_LIST_DB_STATUS), + + /** + * 保存知识库或规则管理目录 + * */ + SAVE_KNOWLEDGE_TREE("saveKnowledgeTree",OpTypeConst.SAVE_KNOWLEDGE_TREE), + + /** + * 修改规则知识库或规则管理目录 + * */ + UPDATE_KNOWLEDGE_TREE("updateKnowledgeTree",OpTypeConst.UPDATE_KNOWLEDGE_TREE), + + /** + * 保存规则 + * */ + SAVE_RULE("saveRule",OpTypeConst.SAVE_RULE), + + /** + * 修改规则 + * */ + UPDATE_RULE("upadteRule",OpTypeConst.UPDATE_RULE), + + /** + * 修改规则状态 + * */ + UPDATE_RULE_STATUS("upadteRuleStatus",OpTypeConst.UPDATE_RULE_STATUS), + + /** + * 保存评分卡 + * */ + SAVE_SCORECARD("saveScorecard",OpTypeConst.SAVE_SCORECARD), + + /** + * 修改评分卡 + * */ + UPDATE_SCORECARD("upadteScorecard",OpTypeConst.UPDATE_SCORECARD), + + /** + *修改规则状态 + * */ + UPDATE_SCORECARD_STATUS("upadteScorecardStatus",OpTypeConst.UPDATE_SCORECARD_STATUS), + + /** + *节点重命名 + * */ + RENAME_NODE("renameNode",OpTypeConst.RENAME_NODE), + + /** + *保存节点 + * */ + SAVE_NODE("saveNode",OpTypeConst.SAVE_NODE), + + /** + *修改节点 + * */ + UPDATE_NODE("updateNode",OpTypeConst.UPDATE_NODE), + + /** + *删除节点 + * */ + DELETE_NODE("deleteNode",OpTypeConst.DELETE_NODE), + + /** + *批量删除节点 + * */ + BATCH_DELETE_NODE("batchDeleteNode",OpTypeConst.BATCH_DELETE_NODE), + + /** + *删除节点之间的连线 + * */ + DELETE_NODE_LINK("beleteNodeLink",OpTypeConst.DELETE_NODE_LINK), + + /** + *复制节点 + * */ + COPY_NODE("copyNode",OpTypeConst.COPY_NODE), + + /** + *保存引擎 + * */ + SAVE_ENGINE("saveEngine",OpTypeConst.SAVE_ENGINE), + + /** + *修改引擎 + * */ + UPDATE_ENGINE("updateEngine",OpTypeConst.UPDATE_ENGINE), + + /** + *保存版本 + * */ + SAVE_VERSION("saveVersion",OpTypeConst.SAVE_VERSION), + + /** + *修改版本 + * */ + UPDATE_VERSION("updateVersion",OpTypeConst.UPDATE_VERSION), + + /** + *删除版本 + * */ + DELETE_VERSION("deleteVersion",OpTypeConst.DELETE_VERSION), + + /** + * 引擎部署 + * */ + ENGINDE_DEPLOY("engineDepoly",OpTypeConst.ENGINDE_DEPLOY), + + /** + * 引擎停止部署 + * */ + ENGINDE_UNDEPLOY("engineUndepoly",OpTypeConst.ENGINDE_UNDEPLOY), + + /** + * 清空引擎节点 + * */ + CLEAR_NODE("clearNode",OpTypeConst.CLEAR_NODE), + + /** + * 添加引擎引用规则关系 + * */ + ADD_RULE_QUOTES_REL("addRuleQuotesRel",OpTypeConst.ADD_RULE_QUOTES_REL), + + /** + * 批量修改引擎引用规则状态 + * */ + BATCH_UPDATE_STATUS_FOR_QUOTES_RULE("batchUpadteStatusForQuotesRule",OpTypeConst.BATCH_UPDATE_STATUS_FOR_QUOTES_RULE), + + /** + * 添加引擎引用字段关系 + * */ + ADD_FIELD_QUOTES_REL("addFieldQuotesRel",OpTypeConst.ADD_FIELD_QUOTES_REL), + + /** + * 数据填写 + * */ + FILL_DATA("fillData",OpTypeConst.FILL_DATA); + + private String value; + + private String type; + + private OpTypeEnum(String value, String type) + { + this.value = value; + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/RuleInfoConstants.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/RuleInfoConstants.java new file mode 100644 index 0000000..3195e9c --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/RuleInfoConstants.java @@ -0,0 +1,28 @@ +package com.fibo.ddp.common.utils.constant; + +/** + * Created by niuge on 2021/11/11. + */ +public class RuleInfoConstants { + /** + * 黑名单 + */ + public static final String BLACK_LIST = "blacklist"; + /** + * 阈值规则 + */ + public static final String THRESHOLD = "threshold"; + /** + * 互斥规则 + */ + public static final String MUTEX = "mutex"; + /** + * 合并规则 + */ + public static final String MERGE = "merge"; + /** + * 拦截规则 + */ + public static final String INTERCEPT = "intercept"; + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ServiceFilterConstant.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ServiceFilterConstant.java new file mode 100644 index 0000000..39c8d07 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/ServiceFilterConstant.java @@ -0,0 +1,24 @@ +package com.fibo.ddp.common.utils.constant; + +import java.util.HashSet; +import java.util.Set; + +/** + * 服务过滤配置 此处配置的uri都是不需要通过session管理,免token传参。 + */ +public class ServiceFilterConstant { + private static Set uriSet = new HashSet(); + static { + uriSet.add("/Riskmanage/v2/login/login");// 密码登录 + uriSet.add("/Riskmanage/v2/datamanage/datamanage/downTemplate");// 指标模板下载 + uriSet.add("/Riskmanage/v2/datamanage/listmanage/downTemplate");// 名单库模板下载 + uriSet.add("/Riskmanage/v3/analyse/decision"); + } + + public static boolean isSessionFilter(String uri) { + if (uriSet.contains(uri)) { + return true; + } + return false; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/StatusConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/StatusConst.java new file mode 100644 index 0000000..e7d3bc8 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/StatusConst.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.utils.constant; + +public class StatusConst { + //状态 + public static final int STATUS_ENABLED = 1;//启用状态,默认 + public static final int STATUS_DEAD = 0;//停用状态 + public static final int STATUS_DELETE = -1;//删除状态 +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/SysConstant.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/SysConstant.java new file mode 100644 index 0000000..fe20daa --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/SysConstant.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.common.utils.constant; + +/** + * @ClassName: SysConstant + * @Description: 系统常量类 + */ +public final class SysConstant { + + public static final String EMPTY_STRING =""; + + public static final String SPACE =" "; + + public static final String COMMA =","; + + public static final String SEMICOLON =";"; + + public static final String MINUS ="-"; + + public static final String UNDERLINE ="_"; + + public static final String DATA_POINT ="."; + + public static final String POINT ="\\."; + + public static final String COLON =":"; + + public static final String WN ="// "; + + public static final String AT ="@"; + + public static final String SLASH ="/"; + + public static final String BACKSLASH ="\\\\"; + + public static final String YES ="Y"; + + public static final String NO ="N"; + + public static final String TRUE ="true"; + + public static final String FALSE ="false"; + + public static final String LEFT_BRACKET ="("; + + public static final String RIGHT_BRACKET =")"; + + public static final String ELLIPSIS ="..."; + + public static final String ESCAPE ="\\"; + + public static final String EXCLAMATION ="!"; + + public static final String INFINITY ="∞"; + + /** + * 系统统一操作成功码 + */ + public static final String SUCCESS_CODE = "200"; + + /** + * 系统统一操作成功提示信息 + */ + public static final String SUCCESS_MESSAGE = "操作成功"; + + /** + * 系统统一操作失败码 + */ + public static final String FAIL_CODE = "500"; + + /** + * 系统统一操作失败提示信息 + */ + public static final String FAIL_MESSAGE = "操作失败"; + + /** + * 系统统一操作失败码 + */ + public static final String UNUSE_CODE = "300"; + + /** + * 系统统一操作失败提示信息 + */ + public static final String UNUSE_MESSAGE = "已停用"; + + /** + * 系统统一操作失败码 + */ + public static final String DEL_CODE = "400"; + + /** + * 系统统一操作失败提示信息 + */ + public static final String DEL_MESSAGE = "已删除"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/CallBackTypeEnum.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/CallBackTypeEnum.java new file mode 100644 index 0000000..a2a9318 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/CallBackTypeEnum.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +public enum CallBackTypeEnum { + + SYNC(1,"同步"), + ASYNC(2,"异步"); + + private int code; + private String message; + + CallBackTypeEnum(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineConst.java new file mode 100644 index 0000000..dd10b02 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineConst.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +/** + * 引擎使用常量 + */ +public class EngineConst { + /** + * 版本部署待审批状态 + */ + public static final int BOOT_STATE_DEPLOY_APPLY = 2; + /** + * 版本部署状态 + */ + public static final int BOOT_STATE_DEPLOY = 1; + + /** + * 版本未部署状态 + */ + public static final int BOOT_STATE_UNDEPLOY = 0; + + /** + * 决策选项结果集key + */ + public static final String DECISION_COLLECTION_KEY = "formulaList"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineContentConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineContentConst.java new file mode 100644 index 0000000..42e1f82 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineContentConst.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +public interface EngineContentConst { + String NODE_LIST_KEY = "nodeList"; + String SOURCE_ID = "sourceId"; + String Event_Dispose = "eventDispose"; + interface DataFlowEngine{ + String NODE_TYPE = "nodeType"; + interface NodeType{ + String BEGIN = "begin"; + String WHERE = "where"; + String OR = "or"; + String WITHIN = "within"; + String NEXT = "next"; + String FOLLOWED_BY = "followedBy"; + String ONE_OR_MORE = "oneOrMore"; + String TIMES = "times"; + String TIMES_OR_MORE = "timesOrMore"; + } + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineMsg.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineMsg.java new file mode 100644 index 0000000..c6d111e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineMsg.java @@ -0,0 +1,34 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +public class EngineMsg { + + /** + * 部署成功 + */ + public static final int STATUS_SUCCESS = 1; + /** + * 部署待审批 + */ + public static final int STATUS_WAIT = 2; + public static final String DEPLOY_WAIT = "部署待审批"; + + public static final String DEPLOY_SUCCESS = "部署成功!"; + + public static final String UNDEPLOY_SUCCESS = "当前版本已停用!"; + + /** + * 部署失败 + */ + public static final int STATUS_FAILED = 0; + + public static final String DEPLOY_FAILED = "部署失败!"; + + public static final String UNDEPLOY_FAILED = "停用当前版本失败!"; + + public static final String DELETE_RUNNING_FAILED = "当前版本正在运行,不能删除!"; + + public static final String DELETE_VERSION_SUCCESS = "当前版本删除成功!"; + + public static final String DELETE_VERSION_FAILED = "未知异常,当前版本删除失败!"; + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineOperator.java new file mode 100644 index 0000000..13ac033 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineOperator.java @@ -0,0 +1,153 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +/** + * 解析器可用的算法和符号 + */ +public class EngineOperator { + + /*---------------------------- 关系运算符 ----------------------------*/ + + public static final String OPERATOR_AND_RELATION = "&&"; + + public static final String OPERATOR_OR_RELATION = "||"; + + public static final String OPERATOR_NOT_RELATION = "!"; + + public static final String OPERATOR_EQUALS_RELATION = "=="; + + public static final String OPERATOR_GREATER_RELATION = ">"; + + public static final String OPERATOR_GREATER_EQUALS_RELATION = ">="; + + public static final String OPERATOR_LESS_RELATION = "<"; + + public static final String OPERATOR_LESS_EQUALS_RELATION = "<="; + + public static final String OPERATOR_NOT_EQUALS_RELATION = "!="; + + public static final String OPERATOR_AND_STRING_RELATION = "AND"; + + public static final String OPERATOR_OR_STRING_RELATION = "OR"; + + /*---------------------------- 数学运算符 ----------------------------*/ + + public static final String OPERATOR_ADD_MATH = "+"; + + public static final String OPERATOR_MINUS_MATH = "-"; + + public static final String OPERATOR_MULITI_MATH = "*"; + + public static final String OPERATOR_DIVIDE_MATH = "/"; + + public static final String OPERATOR_MODULU_MATH = "%"; + + public static final String OPERATOR_ABS_MATH = "abs"; + + public static final String OPERATOR_ACOS_MATH = "acos"; + + public static final String OPERATOR_ASIN_MATH = "asin"; + + public static final String OPERATOR_ATAN_MATH = "atan"; + + public static final String OPERATOR_ATAN2_MATH = "atan2"; + + public static final String OPERATOR_AVERAGE_MATH = "avg"; + + public static final String OPERATOR_CEIL_MATH = "ceil"; + + public static final String OPERATOR_COS_MATH = "cos"; + + public static final String OPERATOR_EXP_MATH = "exp"; + + public static final String OPERATOR_FLOOR_MATH = "floor"; + + public static final String OPERATOR_IEEE_MATH = "IEEEremainder"; + + public static final String OPERATOR_LN_MATH = "ln"; + + public static final String OPERATOR_LOG_MATH = "log"; + + public static final String OPERATOR_MAX_MATH = "max"; + + public static final String OPERATOR_MIN_MATH = "min"; + + public static final String OPERATOR_POW_MATH = "pow"; + + public static final String OPERATOR_RANDOM_MATH = "random"; + + public static final String OPERATOR_RINT_MATH = "rint"; + + public static final String OPERATOR_ROUND_MATH = "round"; + + public static final String OPERATOR_SIN_MATH = "sin"; + + public static final String OPERATOR_SQRT_MATH = "sqrt"; + + public static final String OPERATOR_SUM_MATH = "sum"; + + public static final String OPERATOR_TAN_MATH = "tan"; + + public static final String OPERATOR_TODEGREES_MATH = "toDegrees"; + + public static final String OPERATOR_TORADIANS_MATH = "toRadians"; + + /*---------------------------- 字符串运算符 ----------------------------*/ + + public static final String OPERATOR_CHARAT_STRING = "charAt"; + + public static final String OPERATOR_COMPARE_STRING = "compareTo"; + + public static final String OPERATOR_CTIC_STRING = "compareToIgnoreCase"; + + public static final String OPERATOR_CONCAT_STRING = "concat"; + + public static final String OPERATOR_ENDSWITH_STRING = "endsWith"; + + public static final String OPERATOR_EIC_STRING = "equalsIgnoreCase"; + + public static final String OPERATOR_EVAL_STRING = "eval"; + + public static final String OPERATOR_INDEXOF_STRING = "indexOf"; + + public static final String OPERATOR_LASTINDEXOF_STRING = "lastIndexOf"; + + public static final String OPERATOR_LENGTH_STRING = "length"; + + public static final String OPERATOR_REPLACE_STRING = "replace"; + + public static final String OPERATOR_STARTSWITH_STRING = "startsWith"; + + public static final String OPERATOR_SUB_STRING = "substring"; + + public static final String OPERATOR_TLC_STRING = "toLowerCase"; + + public static final String OPERATOR_TUC_STRING = "toUpperCase"; + + public static final String OPERATOR_TRIM_STRING = "trim"; + + public static final String OPERATOR_CONTAINS_STRING = "contains"; + + public static final String OPERATOR_UNCONTAINS_STRING = "notContains"; + + public static final String OPERATOR_EQUALS_STRING = "equals"; + + public static final String OPERATOR_UNEQUALS_STRING = "notEquals"; + + /*---------------------------- 符号 ----------------------------*/ + + public static final String OPERATOR_LEFT_BRACE = "{"; + + public static final String OPERATOR_RIGHT_BRACE = "}"; + + public static final String OPERATOR_VARIABLE_LEFT = "#"+OPERATOR_LEFT_BRACE; + + public static final String OPERATOR_VARIABLE_RIGHT = "}"; + + public static final String OPERATOR_LEFT_PARENTHESES = "("; + + public static final String OPERATOR_RIGHT_PARENTHESES = ")"; + + public static final String OPERATOR_LEFT_BRACKET = "["; + + public static final String OPERATOR_RIGHT_BRACKET = "]"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineTypeConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineTypeConst.java new file mode 100644 index 0000000..6b64318 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EngineTypeConst.java @@ -0,0 +1,15 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +public class EngineTypeConst { + public static final String RULE_ENGINE = "rule_engine"; + public static final String RISK_CONTROL_ENGINE = "risk_control_engine"; + public static final String DATA_FLOW_ENGINE = "data_flow_engine"; + public static final String PERSONAS_ENGINE = "personas_engine"; + public static final String MARKETING_ENGINE = "marketing_engine"; + public static final String WARNING_ENGINE = "warning_engine"; + public static final String SCORING_ENGINE = "scoring_engine"; + public static final String LOGIC_ENGINE = "logic_engine"; + public static final String QUESTIONNAIRE_ENGINE = "questionnaire_engine"; + public static final String PAGE_ENGINE = "page_engine"; + public static final String MATCHING_ENGINE = "matching_engine"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EnumConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EnumConst.java new file mode 100644 index 0000000..bffa110 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/EnumConst.java @@ -0,0 +1,49 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +/** + * 枚举使用到的常量 + */ +public class EnumConst { + + public static final String NODE_START = "开始"; + + public static final String NODE_POLICY = "规则集"; + + public static final String NODE_CLASSIFY = "分组"; + + public static final String NODE_SCORECARD = "评分卡"; + + public static final String NODE_BLACK = "名单库";//原黑名单改为名单库 + + public static final String NODE_WHITE = "白名单"; + + public static final String NODE_SANDBOX = "分流"; + + public static final String NODE_CREDIT_LEVEL = "信用评级"; + + public static final String NODE_DECISION = "决策选项"; + + public static final String NODE_QUOTA_CALC = "额度计算"; + + public static final String NODE_REPORT = "报表分析"; + + public static final String NODE_CUSTOMIZE = "自定义按钮"; + + public static final String NODE_COMPLEXRULE = "复杂规则"; + + public static final String NODE_CHILD_ENGINE = "子引擎"; + + public static final String NODE_MODEL_ENGINE = "模型"; + + public static final String NODE_DECISION_TABLES = "决策表"; + + public static final String NODE_DECISION_TREE = "决策树"; + + public static final String NODE_RPC = "远程调用"; + + public static final String NODE_PARALLEL = "并行"; + + public static final String NODE_AGGREGATION = "聚合"; + + public static final String NODE_CHAMPION_CHALLENGE= "冠军挑战"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/NodeTypeEnum.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/NodeTypeEnum.java new file mode 100644 index 0000000..2ee1167 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/enginex/NodeTypeEnum.java @@ -0,0 +1,123 @@ +package com.fibo.ddp.common.utils.constant.enginex; + +public enum NodeTypeEnum { + /** + * 开始节点 + */ + START(1, EnumConst.NODE_START), + /** + * 规则节点 + */ + POLICY(2,EnumConst.NODE_POLICY), + /** + * 分组节点 + */ + CLASSIFY(3, EnumConst.NODE_CLASSIFY), + /** + * 评分卡节点 + */ + SCORECARD(4,EnumConst.NODE_SCORECARD), + /** + * 黑名单节点 + */ + BLACKLIST(5,EnumConst.NODE_BLACK), + /** + * 白名单节点 + */ + WHITELIST(6,EnumConst.NODE_WHITE), + /** + * 分流节点 + */ + SANDBOX(7,EnumConst.NODE_SANDBOX), + /** + * 信用评级节点 + */ + CREDITLEVEL(8,EnumConst.NODE_CREDIT_LEVEL), + /** + * 决策选项节点 + */ + DECISION(9,EnumConst.NODE_DECISION), + /** + * 额度计算节点 + */ + QUOTACALC(10,EnumConst.NODE_QUOTA_CALC), + /** + * 报表分析节点 + */ + REPORT(11,EnumConst.NODE_REPORT), + /** + * 自定义节点 + */ + CUSTOMIZE(12,EnumConst.NODE_CUSTOMIZE), + /** + * 复杂规则 + */ + NODE_COMPLEXRULE(13,EnumConst.NODE_COMPLEXRULE), + /** + * 子引擎 + */ + CHILD_ENGINE(14,EnumConst.NODE_CHILD_ENGINE), + /** + * 模型 + */ + MODEL_ENGINE(15,EnumConst.NODE_MODEL_ENGINE), + /** + * 决策表 + */ + DECISION_TABLES(16,EnumConst.NODE_DECISION_TABLES), + /** + * 决策树 + */ + DECISION_TREE(17,EnumConst.NODE_DECISION_TREE), + /** + * 远程调用 + */ + RPC(18, EnumConst.NODE_RPC), + /** + * 并行节点 + */ + PARALLEL(19, EnumConst.NODE_PARALLEL), + /** + * 聚合节点 + */ + AGGREGATION(20, EnumConst.NODE_AGGREGATION), + /** + * 冠军挑战节点 + */ + CHAMPION_CHALLENGE(21, EnumConst.NODE_CHAMPION_CHALLENGE); + + private int value; + + private String type; + + private NodeTypeEnum(int value, String type) + { + this.value = value; + this.type = type; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public static NodeTypeEnum adapad(int value) { + for (NodeTypeEnum nodeTypeEnum : NodeTypeEnum.values()) { + if (nodeTypeEnum.getValue() == value) { + return nodeTypeEnum; + } + } + return null; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/Constants.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/Constants.java new file mode 100644 index 0000000..25fd272 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/Constants.java @@ -0,0 +1,233 @@ +package com.fibo.ddp.common.utils.constant.monitor; + +/** + * 常量定义 + */ +public class Constants { + /** + *

UserInfo hbase table

+ */ + public class UserInfoTable{ + /** + * 表名 + */ + public static final String TABLE_NAME = "user_info"; + /** + *基本信息列族 + */ + public static final String FAMILY_BASE_INFO="base_info"; + /** + * 列 + */ + public static final String BASEINFO="baseInfo"; + } + /** + *

monitor_decision_flow hbase table

+ * 决策流监控 + */ + public class MonitorDecisionFlow{ + /** + * 表名 + */ + public static final String TABLE_NAME = "monitor_decision_flow"; + /** + *决策流监控信息(列族) + */ + public static final String MONITOR_INFO = "monitor_info"; + /** + *入参 + */ + public static final String PARAMS = "params"; + /** + * 快照 + */ + public static final String SNAPSHOT = "snapshot"; + /** + * 执行过程 + */ + public static final String PROCESS = "process"; + /** + * 决策流基本信息 + */ + public static final String BASE_INFO = "base_info"; + /** + * 业务id + */ + public static final String BUSINESS_ID = "business_id"; + /** + *决策流名称 + */ + public static final String ENGINE_NAME = "engine_name"; + /** + * 决策流版本id + */ + public static final String ENGINE_VERSION_ID = "engine_version_id"; + /** + * 引擎版本信息 + */ + public static final String ENGINE_INFO = "engine_info"; + } + + /** + *

monitor_node hbase table

+ * 节点监控 + */ + public class MonitorNode{ + /** + * 表名 + */ + public static final String TABLE_NAME = "monitor_node"; + /** + *节点监控信息(列族) + */ + public static final String MONITOR_INFO = "monitor_info"; + /** + *入参 + */ + public static final String PARAMS = "params"; + /** + * 快照 + */ + public static final String SNAPSHOT = "snapshot"; + /** + * 节点输出结果 + */ + public static final String RESULT = "result"; + /** + * 节点基本信息 + */ + public static final String BASE_INFO = "base_info"; + /** + * 业务id + */ + public static final String BUSINESS_ID = "business_id"; + /** + *节点名称 + */ + public static final String NODE_ID = "node_id"; + /** + *节点名称 + */ + public static final String NODE_NAME = "node_name"; + /** + * 节点类型 + */ + public static final String NODE_TYPE = "node_type"; + /** + * 节点基本信息 + */ + public static final String NODE_INFO = "node_info"; + /** + * 决策流版本id + */ + public static final String ENGINE_VERSION_ID = "engine_version_id"; + /** + * 引擎版本信息 + */ + public static final String ENGINE_INFO = "engine_info"; + } + + /** + *

monitor_strategy hbase table

+ * 策略监控 + */ + public class MonitorStrategy{ + /** + * 表名 + */ + public static final String TABLE_NAME = "monitor_strategy"; + /** + *策略监控信息(列族) + */ + public static final String MONITOR_INFO = "monitor_info"; + /** + *入参 + */ + public static final String PARAMS = "params"; + /** + * 快照 + */ + public static final String SNAPSHOT = "snapshot"; + /** + * 策略输出结果 + */ + public static final String RESULT = "result"; + /** + * 策略基本信息 + */ + public static final String BASE_INFO = "base_info"; + /** + * 业务id + */ + public static final String BUSINESS_ID = "business_id"; + /** + *策略id + */ + public static final String STRATEGY_ID = "strategy_id"; + /** + *策略名称 + */ + public static final String STRATEGY_NAME = "strategy_name"; + /** + *策略类型 + */ + public static final String STRATEGY_TYPE = "strategy_type"; + /** + *节点id + */ + public static final String NODE_ID = "node_id"; + /** + *节点类型 + */ + public static final String NODE_TYPE = "node_type"; + /** + * 决策流版本id + */ + public static final String ENGINE_VERSION_ID = "engine_version_id"; + } + + /** + *

monitor_strategy hbase table

+ * 全量指标记录 + */ + public class RunnerFeatureRecord{ + /** + * 表名 + */ + public static final String TABLE_NAME = "runner_feature_record"; + /** + *执行前指标集合(列族) + */ + public static final String BEFORE_FEATURE = "before_feature"; + /** + *执行后指标集合(列族) + */ + public static final String AFTER_FEATURE = "after_feature"; + /** + * 基本信息(列族) + */ + public static final String BASE_INFO = "base_info"; + /** + * 业务id + */ + public static final String BUSINESS_ID = "business_id"; + /** + *引擎id + */ + public static final String ENGINE_ID = "engine_id"; + + /** + *引擎名称 + */ + public static final String ENGINE_NAME = "engine_name"; + + /** + *组织id + */ + public static final String ORGAN_ID = "organ_id"; + /** + * 决策流版本id + */ + public static final String ENGINE_VERSION_ID = "engine_version_id"; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/MonitorStorageType.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/MonitorStorageType.java new file mode 100644 index 0000000..9e3b822 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/MonitorStorageType.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.utils.constant.monitor; + +public class MonitorStorageType { + /** + * 监控中心数据存储类型 + */ + public static final String Mysql = "mysql"; + public static final String HBase = "hbase"; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/RowKeyUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/RowKeyUtil.java new file mode 100644 index 0000000..ca48057 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/monitor/RowKeyUtil.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.utils.constant.monitor; + +public class RowKeyUtil { + /** + * Long.MAX_VALUE - lastUpdate 得到的值再补齐20位 + * @param lastUpdate + * @return + */ + public static String formatLastUpdate(long lastUpdate){ + if(lastUpdate<0){ + lastUpdate = 0; + } + long diff = Long.MAX_VALUE - lastUpdate; + return String.format("%0"+20+"d",diff); + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/runner/ParamTypeConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/runner/ParamTypeConst.java new file mode 100644 index 0000000..475b53b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/runner/ParamTypeConst.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.common.utils.constant.runner; + +public class ParamTypeConst { + public static final int CONSTANT = 1; + public static final int VARIABLE = 2; + public static final int CUSTOM = 3; + public static final int REGEX = 4; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/CondConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/CondConst.java new file mode 100644 index 0000000..c2c925a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/CondConst.java @@ -0,0 +1,19 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +public class CondConst { + public static final long DEFAULT_CONDITION_PARENT_ID = 0;//根节点父ID + + public static class CondType{ + public static final int RELATION_CONDITION_TYPE = 1;//关系节点类型 + public static final int EXPRESSION_CONDITION_TYPE = 2;//表达式节点类型 + public static final int LOOP_RULE_ROOT = 3 ;//循环规则的根节点 + public static final int LOOP_RULE_RESULT_CONDITION = 4;//循环规则的结果条件 + public static final int CONDITION_GROUP_ROOT = 5;//条件组的根节点 + public static final int CONDITION_GROUP_RESULT_CONDITION = 6;//条件组的结果条件 + } + public static class CondLogic{ + public static final String LOOP_RULE_LOGICAL = "for";//循环规则的逻辑符号 + public static final String CONDITION_GROUP_LOGICAL = "condGroup";//条件组的逻辑符号 + + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesDetailConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesDetailConst.java new file mode 100644 index 0000000..c998e86 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesDetailConst.java @@ -0,0 +1,13 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +public class DecisionTablesDetailConst{ + + public static final String LEFT_DETAIL_NAME = "left"; + public static final int LEFT_DETAIL_NUM = 1; + public static final String TOP_DETAIL_NAME = "top"; + public static final int TOP_DETAIL_NUM = 2; + public static final long ROOT_PARENT_ID = 0; + + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesRunnerConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesRunnerConst.java new file mode 100644 index 0000000..610a238 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/DecisionTablesRunnerConst.java @@ -0,0 +1,73 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + + +import java.util.UUID; + +public class DecisionTablesRunnerConst { + + public static final String DECISION_FILE_HEAD = " package com.baoying.enginex.executor.drools \\r\\n" + + " import java.util.Map;\\r\\n" + + " import java.util.List;\\r\\n" + + " import java.util.ArrayList;\\r\\n" + + " import java.util.HashMap;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.InputParam;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.Result;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.EngineRule;\\r\\n"; + public static final String RULE_NAME_PREFIX = " rule \t"; + public static final String RULE_SALIENCE_PREFIX = "\\r\\n salience\\t "; + public static final String RULE_CONDITION_PREFIX = "\\r\\n when \\r\\n"; + public static final String CONDITION_DETAIL_PREFIX = "\\t $inputParam : InputParam();\\r\\n Map"; + public static final String CONDITION_DETAIL_SUFFIX = " \t from $inputParam.inputParam;\\r\\n"; + public static final String RULE_DISPOSE_PREFIX = "\\t then \\r\\n"; + public static final String DISPOSE_PREFIX = + "\\t List resultList =$inputParam.getResult();\\r\\n" + + "\\t Result result =new Result(); \\r\\n" + + "\\t result.setResultType(\""; + public static final String DISPOSE_INFIX = "\"); \\r\\n" + + "\\t result.setVersionCode(\""; + public static final String DISPOSE_SUFFIX = "\"); \\r\\n" + + "\\t Map map =new HashMap<>(); \\r\\n"; + + public static final String HIT_RESULT = "\\t map.put(\"result\",true); \\r\\n"; + + public static final String RULE_END = "\\t result.setMap(map); \\r\\n" + + " resultList.add(result); \\r\\n" + + "\\t $inputParam.setResult(resultList); \\r\\n" + + " end\\r\\n"; + + public static final int DEFAULT_TYPE = 1; + + //拼装规则执行的content + public static String fitContent(String condition) { + String content = ""; + String name = "decisionTables"+UUID.randomUUID().toString().replace("-", ""); + content += DECISION_FILE_HEAD + + RULE_NAME_PREFIX + name + + RULE_SALIENCE_PREFIX + 10 + + RULE_CONDITION_PREFIX + + CONDITION_DETAIL_PREFIX + condition + + CONDITION_DETAIL_SUFFIX + + RULE_DISPOSE_PREFIX + + DISPOSE_PREFIX + DEFAULT_TYPE + + DISPOSE_INFIX + name + + DISPOSE_SUFFIX; + content += HIT_RESULT + RULE_END; + return content; + } + +// public static void main(String[] args) { +// String versionCode = "rule1"; +// Integer salience = null; +// String rule = "age>10"; +// Integer type = null; +// Integer score = 10; +// Map contentMap = new HashMap<>(); +// contentMap.put("a","a"); +// contentMap.put("b","b"); +// contentMap.put("c","c"); +// String s = fitContent(versionCode, salience, rule, type, score,contentMap); +// System.out.println(s); +// } +} + + diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/ExcelHeader.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/ExcelHeader.java new file mode 100644 index 0000000..bc06658 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/ExcelHeader.java @@ -0,0 +1,30 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +/** + * ClassName:ExcelHeader
+ * Description: Excel表头配置.
+ */ +public class ExcelHeader { + + /** + * 规则表头名称 + * */ + public static final String[] RULE_HEADER = {"规则名称","规则代码","规则描述","优先级","条件","输出"}; + + /** + * 规则表头对应属性名称 + * */ + public static final String[] RULE_ClASS = {"name","versionCode","description","priority","fieldContent","content"}; + + /** + * 评分卡表头名称 + * */ + public static final String[] SCORECARD_HEADER = {"评分卡名称","评分卡代码","评分卡描述","版本号","指标详情","评分卡规则内容"}; + + /** + * 评分卡表头对应属性名称 + * */ + public static final String[] SCORECARD_ClASS = {"name","versionCode","description","version","fieldContent","content"}; + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConditionConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConditionConst.java new file mode 100644 index 0000000..23351a5 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConditionConst.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +public class RuleConditionConst { + + public static final long DEFAULT_CONDITION_PARENT_ID = 0;//根节点父ID + public static final int RELATION_CONDITION_TYPE = 1;//关系节点类型 + public static final int EXPRESSION_CONDITION_TYPE = 2;//表达式节点类型 + + public static final String LOOP_RULE_LOGICAL = "for";//循环规则的逻辑符号 + public static final int LOOP_RULE_ROOT = 3;//循环规则的根节点 + public static final int LOOP_RULE_RESULT_CONDITION = 4;//循环规则的结果条件 + + public static final String CONDITION_GROUP_LOGICAL = "condGroup";//循环规则的逻辑符号 + public static final int CONDITION_GROUP_ROOT = 5;//循环规则的根节点 + public static final int CONDITION_GROUP_RESULT_CONDITION = 6;//循环规则的结果条件 + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConst.java new file mode 100644 index 0000000..204feff --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleConst.java @@ -0,0 +1,42 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +public class RuleConst { + public static final int STATUS_ENABLED = 1;//启用状态,默认 + public static final int STATUS_DEAD = 0;//停用状态 + public static final int STATUS_DELETE = -1;//删除状态 + + + public static final int TYPE_SYSTEM = 0;//系统规则 + public static final int TYPE_ORGAN = 1;//组织规则,默认 + public static final int TYPE_ENGINE = 2;//引擎规则 + + public static final int RULE_TYPE_TERMINATION = 0;//终止 + public static final int RULE_TYPE_SCORING = 1;//计分 + + public static final int RULE_AUDIT_TERMINATION = 2;//终止 + public static final int RULE_AUDIT_SCORING = 5;//继续 + + // runner + public static final int CONST_TYPE = 1;//常量 + public static final int VARIABLE_TYPE = 2;//变量 + + public static final int RELATION_CONDITION = 1;//关系节点表示&&或者|| + public static final int EXPRESSION_CONDITION = 2;//表达式条件 + public static final int LOOP_CONDITION = 3;//循环条件 + public static final int LOOP_RESULT_CONDITION = 4;//循环规则条件 + public static final int CONDITION_GROUP_CONDITION = 5;//条件组节点 + public static final int CONDITION_RESULT_CONDITION = 6;//条件组节点 + + + public static final int LOOP_GROUP_ACTION_TYPE_SUM = 1;//循环中求和 + public static final int LOOP_GROUP_ACTION_TYPE_ASSIGNMENT = 2;//赋值 + + public static final int LOOP_GROUP_ACTION_TYPE_OUT_VARIABLE = 3;//输出变量 + public static final int LOOP_GROUP_ACTION_TYPE_OUT_CONST = 4;//输出常量 + + public static class ScriptType { + public static final String GROOVY = "groovy"; + public static final String PYTHON = "python"; + public static final String JAVASCRIPT = "js"; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleRunnerConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleRunnerConst.java new file mode 100644 index 0000000..7ed303e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/RuleRunnerConst.java @@ -0,0 +1,86 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +import java.util.Map; + +public class RuleRunnerConst { + public static final String RULE_FILE_HEAD = " package com.baoying.enginex.executor.drools \\r\\n" + + " import java.util.Map;\\r\\n" + + " import java.util.List;\\r\\n" + + " import java.util.ArrayList;\\r\\n" + + " import java.util.HashMap;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.InputParam;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.Result;\\r\\n" + + " import com.baoying.enginex.executor.engine.model.EngineRule;\\r\\n"; + public static final String RULE_NAME_PREFIX = " rule \t"; + public static final String RULE_SALIENCE_PREFIX = "\\r\\n salience\\t "; + public static final String RULE_CONDITION_PREFIX = "\\r\\n when \\r\\n"; + public static final String CONDITION_DETAIL_PREFIX = "\\t $inputParam : InputParam();\\r\\n Map"; + public static final String CONDITION_DETAIL_SUFFIX = " \t from $inputParam.inputParam;\\r\\n"; + public static final String RULE_DISPOSE_PREFIX = "\\t then \\r\\n"; + public static final String DISPOSE_PREFIX = + "\\t List resultList =$inputParam.getResult();\\r\\n" + + "\\t Result result =new Result(); \\r\\n" + + "\\t result.setResultType(\""; + public static final String DISPOSE_INFIX = "\"); \\r\\n" + + "\\t result.setVersionCode(\""; + public static final String DISPOSE_SUFFIX = "\"); \\r\\n" + + "\\t Map map =new HashMap<>(); \\r\\n"; + + public static final String SCORE_PREFIX = "\\t map.put(\"score\","; + public static final String SCORE_SUFFIX = "); \\r\\n"; + + public static final String RULE_END = "\\t result.setMap(map); \\r\\n" + + " resultList.add(result); \\r\\n" + + "\\t $inputParam.setResult(resultList); \\r\\n" + + " end\\r\\n"; + + public static final int DEFAULT_TYPE = 1; + + //拼装规则执行的content + public static String fitRuleContent(String code, Integer salience, String rule, Integer type, Integer score, Map contentMap) { + String content = ""; + if (salience == null || salience < 0) { + salience = 0; + } + if (type == null) { + type = DEFAULT_TYPE; + } + content += RULE_FILE_HEAD + + RULE_NAME_PREFIX + code + + RULE_SALIENCE_PREFIX + salience + + RULE_CONDITION_PREFIX + + CONDITION_DETAIL_PREFIX + rule + + CONDITION_DETAIL_SUFFIX + + RULE_DISPOSE_PREFIX + + DISPOSE_PREFIX + type + + DISPOSE_INFIX + code+ + DISPOSE_SUFFIX; + if (score!=null){ + content += SCORE_PREFIX+score+SCORE_SUFFIX; + } + + if (contentMap!=null&&!contentMap.isEmpty()){ + for (String s : contentMap.keySet()) { + content+="\\t\\t map.put(\""+s+"\",\""+contentMap.get(s)+"\");\\n"; + } + + } + content += RULE_END; + + return content; + } + +// public static void main(String[] args) { +// String versionCode = "rule1"; +// Integer salience = null; +// String rule = "age>10"; +// Integer type = null; +// Integer score = 10; +// Map contentMap = new HashMap<>(); +// contentMap.put("a","a"); +// contentMap.put("b","b"); +// contentMap.put("c","c"); +// String s = fitContent(versionCode, salience, rule, type, score,contentMap); +// System.out.println(s); +// } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Status.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Status.java new file mode 100644 index 0000000..ee3b471 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Status.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +/** + * ClassName:ExcelHeader
+ * Description: 通用状态.
+ */ +public class Status { + + /** + * 启用 + * */ + public static final int ENABLED = 1; + + /** + * 停用 + * */ + public static final int DISABLE =0; + + /** + * 删除 + * */ + public static final int DELETE =-1; + + /** + * 输出 + * */ + public static final int IS_OUTPUT =1; + + /** + * 不输出 + * */ + public static final int IS_NOT_OUTPUT =0; + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/StrategyType.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/StrategyType.java new file mode 100644 index 0000000..4f216f3 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/StrategyType.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.common.utils.constant.strategyx; + +public class StrategyType { + public static final String DECISION_TABLES = "decision_tables";//决策表 + public static final String DECISION_TREE = "decision_tree";//决策树 + public static final String SCORECARD = "scorecard";//评分卡 + public static final String LIST_DB = "list_db";//名单库 + public static final String MODELS = "models";//模型 + public static final String COMPLEX_RULE = "complex_rule";//复杂规则 + public static final String BASE_RULE = "base_rule";//基础规则 + + + public static class OutType{ + public static final String SUCCESS_OUT = "success";//成功时输出 + public static final String FAIL_OUT = "fail";//失败时输出 + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Type.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Type.java new file mode 100644 index 0000000..97c5273 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/constant/strategyx/Type.java @@ -0,0 +1,44 @@ +package com.fibo.ddp.common.utils.constant.strategyx; +/** + * ClassName:ExcelHeader
+ * Description: 通用类型.
+ * @see + */ +public class Type { + /** + * 系统的 + * */ + public static final int SYSTEMATIC =0; + + /** + * 组织的 + * */ + public static final int ORGANIZATIONAL =1; + + /** + * 引擎的 + * */ + public static final int ENGINE =2; + + /** + * 树类型为规则集 + * */ + public static final int RULE_TREE =0; + + /** + * 树类型为评分卡 + * */ + public static final int SCORECARD_TREE =0; + + /** + * 树类型为回收站 + * */ + public static final int RECYCLE_TREE =0; + + /** + * 知识库映射类型 + */ + public static final int POLICY = 1; + + public static final int SCORECARD = 2; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/exception/ApiException.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/exception/ApiException.java new file mode 100644 index 0000000..bef677d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/exception/ApiException.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.common.utils.exception; + +/** + * 自定义异常消息处理 + */ +public class ApiException extends RuntimeException { + + private static final long serialVersionUID = 1136843834946392402L; + + /** + * 异常编码 + */ + public final String errCode; + + /** + * 异常消息 + */ + public final String message; + + /** + * data + */ + public final Object data; + + public ApiException(Throwable e) { + super(e); + errCode = ""; + message = ""; + data = null; + } + + public ApiException(String errCode, String message) { + super(message); + this.errCode = errCode; + this.message = message; + this.data = null; + } + + public ApiException(String errCode, String message, Object data) { + super(message); + this.errCode = errCode; + this.message = message; + this.data = data; + } + + public ApiException(String errCode, String message, Throwable e) { + super(message, e); + this.errCode = errCode; + this.message = message; + this.data = null; + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/CollectionUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/CollectionUtil.java new file mode 100644 index 0000000..9a6a31d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/CollectionUtil.java @@ -0,0 +1,104 @@ +package com.fibo.ddp.common.utils.util; + +import java.util.*; + +public class CollectionUtil { + + /** + * 集合判非空 + * + * @param collection + * @return + */ + public static boolean isNotNullOrEmpty(Collection collection) { + if (null == collection || collection.isEmpty()){ + return false; + } + return true; + } + + /** + * map判非空 + * + * @param map + * @return + */ + public static boolean isNotNullOrEmpty(Map map) { + if (null == map || map.isEmpty()){ + return false; + } + return true; + } + + /** + * 获取多个集合并集 + * @param list + * @return + */ + public static Set getUnion(List> list) { + Set set = new HashSet(); + if (list == null) { + list = new ArrayList>(); + } + int size = list.size(); + if (size > 1) { + for (int i = 0; i < size; i++) { + int j = i + 1; + if (j < size) { + list.get(0).removeAll(list.get(j)); + list.get(0).addAll(list.get(j)); + if (i == size - 2) { + List resultList = list.get(0); + for (Object result : resultList) { + set.add(result); + } + } + } + } + } else { + // 只有一个集合则直接插入结果 + for (List subList : list) { + for (Object result : subList) { + set.add(result); + } + } + } + return set; + + } + + /** + * 获取多个集合交集 + * @param list + * @return + */ + public static Set getIntersection(List> list) { + Set set = new HashSet(); + int size = list.size(); + if (size > 1) { + // 集合个数大于1,取交集 + for (int i = 0; i < size; i++) { + int j = i + 1; + if (j < size) { + list.get(0).retainAll(list.get(j)); + if (i == size - 2) { + List resultList = list.get(0); + for (Object result : resultList) { + set.add(result); + } + } + } + } + } else { + // 只有一个集合则不取交集 + for (List subList : list) { + for (Object result : subList) { + set.add(result); + } + } + } + + return set; + + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/DataHelp.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/DataHelp.java new file mode 100644 index 0000000..3513c62 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/DataHelp.java @@ -0,0 +1,40 @@ +package com.fibo.ddp.common.utils.util; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class DataHelp { + public static int day=0; + public static String getNowDate(){ + Date date = new Date(); + SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String s = simple.format(date); + return s; + } + public static String getEndDate(){ + SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar c = Calendar.getInstance(); + c.add(Calendar.DATE, + DataHelp.day); + Date monday = c.getTime(); + String s = simple.format(monday); + return s; + } + public static String getNowDateString(){ + Date date = new Date(); + SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss"); + String s = simple.format(date); + return s; + } + public static String getDay(){ + Date date = new Date(); + SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd"); + String s = simple.format(date); + return s; + } + public static void main(String[] args) { + System.out.println(getNowDate()); + System.out.println(getNowDateString()); + + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/RequestUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/RequestUtil.java new file mode 100644 index 0000000..988d689 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/RequestUtil.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.common.utils.util; + +import javax.servlet.http.HttpServletRequest; + +public class RequestUtil { + /** + * 获取客户端IP, 考虑web server代理 + * + * @param request + * @return + */ + public static String getClientIP(HttpServletRequest request) { + + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + if (ip != null&&ip.indexOf(',') > 0) { + ip = ip.substring(0, ip.indexOf(',')).trim(); + } + + return ip; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/ResponseUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/ResponseUtil.java new file mode 100644 index 0000000..31f9175 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/ResponseUtil.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.utils.util; + +import com.github.pagehelper.PageInfo; + +import java.util.HashMap; +import java.util.Map; + +public class ResponseUtil { + public static Map getResponseMap(PageInfo pageInfo){ + HashMap responseMap = new HashMap<>(); + responseMap.put("pageInfo",pageInfo); + responseMap.put("klist",pageInfo.getList()); + pageInfo.setList(null); + return responseMap; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/SnowFlakUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/SnowFlakUtil.java new file mode 100644 index 0000000..8575c1a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/SnowFlakUtil.java @@ -0,0 +1,42 @@ +package com.fibo.ddp.common.utils.util; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.net.NetUtil; +import cn.hutool.core.util.IdUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Random; + +@Component +@Slf4j +public class SnowFlakUtil { + // @JsonFormat(shape = JsonFormat.Shape.STRING) + private static long workerId = 1;//为终端ID + private static long datacenterId = 1;//数据中心ID + private static Snowflake snowflake; + @PostConstruct + public void init() { + try { + workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr()) % 32; + }catch (Exception e){ + workerId = (1+new Random().nextInt(30)); + } + log.info("当前机器的workId:{}", workerId); + snowflake = IdUtil.createSnowflake(workerId, datacenterId); + } + + public static synchronized long snowflakeId() { + return snowflake.nextId(); + } + + public static synchronized String snowflakeIdStr() { + return snowflake.nextId() + ""; + } + + public static synchronized long snowflakeId(long workerId, long datacenterId) { + Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId); + return snowflake.nextId(); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/StringUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/StringUtil.java new file mode 100644 index 0000000..263ce5d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/StringUtil.java @@ -0,0 +1,465 @@ +package com.fibo.ddp.common.utils.util; + +import com.fibo.ddp.common.utils.constant.SysConstant; + +import java.math.BigDecimal; +import java.util.*; + +/** + * @ClassName: StringUtil + * @Description: String 工具类 + */ +public class StringUtil { + + /** + *

判断是否是有效的字符串,空字符串为无效字符串

+ * + * @param str + * @return boolean + */ + public static boolean isValidStr(String str) { + return str != null && str.trim().length() > 0; + } + + /** + *

判断是字符串否是为空,字符串为空,返回 "",反之返回其字符串本身.

+ * + *

if str is null then convret str to "".

+ * + * @param str + * @return String + */ + public static String convertStrIfNull(String str) { + return str == null ? SysConstant.EMPTY_STRING : str; + } + + /** + *

根据字符串转换为布尔值.

+ * + * @param str + * @return boolean + */ + public static boolean getStrToBoolean(String str) { + return isValidStr(str) ? str.toLowerCase().trim().equals(SysConstant.TRUE) : false; + } + + /** + *

根据字符串转换为 整型(int)并返回;转换失败,则返回0.

+ * + *

convert str dictValue to int. if fail,then return 0.

+ * + * @param str + * @return int + */ + public static int getStrToInt(String str) { + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return 0; + } + } + + /** + *

根据字符串转换为 整型(int)并返回;转换失败,则返回 指定的值.

+ * + *

convert str dictValue to int. if fail,then return defaultvalue.

+ * + * @param str + * @param defaultValue + * @return int + */ + public static int getStrToInt(String str, int defaultValue) { + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + *

根据字符串转换为long.

+ * + * @param str + * @return long + */ + public static long getStrTolong(String str) { + long result = 0; + if (!isValidStr(str)) { + return result; + } + try { + result = Long.parseLong(str); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据字符串转换为double.

+ * + *

convert String to double

+ * + * @param str + * @return double + */ + public static double getStrTodouble(String str) { + double result = 0; + if (!isValidStr(str)) { + return result; + } + try { + result = Double.parseDouble(str); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据字符串转换为BigDecimal.

+ * + *

convert String object to BigDecimal

+ * + * @param str + * @return BigDecimal + */ + public static BigDecimal getStrToBigDecimal(String str) { + BigDecimal result = new BigDecimal(0); + if (!isValidStr(str)) { + return result; + } + try { + result = new BigDecimal(str); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据字符串转换为Integer.

+ * + *

convert String to Integer.

+ * + * @param str + * @return Integer + */ + public static Integer getStrToInteger(String str) { + Integer result = new Integer(0); + if (!isValidStr(str)) { + return result; + } + try { + result = Integer.valueOf(str); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据字符串转换为Long.

+ * + *

convert String to Long.

+ * + * @param str + * @return Long + */ + public static Long getStrToLong(String str) { + Long result = new Long(0); + if (!isValidStr(str)) { + return result; + } + try { + result = Long.valueOf(str.trim()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据字符串转换为Double.

+ * + *

convert String to Double

+ * + * @param str + * @return Double + */ + public static Double getStrToDouble(String str) { + Double result = new Double(0); + if (!isValidStr(str)) { + return result; + } + try { + result = Double.valueOf(str); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return result; + } + + /** + *

根据数组转换为字符串,用","拼接.

+ *

例:

+ *

    String[] strArray = new String[]{"How","do","you","do"};

+ *

    拼接后字符串样例:How,do,you,do

+ * + *

convert Object array to String use ",".

+ * + * @param Object[] + * @return String + */ + public static String getArrToStr(Object[] obj) { + if (obj == null) { + return null; + } + + StringBuffer buffer = new StringBuffer(); + if (obj.length > 0) { + buffer.append(obj[0]); + } + + for (int m = 1; m < obj.length; m++) { + buffer.append(SysConstant.COMMA).append(obj[m]); + } + + return buffer.toString(); + } + + /** + *

去掉重复数据(1,2,3,2,4 => 1,2,3,4)

+ * + * @param metadata + * @param tagStr + * @return String + */ + public static String removeEqualStr(String metadata, String tagStr) { + if (!StringUtil.isValidStr(metadata)) { + return SysConstant.EMPTY_STRING; + } + Set set = new HashSet(); + String[] arr = metadata.split(tagStr); + for (String temp : arr) { + if (StringUtil.isValidStr(temp)) { + set.add(temp); + } + } + Iterator it = set.iterator(); + StringBuffer returnMetadata = new StringBuffer(); + while (it.hasNext()) { + returnMetadata.append(it.next() + tagStr); + } + return returnMetadata.toString().substring(0,returnMetadata.length() - 1); + } + + /** + *

查询是否有重复数据

+ * + * @param strArr + * @param str + * @param tagStr + * @return boolean + */ + public static boolean hasEqualStr(String strArr, String str, String tagStr) { + boolean bool = false; + if (StringUtil.isValidStr(strArr)) { + String[] arr = strArr.split(tagStr); + for (String temp : arr) { + if (temp.equals(str)) { + bool = true; + break; + } + } + } + return bool; + } + + /** + *

根据字符串将其转换编码为UTF-8的字符串.

+ * + *

convert type to utf-8

+ * + * @param str + * @return utf-8 string + */ + public static String toUtf8String(String str) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (c >= 0 && c <= 255) { + sb.append(c); + } else { + byte[] b; + try { + b = Character.toString(c).getBytes("utf-8"); + } catch (Exception ex) { + b = new byte[0]; + } + for (int j = 0; j < b.length; j++) { + int k = b[j]; + if (k < 0) + k += 256; + sb.append("%" + Integer.toHexString(k).toUpperCase()); + } + } + } + return sb.toString(); + } + + /** + *

根据字符串指定的位置更新字符串内容

+ * + * @param formString 被更新字符串 + * @param updateIndex 选择更新位数 + * @param updateValue 更新为值 + * + * @return String + */ + public static String formatIntegrity(String formatString, int updateIndex, char updateValue) { + if (!isValidStr(formatString)) { + return formatString; + } + if (updateIndex < 1) { + return formatString; + } + if (updateIndex > formatString.length()) { + return formatString; + } + char[] formatStringChar = formatString.toCharArray(); + formatStringChar[updateIndex] = updateValue; + + return String.valueOf(formatStringChar); + } + + /** + *

转换特殊字符

+ * + * @param str 含有特殊字符的字符串 + * + * @return String + */ + public static String converSpecialChar(String str) { + if (!isValidStr(str)) { + return str; + } + str = str.trim(); + if (str.indexOf("\\") >= 0) { + str = str.replaceAll("\\\\", "\\\\\\\\\\\\\\\\"); + } + if (str.indexOf("'") >= 0) { + str = str.replaceAll("'", "\\\\'"); + } + if (str.indexOf("\"") >= 0) { + str = str.replaceAll("\"", "\\\\\""); + } + if (str.indexOf("%") >= 0) { + str = str.replaceAll("%", "\\\\%"); + } + return str; + } + + /** + *

获取字符串字节长度(包含中文和中文符号)

+ * + * @param str 含有中文和中文符号的字符串 + * + * @return int + */ + public static int getLength(String str){ + return str.replaceAll("[\u4E00-\u9FA5\u3000-\u303F\uFF00-\uFFEF]", "rr").length(); + } + + /** + *

此排序方法仅应用于数字类型的string数字排序

+ * + * @param arrays 有long类型的数字组成的String 数组 + * @return 排序后的数组 + */ + public static String[] sortArrays(String[] arrays){ + for(int i = 0; i < arrays.length - 1; i++) { + String temp =""; + for(int j = 0; j < arrays.length - i - 1; j++) { + if(StringUtil.getStrTolong(arrays[j]) >StringUtil.getStrTolong(arrays[j +1])) { + temp = arrays[j + 1]; + arrays[j + 1] = arrays[j]; + arrays[j] = temp; + } + } + } + return arrays; + } + + /** + *

此排序方法仅应用于浮点类型的string数字排序

+ * + * @param arrays 有浮点类型的数字组成的String 数组 + * @return 排序后的数组 + */ + public static String[] sortArraystoBigDecimal(String[] arrays) { + for (int i = 0; i < arrays.length - 1; i++) { + String temp = ""; + for (int j = 0; j < arrays.length - i - 1; j++) { + if (StringUtil.getStrToBigDecimal(arrays[j]).compareTo( + StringUtil.getStrToBigDecimal(arrays[j + 1])) == 1) { + temp = arrays[j + 1]; + arrays[j + 1] = arrays[j]; + arrays[j] = temp; + } + } + } + return arrays; + } + + /** + *

判断字符串是否为NUll,或者为空字符

+ * @param str 字符串 + * @return boolean + * */ + public static boolean isBlank(String str){ + if(str == null || str.equals("")){ + return true; + } + return false; + } + + + /** + *

将字符拆分,并放入list集合

+ * @param str 字符串 + * @return list + * */ + public static List toLongList(String str){ + List idList = new ArrayList(); + if(!isBlank(str)){ + String[] idsArray = str.split(","); + for (int i = 0; i < idsArray.length; i++) { + idList.add(Long.parseLong(idsArray[i])); + } + } + return idList; + } + + + public static String listToString(List list, char separator) { + return org.apache.commons.lang.StringUtils.join(list.toArray(),separator); + } + + public static void main(String[] args) { + //String result = "aaaa ,,aaa"; + //System.out.println(getLength(result)); + + String[] strArray = new String[]{"How","d$o","you","do"}; + strArray = new String[]{"5.36","5.003","1.36","9.87","3.33333379"}; + //strArray = StringUtil.sortArrays(strArray); + strArray = StringUtil.sortArraystoBigDecimal(strArray); + String str = StringUtil.getArrToStr(strArray); + System.out.println(str); + + //System.out.println(StringUtil.formatIntegrity("dkkemnkn", 2, '6')); + + } + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/DictVariableUtils.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/DictVariableUtils.java new file mode 100644 index 0000000..1a3ee33 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/DictVariableUtils.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.common.utils.util.runner; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; + +import java.util.Date; + +public class DictVariableUtils { + + public static Object getValueFromJsonObject(JSONObject jsonObject){ + Object result = ""; + if (jsonObject.get("value") != null) { + switch (jsonObject.getString("type")){ + case "date": + try { + result = DateUtil.format(new Date(),jsonObject.getString("value")); + }catch (Exception e){ + e.printStackTrace(); + result = DateUtil.format(new Date(),"yyyyMMdd"); + } + break; + default: + result = jsonObject.get("value"); + } + } + return result; + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/JevalUtil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/JevalUtil.java new file mode 100644 index 0000000..811f0cb --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/JevalUtil.java @@ -0,0 +1,167 @@ +package com.fibo.ddp.common.utils.util.runner; + +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineOperator; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; + +import java.util.Map; + +/** + * 表达式解析器入口 + */ +public class JevalUtil { + + /** + * 获取执行布尔值结果 + * @param expression + * @param params + * @return + * @throws EvaluationException + */ + public static Boolean evaluateBoolean(String expression,Map params) throws EvaluationException { + Evaluator evaluator = getEvaluator(params); + return evaluator.getBooleanResult(expression); + } + + /** + * 获取执行数字结果 + * @param expression + * @param params + * @return + * @throws EvaluationException + */ + public static Double evaluateNumric(String expression,Map params) throws EvaluationException{ + Evaluator evaluator = getEvaluator(params); + return evaluator.getNumberResult(expression); + } + + /** + * 获取执行String结果 + * @param expression + * @param params + * @return + * @throws EvaluationException + */ + public static String evaluateString(String expression,Map params) throws EvaluationException{ + Evaluator evaluator = getEvaluator(params); + return evaluator.evaluate(expression,false,true); + } + + /** + * 获取绑定参数的Evaluator + * @param params + * @return + * @throws EvaluationException + */ + private static Evaluator getEvaluator(Map params){ + Evaluator evaluator = new Evaluator(); + if(params != null && !params.isEmpty()){ + for (Map.Entry entry : params.entrySet()) { + if(null!=entry.getValue()){ + evaluator.putVariable(entry.getKey(), entry.getValue().toString()); + } + } + } + return evaluator; + } + + /** + * 根据区间表达式解析区间 + * @param expression,eg:[3,5],inputParam:字段code + * @return + */ + public static String getNumericInterval(String expression,String param){ + StringBuffer result = new StringBuffer(); + //先把变量进行加工#{inputParam} + param = EngineOperator.OPERATOR_VARIABLE_LEFT+param+EngineOperator.OPERATOR_VARIABLE_RIGHT; + //如果是纯数字,代表==,直接拼接 + if(!expression.startsWith(EngineOperator.OPERATOR_LEFT_PARENTHESES) && !expression.startsWith(EngineOperator.OPERATOR_LEFT_BRACKET) + && !expression.endsWith(EngineOperator.OPERATOR_RIGHT_PARENTHESES) && !expression.endsWith(EngineOperator.OPERATOR_RIGHT_BRACKET)){ + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_EQUALS_RELATION).append(CommonConst.SYMBOL_BLANK).append(expression); + return result.toString(); + } + //获取到取值区间 + String exp = expression.substring(1, expression.length()-1); + String[] segments = null; + if(exp.startsWith(CommonConst.SYMBOL_COMMA)){ + segments = new String[1]; + segments[0] = exp.substring(1); + }else{ + segments = exp.split(CommonConst.SYMBOL_COMMA); + } + //判断取值范围(,3)(4,) + if(segments.length == 1){ + //说明是(,3),(4,) + if(expression.substring(1, expression.length()-1).startsWith(CommonConst.SYMBOL_COMMA)){ + //以逗号开始(,3) + if(expression.endsWith(EngineOperator.OPERATOR_RIGHT_PARENTHESES)){ + //小括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_LESS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + }else if(expression.endsWith(EngineOperator.OPERATOR_RIGHT_BRACKET)){ + //大括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_LESS_EQUALS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + } + }else{ + //以逗号结尾(4,) + if(expression.startsWith(EngineOperator.OPERATOR_LEFT_PARENTHESES)){ + //小括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_GREATER_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + }else if(expression.startsWith(EngineOperator.OPERATOR_LEFT_BRACKET)){ + //大括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_GREATER_EQUALS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + } + } + }else if(segments.length == 2){ + //开始符号 + if(expression.startsWith(EngineOperator.OPERATOR_LEFT_PARENTHESES)){ + //小括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_GREATER_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + }else if(expression.startsWith(EngineOperator.OPERATOR_LEFT_BRACKET)){ + //大括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_GREATER_EQUALS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[0]); + } + //都是&&关系 + result.append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_AND_RELATION).append(CommonConst.SYMBOL_BLANK); + //结束符号 + if(expression.endsWith(EngineOperator.OPERATOR_RIGHT_PARENTHESES)){ + //小括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_LESS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[1]); + }else if(expression.endsWith(EngineOperator.OPERATOR_RIGHT_BRACKET)){ + //大括号 + result.append(param).append(CommonConst.SYMBOL_BLANK).append(EngineOperator.OPERATOR_LESS_EQUALS_RELATION).append(CommonConst.SYMBOL_BLANK).append(segments[1]); + } + } + return result.toString(); + } + + /** + * 变量值转义 + * @param fieldsMap + * @param variablesMap + * @return + */ + public static Map convertVariables(Map fieldsMap,Map variablesMap){ + if(CollectionUtil.isNotNullOrEmpty(variablesMap)){ + if(!CollectionUtil.isNotNullOrEmpty(fieldsMap)){ + return variablesMap; + } + String key = ""; + Integer value = null; + for (Map.Entry entry : variablesMap.entrySet()) { + key = entry.getKey(); + value = fieldsMap.get(key); + if(value == null){ + continue; + } + //2代表字符串 + if(value == 2){ + String variableValue = CommonConst.SYMBOL_SINGLE_QUOTA+variablesMap.get(key).toString()+CommonConst.SYMBOL_SINGLE_QUOTA; + variablesMap.put(key, variableValue); + } + } + } + return variablesMap; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/NumUtils.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/NumUtils.java new file mode 100644 index 0000000..85491bd --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/NumUtils.java @@ -0,0 +1,23 @@ +package com.fibo.ddp.common.utils.util.runner; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class NumUtils { + + public static double toDouble(Object o){ + double d = 0D; + if (o==null){ + return d; + } + try { + d = Double.valueOf(o.toString()).doubleValue(); + + }catch (Exception e){ + log.error("转换为double失败,原值:{}",o); + e.printStackTrace(); + } + return d; + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/StrUtils.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/StrUtils.java new file mode 100644 index 0000000..002950f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/StrUtils.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.utils.util.runner; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StrUtils { + //判断是否为一个数字 + public static boolean isNum(String str){ + if (str==null||"".equals(str)){ + return false; + } + Pattern pattern = Pattern.compile("^(-|\\+)?\\d+(\\.\\d+)?$"); + Matcher isNum = pattern.matcher(str); + if (!isNum.matches()) { + return false; + } + return true; + } + //将字符串转为Long类型 + public static Long strToLong(String str){ + if (isNum(str)){ + return Long.valueOf(str); + } + return null; + } + public static Double strToDouble(String str){ + if (isNum(str)){ + return Double.valueOf(str); + } + return null; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ArgumentTokenizer.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ArgumentTokenizer.java new file mode 100644 index 0000000..1d31ac3 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ArgumentTokenizer.java @@ -0,0 +1,119 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import java.util.Enumeration; + +/** + * This class allow for tokenizer methods to be called on a String of arguments. + */ +public class ArgumentTokenizer implements Enumeration { + + /** + * The default delimitor. + */ + public final char defaultDelimiter = + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR; + + // The arguments to be tokenized. This is updated every time the nextToken + // method is called. + private String arguments = null; + + // The separator between the arguments. + private char delimiter = defaultDelimiter; + + /** + * Constructor that takes a String of arguments and a delimitoer. + * + * @param arguments + * The String of srguments to be tokenized. + * @param delimiter + * The argument tokenizer. + */ + public ArgumentTokenizer(final String arguments, final char delimiter) { + this.arguments = arguments; + this.delimiter = delimiter; + } + + /** + * Indicates if there are more elements. + * + * @return True if there are more elements and false if not. + */ + public boolean hasMoreElements() { + return hasMoreTokens(); + } + + /** + * Indicates if there are more tokens. + * + * @return True if there are more tokens and false if not. + */ + public boolean hasMoreTokens() { + + if (arguments.length() > 0) { + return true; + } + + return false; + } + + /** + * Returns the next element. + * + * @return The next element. + */ + public Object nextElement() { + return nextToken(); + } + + /** + * Returns the next token. + * + * @return The next element. + */ + public String nextToken() { + int charCtr = 0; + int size = arguments.length(); + int parenthesesCtr = 0; + String returnArgument = null; + + // Loop until we hit the end of the arguments String. + while (charCtr < size) { + if (arguments.charAt(charCtr) == '(') { + parenthesesCtr++; + } else if (arguments.charAt(charCtr) == ')') { + parenthesesCtr--; + } else if (arguments.charAt(charCtr) == delimiter + && parenthesesCtr == 0) { + + returnArgument = arguments.substring(0, charCtr); + arguments = arguments.substring(charCtr + 1); + break; + } + + charCtr++; + } + + if (returnArgument == null) { + returnArgument = arguments; + arguments = ""; + } + + return returnArgument; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationConstants.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationConstants.java new file mode 100644 index 0000000..89f5cad --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationConstants.java @@ -0,0 +1,63 @@ +package com.fibo.ddp.common.utils.util.runner.jeval; + +/** + * Contains constants used by classes in this package. + */ +public class EvaluationConstants { + + /** + * The single quote character. + */ + public static final char SINGLE_QUOTE = '\''; + + /** + * The double quote character. + */ + public static final char DOUBLE_QUOTE = '"'; + + /** + * The open brace character. + */ + public static final char OPEN_BRACE = '{'; + + /** + * The closed brace character. + */ + public static final char CLOSED_BRACE = '}'; + + /** + * The pound sign character. + */ + public static final char POUND_SIGN = '#'; + + /** + * The open variable string. + */ + public static final String OPEN_VARIABLE = String.valueOf(POUND_SIGN) + + String.valueOf(OPEN_BRACE); + + /** + * The closed brace string. + */ + public static final String CLOSED_VARIABLE = String.valueOf(CLOSED_BRACE); + + /** + * The true value for a Boolean string. + */ + public static final String BOOLEAN_STRING_TRUE = "1.0"; + + /** + * The false value for a Boolean string. + */ + public static final String BOOLEAN_STRING_FALSE = "0.0"; + + /** + * The comma character. + */ + public static final char COMMA = ','; + + /** + * The function argument separator. + */ + public static final char FUNCTION_ARGUMENT_SEPARATOR = COMMA; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationException.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationException.java new file mode 100644 index 0000000..190ad95 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationException.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +/** + * This exception is thrown when an error occurs during the evaluation process. + */ +public class EvaluationException extends Exception { + + private static final long serialVersionUID = -3010333364122748053L; + + /** + * This constructor takes a custom message as input. + * + * @param message + * A custom message for the exception to display. + */ + public EvaluationException(String message) { + super(message); + } + + /** + * This constructor takes an exception as input. + * + * @param exception + * An exception. + */ + public EvaluationException(Exception exception) { + super(exception); + } + + /** + * This constructor takes an exception as input. + * + * @param message + * A custom message for the exception to display. + * @param exception + * An exception. + */ + public EvaluationException(String message, Exception exception) { + super(message, exception); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationHelper.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationHelper.java new file mode 100644 index 0000000..a119bd7 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationHelper.java @@ -0,0 +1,87 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +public class EvaluationHelper { + + /** + * Replaces all old string within the expression with new strings. + * + * @param expression + * The string being processed. + * @param oldString + * The string to replace. + * @param newString + * The string to replace the old string with. + * + * @return The new expression with all of the old strings replaced with new + * strings. + */ + public static String replaceAll(final String expression, + final String oldString, final String newString) { + + String replacedExpression = expression; + + if (replacedExpression != null) { + int charCtr = 0; + int oldStringIndex = replacedExpression.indexOf(oldString, charCtr); + + while (oldStringIndex > -1) { + // Remove the old string from the expression. + final StringBuffer buffer = new StringBuffer(replacedExpression + .substring(0, oldStringIndex) + + replacedExpression.substring(oldStringIndex + + oldString.length())); + + // Insert the new string into the expression. + buffer.insert(oldStringIndex, newString); + + replacedExpression = buffer.toString(); + + charCtr = oldStringIndex + newString.length(); + + // Determine if we need to continue to search. + if (charCtr < replacedExpression.length()) { + oldStringIndex = replacedExpression.indexOf(oldString, + charCtr); + } else { + oldStringIndex = -1; + } + } + } + + return replacedExpression; + } + + /** + * Determines if a character is a space or white space. + * + * @param character + * The character being evaluated. + * + * @return True if the character is a space or white space and false if not. + */ + public static boolean isSpace(final char character) { + + if (character == ' ' || character == '\t' || character == '\n' + || character == '\r' || character == '\f') { + return true; + } + + return false; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationResult.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationResult.java new file mode 100644 index 0000000..b05fe4f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/EvaluationResult.java @@ -0,0 +1,177 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +/** + * This class can be used to wrap the result of an expression evaluation. It + * contains useful methods for evaluating the contents of the result. + */ +public class EvaluationResult { + + // The value returned from the evaluation of an expression. + private String result; + + // The quote character specified in the evaluation of the expression. + private char quoteCharacter; + + /** + * Constructor. + * + * @param result + * The value returned from the evaluation of an expression. + * @param quoteCharacter + * The quote character specified in the evaluation of the + * expression. + */ + public EvaluationResult(String result, char quoteCharacter) { + + this.result = result; + this.quoteCharacter = quoteCharacter; + } + + /** + * Returns the quote character. + * + * @return The quote character. + */ + public char getQuoteCharacter() { + return quoteCharacter; + } + + /** + * Sets the quote character. + * + * @param quoteCharacter + * The quoteCharacter to set. + */ + public void setQuoteCharacter(char quoteCharacter) { + this.quoteCharacter = quoteCharacter; + } + + /** + * Returns the result value. + * + * @return The result value. + */ + public String getResult() { + return result; + } + + /** + * Sets the result value. + * + * @param result + * The result to set. + */ + public void setResult(String result) { + this.result = result; + } + + /** + * Returns true if the result value is equal to the value of a Boolean true + * string (1.0). + * + * @return True if the result value is equal to the value of a Boolean true + * string (1.0). + */ + public boolean isBooleanTrue() { + + if (result != null + && EvaluationConstants.BOOLEAN_STRING_TRUE.equals(result)) { + + return true; + } + + return false; + } + + /** + * Returns true if the result value is equal to the value of a Boolean false + * string (0.0). + * + * @return True if the result value is equal to the value of a Boolean false + * string (0.0). + */ + public boolean isBooleanFalse() { + + if (result != null + && EvaluationConstants.BOOLEAN_STRING_FALSE.equals(result)) { + + return true; + } + + return false; + } + + /** + * Returns true if the result value starts with a quote character and ends + * with a quote character. + * + * @return True if the result value starts with a quote character and ends + * with a quote character. + */ + public boolean isString() { + + if (result != null && result.length() >= 2) { + + if (result.charAt(0) == quoteCharacter + && result.charAt(result.length() - 1) == quoteCharacter) { + + return true; + } + } + + return false; + } + + /** + * Returns a Double for the result value. + * + * @return A Double for the result value. + * + * @throws NumberFormatException + * Thrown if the result value is not a double. + */ + public Double getDouble() throws NumberFormatException { + + return new Double(result); + } + + /** + * Returns the unwrapped string for the result value. An unwrapped string is + * a string value without the quote characters that wrap the result value. + * For a string to be returned, then the first character must be a quote + * character and the last character must be a quote character. Otherwise, a + * null value is returned. + * + * @return The normal string for the result value. Null will be returned if + * the result value is not of a string type. + */ + public String getUnwrappedString() { + + if (result != null && result.length() >= 2) { + + if (result.charAt(0) == quoteCharacter + && result.charAt(result.length() - 1) == quoteCharacter) { + + return result.substring(1, result.length() - 1); + } + } + + return null; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/Evaluator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/Evaluator.java new file mode 100644 index 0000000..67f6032 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/Evaluator.java @@ -0,0 +1,1703 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; +import com.fibo.ddp.common.utils.util.runner.jeval.function.math.MathFunctions; +import com.fibo.ddp.common.utils.util.runner.jeval.function.string.StringFunctions; +import com.fibo.ddp.common.utils.util.runner.jeval.operator.*; + +import java.util.*; + +/** + * This class is used to evaluate mathematical, string, Boolean and functional + * expressions. It is the main entry point into the JEval API.
+ *
+ * The following types of expressions are supported:
+ *
    + *
  • mathematical Expression involving numbers. Numbers are treated + * as doubles, so resulting numbers will contain at least one decimal place.
  • + *
  • string String can also be added together, compared, etc...
  • + *
  • Boolean Expression that evaluate to true (1.0) and false (0.0).
  • + *
  • functional Custom functions can be created or there are many + * Math and String functions that JEval supplies with this class.
  • + *
+ * The following operators are supported:
+ *
    + *
  • ( open parentheses
  • + *
  • ) closed parentheses
  • + *
  • + addition (for numbers and strings)
  • + *
  • - subtraction
  • + *
  • * multiplication
  • + *
  • / division
  • + *
  • % modulus
  • + *
  • + unary plus
  • + *
  • - unary minus
  • + *
  • = equal (for numbers and strings)
  • + *
  • != not equal (for numbers and strings)
  • + *
  • < less than (for numbers and strings)
  • + *
  • <= less than or equal (for numbers and strings)
  • + *
  • > greater than (for numbers and strings)
  • + *
  • >= greater than or equal (for numbers and strings)
  • + *
  • && boolean and
  • + *
  • || boolean or
  • + *
  • ! boolean not
  • + *
+ * Allows for prebuilt and custom functions.
+ *
    + *
  • JEval already comes with many functions which represent most of the + * methods in the Math and String classes in the standard JDK.
  • + *
  • Thirty-nine math and string functions come built in. See the + * net.sourceforge.jeval.functions.math and + * net.sourceforge.jeval.functions.string packages for details on these ready to + * use functions. You can choose to not load these functions if we you want to + * gain a small improvement in performance.
  • + *
  • Functions must be followed by an open parentheses and a closed + * parentheses which contain any required parameters.
  • + *
  • For more details on functions, see the Function class and the test + * classes.
  • + *
+ * Allows for variables.
+ *
    + *
  • Variable must be enclosed by a pound sign and open brace #{ and a closed + * brace }. i.e. expression = "#{a} + #{b}"
  • + *
  • Two math variables come built in. The E and PI variables represent the + * same value as the Math.E and Math.PI constants in the standard Java SDK. You + * can choose not to load these variables.
  • + *
+ * Notes on expression parsing: + *
    + *
  • Spaces are ignored when parsing expressions.
  • + *
  • The order of precedence used by this class is as follows from highest to + * lowest.
  • + *
  • The expression is evaluated as one or more subexpressions. + * Subexpressions within open parentheses and closed parentheses are evaluated + * before other parts of the expression.
  • + *
  • Inner most subexpression are evaluated first working outward.
  • + *
  • Subexpressions at the same level are evaluated from left to right.
  • + *
  • When evaluating expressions and subexpressions, operators are evaluated + * with the following precedence listed below.
  • + *
  • Operators with with the same precedence are evaluated from left to + * right.
  • + *
  • Once the expression is parsed, Variables are replaced with their values. + * The evaluator has its own internal variable map that it used to resolve + * variable values. All of the variable related methods on the evaluator refer + * to this internal map. You can choose to set you own variable resolver on your + * evaluator instance. If you do this, then variables resolved by your resolver + * will override any variables in the evaluator's internal variable map.
  • + *
  • Functions are then executed and replaced with their results. Function + * arguments are each individually evaluated as subexpressions that are comma + * separated. This gives you the ability to use nested functions in your + * expressions. You can choose not to evaluate function arguments as expressions + * and instead let the functions handle the arguments themselves. This in effect + * turns off nested expressions, unless you versionCode nested expression support into + * your own custom functions.
  • + *
  • Once all variables and functions are resolved, then the parsed + * expression and subexpressions are evaluated according to operator precedence.
  • + *
+ * Operator precedence: + *
    + *
  • + unary plus, - unary minus, ! boolean not
  • + *
  • * multiplication, / division, % modulus
  • + *
  • + addition, - subtraction
  • + *
  • < less than, <= less than or equal, > greater than, >= greater than or + * equal
  • + *
  • = equal, != not equal
  • + *
  • && boolean and
  • + *
  • || boolean or
  • + *
+ * Function and variable names can not break any of the following rules:
+ *
    + *
  • can not start with a number
  • + *
  • can not contain an operator (see the above list of operators)/li> + *
  • can not contain a quote character - single or double/li> + *
  • can not contain a brace character - open or closed/li> + *
  • can not contain one of the following special characters: #, ~ , ^ !
  • + *
+ * Other Notes: + *
    + *
  • This class is not thread safe.
  • + *
  • Allows for the quote character (single or double) to be specified at run + * time. Quote characters are required for specifying string values.
  • + *
  • Expressions can contain different types of expressions within the same + * expression. However, Numeric and string types can not be mixed in a left / + * right operand pair.
  • + *
  • An expression can be parsed before being evaluated by calling the parse() + * method. This may save on response time if parsing takes more than a few + * seconds. However, parsing is usually very fast, so this is probably not + * needed.
  • + *
  • If an expression does not change, it will not be parsed each + * time the expression is evaluated. Therefore, variables values can change and + * the expression can be evaluated again without having to re-parse the + * expression.
  • + *
  • Nested functions calls are supported. Nested function support can be + * turned off to improve performance. Custom functions can be coded to handle + * nested calls instead if desired.
  • + *
  • The string used to start variables, "#{", can not appear in an + * expression. + *
  • See the evaluate methods in this class, JUnit tests and samples for more + * details.
  • + *
+ */ +public class Evaluator { + + // Contains all of the operators. + private List operators = new ArrayList(); + + // Contains all of the functions in use. + private Map functions = new HashMap(); + + // Contains all of the variables in use. + private Map variables = new HashMap(); + + // The quote character in use. + private char quoteCharacter = EvaluationConstants.SINGLE_QUOTE; + + // The open parentheses operator. + private Operator openParenthesesOperator = new OpenParenthesesOperator(); + + // The closed parentheses operator. + private Operator closedParenthesesOperator = new ClosedParenthesesOperator(); + + // Indicates if the user wants to load the system math variables. + private boolean loadMathVariables; + + // Indicates if the user wants to load the system math functions. + private boolean loadMathFunctions; + + // Indicates if the user wants to load the system string functions. + private boolean loadStringFunctions; + + // Indicates if the user wants to process nested function calls. + private boolean processNestedFunctions; + + // Saves the previous expression, because we do not want to parse it, if + // it did not change. + private String previousExpression = null; + + // The previous stack of parsed operators + private Stack previousOperatorStack = null; + + // The previous stack of parsed operands. + private Stack previousOperandStack = null; + + // The stack of parsed operators + private Stack operatorStack = null; + + // The stack of parsed operands. + private Stack operandStack = null; + + // Allows for user to set their own variable resolver. + private VariableResolver variableResolver = null; + + /** + * The default constructor. This constructor calls the five parameter + * Evaluator constructor and passes in the following default values: + * SINGLE_QUOTE, true, true, true and true. + */ + public Evaluator() { + this(EvaluationConstants.SINGLE_QUOTE, true, true, true, true); + } + + /** + * The main constructor for Evaluator. + * + * @param quoteCharacter + * The quote character to use when evaluating expression. + * @param loadMathVariables + * Indicates if the standard Math variables should be loaded or + * not. + * @param loadMathFunctions + * Indicates if the standard Math functions should be loaded or + * not. + * @param loadStringFunctions + * Indicates if the standard String functions should be loaded or + * not. + * @param processNestedFunctions + * Indicates if nested function calls should be processed or not. + * + * @exception IllegalArgumentException + * Thrown when the quote character is not a valid quote + * character. + */ + public Evaluator(final char quoteCharacter, + final boolean loadMathVariables, final boolean loadMathFunctions, + final boolean loadStringFunctions, + final boolean processNestedFunctions) { + + // Install the operators used by Evaluator. + installOperators(); + + // Install the system variables. + this.loadMathVariables = loadMathVariables; + loadSystemVariables(); + + // Install the system functions. + this.loadMathFunctions = loadMathFunctions; + this.loadStringFunctions = loadStringFunctions; + loadSystemFunctions(); + + // Set the default quote character. + setQuoteCharacter(quoteCharacter); + + // Process nested function calls. + this.processNestedFunctions = processNestedFunctions; + } + + /** + * Returns the current quote character in use. + * + * @return The quote character in use. + */ + public char getQuoteCharacter() { + return quoteCharacter; + } + + /** + * Sets the quote character to use when evaluating expressions. + * + * @param quoteCharacter + * The quote character to use when evaluating expressions. + * + * @exception IllegalArgumentException + * Thrown when the quote character is not a valid quote + * character. + */ + public void setQuoteCharacter(final char quoteCharacter) { + if (quoteCharacter == EvaluationConstants.SINGLE_QUOTE + || quoteCharacter == EvaluationConstants.DOUBLE_QUOTE) { + this.quoteCharacter = quoteCharacter; + } else { + throw new IllegalArgumentException("Invalid quote character."); + } + } + + /** + * Adds a function to the list of functions to use when evaluating + * expressions. + * + * @param function + * The function being added. + * + * @exception IllegalArgumentException + * Thrown when the function name is not valid or the function + * name is already in use. + */ + public void putFunction(final Function function) { + // Make sure the function name is valid. + isValidName(function.getName()); + + // Make sure the function name isn't already in use. + final Function existingFunction = (Function) functions.get(function + .getName()); + + if (existingFunction == null) { + functions.put(function.getName(), function); + } else { + throw new IllegalArgumentException("A function with the same name " + + "already exists."); + } + } + + /** + * Returns a funtion from the list of functions. If the function can not be + * found in the list of functions, then null will be returned. + * + * @param functionName + * The name of the function to retrieve the value for. + * + * @return The value for a function in the list of function. + */ + public Function getFunction(final String functionName) { + return (Function) functions.get(functionName); + } + + /** + * Removes the function from the list of functions to use when evaluating + * expressions. + * + * @param functionName + * The name of the function to remove. + */ + public void removeFunction(final String functionName) { + if (functions.containsKey(functionName)) { + functions.remove(functionName); + } else { + throw new IllegalArgumentException("The function does not exist."); + } + } + + /** + * Removes all of the functions at one time. + */ + public void clearFunctions() { + // Remove all functions. + functions.clear(); + + // Reload the system functions if necessary. + loadSystemFunctions(); + } + + /** + * Rturns the map of functions currently set on this object. + * + * @return the map of functions currently set on this object. + */ + public Map getFunctions() { + return functions; + } + + /** + * Sets the map of functions for this object. + * + * @param functions The map of functions for this object. + */ + public void setFunctions(Map functions) { + this.functions = functions; + } + + /** + * Adds or replaces a variable to the list of variables to use when + * evaluating expressions. If the variable already exists, then its value + * will be overlaid. + * + * @param variableName + * The name of the variable being set. + * @param variableValue + * The value for the variable being set. + */ + public void putVariable(final String variableName, + final String variableValue) { + // Make sure the variable name is valid. + isValidName(variableName); + + variables.put(variableName, variableValue); + } + + /** + * Returns the value for a variable in the list of variables. If the + * variable can not be found in the list of variables, then null will be + * returned. + * + * @param variableName + * The name of the variable to retrieve the value for. + * + * @return The value for a variable in the list of variables. + * + * @throws Throws + * an EvaluatorException if the variable name can not be + * resolved. + */ + public String getVariableValue(final String variableName) + throws EvaluationException { + + String variableValue = null; + + /* + * If the user has implemented a variable resolver and set it onto this + * object, then use it before looking in the variable map. + */ + if (variableResolver != null) { + + try { + variableValue = variableResolver.resolveVariable(variableName); + } catch (FunctionException fe) { + throw new EvaluationException(fe.getMessage(), fe); + } + } + + /* + * If no variable value at this point, then go to the internal variable + * map to resolve the variable. + */ + if (variableValue == null) { + + variableValue = (String) variables.get(variableName); + } + + if (variableValue == null) { + + throw new EvaluationException( + "Can not resolve variable with name equal to \"" + + variableName + "\"."); + } + + return variableValue; + } + + /** + * Removes the variable from the list of variables to use when evaluating + * expressions. + * + * @param variableName + * The name of the variable to remove. + */ + public void removeVaraible(final String variableName) { + if (variables.containsKey(variableName)) { + variables.remove(variableName); + } else { + throw new IllegalArgumentException("The variable does not exist."); + } + } + + /** + * Removes all of the variables at one time. + */ + public void clearVariables() { + // Remove all functions. + variables.clear(); + + // Reload the system variables if necessary. + loadSystemVariables(); + } + + /** + * Rturns the map of variables currently set on this object. + * + * @return the map of variables currently set on this object. + */ + public Map getVariables() { + return variables; + } + + /** + * Sets the map of variables for this object. + * + * @param variables The map of variables for this object. + */ + public void setVariables(Map variables) { + this.variables = variables; + } + + /** + * Returns the variable resolver. The variable resolver can be used by + * the user to resolve their own variables. Variables in the variable + * resolver override any variables that are in this classes internal + * variable map. + * + * @return The variable resolver. + */ + public VariableResolver getVariableResolver() { + return variableResolver; + } + + /** + * Sets the variable resolver for this class. Varaibles resolved by the + * variable resolver will override any variables in this class's internal + * variable map. + * + * @param variableResolver The variable resolver for this class. + */ + public void setVariableResolver(VariableResolver variableResolver) { + this.variableResolver = variableResolver; + } + + /** + * This method evaluates mathematical, boolean or functional expressions. + * See the class description and test classes for more information on how to + * write an expression. If quotes exist around a string expression, then + * they will be left in the result string. Function will also have their + * results wrapped with the appripriate quote characters. + * + * @param expression + * The expression to evaluate. + * + * @return The result of the evaluated. expression. Numbers are treated as + * doubles, so resulting numbers will contain at least one decimal + * place. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public String evaluate(final String expression) throws EvaluationException { + return evaluate(expression, true, true); + } + + /** + * This method evaluates mathematical, boolean or functional expressions. + * See the class description and test classes for more information on how to + * write an expression. The expression used will be the one previously + * specified when using the parse method. If the parse method has not been + * called before calling this method, then an exception will be thrown. If + * quotes exist around a string expression, then they will be left in the + * result string. Function will also have their results wrapped with the + * appropriate quote characters. + * + * @return The result of the evaluated. expression. Numbers are treated as + * doubles, so resulting numbers will contain at least one decimal + * place. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public String evaluate() throws EvaluationException { + // Get the previously parsed expression. + final String expression = previousExpression; + + if (expression == null || expression.length() == 0) { + throw new EvaluationException("No expression has been specified."); + } + + return evaluate(expression, true, true); + } + + /** + * This method evaluates mathematical, boolean or functional expressions. + * See the class description and test classes for more information on how to + * write an expression. + * + * @param expression + * The expression to evaluate. + * @param keepQuotes + * Indicates if the the quotes should be kept in the result or + * not. This is only for string expression that are enclosed in + * quotes prior to being evaluated. + * @param wrapStringFunctionResults + * Indicates if the results from functions that return strings + * should be wrapped in quotes. The quote character used will be + * whatever is the current quote character for this object. + * + * @return The result of the evaluated expression. Numbers are treated as + * doubles, so resulting numbers will contain at least one decimal + * place. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public String evaluate(final String expression, final boolean keepQuotes, + final boolean wrapStringFunctionResults) throws EvaluationException { + + // Parse the expression. + parse(expression); + + String result = getResult(operatorStack, operandStack, + wrapStringFunctionResults); + + // Remove the quotes if necessary. + if (isExpressionString(result) && !keepQuotes) { + result = result.substring(1, result.length() - 1); + } + + return result; + } + + /** + * This method evaluates mathematical, boolean or functional expressions. + * The expression used will be the one previously specified when using the + * parse method. If the parse method has not been called before calling this + * method, then an exception will be thrown. See the class description and + * test classes for more information on how to write an expression. + * + * @param keepQuotes + * Indicates if the the quotes should be kept in the result or + * not. This is only for string expressions that are enclosed in + * quotes prior to being evaluated. + * @param wrapStringFunctionResults + * Indicates if the results from functions that return strings + * should be wrapped in quotes. The quote character used will be + * whatever is the current quote character for this object. + * + * @return The result of the evaluated expression. Numbers are treated as + * doubles, so resulting numbers will contain at least one decimal + * place. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public String evaluate(final boolean keepQuotes, + final boolean wrapStringFunctionResults) throws EvaluationException { + + // Get the previously parsed expression. + final String expression = previousExpression; + + if (expression == null || expression.length() == 0) { + throw new EvaluationException("No expression has been specified."); + } + + return evaluate(expression, keepQuotes, wrapStringFunctionResults); + } + + /** + * This method is a simple wrapper around the evaluate(String) method. Its + * purpose is to return a more friendly boolean return value instead of the + * string "1.0" (for true) and "0.0" (for false) that is normally returned. + * + * @param expression + * The expression to evaluate. + * + * @return A boolean value that represents the result of the evaluated + * expression. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. It is also thrown if the result is not able to + * be converted to a boolean value. + */ + public boolean getBooleanResult(final String expression) + throws EvaluationException { + + final String result = evaluate(expression); + + try { + Double doubleResult = new Double(result); + + if (doubleResult.doubleValue() == 1.0) { + return true; + } + } catch (NumberFormatException exception) { + return false; + } + + return false; + } + + /** + * This method is a simple wrapper around the evaluate(String) method. Its + * purpose is to return a more friendly double return value instead of the + * string number that is normally returned. + * + * @param expression + * The expression to evaluate. + * + * @return A double value that represents the result of the evaluated + * expression. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. It is also thrown if the result is not able to + * be converted to a double value. + */ + public double getNumberResult(final String expression) + throws EvaluationException { + + final String result = evaluate(expression); + Double doubleResult = null; + + try { + doubleResult = new Double(result); + } catch (NumberFormatException nfe) { + throw new EvaluationException( + "Expression does not produce a number.", nfe); + } + + return doubleResult.doubleValue(); + } + + /** + * This method parses a mathematical, boolean or functional expressions. + * When the expression is eventually evaluated, as long as the expression + * has not changed, it will not have to be reparsed. See the class + * description and test classes for more information on how to write an + * expression. + * + * @param expression + * The expression to evaluate. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public void parse(final String expression) throws EvaluationException { + + // Save the expression. + boolean parse = true; + if (!expression.equals(previousExpression)) { + previousExpression = expression; + } else { + parse = false; + operatorStack = (Stack) previousOperatorStack.clone(); + operandStack = (Stack) previousOperandStack.clone(); + } + + try { + if (parse) { + // These stacks will keep track of the operands and operators. + operandStack = new Stack(); + operatorStack = new Stack(); + + // Flags to help us keep track of what we are processing. + boolean haveOperand = false; + boolean haveOperator = false; + Operator unaryOperator = null; + + // We are going to process until we get to the end, so get the + // length. + int numChars = expression.length(); + int charCtr = 0; + + // Process until the counter exceeds the length. The goal is to + // get + // all of the operands and operators. + while (charCtr < numChars) { + Operator operator = null; + int operatorIndex = -1; + + // Skip any white space. + if (EvaluationHelper.isSpace(expression.charAt(charCtr))) { + charCtr++; + continue; + } + + // Get the next operator. + NextOperator nextOperator = getNextOperator(expression, + charCtr, null); + + if (nextOperator != null) { + operator = nextOperator.getOperator(); + operatorIndex = nextOperator.getIndex(); + } + + // Check if it is time to process an operand. + if (operatorIndex > charCtr || operatorIndex == -1) { + charCtr = processOperand(expression, charCtr, + operatorIndex, operandStack, unaryOperator); + + haveOperand = true; + haveOperator = false; + unaryOperator = null; + } + + // Check if it is time to process an operator. + if (operatorIndex == charCtr) { + if (nextOperator.getOperator().isUnary() + && (haveOperator || charCtr == 0)) { + charCtr = processUnaryOperator(operatorIndex, + nextOperator.getOperator()); + + if (unaryOperator == null) { + // We have an unary operator. + unaryOperator = nextOperator.getOperator(); + } else { + throw new EvaluationException( + "Consecutive unary " + + "operators are not allowed (index=" + + charCtr + ")."); + } + } else { + charCtr = processOperator(expression, + operatorIndex, operator, operatorStack, + operandStack, haveOperand, unaryOperator); + + unaryOperator = null; + } + + if (!(nextOperator.getOperator() instanceof ClosedParenthesesOperator)) { + haveOperand = false; + haveOperator = true; + } + } + } + + // Save the parsed operators and operands. + previousOperatorStack = (Stack) operatorStack.clone(); + previousOperandStack = (Stack) operandStack.clone(); + } + } catch (Exception e) { + // Clear the previous expression, because it is invalid. + previousExpression = ""; + + throw new EvaluationException(e.getMessage(), e); + } + } + + /** + * Install all of the operators into the list of operators to use when + * evaluating expressions. + */ + private void installOperators() { + // Install the most used operators first. + operators.add(openParenthesesOperator); + operators.add(closedParenthesesOperator); + operators.add(new AdditionOperator()); + operators.add(new SubtractionOperator()); + operators.add(new MultiplicationOperator()); + operators.add(new DivisionOperator()); + operators.add(new EqualOperator()); + operators.add(new NotEqualOperator()); + + // If there is a first character conflict between two operators, + // then install the operator with the greatest length first. + operators.add(new LessThanOrEqualOperator()); // Length of 2. + operators.add(new LessThanOperator()); // Length of 1. + operators.add(new GreaterThanOrEqualOperator()); // Length of 2. + operators.add(new GreaterThanOperator()); // Length of 1. + + // Install the least used operators last. + operators.add(new BooleanAndOperator()); + operators.add(new BooleanOrOperator()); + operators.add(new BooleanNotOperator()); + operators.add(new ModulusOperator()); + } + + /** + * Processes the operand that has been found in the expression. + * + * @param expression + * The expression being evaluated. + * @param operatorIndex + * The position in the expression where the current operator + * being processed is located. + * @param operandStack + * The stack of operands. + * @param unaryOperator + * The unary operator if we are working with one. + * + * @return The new position in the expression where processing should + * continue. + * + * @exception EvaluateException + * Thrown is an error is encoutnered while processing the + * expression. + */ + private int processOperand(final String expression, final int charCtr, + final int operatorIndex, final Stack operandStack, + final Operator unaryOperator) throws EvaluationException { + + String operandString = null; + int rtnCtr = -1; + + // Get the operand to process. + if (operatorIndex == -1) { + operandString = expression.substring(charCtr).trim(); + rtnCtr = expression.length(); + } else { + operandString = expression.substring(charCtr, operatorIndex).trim(); + rtnCtr = operatorIndex; + } + + if (operandString.length() == 0) { + throw new EvaluationException("Expression is invalid."); + } + + final ExpressionOperand operand = new ExpressionOperand(operandString, + unaryOperator); + operandStack.push(operand); + + return rtnCtr; + } + + /** + * Processes the operator that has been found in the expression. + * + * @param expression + * The expression being evaluated. + * @param operatorIndex + * The position in the expression where the current operator + * being processed is located. + * @param operator + * The operator being processed. + * @param operatorStack + * The stack of operators. + * @param operandStack + * The stack of operands. + * @param haveOperand + * Indicates if have an operand to process. + * @param unaryOperator + * The unary operand associated with thi operator. This may be + * null. + * + * @return The new position in the expression where processing should + * continue. + * + * @exception EvaluateException + * Thrown is an error is encoutnered while processing the + * expression. + */ + private int processOperator(final String expression, + final int originalOperatorIndex, final Operator originalOperator, + final Stack operatorStack, final Stack operandStack, + final boolean haveOperand, final Operator unaryOperator) + throws EvaluationException { + + int operatorIndex = originalOperatorIndex; + Operator operator = originalOperator; + + // If we have and operand and the current operator is an instance + // of OpenParenthesesOperator, then we are ready to process a function. + if (haveOperand && operator instanceof OpenParenthesesOperator) { + NextOperator nextOperator = processFunction(expression, + operatorIndex, operandStack); + + operator = nextOperator.getOperator(); + operatorIndex = nextOperator.getIndex() + operator.getLength(); + + nextOperator = getNextOperator(expression, operatorIndex, null); + + // Look to see if there is another operator. + // If there is, the process it, else get out of this routine. + if (nextOperator != null) { + operator = nextOperator.getOperator(); + operatorIndex = nextOperator.getIndex(); + } else { + return operatorIndex; + } + } + + // Determine what type of operator we are left with and process + // accordingly. + if (operator instanceof OpenParenthesesOperator) { + final ExpressionOperator expressionOperator = new ExpressionOperator( + operator, unaryOperator); + operatorStack.push(expressionOperator); + } else if (operator instanceof ClosedParenthesesOperator) { + ExpressionOperator stackOperator = null; + + if (operatorStack.size() > 0) { + stackOperator = (ExpressionOperator) operatorStack.peek(); + } + + // Process until we reach an open parentheses. + while (stackOperator != null + && !(stackOperator.getOperator() instanceof OpenParenthesesOperator)) { + processTree(operandStack, operatorStack); + + if (operatorStack.size() > 0) { + stackOperator = (ExpressionOperator) operatorStack.peek(); + } else { + stackOperator = null; + } + } + + if (operatorStack.isEmpty()) { + throw new EvaluationException("Expression is invalid."); + } + + // Pop the open parameter from the stack. + final ExpressionOperator expressionOperator = (ExpressionOperator) operatorStack + .pop(); + + if (!(expressionOperator.getOperator() instanceof OpenParenthesesOperator)) { + throw new EvaluationException("Expression is invalid."); + } + + // Process the unary operator if we have one. + if (expressionOperator.getUnaryOperator() != null) { + Object operand = operandStack.pop(); + + ExpressionTree tree = new ExpressionTree(this, operand, null, + null, expressionOperator.getUnaryOperator()); + + operandStack.push(tree); + } + } else { + // Process non-inputParam operator. + if (operatorStack.size() > 0) { + ExpressionOperator stackOperator = (ExpressionOperator) operatorStack + .peek(); + + while (stackOperator != null + && stackOperator.getOperator().getPrecedence() >= operator + .getPrecedence()) { + processTree(operandStack, operatorStack); + + if (operatorStack.size() > 0) { + stackOperator = (ExpressionOperator) operatorStack + .peek(); + } else { + stackOperator = null; + } + } + } + + ExpressionOperator expressionOperator = new ExpressionOperator( + operator, unaryOperator); + + operatorStack.push(expressionOperator); + } + + final int rtnCtr = operatorIndex + operator.getLength(); + + return rtnCtr; + } + + /** + * Processes the unary operator that has been found in the expression. + * + * @param operatorIndex + * The position in the expression where the current operator + * being processed is located. + * @param operator + * The operator being processed. + * + * @return The new position in the expression where processing should + * continue. + */ + private int processUnaryOperator(final int operatorIndex, + final Operator operator) { + + final int rtnCtr = operatorIndex + operator.getSymbol().length(); + + return rtnCtr; + } + + /** + * Processes the function that has been found in the expression. + * + * @param expression + * The expression being evaluated. + * @param operatorIndex + * The position in the expression where the current operator + * being processed is located. + * @param operandStack + * The stack of operands. + * @param operatorStack + * The stack of operators. + * @param operator + * The current operator being processed. + * @param unaryOperator + * The unary operator associated with this function. This can be + * null. + * + * @return The next operator in the expression. This should be the closed + * parentheses operator. + * + * @exception EvaluateException + * Thrown is an error is encoutnered while processing the + * expression. + */ + private NextOperator processFunction(final String expression, + final int operatorIndex, final Stack operandStack) + throws EvaluationException { + + int parenthesisCount = 1; + NextOperator nextOperator = null; + int nextOperatorIndex = operatorIndex; + + // Loop until we find the function's closing parentheses. + while (parenthesisCount > 0) { + nextOperator = getNextOperator(expression, nextOperatorIndex + 1, + null); + + if (nextOperator == null) { + throw new EvaluationException("Function is not closed."); + } else if (nextOperator.getOperator() instanceof OpenParenthesesOperator) { + parenthesisCount++; + } else if (nextOperator.getOperator() instanceof ClosedParenthesesOperator) { + parenthesisCount--; + } + + // Get the next operator index. + nextOperatorIndex = nextOperator.getIndex(); + } + + // Get the function argument. + String arguments = expression.substring(operatorIndex + 1, + nextOperatorIndex); + + // Pop the function name from the stack. + final ExpressionOperand operand = (ExpressionOperand) operandStack + .pop(); + final Operator unaryOperator = operand.getUnaryOperator(); + final String functionName = operand.getValue(); + + // Validate that the function name is valid. + try { + isValidName(functionName); + } catch (IllegalArgumentException iae) { + throw new EvaluationException("Invalid function name of \"" + + functionName + "\".", iae); + } + + // Get the function object. + final Function function = (Function) functions.get(functionName); + + if (function == null) { + throw new EvaluationException("A function is not defined (index=" + + operatorIndex + ")."); + } + + final ParsedFunction parsedFunction = new ParsedFunction(function, + arguments, unaryOperator); + operandStack.push(parsedFunction); + + return nextOperator; + } + + /** + * Processes an expresssion tree that has been parsed into an operand stack + * and oeprator stack. + * + * @param operandStack + * The stack of operands. + * @param operatorStack + * The stack of operators. + */ + private void processTree(final Stack operandStack, final Stack operatorStack) { + + Object rightOperand = null; + Object leftOperand = null; + Operator operator = null; + + // Get the right operand node from the tree. + if (operandStack.size() > 0) { + rightOperand = operandStack.pop(); + } + + // Get the left operand node from the tree. + if (operandStack.size() > 0) { + leftOperand = operandStack.pop(); + } + + // Get the operator node from the tree. + operator = ((ExpressionOperator) operatorStack.pop()).getOperator(); + + // Build an expressin tree from the nodes. + final ExpressionTree tree = new ExpressionTree(this, leftOperand, + rightOperand, operator, null); + + // Push the tree onto the stack. + operandStack.push(tree); + } + + /** + * Returns the final result of the evaluated expression. + * + * @param operatorStack + * The stack of operators. + * @param operandStack + * The stack of operands. + * @param wrapStringFunctionResults + * Indicates if the results from functions that return strings + * should be wrapped in quotes. The quote character used will be + * whatever is the current quote character for this object. + * + * @return The final result of the evaluated expression. + * + * @exception EvaluateException + * Thrown is an error is encoutnered while processing the + * expression. + */ + private String getResult(final Stack operatorStack, + final Stack operandStack, final boolean wrapStringFunctionResults) + throws EvaluationException { + + // The result to return. + String resultString = null; + + // Process the rest of the operators left on the stack. + while (operatorStack.size() > 0) { + processTree(operandStack, operatorStack); + } + + // At this point only one operand should be left on the tree. + // It may be a tree operand that contains other tree and/or + // other operands. + if (operandStack.size() != 1) { + throw new EvaluationException("Expression is invalid."); + } + + final Object finalOperand = operandStack.pop(); + + // Check if the final operand is a tree. + if (finalOperand instanceof ExpressionTree) { + // Get the final result. + resultString = ((ExpressionTree) finalOperand) + .evaluate(wrapStringFunctionResults); + } + // Check if the final operand is an operand. + else if (finalOperand instanceof ExpressionOperand) { + ExpressionOperand resultExpressionOperand = (ExpressionOperand) finalOperand; + + resultString = ((ExpressionOperand) finalOperand).getValue(); + resultString = replaceVariables(resultString); + + // Check if the operand is a string or not. If it not a string, + // then it must be a number. + if (!isExpressionString(resultString)) { + Double resultDouble = null; + try { + resultDouble = new Double(resultString); + } catch (Exception e) { + throw new EvaluationException("Expression is invalid.", e); + } + + // Process a unary operator if one exists. + if (resultExpressionOperand.getUnaryOperator() != null) { + resultDouble = new Double(resultExpressionOperand + .getUnaryOperator().evaluate( + resultDouble.doubleValue())); + } + + // Get the final result. + resultString = resultDouble.toString(); + } else { + if (resultExpressionOperand.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } else if (finalOperand instanceof ParsedFunction) { + final ParsedFunction parsedFunction = (ParsedFunction) finalOperand; + final Function function = parsedFunction.getFunction(); + String arguments = parsedFunction.getArguments(); + + if (processNestedFunctions) { + arguments = processNestedFunctions(arguments); + } + + arguments = replaceVariables(arguments); + + // Get the final result. + try { + FunctionResult functionResult = + function.execute(this, arguments); + resultString = functionResult.getResult(); + + if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC) { + + Double resultDouble = new Double(resultString); + + // Process a unary operator if one exists. + if (parsedFunction.getUnaryOperator() != null) { + resultDouble = new Double(parsedFunction + .getUnaryOperator().evaluate( + resultDouble.doubleValue())); + } + + // Get the final result. + resultString = resultDouble.toString(); + } + else if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_STRING) { + + // The result must be a string result. + if (wrapStringFunctionResults) { + resultString = quoteCharacter + resultString + + quoteCharacter; + } + + if (parsedFunction.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } catch (FunctionException fe) { + throw new EvaluationException(fe.getMessage(), fe); + } + } else { + throw new EvaluationException("Expression is invalid."); + } + + return resultString; + } + + /** + * Returns the next operator in the expression. + * + * @param expression + * The expression being evaluated. + * @param start + * The position in the expression to start searching for the next + * operator. + * @param match + * The operator to search for. This can be null if you want the + * very next operator. If it is not null, it searches until it + * finds the match. + * + * @return The next operator in the expression. Returns null if no next + * operator is returned. + */ + private NextOperator getNextOperator(final String expression, + final int start, final Operator match) { + + final int numChars = expression.length(); + int numQuoteCharacters = 0; + + for (int charCtr = start; charCtr < numChars; charCtr++) { + // Keep track of open strings. + if (expression.charAt(charCtr) == quoteCharacter) { + numQuoteCharacters++; + } + + // Do not look into open strings. + if ((numQuoteCharacters % 2) == 1) { + continue; + } + + // Assumes the operators are installed in order of length. + final int numOperators = operators.size(); + for (int operatorCtr = 0; operatorCtr < numOperators; operatorCtr++) { + Operator operator = (Operator) operators.get(operatorCtr); + + if (match != null) { + // Look through the operators until we find the + // one we are searching for. + if (!match.equals(operator)) { + continue; + } + } + + // The operator can 1 or 2 characters in length. + if (operator.getLength() == 2) { + int endCtr = -1; + if (charCtr + 2 <= expression.length()) { + endCtr = charCtr + 2; + } else { + endCtr = expression.length(); + } + + // Look for a match. + if (expression.substring(charCtr, endCtr).equals( + operator.getSymbol())) { + NextOperator nextOperator = new NextOperator(operator, + charCtr); + + return nextOperator; + } + } else { + // Look for a match. + if (expression.charAt(charCtr) == operator.getSymbol() + .charAt(0)) { + NextOperator nextOperator = new NextOperator(operator, + charCtr); + + return nextOperator; + } + } + } + } + + return null; + } + + /** + * Determines if the string represents a valid expression string or not. + * Valid expression strings must start and end with a quote character. + * + * @param expressionString + * The string being evaluated. + * + * @return True if the string is a valid string and false if not. + */ + protected boolean isExpressionString(final String expressionString) + throws EvaluationException { + + if (expressionString.length() > 1 + && expressionString.charAt(0) == quoteCharacter + && expressionString.charAt(expressionString.length() - 1) == quoteCharacter) { + return true; + } + + if (expressionString.indexOf(quoteCharacter) >= 0) { + throw new EvaluationException("Invalid use of quotes."); + } + + return false; + } + + /** + * This method verifies if a function or variable name is valid or not. + * + * Function and variable names must follow these rules... + *
    + *
  • can not start with a number
  • + *
  • can not contain an operator (see the above list of operators)
  • + *
  • can not contain a quote character - single or double
  • + *
  • can not contain a brace character - open or closed
  • + *
  • can not contain one of the following special characters: #, ~ , ^ !
  • + *
      + * + * @param name + * The function or variable name being validated. + * + * @exception IllegalArgumentException + * Thrown if the name is invalid. + */ + public void isValidName(final String name) throws IllegalArgumentException { + + if (name.length() == 0) { + throw new IllegalArgumentException("Variable is empty."); + } + + // Check if name starts with a number. + final char firstChar = name.charAt(0); +// if (firstChar >= '0' && firstChar <= '9') { +// throw new IllegalArgumentException("A variable or function name " +// + "can not start with a number."); +// } + + // Check if name contains with a quote character. + if (name.indexOf(EvaluationConstants.SINGLE_QUOTE) > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a quote character."); + } else if (name.indexOf(EvaluationConstants.DOUBLE_QUOTE) > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a quote character."); + } + + // Check if name contains with a brace character. + if (name.indexOf(EvaluationConstants.OPEN_BRACE) > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain an open brace character."); + } else if (name.indexOf(EvaluationConstants.CLOSED_BRACE) > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a closed brace character."); + } else if (name.indexOf(EvaluationConstants.POUND_SIGN) > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a pound sign character."); + } + + // Check if name contains an operator character. + final Iterator operatorIterator = operators.iterator(); + + while (operatorIterator.hasNext()) { + final Operator operator = (Operator) operatorIterator.next(); + + if (name.indexOf(operator.getSymbol()) > -1) { + throw new IllegalArgumentException( + "A variable or function name " + + "can not contain an operator symbol."); + } + } + + // Check if name contains other special characters. + if (name.indexOf("!") > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a special character."); + } else if (name.indexOf("~") > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a special character."); + } else if (name.indexOf("^") > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a special character."); + } else if (name.indexOf(",") > -1) { + throw new IllegalArgumentException("A variable or function name " + + "can not contain a special character."); + } + } + + /** + * This method loads the system functions is necessary. + */ + private void loadSystemFunctions() { + // Install the math functions. + if (loadMathFunctions) { + final FunctionGroup mathFunctions = new MathFunctions(); + + mathFunctions.load(this); + } + + // Install the string functions. + if (loadStringFunctions) { + final FunctionGroup stringFunctions = new StringFunctions(); + + stringFunctions.load(this); + } + } + + /** + * This method loads the system variables is necessary. + */ + private void loadSystemVariables() { + // Install the math variables. + if (loadMathVariables) { + // Add the two math variables. + putVariable("E", new Double(Math.E).toString()); + putVariable("PI", new Double(Math.PI).toString()); + } + } + + /** + * Replaces the variables in the expression with the values of the variables + * for this instance of the evaluator. + * + * @param expression + * The expression being processed. + * + * @return A new expression with the variables replaced with their values. + * + * @exception EvaluateException + * Thrown is an error is encoutnered while processing the + * expression. + */ + public String replaceVariables(final String expression) + throws EvaluationException { + + int openIndex = expression.indexOf(EvaluationConstants.OPEN_VARIABLE); + + if (openIndex < 0) { + return expression; + } + + String replacedExpression = expression; + + while (openIndex >= 0) { + + int closedIndex = -1; + if (openIndex >= 0) { + + closedIndex = replacedExpression.indexOf( + EvaluationConstants.CLOSED_VARIABLE, openIndex + 1); + if (closedIndex > openIndex) { + + String variableName = replacedExpression.substring( + openIndex + + EvaluationConstants.OPEN_VARIABLE + .length(), closedIndex); + + // Validate that the variable name is valid. + try { + isValidName(variableName); + } catch (IllegalArgumentException iae) { + throw new EvaluationException("Invalid variable name of \"" + + variableName + "\".", iae); + } + + String variableValue = getVariableValue(variableName); + + String variableString = EvaluationConstants.OPEN_VARIABLE + + variableName + + EvaluationConstants.CLOSED_VARIABLE; + + replacedExpression = EvaluationHelper.replaceAll( + replacedExpression, variableString, variableValue); + } else { + + break; + } + } + + // Start looking at the beginning of the string, since + // the length string has changed and characters have moved + // positions. + openIndex = replacedExpression.indexOf( + EvaluationConstants.OPEN_VARIABLE); + } + + // If an open brace is left over, then a variable could not be replaced. + int openBraceIndex = replacedExpression + .indexOf(EvaluationConstants.OPEN_VARIABLE); + if (openBraceIndex > -1) { + throw new EvaluationException( + "A variable has not been closed (index=" + openBraceIndex + + ")."); + } + + return replacedExpression; + } + + /** + * This method process nested function calls that may be in the arguments + * passed into a higher level function. + * + * @param arguments The arguments to process. + * + * @return The arguments with any nested function calls evaluated. + * + * @throws EvaluationException Thrown if an error occurs. + */ + protected String processNestedFunctions(final String arguments) + throws EvaluationException { + + StringBuffer evaluatedArguments = new StringBuffer(); + + // Process nested function calls. + if (arguments.length() > 0) { + + Evaluator argumentsEvaluator = new Evaluator(quoteCharacter, + loadMathVariables, loadMathFunctions, loadStringFunctions, + processNestedFunctions); + argumentsEvaluator.setFunctions(getFunctions()); + argumentsEvaluator.setVariables(getVariables()); + argumentsEvaluator.setVariableResolver(getVariableResolver()); + + final ArgumentTokenizer tokenizer = new ArgumentTokenizer( + arguments, EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + List evalautedArgumentList = new ArrayList(); + while (tokenizer.hasMoreTokens()) { + + String argument = tokenizer.nextToken().trim(); + + try { + argument = argumentsEvaluator.evaluate(argument); + } catch (Exception e) { + throw new EvaluationException(e.getMessage(), e); + } + + evalautedArgumentList.add(argument); + } + + Iterator evaluatedArgumentIterator = evalautedArgumentList + .iterator(); + + while (evaluatedArgumentIterator.hasNext()) { + + if (evaluatedArguments.length() > 0) { + + evaluatedArguments + .append(EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + } + + String evaluatedArgument = (String) evaluatedArgumentIterator + .next(); + evaluatedArguments.append(evaluatedArgument); + } + } + + return evaluatedArguments.toString(); + } + + /** + * Returns the value used during construction of this object to specify if + * math variables should be loaded. + * + * @return the loadMathVariables + */ + public boolean isLoadMathVariables() { + return loadMathVariables; + } + + /** + * Returns the value used during construction of this object to specify if + * math functions should be loaded. + * + * @return the loadMathFunctions + */ + public boolean getLoadMathFunctions() { + return loadMathFunctions; + } + + /** + * Returns the value used during construction of this object to specify if + * string functions should be loaded. + * + * @return the loadStringFunctions + */ + public boolean getLoadStringFunctions() { + return loadStringFunctions; + } + + /** + * Returns the value used during construction of this object to specify if + * nested functions should be processed. + * + * @return the processNestedFunctions + */ + public boolean getProcessNestedFunctions() { + return processNestedFunctions; + } + + public String getPreviousExpression() { + return previousExpression; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperand.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperand.java new file mode 100644 index 0000000..8d727b1 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperand.java @@ -0,0 +1,62 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.operator.Operator; + +/** + * Represents an operand being processed in the expression. + */ +public class ExpressionOperand { + + // The value of the operand. + private String value = null; + + // The unary operator for the operand, if one exists. + private Operator unaryOperator = null; + + /** + * Create a new ExpressionOperand. + * + * @param value + * The value for the new ExpressionOperand. + * @param unaryOperator + * The unary operator for this object. + */ + public ExpressionOperand(final String value, final Operator unaryOperator) { + this.value = value; + this.unaryOperator = unaryOperator; + } + + /** + * Returns the value of this object. + * + * @return The value of this object. + */ + public String getValue() { + return value; + } + + /** + * Returns the unary operator for this object. + * + * @return The unary operator for this object. + */ + public Operator getUnaryOperator() { + return unaryOperator; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperator.java new file mode 100644 index 0000000..f5b0332 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionOperator.java @@ -0,0 +1,63 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.operator.Operator; + +/** + * Represents an operator being processed in the expression. + */ +public class ExpressionOperator { + + // The operator that this object represents. + private Operator operator = null; + + // The unary operator for this object, if there is one. + private Operator unaryOperator = null; + + /** + * Creates a new ExpressionOperator. + * + * @param operator + * The operator this object represents. + * @param unaryOperator + * The unary operator for this object. + */ + public ExpressionOperator(final Operator operator, + final Operator unaryOperator) { + this.operator = operator; + this.unaryOperator = unaryOperator; + } + + /** + * Returns the operator for this object. + * + * @return The operator for this object. + */ + public Operator getOperator() { + return operator; + } + + /** + * Returns the unary operator for this object. + * + * @return The unary operator for this object. + */ + public Operator getUnaryOperator() { + return unaryOperator; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionTree.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionTree.java new file mode 100644 index 0000000..21151d9 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ExpressionTree.java @@ -0,0 +1,368 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; +import com.fibo.ddp.common.utils.util.runner.jeval.operator.Operator; + +/** + * Represents an expression tree made up of a left operand, right operand, + * operator and unary operator. + */ +public class ExpressionTree { + + // The left node in the tree. + private Object leftOperand = null; + + // The right node in the tree. + private Object rightOperand = null; + + // The operator for the two operands. + private Operator operator = null; + + // The unary operator, if one exists. + private Operator unaryOperator = null; + + // The Evaluator object processing this tree. + private Evaluator evaluator = null; + + /** + * Creates a new ExpressionTree. + * + * @param evaluator + * The Evaluator object processing this tree. + * @param leftOperand + * The left operand to place as the left node of the tree. + * @param rightOperand + * The right operand to place as the right node of the tree. + * @param operator + * The operator to place as the operator node of the tree. + * @param unaryOperator + * The new unary operator for this tree. + */ + public ExpressionTree(final Evaluator evaluator, final Object leftOperand, + final Object rightOperand, final Operator operator, + final Operator unaryOperator) { + + this.evaluator = evaluator; + this.leftOperand = leftOperand; + this.rightOperand = rightOperand; + this.operator = operator; + this.unaryOperator = unaryOperator; + } + + /** + * Returns the left operand of this tree. + * + * @return The left operand of this tree. + */ + public Object getLeftOperand() { + return leftOperand; + } + + /** + * Returns the right operand of this tree. + * + * @return The right operand of this tree. + */ + public Object getRightOperand() { + return rightOperand; + } + + /** + * Returns the operator for this tree. + * + * @return The operator of this tree. + */ + public Operator getOperator() { + return operator; + } + + /** + * Returns the unary operator for this tree. + * + * @return The unary operator of this tree. + */ + public Operator getUnaryOperator() { + return unaryOperator; + } + + /** + * Evaluates the operands for this tree using the operator and the unary + * operator. + * + * @param wrapStringFunctionResults + * Indicates if the results from functions that return strings + * should be wrapped in quotes. The quote character used will be + * whatever is the current quote character for this object. + * + * @exception EvaluateException + * Thrown is an error is encountered while processing the + * expression. + */ + public String evaluate(final boolean wrapStringFunctionResults) + throws EvaluationException { + + String rtnResult = null; + + // Get the left operand. + String leftResultString = null; + Double leftResultDouble = null; + + if (leftOperand instanceof ExpressionTree) { + leftResultString = ((ExpressionTree) leftOperand) + .evaluate(wrapStringFunctionResults); + + try { + leftResultDouble = new Double(leftResultString); + leftResultString = null; + } catch (NumberFormatException exception) { + leftResultDouble = null; + } + } else if (leftOperand instanceof ExpressionOperand) { + + final ExpressionOperand leftExpressionOperand = (ExpressionOperand) leftOperand; + + leftResultString = leftExpressionOperand.getValue(); + leftResultString = evaluator.replaceVariables(leftResultString); + + // Check if the operand is a string or not. If it not a string, + // then it must be a number. + if (!evaluator.isExpressionString(leftResultString)) { + try { + leftResultDouble = new Double(leftResultString); + leftResultString = null; + } catch (NumberFormatException nfe) { + throw new EvaluationException("Expression is invalid.", nfe); + } + + if (leftExpressionOperand.getUnaryOperator() != null) { + leftResultDouble = new Double(leftExpressionOperand + .getUnaryOperator().evaluate( + leftResultDouble.doubleValue())); + } + } else { + if (leftExpressionOperand.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } else if (leftOperand instanceof ParsedFunction) { + + final ParsedFunction parsedFunction = (ParsedFunction) leftOperand; + final Function function = parsedFunction.getFunction(); + String arguments = parsedFunction.getArguments(); + arguments = evaluator.replaceVariables(arguments); + + if (evaluator.getProcessNestedFunctions()) { + arguments = evaluator.processNestedFunctions(arguments); + } + + try { + FunctionResult functionResult = + function.execute(evaluator, arguments); + leftResultString = functionResult.getResult(); + + if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC) { + + Double resultDouble = new Double(leftResultString); + + // Process a unary operator if one exists. + if (parsedFunction.getUnaryOperator() != null) { + resultDouble = new Double(parsedFunction + .getUnaryOperator().evaluate( + resultDouble.doubleValue())); + } + + // Get the final result. + leftResultString = resultDouble.toString(); + } + else if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_STRING) { + + // The result must be a string result. + if (wrapStringFunctionResults) { + leftResultString = evaluator.getQuoteCharacter() + + leftResultString + + evaluator.getQuoteCharacter(); + } + + if (parsedFunction.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } catch (FunctionException fe) { + throw new EvaluationException(fe.getMessage(), fe); + } + + if (!evaluator.isExpressionString(leftResultString)) { + try { + leftResultDouble = new Double(leftResultString); + leftResultString = null; + } catch (NumberFormatException nfe) { + throw new EvaluationException("Expression is invalid.", nfe); + } + } + } else { + if (leftOperand != null) { + throw new EvaluationException("Expression is invalid."); + } + } + + // Get the right operand. + String rightResultString = null; + Double rightResultDouble = null; + + if (rightOperand instanceof ExpressionTree) { + rightResultString = ((ExpressionTree) rightOperand) + .evaluate(wrapStringFunctionResults); + + try { + rightResultDouble = new Double(rightResultString); + rightResultString = null; + } catch (NumberFormatException exception) { + rightResultDouble = null; + } + + } else if (rightOperand instanceof ExpressionOperand) { + + final ExpressionOperand rightExpressionOperand = (ExpressionOperand) rightOperand; + rightResultString = ((ExpressionOperand) rightOperand).getValue(); + rightResultString = evaluator.replaceVariables(rightResultString); + + // Check if the operand is a string or not. If it not a string, + // then it must be a number. + if (!evaluator.isExpressionString(rightResultString)) { + try { + rightResultDouble = new Double(rightResultString); + rightResultString = null; + } catch (NumberFormatException nfe) { + throw new EvaluationException("Expression is invalid.", nfe); + } + + if (rightExpressionOperand.getUnaryOperator() != null) { + rightResultDouble = new Double(rightExpressionOperand + .getUnaryOperator().evaluate( + rightResultDouble.doubleValue())); + } + } else { + if (rightExpressionOperand.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } else if (rightOperand instanceof ParsedFunction) { + + final ParsedFunction parsedFunction = (ParsedFunction) rightOperand; + final Function function = parsedFunction.getFunction(); + String arguments = parsedFunction.getArguments(); + arguments = evaluator.replaceVariables(arguments); + + if (evaluator.getProcessNestedFunctions()) { + arguments = evaluator.processNestedFunctions(arguments); + } + + try { + FunctionResult functionResult = + function.execute(evaluator, arguments); + rightResultString = functionResult.getResult(); + + if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC) { + + Double resultDouble = new Double(rightResultString); + + // Process a unary operator if one exists. + if (parsedFunction.getUnaryOperator() != null) { + resultDouble = new Double(parsedFunction + .getUnaryOperator().evaluate( + resultDouble.doubleValue())); + } + + // Get the final result. + rightResultString = resultDouble.toString(); + } + else if (functionResult.getType() == + FunctionConstants.FUNCTION_RESULT_TYPE_STRING) { + + // The result must be a string result. + if (wrapStringFunctionResults) { + rightResultString = evaluator.getQuoteCharacter() + + rightResultString + + evaluator.getQuoteCharacter(); + } + + if (parsedFunction.getUnaryOperator() != null) { + throw new EvaluationException("Invalid operand for " + + "unary operator."); + } + } + } catch (FunctionException fe) { + throw new EvaluationException(fe.getMessage(), fe); + } + + if (!evaluator.isExpressionString(rightResultString)) { + try { + rightResultDouble = new Double(rightResultString); + rightResultString = null; + } catch (NumberFormatException nfe) { + throw new EvaluationException("Expression is invalid.", nfe); + } + } + } else if (rightOperand == null) { + // Do nothing. + } else { + throw new EvaluationException("Expression is invalid."); + } + + // Evaluate the the expression. + if (leftResultDouble != null && rightResultDouble != null) { + double doubleResult = operator.evaluate(leftResultDouble + .doubleValue(), rightResultDouble.doubleValue()); + + if (getUnaryOperator() != null) { + doubleResult = getUnaryOperator().evaluate(doubleResult); + } + + rtnResult = new Double(doubleResult).toString(); + } else if (leftResultString != null && rightResultString != null) { + rtnResult = operator.evaluate(leftResultString, rightResultString); + } else if (leftResultDouble != null && rightResultDouble == null) { + double doubleResult = -1; + + if (unaryOperator != null) { + doubleResult = unaryOperator.evaluate(leftResultDouble + .doubleValue()); + } else { + // Do not allow numeric (left) and + // string (right) to be evaluated together. + throw new EvaluationException("Expression is invalid."); + } + + rtnResult = new Double(doubleResult).toString(); + } else { + throw new EvaluationException("Expression is invalid."); + } + + return rtnResult; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/NextOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/NextOperator.java new file mode 100644 index 0000000..f961b37 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/NextOperator.java @@ -0,0 +1,62 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.operator.Operator; + +/** + * Represents the next operator in the expression to process. + */ +class NextOperator { + + // The operator this object represetns. + private Operator operator = null; + + // The index of the operator in the expression. + private int index = -1; + + /** + * Create a new NextOperator from an operator and index. + * + * @param operator + * The operator this object represents. + * @param index + * The index of the operator in the expression. + */ + public NextOperator(final Operator operator, final int index) { + this.operator = operator; + this.index = index; + } + + /** + * Returns the operator for this object. + * + * @return The operator represented by this object. + */ + public Operator getOperator() { + return operator; + } + + /** + * Returns the index for this object. + * + * @return The index of the operator in the expression. + */ + public int getIndex() { + return index; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ParsedFunction.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ParsedFunction.java new file mode 100644 index 0000000..dd0e96d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/ParsedFunction.java @@ -0,0 +1,81 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.operator.Operator; + +/** + * This class represents a function that has been parsed. + */ +public class ParsedFunction { + + // The function that has been parsed. + // FIXME Make all class instance methods final if possible. + private final Function function; + + // The arguments to the function. + private final String arguments; + + // The unary operator for this object, if there is one. + private final Operator unaryOperator; + + /** + * The constructor for this class. + * + * @param function + * The function that has been parsed. + * @param arguments + * The arguments to the function. + * @param unaryOperator + * The unary operator for this object, if there is one. + */ + public ParsedFunction(final Function function, final String arguments, + final Operator unaryOperator) { + + this.function = function; + this.arguments = arguments; + this.unaryOperator = unaryOperator; + } + + /** + * Returns the function that has been parsed. + * + * @return The function that has been parsed. + */ + public Function getFunction() { + return function; + } + + /** + * Returns the arguments to the function. + * + * @return The arguments to the function. + */ + public String getArguments() { + return arguments; + } + + /** + * Returns the unary operator for this object, if there is one. + * + * @return The unary operator for this object, if there is one. + */ + public Operator getUnaryOperator() { + return unaryOperator; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/VariableResolver.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/VariableResolver.java new file mode 100644 index 0000000..b14197f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/VariableResolver.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.common.utils.util.runner.jeval; + +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; + +/** + * This interface can be implement with a custom resolver and set onto the + * Evaluator class. It will then be used to resolve variables when they are + * replaced in an expression as it gets evaluated. Varaibles resolved by the + * resolved will override any varibles that exist in the variable map of an + * Evaluator instance. + */ +public interface VariableResolver { + + /** + * Returns a variable value for the specified variable name. + * + * @param variableName + * The name of the variable to return the variable value for. + * + * @return A variable value for the specified variable name. If the variable + * name can not be resolved, then null should be returned. + * + * @throws Can throw a FunctionException if needed. + */ + public String resolveVariable(String variableName) throws FunctionException; +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/Function.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/Function.java new file mode 100644 index 0000000..a77589b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/Function.java @@ -0,0 +1,51 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; + +/** + * A function that can be specified in an expression. + */ +public interface Function { + + /** + * Returns the name of the function. + * + * @return The name of this function class. + */ + public String getName(); + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * The arguments that will be evaluated by the function. It is up + * to the function implementation to break the string into one or + * more arguments. + * + * @return The value of the evaluated argument and its type. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException; +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionConstants.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionConstants.java new file mode 100644 index 0000000..1cb63cf --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionConstants.java @@ -0,0 +1,33 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +/** + * Contains constants used by classes in this package. + */ +public class FunctionConstants { + + /** + * Indicates that the function result is a numeric or Boolean value. + */ + public static final int FUNCTION_RESULT_TYPE_NUMERIC = 0; + + /** + * Indicates that the function result is a string value. + */ + public static final int FUNCTION_RESULT_TYPE_STRING = 1; +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionException.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionException.java new file mode 100644 index 0000000..ddc46fd --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionException.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +/** + * This exception is thrown when an error occurs while processing a function. + */ +public class FunctionException extends Exception { + + private static final long serialVersionUID = 4767250768467137620L; + + /** + * This constructor takes a custom message as input. + * + * @param message + * A custom message for the exception to display. + */ + public FunctionException(String message) { + super(message); + } + + /** + * This constructor takes an exception as input. + * + * @param exception + * An exception. + */ + public FunctionException(Exception exception) { + super(exception); + } + + /** + * This constructor takes an exception as input. + * + * @param message + * A custom message for the exception to display. + * @param exception + * An exception. + */ + public FunctionException(String message, Exception exception) { + super(message, exception); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionGroup.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionGroup.java new file mode 100644 index 0000000..ce9dcd3 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionGroup.java @@ -0,0 +1,58 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; + +import java.util.List; + +/** + * A groups of functions that can loaded at one time into an instance of + * Evaluator. + */ +public interface FunctionGroup { + /** + * Returns the name of the function group. + * + * @return The name of this function group class. + */ + public String getName(); + + /** + * Returns a list of the functions that are loaded by this class. + * + * @return A list of the functions loaded by this class. + */ + public List getFunctions(); + + /** + * Loads the functions in this function group into an instance of Evaluator. + * + * @param evaluator + * An instance of Evaluator to load the functions into. + */ + public void load(Evaluator evaluator); + + /** + * Unloads the functions in this function group from an instance of + * Evaluator. + * + * @param evaluator + * An instance of Evaluator to unload the functions from. + */ + public void unload(Evaluator evaluator); +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionHelper.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionHelper.java new file mode 100644 index 0000000..4c015e6 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionHelper.java @@ -0,0 +1,284 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +import com.fibo.ddp.common.utils.util.runner.jeval.ArgumentTokenizer; + +import java.util.ArrayList; + +/** + * This class contains many methods that are helpful when writing functions. + * Some of these methods were created to help with the creation of the math and + * string functions packaged with Evaluator. + */ +public class FunctionHelper { + + /** + * This method first removes any white space at the beginning and end of the + * input string. It then removes the specified quote character from the the + * first and last characters of the string if a quote character exists in + * those positions. If quote characters are not in the first and last + * positions after the white space is trimmed, then a FunctionException will + * be thrown. + * + * @param arguments + * The arguments to trim and revove quote characters from. + * @param quoteCharacter + * The character to remove from the first and last position of + * the trimmed string. + * + * @return The arguments with white space and quote characters removed. + * + * @exception FunctionException + * Thrown if quote characters do not exist in the first and + * last positions after the white space is trimmed. + */ + public static String trimAndRemoveQuoteChars(final String arguments, + final char quoteCharacter) throws FunctionException { + + String trimmedArgument = arguments; + + trimmedArgument = trimmedArgument.trim(); + + if (trimmedArgument.charAt(0) == quoteCharacter) { + trimmedArgument = trimmedArgument.substring(1, trimmedArgument + .length()); + } else { + throw new FunctionException("Value does not start with a quote."); + } + + if (trimmedArgument.charAt(trimmedArgument.length() - 1) == quoteCharacter) { + trimmedArgument = trimmedArgument.substring(0, trimmedArgument + .length() - 1); + } else { + throw new FunctionException("Value does not end with a quote."); + } + + return trimmedArgument; + } + + /** + * This methods takes a string of input function arguments, evaluates each + * argument and creates a Double value for each argument from the result of + * the evaluations. + * + * @param arguments + * The arguments to parse. + * @param delimiter + * The delimiter to use while parsing. + * + * @return An array list of Double values found in the input string. + * + * @exception FunctionException + * Thrown if the string does not properly parse into Double + * values. + */ + public static ArrayList getDoubles(final String arguments, + final char delimiter) throws FunctionException { + + ArrayList returnValues = new ArrayList(); + + try { + + final ArgumentTokenizer tokenizer = new ArgumentTokenizer( + arguments, delimiter); + + while (tokenizer.hasMoreTokens()) { + final String token = tokenizer.nextToken().trim(); + returnValues.add(new Double(token)); + } + } catch (Exception e) { + throw new FunctionException("Invalid values in string.", e); + } + + return returnValues; + } + + /** + * This methods takes a string of input function arguments, evaluates each + * argument and creates a String value for each argument from the result of + * the evaluations. + * + * @param arguments + * The arguments of values to parse. + * @param delimiter + * The delimiter to use while parsing. + * + * @return An array list of String values found in the input string. + * + * @exception FunctionException + * Thrown if the stirng does not properly parse into String + * values. + */ + public static ArrayList getStrings(final String arguments, + final char delimiter) throws FunctionException { + + final ArrayList returnValues = new ArrayList(); + + try { + ArgumentTokenizer tokenizer = new ArgumentTokenizer(arguments, + delimiter); + + while (tokenizer.hasMoreTokens()) { + final String token = tokenizer.nextToken(); + returnValues.add(token); + } + } catch (Exception e) { + throw new FunctionException("Invalid values in string.", e); + } + + return returnValues; + } + + /** + * This methods takes a string of input function arguments, evaluates each + * argument and creates a one Integer and one String value for each argument + * from the result of the evaluations. + * + * @param arguments + * The arguments of values to parse. + * @param delimiter + * The delimiter to use while parsing. + * + * @return An array list of object values found in the input string. + * + * @exception FunctionException + * Thrown if the stirng does not properly parse into the + * proper objects. + */ + public static ArrayList getOneStringAndOneInteger(final String arguments, + final char delimiter) throws FunctionException { + + ArrayList returnValues = new ArrayList(); + + try { + final ArgumentTokenizer tokenizer = new ArgumentTokenizer( + arguments, delimiter); + + int tokenCtr = 0; + while (tokenizer.hasMoreTokens()) { + if (tokenCtr == 0) { + final String token = tokenizer.nextToken(); + returnValues.add(token); + } else if (tokenCtr == 1) { + final String token = tokenizer.nextToken().trim(); + returnValues.add(new Integer(new Double(token).intValue())); + } else { + throw new FunctionException("Invalid values in string."); + } + + tokenCtr++; + } + } catch (Exception e) { + throw new FunctionException("Invalid values in string.", e); + } + + return returnValues; + } + + /** + * This methods takes a string of input function arguments, evaluates each + * argument and creates a two Strings and one Integer value for each + * argument from the result of the evaluations. + * + * @param arguments + * The arguments of values to parse. + * @param delimiter + * The delimiter to use while parsing. + * + * @return An array list of object values found in the input string. + * + * @exception FunctionException + * Thrown if the stirng does not properly parse into the + * proper objects. + */ + public static ArrayList getTwoStringsAndOneInteger(final String arguments, + final char delimiter) throws FunctionException { + + final ArrayList returnValues = new ArrayList(); + + try { + final ArgumentTokenizer tokenizer = new ArgumentTokenizer( + arguments, delimiter); + + int tokenCtr = 0; + while (tokenizer.hasMoreTokens()) { + if (tokenCtr == 0 || tokenCtr == 1) { + final String token = tokenizer.nextToken(); + returnValues.add(token); + } else if (tokenCtr == 2) { + final String token = tokenizer.nextToken().trim(); + returnValues.add(new Integer(new Double(token).intValue())); + } else { + throw new FunctionException("Invalid values in string."); + } + + tokenCtr++; + } + } catch (Exception e) { + throw new FunctionException("Invalid values in string.", e); + } + + return returnValues; + } + + /** + * This methods takes a string of input function arguments, evaluates each + * argument and creates a one String and two Integers value for each + * argument from the result of the evaluations. + * + * @param arguments + * The arguments of values to parse. + * @param delimiter + * The delimiter to use while parsing. + * + * @return An array list of object values found in the input string. + * + * @exception FunctionException + * Thrown if the stirng does not properly parse into the + * proper objects. + */ + public static ArrayList getOneStringAndTwoIntegers(final String arguments, + final char delimiter) throws FunctionException { + + final ArrayList returnValues = new ArrayList(); + + try { + final ArgumentTokenizer tokenizer = new ArgumentTokenizer( + arguments, delimiter); + + int tokenCtr = 0; + while (tokenizer.hasMoreTokens()) { + if (tokenCtr == 0) { + final String token = tokenizer.nextToken().trim(); + returnValues.add(token); + } else if (tokenCtr == 1 || tokenCtr == 2) { + final String token = tokenizer.nextToken().trim(); + returnValues.add(new Integer(new Double(token).intValue())); + } else { + throw new FunctionException("Invalid values in string."); + } + + tokenCtr++; + } + } catch (Exception e) { + throw new FunctionException("Invalid values in string.", e); + } + + return returnValues; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionResult.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionResult.java new file mode 100644 index 0000000..bc8ec17 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/FunctionResult.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function; + +/** + * This is a wrapper for the result value returned from a function that not only + * contains the result, but the type. All custom functions must return a + * FunctionResult. + */ +public class FunctionResult { + + // The value returned from a function call. + private String result; + + // The type of the result. Can be a numberic or string. Boolean values come + // back as numeric values. + private int type; + + /** + * Constructor. + * + * @param result + * The result value. + * @param type + * The result type. + * + * @throws FunctionException + * Thrown if result type is invalid. + */ + public FunctionResult(String result, int type) throws FunctionException { + + if (type < FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC + || type > FunctionConstants.FUNCTION_RESULT_TYPE_STRING) { + + throw new FunctionException("Invalid function result type."); + } + + this.result = result; + this.type = type; + } + + /** + * Returns the result value. + * + * @return The result value. + */ + public String getResult() { + return result; + } + + /** + * Returns the result type. + * + * @return The result type. + */ + public int getType() { + return type; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Abs.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Abs.java new file mode 100644 index 0000000..66d08b5 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Abs.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the absolute value of a double value. See the Math.abs(double) method in the + * JDK for a complete description of how this function works. + */ +public class Abs implements Function { + /** + * Returns the name of the function - "abs". + * + * @return The name of this function class. + */ + public String getName() { + return "abs"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The absolute value of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.abs(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Acos.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Acos.java new file mode 100644 index 0000000..22fa70d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Acos.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the arc cosine of an angle. See the Math.ceil(double) method in the JDK for a + * complete description of how this function works. + */ +public class Acos implements Function { + /** + * Returns the name of the function - "acos". + * + * @return The name of this function class. + */ + public String getName() { + return "acos"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The arc cosine value of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.acos(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Asin.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Asin.java new file mode 100644 index 0000000..5bc633a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Asin.java @@ -0,0 +1,72 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the arc sine of an angle See the Math.asin(double) method in the JDK for a + * complete description of how this function works. + */ +public class Asin implements Function { + /** + * Returns the name of the function - "asin". + * + * @return The name of this function class. + */ + public String getName() { + return "asin"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The arc sine of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.asin(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan.java new file mode 100644 index 0000000..2cc293f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the arc tangent of an angle. See the Math.atan(double) method in the JDK for + * a complete description of how this function works. + */ +public class Atan implements Function { + /** + * Returns the name of the function - "atan". + * + * @return The name of this function class. + */ + public String getName() { + return "atan"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The arc tangent of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.atan(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan2.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan2.java new file mode 100644 index 0000000..4b6638c --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Atan2.java @@ -0,0 +1,77 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function + * converts rectangular coordinates to polar. See the Math.atan2(double, double) + * method in the JDK for a complete description of how this function works. + */ +public class Atan2 implements Function { + /** + * Returns the name of the function - "atan2". + * + * @return The name of this function class. + */ + public String getName() { + return "atan2"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two double + * values and evaluated. + * + * @return The arc tangent2 value of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (numbers.size() != 2) { + throw new FunctionException("Two numeric arguments are required."); + } + + try { + double argumentOne = ((Double) numbers.get(0)).doubleValue(); + double argumentTwo = ((Double) numbers.get(1)).doubleValue(); + result = new Double(Math.atan2(argumentOne, argumentTwo)); + } catch (Exception e) { + throw new FunctionException("Two numeric arguments are required.", e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Average.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Average.java new file mode 100644 index 0000000..fd8eab9 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Average.java @@ -0,0 +1,49 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.math.BigDecimal; +import java.util.ArrayList; + + +/** + * 计算多个数字的平均值 + */ +public class Average implements Function { + + @Override + public String getName() { + return "avg"; + } + + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + int count = numbers.size() ; + if (count < 2) { + throw new FunctionException("Two numeric arguments are required at least."); + } + + double sum=0; + for (Double num : numbers) { + //为什么使用这样的方法,而不直接相加呢? + //原因是Java中的简单浮点数类型float和double不能够进行运算,会出现类似如下情况 + //eg:sum(1,2,3,1.2,2.0,3.6)=12.79999999999而不等于12.8 + BigDecimal b1=new BigDecimal(Double.toString(sum)); + BigDecimal b2=new BigDecimal(Double.toString(num)); + sum=b1.add(b2).doubleValue(); + } + + result = new Double(sum/count); + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ceil.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ceil.java new file mode 100644 index 0000000..48026a0 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ceil.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the ceiling value of a double value. See the Math.ceil(double) method in the + * JDK for a complete description of how this function works. + */ +public class Ceil implements Function { + /** + * Returns the name of the function - "ceil". + * + * @return The name of this function class. + */ + public String getName() { + return "ceil"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The ceiling of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.ceil(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Cos.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Cos.java new file mode 100644 index 0000000..15e6be4 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Cos.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the trigonometric cosine of an angle. See the Math.cos(double) method in the + * JDK for a complete description of how this function works. + */ +public class Cos implements Function { + /** + * Returns the name of the function - "cos". + * + * @return The name of this function class. + */ + public String getName() { + return "cos"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The cosine of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.cos(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Exp.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Exp.java new file mode 100644 index 0000000..f24eaaf --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Exp.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the exponential number e (i.e., 2.718...) raised to the power of a double + * value. See the Math.exp(double) method in the JDK for a complete description + * of how this function works. + */ +public class Exp implements Function { + /** + * Returns the name of the function - "exp". + * + * @return The name of this function class. + */ + public String getName() { + return "exp"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The the value e to the argument power, where e is the base of the + * natural logarithms + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.exp(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Floor.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Floor.java new file mode 100644 index 0000000..366b6b9 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Floor.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the floor value of a double value. See the Math.floor(double) method in the + * JDK for a complete description of how this function works. + */ +public class Floor implements Function { + /** + * Returns the name of the function - "floor". + * + * @return The name of this function class. + */ + public String getName() { + return "floor"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The floor of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.floor(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Groovy.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Groovy.java new file mode 100644 index 0000000..06316a4 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Groovy.java @@ -0,0 +1,167 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * This class is a function that executes within Evaluator. The function returns + * the ceiling value of a double value. See the Math.ceil(double) method in the + * JDK for a complete description of how this function works. + */ +@Component +public class Groovy implements Function { + + private static final Logger logger = LoggerFactory.getLogger(Groovy.class); + + private static final ScriptEngineManager factory = new ScriptEngineManager(); + + public static String GROOVY_SHELL_KEY_PREFIX = "GROOVY_SHELL#"; + +// private RedisManager redisManager; + + private static Cache scriptClassCache = Caffeine.newBuilder() + .expireAfterWrite(1, TimeUnit.HOURS) + .expireAfterAccess(1, TimeUnit.HOURS) + .build(); + + /** + * Returns the name of the function - "def main". + * + * @return The name of this function class. + */ + public String getName() { + return "def main"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The ceiling of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + return null; + } + +// public String execute(final String expression, Map data) throws EvaluationException { +// String result = null; +// try { +// ScriptEngine scriptEngine = null; +// String scriptMd5 = PYTHON_SHELL_KEY_PREFIX + MD5.GetMD5Code(expression); +// ScriptEngine value = (ScriptEngine) SerializeUtils.deserialize(redisManager.get(scriptMd5.getBytes())); +// if(value != null){ +// scriptEngine = value; +// } else { +// scriptEngine = factory.getEngineByName("groovy"); +// scriptEngine.eval(expression); +// redisManager.set(scriptMd5.getBytes(), SerializeUtils.serialize(scriptEngine), 120); +// } +// +// Object functionResult = ((Invocable) scriptEngine).invokeFunction("main", data); +// result = functionResult.toString(); +// } catch (Exception e) { +// throw new EvaluationException("执行groovy脚本出错", e); +// } +// return result; +// } + + public String execute(final String expression, Map data) throws EvaluationException { + String result = null; + try { + ScriptEngine scriptEngine = null; + String scriptMd5 = GROOVY_SHELL_KEY_PREFIX + MD5.GetMD5Code(expression); + ScriptEngine value = scriptClassCache.getIfPresent(scriptMd5); + if(value != null){ + scriptEngine = value; + } else { + scriptEngine = factory.getEngineByName("groovy"); + scriptEngine.eval(expression); + scriptClassCache.put(scriptMd5, scriptEngine); + } + + Object functionResult = ((Invocable) scriptEngine).invokeFunction("main", data); + if (functionResult!=null){ + result = functionResult.toString(); + } +// result = functionResult.toString(); + } catch (Exception e) { + throw new EvaluationException("执行groovy脚本出错", e); + } + return result; + } + @Autowired + private Python python; + public Object executeForObject(final String expression, Map data) throws EvaluationException { + Object result = null; + try { + ScriptEngine scriptEngine = null; + String scriptMd5 = GROOVY_SHELL_KEY_PREFIX + MD5.GetMD5Code(expression); + ScriptEngine value = scriptClassCache.getIfPresent(scriptMd5); + if(value != null){ + scriptEngine = value; + } else { + scriptEngine = factory.getEngineByName("groovy"); + scriptEngine.eval(expression); + scriptClassCache.put(scriptMd5, scriptEngine); + } + + Object functionResult = ((Invocable) scriptEngine).invokeFunction("main", data); + if (functionResult!=null){ +// if (functionResult instanceof HashMap||functionResult instanceof ArrayList){ +// result = JSON.toJSONString(functionResult); +// }else +// if (functionResult instanceof String){ +// result = functionResult.toString(); +// }else { +// result = functionResult; +// } + result = functionResult; + } + } catch (Exception e) { + throw new EvaluationException("执行groovy脚本出错", e); + } + return result; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/IEEEremainder.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/IEEEremainder.java new file mode 100644 index 0000000..3814de7 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/IEEEremainder.java @@ -0,0 +1,79 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the remainder operation on two arguments as prescribed by the IEEE 754 + * standard. See the Math.IEEERemainder(double, double) method in the JDK for a + * complete description of how this function works. + */ +public class IEEEremainder implements Function { + /** + * Returns the name of the function - "IEEEremainder". + * + * @return The name of this function class. + */ + public String getName() { + return "IEEEremainder"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two double + * values and evaluated. + * + * @return The the remainder operation on two arguments as prescribed by the + * IEEE 754 standard. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (numbers.size() != 2) { + throw new FunctionException("Two numeric arguments are required."); + } + + try { + double argumentOne = ((Double) numbers.get(0)).doubleValue(); + double argumentTwo = ((Double) numbers.get(1)).doubleValue(); + result = new Double(Math.IEEEremainder(argumentOne, argumentTwo)); + } catch (Exception e) { + throw new FunctionException("Two numeric arguments are required.", e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ln.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ln.java new file mode 100644 index 0000000..727a399 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Ln.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * log以e为底的对数 + */ +public class Ln implements Function { + + @Override + public String getName() { + return "ln"; + } + + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.log(number)/Math.log(Math.E)); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Log.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Log.java new file mode 100644 index 0000000..4918ad4 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Log.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the natural logarithm (base e) of a double value. See the Math.log(double) + * method in the JDK for a complete description of how this function works. + */ +public class Log implements Function { + /** + * Returns the name of the function - "log". + * + * @return The name of this function class. + */ + public String getName() { + return "log"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The natural logarithm of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.log(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/MathFunctions.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/MathFunctions.java new file mode 100644 index 0000000..3875cd4 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/MathFunctions.java @@ -0,0 +1,118 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionGroup; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A groups of functions that can loaded at one time into an instance of + * Evaluator. This group contains all of the functions located in the + * net.sourceforge.jeval.function.math package. + */ +public class MathFunctions implements FunctionGroup { + /** + * Used to store instances of all of the functions loaded by this class. + */ + private List functions = new ArrayList(); + + /** + * Default contructor for this class. The functions loaded by this class are + * instantiated in this constructor. + */ + public MathFunctions() { + functions.add(new Abs()); + functions.add(new Acos()); + functions.add(new Asin()); + functions.add(new Atan()); + functions.add(new Atan2()); + functions.add(new Ceil()); + functions.add(new Cos()); + functions.add(new Exp()); + functions.add(new Floor()); + functions.add(new IEEEremainder()); + functions.add(new Log()); + functions.add(new Pow()); + functions.add(new Random()); + functions.add(new Rint()); + functions.add(new Round()); + functions.add(new Sin()); + functions.add(new Sqrt()); + functions.add(new Tan()); + functions.add(new ToDegrees()); + functions.add(new ToRadians()); + functions.add(new Max()); + functions.add(new Min()); + functions.add(new Sum()); + functions.add(new Ln()); + functions.add(new Average()); + functions.add(new Groovy()); + } + + /** + * Returns the name of the function group - "numberFunctions". + * + * @return The name of this function group class. + */ + public String getName() { + return "numberFunctions"; + } + + /** + * Returns a list of the functions that are loaded by this class. + * + * @return A list of the functions loaded by this class. + */ + public List getFunctions() { + return functions; + } + + /** + * Loads the functions in this function group into an instance of Evaluator. + * + * @param evaluator + * An instance of Evaluator to load the functions into. + */ + public void load(final Evaluator evaluator) { + Iterator functionIterator = functions.iterator(); + + while (functionIterator.hasNext()) { + evaluator.putFunction((Function) functionIterator.next()); + } + } + + /** + * Unloads the functions in this function group from an instance of + * Evaluator. + * + * @param evaluator + * An instance of Evaluator to unload the functions from. + */ + public void unload(final Evaluator evaluator) { + Iterator functionIterator = functions.iterator(); + + while (functionIterator.hasNext()) { + evaluator.removeFunction(((Function) functionIterator.next()) + .getName()); + } + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Max.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Max.java new file mode 100644 index 0000000..e565ad0 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Max.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * 获取多个值得最大值 + */ +public class Max implements Function { + + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + int count = numbers.size() ; + if (count < 2) { + throw new FunctionException("Two numeric arguments are required at least."); + } + + result = (Double)Collections.max(numbers); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + + @Override + public String getName() { + return "max"; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Min.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Min.java new file mode 100644 index 0000000..5923c3d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Min.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * 获取多个值最小值 + */ +public class Min implements Function { + + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + int count = numbers.size() ; + if (count < 2) { + throw new FunctionException("Two numeric arguments are required at least."); + } + + result = (Double)Collections.min(numbers); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + + @Override + public String getName() { + return "min"; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Pow.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Pow.java new file mode 100644 index 0000000..8719200 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Pow.java @@ -0,0 +1,79 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the value of the first argument raised to the second power of the second + * argument. See the Math.pow(double, double) method in the JDK for a complete + * description of how this function works. + */ +public class Pow implements Function { + /** + * Returns the name of the function - "pow". + * + * @return The name of this function class. + */ + public String getName() { + return "pow"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two double + * values and evaluated. + * + * @return The value of the first argument raised to the second power of the + * second argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (numbers.size() != 2) { + throw new FunctionException("Two numeric arguments are required."); + } + + try { + double argumentOne = ((Double) numbers.get(0)).doubleValue(); + double argumentTwo = ((Double) numbers.get(1)).doubleValue(); + result = new Double(Math.pow(argumentOne, argumentTwo)); + } catch (Exception e) { + throw new FunctionException("Two numeric arguments are required.", e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Python.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Python.java new file mode 100644 index 0000000..1d79eb6 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Python.java @@ -0,0 +1,177 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.python.core.PyDictionary; +import org.python.core.PyObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +public class Python implements Function { + + private static final Logger logger = LoggerFactory.getLogger(Groovy.class); + + private static final ScriptEngineManager factory = new ScriptEngineManager(); + + public static String PYTHON_SHELL_KEY_PREFIX = "JYTHON_SHELL#"; + + private static Cache scriptClassCache = Caffeine.newBuilder() + .expireAfterWrite(1, TimeUnit.HOURS) + .expireAfterAccess(1, TimeUnit.HOURS) + .build(); + /** + * Returns the name of the function - "def main". + * + * @return The name of this function class. + */ + @Override + public String getName() { + return "if __name__ == \"__main__\":"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The ceiling of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) throws FunctionException { + return null; + } + + public Object executeForObject(final String expression, Map data) throws EvaluationException { + Object result = null; + try { + ScriptEngine scriptEngine = null; + String scriptMd5 = PYTHON_SHELL_KEY_PREFIX + MD5.GetMD5Code(expression); + ScriptEngine value = scriptClassCache.getIfPresent(scriptMd5); + Object functionResult = null; + + if(value != null){ + scriptEngine = value; + } else { + scriptEngine = factory.getEngineByName("python"); + scriptEngine.eval(expression); + scriptClassCache.put(scriptMd5, scriptEngine); + } + PyDictionary pyDictionary = new PyDictionary(); + for (Map.Entry entry : data.entrySet()) { + pyDictionary.put(entry.getKey(),entry.getValue()); + } + +// PythonInterpreter interpreter = new PythonInterpreter(); +// interpreter.exec(new String(expression.getBytes())); +// PyFunction python_main = interpreter.get("python_main", PyFunction.class); +// PyObject pyObject = python_main.__call__(pyDictionary); +// System.out.println(pyObject); +// String ret = pyObject.toString(); +// String newStr = new String(ret.getBytes("iso8859-1"), "utf-8"); //通过new String(ret.getBytes("iso8859-1"), "utf-8")转一下就好了 +// System.out.println(newStr); //newStr就不会乱码了 +// System.out.println(getEncode(String.valueOf(pyObject))); + functionResult = ((Invocable) scriptEngine).invokeFunction("python_main", pyDictionary); + if (functionResult instanceof PyDictionary){ + PyObject resultPy = (PyObject)functionResult; + String ret = resultPy.toString();//这里ret可能会乱码 + System.out.println(ret); + } + result = functionResult; + } catch (Exception e) { + e.printStackTrace(); + throw new EvaluationException("执行Python脚本出错", e); + } + return result; + } + // 这里可以提供更多地编码格式,另外由于部分编码格式是一致的所以会返回 第一个匹配的编码格式 GBK 和 GB2312 + public static final String[] encodes = new String[] { "UTF-8", "GBK", "GB2312", "ISO-8859-1", "ISO-8859-2" }; + + /** + * 获取字符串编码格式 + * + * @param str + * @return + */ + public static String getEncode(String str) { + byte[] data = str.getBytes(); + byte[] b = null; + a:for (int i = 0; i < encodes.length; i++) { + try { + b = str.getBytes(encodes[i]); + if (b.length!=data.length) + continue; + for (int j = 0; j < b.length; j++) { + if (b[j] != data[j]) { + continue a; + } + } + return encodes[i]; + } catch (UnsupportedEncodingException e) { + continue; + } + } + return null; + } + + public static void main(String[] args) throws IOException { +// Properties props = new Properties(); +//// props.put("python.home", "F:\\Java\\jython\\jython2.7.1\\Lib"); +// props.put("python.console.encoding", "UTF-8"); +// props.put("python.security.respectJavaAccessibility", "false"); +// props.put("python.import.site", "false"); +// Properties preprops = System.getProperties(); +// PythonInterpreter.initialize(preprops, props, new String[0]); +// PythonInterpreter interpreter = new PythonInterpreter(); +// interpreter.exec("#coding=UTF-8 \n" + +// "print('a智障v')"); +// interpreter.execfile("E:\\python\\迭代求阶乘.py"); + + +// PythonInterpreter interpreter = new PythonInterpreter(); +// interpreter.exec("# -*- encoding: utf-8 -*- \na='智障'; "); +// interpreter.exec("print a;"); +// interpreter.exec("print '智障';"); +// String s = "python \ndef python_main(_):\n" + +// " # result 为返回结果其中内部字段解释为:ruleScore(规则命中时得分),hitResult规则是否命中可选值为:命中/未命中\n" + +// " # fieldList 为输出字段列表,内部为字典表,updateInputMap 为需要更新到入参的变量是一个字典表\n" + +// "\n" + +// " result = {\"ruleScore\":0,\"hitResult\":\"未命中\",\"fieldList\":[],\"updateInputMap\":{}}\n" + +// " print(_)\n" + +// " print(\"未命中\")\n" + +// " result[\"ruleScore\"] = 420\n" + +// " result[\"hitResult\"] = \"命中\"\n" + +// " return result\n" + +// "\n" + +// "if __name__ == \"__main__\":\n" + +// " python_main(params)"; +// String[] inputParam = new String[2]; +// inputParam[0] = "python3"; +// inputParam[1] = s; +// Runtime.getRuntime().exec(s); + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Random.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Random.java new file mode 100644 index 0000000..e079f16 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Random.java @@ -0,0 +1,63 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * a random double value greater than or equal to 0.0 and less than 1.0. See the + * Math.random() method in the JDK for a complete description of how this + * function works. + */ +public class Random implements Function { + /** + * Returns the name of the function - "random". + * + * @return The name of this function class. + */ + public String getName() { + return "random"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * Not used. + * + * @return A random double value greater than or equal to 0.0 and less than + * 1.0. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = new Double(Math.random()); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Rint.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Rint.java new file mode 100644 index 0000000..a1f28c1 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Rint.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the double value that is closest in value to the argument and is equal to a + * mathematical integer. See the Math.rint(double) method in the JDK for a + * complete description of how this function works. + */ +public class Rint implements Function { + /** + * Returns the name of the function - "rint". + * + * @return The name of this function class. + */ + public String getName() { + return "rint"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A double value that is closest in value to the argument and is + * equal to a mathematical integer. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.rint(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Round.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Round.java new file mode 100644 index 0000000..7f3cdae --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Round.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the closet long to a double value. See the Math.round(double) method in the + * JDK for a complete description of how this function works. + */ +public class Round implements Function { + /** + * Returns the name of the function - "round". + * + * @return The name of this function class. + */ + public String getName() { + return "round"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A long value that is closest to the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Long result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Long(Math.round(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sin.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sin.java new file mode 100644 index 0000000..f1e8101 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sin.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the sine of an angle. See the Math.sin(double) method in the JDK for a + * complete description of how this function works. + */ +public class Sin implements Function { + /** + * Returns the name of the function - "sin". + * + * @return The name of this function class. + */ + public String getName() { + return "sin"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return The sine of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.sin(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sqrt.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sqrt.java new file mode 100644 index 0000000..3948d2a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sqrt.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * a square root of a double value. See the Math.sqrt(double) method in the JDK + * for a complete description of how this function works. + */ +public class Sqrt implements Function { + /** + * Returns the name of the function - "sqrt". + * + * @return The name of this function class. + */ + public String getName() { + return "sqrt"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A square root of the argument. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.sqrt(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sum.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sum.java new file mode 100644 index 0000000..8470cbb --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Sum.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.math.BigDecimal; +import java.util.ArrayList; + +/** + * 计算多个数字的和 + */ +public class Sum implements Function { + + @Override + public String getName() { + return "sum"; + } + + @Override + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + + ArrayList numbers = FunctionHelper.getDoubles(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + int count = numbers.size() ; + if (count < 2) { + throw new FunctionException("Two numeric arguments are required at least."); + } + + double sum=0; + for (Double num : numbers) { + //为什么使用这样的方法,而不直接相加呢? + //原因是Java中的简单浮点数类型float和double不能够进行运算,会出现类似如下情况 + //eg:sum(1,2,3,1.2,2.0,3.6)=12.79999999999而不等于12.8 + BigDecimal b1=new BigDecimal(Double.toString(sum)); + BigDecimal b2=new BigDecimal(Double.toString(num)); + sum=b1.add(b2).doubleValue(); + } + result = new Double(sum); + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Tan.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Tan.java new file mode 100644 index 0000000..b8346dc --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/Tan.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * trigonometric tangent of an angle. See the Math.tan(double) method in the JDK + * for a complete description of how this function works. + */ +public class Tan implements Function { + /** + * Returns the name of the function - "tan". + * + * @return The name of this function class. + */ + public String getName() { + return "tan"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A trigonometric tangent of an angle. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.tan(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToDegrees.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToDegrees.java new file mode 100644 index 0000000..0106acd --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToDegrees.java @@ -0,0 +1,72 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function + * converts an angle measured in radians to the equivalent angle measured in + * degrees. See the Math.toDegrees(double) method in the JDK for a complete + * description of how this function works. + */ +public class ToDegrees implements Function { + /** + * Returns the name of the function - "toDegrees". + * + * @return The name of this function class. + */ + public String getName() { + return "toDegrees"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A measurement of the argument in degrees. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.toDegrees(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToRadians.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToRadians.java new file mode 100644 index 0000000..3e8fb8b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/math/ToRadians.java @@ -0,0 +1,72 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.math; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function + * converts an angle measured in degress to the equivalent angle measured in + * radians. See the Math.toRadians(double) method in the JDK for a complete + * description of how this function works. + */ +public class ToRadians implements Function { + /** + * Returns the name of the function - "toRadians". + * + * @return The name of this function class. + */ + public String getName() { + return "toRadians"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted to a double value and + * evaluated. + * + * @return A measurement of the argument in radians. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(Evaluator evaluator, String arguments) + throws FunctionException { + Double result = null; + Double number = null; + + try { + number = new Double(arguments); + } catch (Exception e) { + throw new FunctionException("Invalid argument.", e); + } + + result = new Double(Math.toRadians(number.doubleValue())); + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CharAt.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CharAt.java new file mode 100644 index 0000000..439f20b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CharAt.java @@ -0,0 +1,96 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the character at the specified index in the source string. See the + * String.charAt(int) method in the JDK for a complete description of how this + * function works. + */ +public class CharAt implements Function { + /** + * Returns the name of the function - "charAt". + * + * @return The name of this function class. + */ + public String getName() { + return "charAt"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string and + * one integer argument. The first argument is the source string + * and the second argument is the index. The string argument(s) + * HAS to be enclosed in quotes. White space that is not enclosed + * within quotes will be trimmed. Quote characters in the first + * and last positions of any string argument (after being + * trimmed) will be removed also. The quote characters used must + * be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return A character that is located at the specified index. The value is + * returned as a string. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string and one integer argument " + + "are required."; + + ArrayList values = FunctionHelper.getOneStringAndOneInteger(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + int index = ((Integer) values.get(1)).intValue(); + + char[] character = new char[1]; + character[0] = argumentOne.charAt(index); + + result = new String(character); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareTo.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareTo.java new file mode 100644 index 0000000..faf2135 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareTo.java @@ -0,0 +1,93 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function + * compares two strings lexicographically. See the String.compareTo(String) + * method in the JDK for a complete description of how this function works. + */ +public class CompareTo implements Function { + /** + * Returns the name of the function - "compareTo". + * + * @return The name of this function class. + */ + public String getName() { + return "compareTo"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is the first string to compare + * and the second argument is the second string to compare. The + * string argument(s) HAS to be enclosed in quotes. White space + * that is not enclosed within quotes will be trimmed. Quote + * characters in the first and last positions of any string + * argument (after being trimmed) will be removed also. The quote + * characters used must be the same as the quote characters used + * by the current instance of Evaluator. If there are multiple + * arguments, they must be separated by a comma (","). + * + * @return Returns an integer value of zero if the strings are equal, an + * integer value less than zero if the first string precedes the + * second string or an integer value greater than zero if the first + * string follows the second string. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Integer result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + result = new Integer(argumentOne.compareTo(argumentTwo)); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareToIgnoreCase.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareToIgnoreCase.java new file mode 100644 index 0000000..0f4f7bc --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/CompareToIgnoreCase.java @@ -0,0 +1,94 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function + * compares two strings lexicographically, ignoreing case considerations. See + * the String.compareTo(String) method in the JDK for a complete description of + * how this function works. + */ +public class CompareToIgnoreCase implements Function { + /** + * Returns the name of the function - "compareToIgnoreCase". + * + * @return The name of this function class. + */ + public String getName() { + return "compareToIgnoreCase"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is the first string to compare + * and the second argument is the second argument to compare. The + * string argument(s) HAS to be enclosed in quotes. White space + * that is not enclosed within quotes will be trimmed. Quote + * characters in the first and last positions of any string + * argument (after being trimmed) will be removed also. The quote + * characters used must be the same as the quote characters used + * by the current instance of Evaluator. If there are multiple + * arguments, they must be separated by a comma (","). + * + * @return Returns an integer value of zero if the strings are equal, an + * integer value less than zero if the first string precedes the + * second string or an integer value greater than zero if the first + * string follows the second string. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Integer result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + result = new Integer(argumentOne.compareToIgnoreCase(argumentTwo)); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Concat.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Concat.java new file mode 100644 index 0000000..eadc609 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Concat.java @@ -0,0 +1,92 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function + * concatenates the second string to the end of the first. See the + * String.concat(String) method in the JDK for a complete description of how + * this function works. + */ +public class Concat implements Function { + /** + * Returns the name of the function - "concat". + * + * @return The name of this function class. + */ + public String getName() { + return "concat"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is the string in which the + * second argument string will be concatenated. The string + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns a strng that is made up the first string, followed by the + * second string. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + result = argumentOne.concat(argumentTwo); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Contains.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Contains.java new file mode 100644 index 0000000..fa67cad --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Contains.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the index within the source string of the first occurrence of the substring, + * starting at the specified index. See the String.indexOf(String, int) method + * in the JDK for a complete description of how this function works. + */ +public class Contains implements Function { + /** + * Returns the name of the function - "indexOf". + * + * @return The name of this function class. + */ + public String getName() { + return "contains"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments and one integer argument. The first argument is the + * source string, the second argument is the substring and the + * third argument is the index. The string argument(s) HAS to be + * enclosed in quotes. White space that is not enclosed within + * quotes will be trimmed. Quote characters in the first and last + * positions of any string argument (after being trimmed) will be + * removed also. The quote characters used must be the same as + * the quote characters used by the current instance of + * Evaluator. If there are multiple arguments, they must be + * separated by a comma (","). + * + * @return Returns The index at where the substring is found. If the + * substring is not found, then -1 is returned. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.contains(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EndsWith.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EndsWith.java new file mode 100644 index 0000000..3b6dcb5 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EndsWith.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function tests + * if the string ends with a specified suffix. See the String.endswith(String) + * method in the JDK for a complete description of how this function works. + */ +public class EndsWith implements Function { + /** + * Returns the name of the function - "endsWith". + * + * @return The name of this function class. + */ + public String getName() { + return "endsWith"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is the string to test and second + * argument is the suffix. The string argument(s) HAS to be + * enclosed in quotes. White space that is not enclosed within + * quotes will be trimmed. Quote characters in the first and last + * positions of any string argument (after being trimmed) will be + * removed also. The quote characters used must be the same as + * the quote characters used by the current instance of + * Evaluator. If there are multiple arguments, they must be + * separated by a comma (","). + * + * @return Returns "1.0" (true) if the string ends with the suffix, + * otherwise it returns "0.0" (false). The return value respresents + * a Boolean value that is compatible with the Boolean operators + * used by Evaluator. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.endsWith(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Equals.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Equals.java new file mode 100644 index 0000000..af41f07 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Equals.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function tests + * one string equals another. See the String.equals(String) method in the JDK + * for a complete description of how this function works. + */ +public class Equals implements Function { + /** + * Returns the name of the function - "equals". + * + * @return The name of this function class. + */ + public String getName() { + return "equals"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is a string that will be + * compared to the second argument / string. The string + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns "1.0" (true) if the string ends with the suffix, + * otherwise it returns "0.0" (false). The return value respresents + * a Boolean value that is compatible with the Boolean operators + * used by Evaluator. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.equals(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EqualsIgnoreCase.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EqualsIgnoreCase.java new file mode 100644 index 0000000..8738af9 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/EqualsIgnoreCase.java @@ -0,0 +1,99 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function tests + * one string equals another, but ignores case. See the + * String.equalsIgnoreCase(String) method in the JDK for a complete description + * of how this function works. + */ +public class EqualsIgnoreCase implements Function { + /** + * Returns the name of the function - "equalsIgnoreCase". + * + * @return The name of this function class. + */ + public String getName() { + return "equalsIgnoreCase"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is a string that will be + * compared to the second argument / string. The string + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns "1.0" (true) if the string ends with the suffix, + * otherwise it returns "0.0" (false). The return value respresents + * a Boolean value that is compatible with the Boolean operators + * used by Evaluator. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.equalsIgnoreCase(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Eval.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Eval.java new file mode 100644 index 0000000..6f931e5 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Eval.java @@ -0,0 +1,78 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.Function; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionException; +import com.fibo.ddp.common.utils.util.runner.jeval.function.FunctionResult; + +/** + * This class is a function that executes within Evaluator. The function returns + * the result of a Evaluator compatible expression. See the + * Evaluator.evaluate(String) method for a complete description of how this + * function works. + */ +public class Eval implements Function { + /** + * Returns the name of the function - "eval". + * + * @return The name of this function class. + */ + public String getName() { + return "eval"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of evaluator. + * @param arguments + * A string expression that is compatible with Evaluator. *** THE + * STRING ARGUMENT SHOULD NOT BE ENCLOSED IN QUOTES OR THE + * EXPRESSION MAY NOT BE EVALUATED CORRECTLY.*** *** FUNCTION + * CALLS ARE VALID WITHIN THE EVAL FUNCTION. *** + * + * @return The evaluated result fot the input expression. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, + final String arguments) throws FunctionException { + String result = null; + + try { + result = evaluator.evaluate(arguments, false, true); + } catch (EvaluationException ee) { + throw new FunctionException(ee.getMessage(), ee); + } + + int resultType = FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC; + try { + Double.parseDouble(result); + } catch (NumberFormatException nfe) { + resultType = FunctionConstants.FUNCTION_RESULT_TYPE_STRING; + } + + return new FunctionResult(result, resultType); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/IndexOf.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/IndexOf.java new file mode 100644 index 0000000..cec146f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/IndexOf.java @@ -0,0 +1,95 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the index within the source string of the first occurrence of the substring, + * starting at the specified index. See the String.indexOf(String, int) method + * in the JDK for a complete description of how this function works. + */ +public class IndexOf implements Function { + /** + * Returns the name of the function - "indexOf". + * + * @return The name of this function class. + */ + public String getName() { + return "indexOf"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments and one integer argument. The first argument is the + * source string, the second argument is the substring and the + * third argument is the index. The string argument(s) HAS to be + * enclosed in quotes. White space that is not enclosed within + * quotes will be trimmed. Quote characters in the first and last + * positions of any string argument (after being trimmed) will be + * removed also. The quote characters used must be the same as + * the quote characters used by the current instance of + * Evaluator. If there are multiple arguments, they must be + * separated by a comma (","). + * + * @return Returns The index at where the substring is found. If the + * substring is not found, then -1 is returned. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Integer result = null; + String exceptionMessage = "Two string arguments and one integer " + + "argument are required."; + + ArrayList values = FunctionHelper.getTwoStringsAndOneInteger(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 3) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(1), evaluator.getQuoteCharacter()); + int index = ((Integer) values.get(2)).intValue(); + result = new Integer(argumentOne.indexOf(argumentTwo, index)); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/LastIndexOf.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/LastIndexOf.java new file mode 100644 index 0000000..ac561f6 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/LastIndexOf.java @@ -0,0 +1,95 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the index within the source string of the last occurrence of the substring, + * starting at the specified index. See the String.lastIndexOf(String, int) + * method in the JDK for a complete description of how this function works. + */ +public class LastIndexOf implements Function { + /** + * Returns the name of the function - "lastIndexOf". + * + * @return The name of this function class. + */ + public String getName() { + return "lastIndexOf"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments and one integer argument. The first argument is the + * source string, the second argument is the substring and the + * third argument is the index. The string argument(s) HAS to be + * enclosed in quotes. White space that is not enclosed within + * quotes will be trimmed. Quote characters in the first and last + * positions of any string argument (after being trimmed) will be + * removed also. The quote characters used must be the same as + * the quote characters used by the current instance of + * Evaluator. If there are multiple arguments, they must be + * separated by a comma (","). + * + * @return Returns The index at where the substring is found. If the + * substring is not found, then -1 is returned. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Integer result = null; + String exceptionMessage = "Two string arguments and one integer " + + "argument are required."; + + ArrayList values = FunctionHelper.getTwoStringsAndOneInteger(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 3) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(1), evaluator.getQuoteCharacter()); + int index = ((Integer) values.get(2)).intValue(); + result = new Integer(argumentOne.lastIndexOf(argumentTwo, index)); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Length.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Length.java new file mode 100644 index 0000000..bfec995 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Length.java @@ -0,0 +1,80 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +/** + * This class is a function that executes within Evaluator. The function returns + * the length of the source string. See the String.length() method in the JDK + * for a complete description of how this function works. + */ +public class Length implements Function { + /** + * Returns the name of the function - "length". + * + * @return The name of this function class. + */ + public String getName() { + return "length"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string + * argument. The string argument(s) HAS to be enclosed in quotes. + * White space that is not enclosed within quotes will be + * trimmed. Quote characters in the first and last positions of + * any string argument (after being trimmed) will be removed + * also. The quote characters used must be the same as the quote + * characters used by the current instance of Evaluator. If there + * are multiple arguments, they must be separated by a comma + * (","). + * + * @return The length of the source string. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + Integer result = null; + String exceptionMessage = "One string argument is required."; + + try { + String stringValue = arguments; + + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + stringValue, evaluator.getQuoteCharacter()); + + result = new Integer(argumentOne.length()); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result.toString(), + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotContains.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotContains.java new file mode 100644 index 0000000..d326143 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotContains.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * the index within the source string of the first occurrence of the substring, + * starting at the specified index. See the String.indexOf(String, int) method + * in the JDK for a complete description of how this function works. + */ +public class NotContains implements Function { + /** + * Returns the name of the function - "indexOf". + * + * @return The name of this function class. + */ + public String getName() { + return "notContains"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments and one integer argument. The first argument is the + * source string, the second argument is the substring and the + * third argument is the index. The string argument(s) HAS to be + * enclosed in quotes. White space that is not enclosed within + * quotes will be trimmed. Quote characters in the first and last + * positions of any string argument (after being trimmed) will be + * removed also. The quote characters used must be the same as + * the quote characters used by the current instance of + * Evaluator. If there are multiple arguments, they must be + * separated by a comma (","). + * + * @return Returns The index at where the substring is found. If the + * substring is not found, then -1 is returned. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.contains(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotEquals.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotEquals.java new file mode 100644 index 0000000..224998f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/NotEquals.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function tests + * one string equals another. See the String.equals(String) method in the JDK + * for a complete description of how this function works. + */ +public class NotEquals implements Function { + /** + * Returns the name of the function - "equals". + * + * @return The name of this function class. + */ + public String getName() { + return "notEquals"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments. The first argument is a string that will be + * compared to the second argument / string. The string + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns "1.0" (true) if the string ends with the suffix, + * otherwise it returns "0.0" (false). The return value respresents + * a Boolean value that is compatible with the Boolean operators + * used by Evaluator. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments are required."; + + ArrayList strings = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (strings.size() != 2) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) strings.get(1), evaluator.getQuoteCharacter()); + + if (argumentOne.equals(argumentTwo)) { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Replace.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Replace.java new file mode 100644 index 0000000..9bfdf4b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Replace.java @@ -0,0 +1,115 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * a new string with all of the occurances of the old character in the source + * string replaced with the new character. See the String.replace(char, char) + * method in the JDK for a complete description of how this function works. + */ +public class Replace implements Function { + /** + * Returns the name of the function - "replace". + * + * @return The name of this function class. + */ + public String getName() { + return "replace"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string and + * two character arguments. The first argument is the source + * string to replace the charactes in. The second argument is the + * old character to replace in the source string. The third + * argument is the new character to replace the old character + * with in the source string. The string and character + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns a string with every occurence of the old character + * replaced with the new character. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string argument and two character " + + "arguments are required."; + + ArrayList values = FunctionHelper.getStrings(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 3) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(1), evaluator.getQuoteCharacter()); + + String argumentThree = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(2), evaluator.getQuoteCharacter()); + + char oldCharacter = ' '; + if (argumentTwo.length() == 1) { + oldCharacter = argumentTwo.charAt(0); + } else { + throw new FunctionException(exceptionMessage); + } + + char newCharacter = ' '; + if (argumentThree.length() == 1) { + newCharacter = argumentThree.charAt(0); + } else { + throw new FunctionException(exceptionMessage); + } + + result = argumentOne.replace(oldCharacter, newCharacter); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StartsWith.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StartsWith.java new file mode 100644 index 0000000..1a27644 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StartsWith.java @@ -0,0 +1,102 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function tests + * if the string starts with a specified prefix beginning at a specified index. + * See the String.startsWith(String, int) method in the JDK for a complete + * description of how this function works. + */ +public class StartsWith implements Function { + /** + * Returns the name of the function - "startsWith". + * + * @return The name of this function class. + */ + public String getName() { + return "startsWith"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into two string + * arguments and one integer argument. The first argument is the + * string to test, the second argument is the prefix and the + * third argument is the index to start at. The string + * argument(s) HAS to be enclosed in quotes. White space that is + * not enclosed within quotes will be trimmed. Quote characters + * in the first and last positions of any string argument (after + * being trimmed) will be removed also. The quote characters used + * must be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns "1.0" (true) if the string ends with the suffix, + * otherwise it returns "0.0" (false). The return value respresents + * a Boolean value that is compatible with the Boolean operators + * used by Evaluator. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "Two string arguments and one integer " + + "argument are required."; + + ArrayList values = FunctionHelper.getTwoStringsAndOneInteger(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 3) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + String argumentTwo = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(1), evaluator.getQuoteCharacter()); + int index = ((Integer) values.get(2)).intValue(); + + if (argumentOne.startsWith(argumentTwo, index)) { + result = EvaluationConstants.BOOLEAN_STRING_TRUE; + } else { + result = EvaluationConstants.BOOLEAN_STRING_FALSE; + } + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_NUMERIC); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StringFunctions.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StringFunctions.java new file mode 100644 index 0000000..7d34fdd --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/StringFunctions.java @@ -0,0 +1,111 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A groups of functions that can loaded at one time into an instance of + * Evaluator. This group contains all of the functions located in the + * net.sourceforge.jeval.function.string package. + */ +public class StringFunctions implements FunctionGroup { + /** + * Used to store instances of all of the functions loaded by this class. + */ + private List functions = new ArrayList(); + + /** + * Default contructor for this class. The functions loaded by this class are + * instantiated in this constructor. + */ + public StringFunctions() { + functions.add(new CharAt()); + functions.add(new CompareTo()); + functions.add(new CompareToIgnoreCase()); + functions.add(new Concat()); + functions.add(new EndsWith()); + functions.add(new Equals()); + functions.add(new EqualsIgnoreCase()); + functions.add(new Eval()); + functions.add(new IndexOf()); + functions.add(new LastIndexOf()); + functions.add(new Length()); + functions.add(new Replace()); + functions.add(new StartsWith()); + functions.add(new Substring()); + functions.add(new ToLowerCase()); + functions.add(new ToUpperCase()); + functions.add(new Trim()); + functions.add(new Contains()); + functions.add(new NotContains()); + functions.add(new NotEquals()); + } + + /** + * Returns the name of the function group - "stringFunctions". + * + * @return The name of this function group class. + */ + public String getName() { + return "stringFunctions"; + } + + /** + * Returns a list of the functions that are loaded by this class. + * + * @return A list of the functions loaded by this class. + */ + public List getFunctions() { + return functions; + } + + /** + * Loads the functions in this function group into an instance of Evaluator. + * + * @param evaluator + * An instance of Evaluator to load the functions into. + */ + public void load(final Evaluator evaluator) { + Iterator functionIterator = functions.iterator(); + + while (functionIterator.hasNext()) { + evaluator.putFunction((Function) functionIterator.next()); + } + } + + /** + * Unloads the functions in this function group from an instance of + * Evaluator. + * + * @param evaluator + * An instance of Evaluator to unload the functions from. + */ + public void unload(final Evaluator evaluator) { + Iterator functionIterator = functions.iterator(); + + while (functionIterator.hasNext()) { + evaluator.removeFunction(((Function) functionIterator.next()) + .getName()); + } + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Substring.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Substring.java new file mode 100644 index 0000000..73d876c --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Substring.java @@ -0,0 +1,93 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +import java.util.ArrayList; + +/** + * This class is a function that executes within Evaluator. The function returns + * a string that is a substring of the source string. See the + * String.substring(int, int) method in the JDK for a complete description of + * how this function works. + */ +public class Substring implements Function { + /** + * Returns the name of the function - "substring". + * + * @return The name of this function class. + */ + public String getName() { + return "substring"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string + * argument and two integer arguments. The first argument is the + * source string, the second argument is the beginning index and + * the third argument is the ending index. The string argument(s) + * HAS to be enclosed in quotes. White space that is not enclosed + * within quotes will be trimmed. Quote characters in the first + * and last positions of any string argument (after being + * trimmed) will be removed also. The quote characters used must + * be the same as the quote characters used by the current + * instance of Evaluator. If there are multiple arguments, they + * must be separated by a comma (","). + * + * @return Returns the specified substring. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string argument and two integer " + + "arguments are required."; + + ArrayList values = FunctionHelper.getOneStringAndTwoIntegers(arguments, + EvaluationConstants.FUNCTION_ARGUMENT_SEPARATOR); + + if (values.size() != 3) { + throw new FunctionException(exceptionMessage); + } + + try { + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + (String) values.get(0), evaluator.getQuoteCharacter()); + int beginningIndex = ((Integer) values.get(1)).intValue(); + int endingIndex = ((Integer) values.get(2)).intValue(); + result = argumentOne.substring(beginningIndex, endingIndex); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToLowerCase.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToLowerCase.java new file mode 100644 index 0000000..daf4e19 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToLowerCase.java @@ -0,0 +1,80 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +/** + * This class is a function that executes within Evaluator. The function returns + * the source string in lower case. See the String.toLowerCase() method in the + * JDK for a complete description of how this function works. + */ +public class ToLowerCase implements Function { + /** + * Returns the name of the function - "toLowerCase". + * + * @return The name of this function class. + */ + public String getName() { + return "toLowerCase"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string + * argument. The string argument(s) HAS to be enclosed in quotes. + * White space that is not enclosed within quotes will be + * trimmed. Quote characters in the first and last positions of + * any string argument (after being trimmed) will be removed + * also. The quote characters used must be the same as the quote + * characters used by the current instance of Evaluator. If there + * are multiple arguments, they must be separated by a comma + * (","). + * + * @return The source string, converted to lowercase. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string argument is required."; + + try { + String stringValue = arguments; + + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + stringValue, evaluator.getQuoteCharacter()); + + result = argumentOne.toLowerCase(); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToUpperCase.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToUpperCase.java new file mode 100644 index 0000000..3e2c21a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/ToUpperCase.java @@ -0,0 +1,80 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +/** + * This class is a function that executes within Evaluator. The function returns + * the source string in upper case. See the String.toUpperCase() method in the + * JDK for a complete description of how this function works. + */ +public class ToUpperCase implements Function { + /** + * Returns the name of the function - "toUpperCase". + * + * @return The name of this function class. + */ + public String getName() { + return "toUpperCase"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string + * argument. The string argument(s) HAS to be enclosed in quotes. + * White space that is not enclosed within quotes will be + * trimmed. Quote characters in the first and last positions of + * any string argument (after being trimmed) will be removed + * also. The quote characters used must be the same as the quote + * characters used by the current instance of Evaluator. If there + * are multiple arguments, they must be separated by a comma + * (","). + * + * @return The source string, converted to lowercase. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string argument is required."; + + try { + String stringValue = arguments; + + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + stringValue, evaluator.getQuoteCharacter()); + + result = argumentOne.toUpperCase(); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Trim.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Trim.java new file mode 100644 index 0000000..f053581 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/function/string/Trim.java @@ -0,0 +1,81 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.function.string; + +import com.fibo.ddp.common.utils.util.runner.jeval.Evaluator; +import com.fibo.ddp.common.utils.util.runner.jeval.function.*; + +/** + * This class is a function that executes within Evaluator. The function returns + * the source string with white space removed from both ends. See the + * String.trim() method in the JDK for a complete description of how this + * function works. + */ +public class Trim implements Function { + /** + * Returns the name of the function - "trim". + * + * @return The name of this function class. + */ + public String getName() { + return "trim"; + } + + /** + * Executes the function for the specified argument. This method is called + * internally by Evaluator. + * + * @param evaluator + * An instance of Evaluator. + * @param arguments + * A string argument that will be converted into one string + * argument. The string argument(s) HAS to be enclosed in quotes. + * White space that is not enclosed within quotes will be + * trimmed. Quote characters in the first and last positions of + * any string argument (after being trimmed) will be removed + * also. The quote characters used must be the same as the quote + * characters used by the current instance of Evaluator. If there + * are multiple arguments, they must be separated by a comma + * (","). + * + * @return The source string, with white space removed from both ends. + * + * @exception FunctionException + * Thrown if the argument(s) are not valid for this function. + */ + public FunctionResult execute(final Evaluator evaluator, final String arguments) + throws FunctionException { + String result = null; + String exceptionMessage = "One string argument is required."; + + try { + String stringValue = arguments; + + String argumentOne = FunctionHelper.trimAndRemoveQuoteChars( + stringValue, evaluator.getQuoteCharacter()); + + result = argumentOne.trim(); + } catch (FunctionException fe) { + throw new FunctionException(fe.getMessage(), fe); + } catch (Exception e) { + throw new FunctionException(exceptionMessage, e); + } + + return new FunctionResult(result, + FunctionConstants.FUNCTION_RESULT_TYPE_STRING); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AbstractOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AbstractOperator.java new file mode 100644 index 0000000..e4ff93a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AbstractOperator.java @@ -0,0 +1,182 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; + +/** + * This is the standard operator that is the parent to all operators found in + * expressions. + */ +public abstract class AbstractOperator implements Operator { + + private String symbol = null; + + private int precedence = 0; + + private boolean unary = false; + + /** + * A constructor that takes the operator symbol and precedence as input. + * + * @param symbol + * The character(s) that makes up the operator. + * @param precedence + * The precedence level given to this operator. + */ + public AbstractOperator(final String symbol, final int precedence) { + + this.symbol = symbol; + this.precedence = precedence; + } + + /** + * A constructor that takes the operator symbol, precedence, unary indicator + * and unary precedence as input. + * + * @param symbol + * The character(s) that makes up the operator. + * @param precedence + * The precedence level given to this operator. + * @param unary + * Indicates of the operator is a unary operator or not. + */ + public AbstractOperator( + + String symbol, int precedence, boolean unary) { + + this.symbol = symbol; + this.precedence = precedence; + this.unary = unary; + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + * + * @return String The value of the evaluated operands. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public String evaluate(final String leftOperand, final String rightOperand) + throws EvaluationException { + throw new EvaluationException("Invalid operation for a string."); + } + + /** + * Evaluate one double operand. + * + * @param operand + * The operand being evaluated. + */ + public double evaluate(double operand) { + return 0; + } + + /** + * Returns the character(s) that makes up the operator. + * + * @return The operator symbol. + */ + public String getSymbol() { + return symbol; + } + + /** + * Returns the precedence given to this operator. + * + * @return The precedecne given to this operator. + */ + public int getPrecedence() { + return precedence; + } + + /** + * Returns the length of the operator symbol. + * + * @return The length of the operator symbol. + */ + public int getLength() { + return symbol.length(); + } + + /** + * Returns an indicator of if the operator is unary or not. + * + * @return An indicator of if the operator is unary or not. + */ + public boolean isUnary() { + return unary; + } + + /** + * Determines if this operator is equal to another operator. Equality is + * determined by comparing the operator symbol of both operators. + * + * @param object + * The object to compare with this operator. + * + * @return True if the object is equal and false if not. + * + * @exception IllegalStateException + * Thrown if the input object is not of the Operator type. + */ + public boolean equals(final Object object) { + if (object == null) { + return false; + } + + if (!(object instanceof AbstractOperator)) { + throw new IllegalStateException("Invalid operator object."); + } + + AbstractOperator operator = (AbstractOperator) object; + + if (symbol.equals(operator.getSymbol())) { + return true; + } + + return false; + } + + /** + * Returns the String representation of this operator, which is the symbol. + * + * @return The operator symbol. + */ + public String toString() { + return getSymbol(); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AdditionOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AdditionOperator.java new file mode 100644 index 0000000..2430d83 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/AdditionOperator.java @@ -0,0 +1,70 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The addition operator. + */ +public class AdditionOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public AdditionOperator() { + super("+", 5, true); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + Double rtnValue = new Double(leftOperand + rightOperand); + + return rtnValue.doubleValue(); + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(final String leftOperand, final String rightOperand) { + String rtnValue = new String(leftOperand.substring(0, leftOperand + .length() - 1) + + rightOperand.substring(1, rightOperand.length())); + + return rtnValue; + } + + /** + * Evaluate one double operand. + * + * @param operand + * The operand being evaluated. + */ + public double evaluate(double operand) { + return operand; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanAndOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanAndOperator.java new file mode 100644 index 0000000..bee9d07 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanAndOperator.java @@ -0,0 +1,46 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The boolean and operator. + */ +public class BooleanAndOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public BooleanAndOperator() { + super("&&", 2); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand == 1 && rightOperand == 1) { + return 1; + } + + return 0; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanNotOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanNotOperator.java new file mode 100644 index 0000000..7f63118 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanNotOperator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The boolean not operator. + */ +public class BooleanNotOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public BooleanNotOperator() { + super("!", 0, true); + } + + /** + * Evaluate one double operand. + * + * @param operand + * The operand being evaluated. + */ + public double evaluate(final double operand) { + if (operand == 1) { + return 0; + } + + return 1; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanOrOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanOrOperator.java new file mode 100644 index 0000000..972c60f --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/BooleanOrOperator.java @@ -0,0 +1,46 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The boolean or operator. + */ +public class BooleanOrOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public BooleanOrOperator() { + super("||", 1); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand == 1 || rightOperand == 1) { + return 1; + } + + return 0; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ClosedParenthesesOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ClosedParenthesesOperator.java new file mode 100644 index 0000000..5fd4c66 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ClosedParenthesesOperator.java @@ -0,0 +1,30 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The closed parentheses operator. + */ +public class ClosedParenthesesOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public ClosedParenthesesOperator() { + super(")", 0); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/DivisionOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/DivisionOperator.java new file mode 100644 index 0000000..c2881ba --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/DivisionOperator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The division operator. + */ +public class DivisionOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public DivisionOperator() { + super("/", 6); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + Double rtnValue = new Double(leftOperand / rightOperand); + + return rtnValue.doubleValue(); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/EqualOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/EqualOperator.java new file mode 100644 index 0000000..f4e21f1 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/EqualOperator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The equal operator. + */ +public class EqualOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public EqualOperator() { + super("==", 3); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand == rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(String leftOperand, String rightOperand) { + if (leftOperand.compareTo(rightOperand) == 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOperator.java new file mode 100644 index 0000000..4c8dfc6 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOperator.java @@ -0,0 +1,63 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The greater than operator. + */ +public class GreaterThanOperator extends AbstractOperator { + /** + * Default constructor. + */ + public GreaterThanOperator() { + super(">", 4); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand > rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(final String leftOperand, final String rightOperand) { + if (leftOperand.compareTo(rightOperand) > 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOrEqualOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOrEqualOperator.java new file mode 100644 index 0000000..c351fe7 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/GreaterThanOrEqualOperator.java @@ -0,0 +1,63 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The greater than or equal operator. + */ +public class GreaterThanOrEqualOperator extends AbstractOperator { + /** + * Default constructor. + */ + public GreaterThanOrEqualOperator() { + super(">=", 4); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand >= rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(final String leftOperand, final String rightOperand) { + if (leftOperand.compareTo(rightOperand) >= 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOperator.java new file mode 100644 index 0000000..2863e4e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOperator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The less than operator. + */ +public class LessThanOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public LessThanOperator() { + super("<", 4); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand < rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(final String leftOperand, final String rightOperand) { + if (leftOperand.compareTo(rightOperand) < 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOrEqualOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOrEqualOperator.java new file mode 100644 index 0000000..1f46969 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/LessThanOrEqualOperator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The less than or equal operator. + */ +public class LessThanOrEqualOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public LessThanOrEqualOperator() { + super("<=", 4); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand <= rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(String leftOperand, String rightOperand) { + if (leftOperand.compareTo(rightOperand) <= 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ModulusOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ModulusOperator.java new file mode 100644 index 0000000..5c19a1b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/ModulusOperator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The modulus operator. + */ +public class ModulusOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public ModulusOperator() { + super("%", 6); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + Double rtnValue = new Double(leftOperand % rightOperand); + + return rtnValue.doubleValue(); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/MultiplicationOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/MultiplicationOperator.java new file mode 100644 index 0000000..b3ff06d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/MultiplicationOperator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The multiplication operator. + */ +public class MultiplicationOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public MultiplicationOperator() { + super("*", 6); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + Double rtnValue = new Double(leftOperand * rightOperand); + + return rtnValue.doubleValue(); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/NotEqualOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/NotEqualOperator.java new file mode 100644 index 0000000..4d11a04 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/NotEqualOperator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationConstants; + +/** + * The not equal operator. + */ +public class NotEqualOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public NotEqualOperator() { + super("!=", 3); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + if (leftOperand != rightOperand) { + return 1; + } + + return 0; + } + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public String evaluate(String leftOperand, String rightOperand) { + if (leftOperand.compareTo(rightOperand) != 0) { + return EvaluationConstants.BOOLEAN_STRING_TRUE; + } + + return EvaluationConstants.BOOLEAN_STRING_FALSE; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/OpenParenthesesOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/OpenParenthesesOperator.java new file mode 100644 index 0000000..3ad07c5 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/OpenParenthesesOperator.java @@ -0,0 +1,30 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The open parentheses operator. + */ +public class OpenParenthesesOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public OpenParenthesesOperator() { + super("(", 0); + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/Operator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/Operator.java new file mode 100644 index 0000000..6639967 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/Operator.java @@ -0,0 +1,88 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; + +/** + * An oerator than can specified in an expression. + */ +public interface Operator { + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public abstract double evaluate(double leftOperand, double rightOperand); + + /** + * Evaluates two string operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + * + * @return String The value of the evaluated operands. + * + * @exception EvaluateException + * Thrown when an error is found while evaluating the + * expression. + */ + public abstract String evaluate(final String leftOperand, + final String rightOperand) throws EvaluationException; + + /** + * Evaluate one double operand. + * + * @param operand + * The operand being evaluated. + */ + public abstract double evaluate(final double operand); + + /** + * Returns the character(s) that makes up the operator. + * + * @return The operator symbol. + */ + public abstract String getSymbol(); + + /** + * Returns the precedence given to this operator. + * + * @return The precedecne given to this operator. + */ + public abstract int getPrecedence(); + + /** + * Returns the length of the operator symbol. + * + * @return The length of the operator symbol. + */ + public abstract int getLength(); + + /** + * Returns an indicator of if the operator is unary or not. + * + * @return An indicator of if the operator is unary or not. + */ + public abstract boolean isUnary(); +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/SubtractionOperator.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/SubtractionOperator.java new file mode 100644 index 0000000..a6995d7 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/runner/jeval/operator/SubtractionOperator.java @@ -0,0 +1,54 @@ +/* + * Copyright 2002-2007 Robert Breidecker. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.fibo.ddp.common.utils.util.runner.jeval.operator; + +/** + * The subtraction operator. + */ +public class SubtractionOperator extends AbstractOperator { + + /** + * Default constructor. + */ + public SubtractionOperator() { + super("-", 5, true); + } + + /** + * Evaluates two double operands. + * + * @param leftOperand + * The left operand being evaluated. + * @param rightOperand + * The right operand being evaluated. + */ + public double evaluate(final double leftOperand, final double rightOperand) { + Double rtnValue = new Double(leftOperand - rightOperand); + + return rtnValue.doubleValue(); + } + + /** + * Evaluate one double operand. + * + * @param operand + * The operand being evaluated. + */ + public double evaluate(final double operand) { + return -operand; + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/CustomValueUtils.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/CustomValueUtils.java new file mode 100644 index 0000000..3f7751d --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/CustomValueUtils.java @@ -0,0 +1,32 @@ +package com.fibo.ddp.common.utils.util.strategyx; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.HashSet; +import java.util.Set; + +public class CustomValueUtils { + + public static final Set getFieldEnSet(String custom) { + Set fieldEns = new HashSet<>(); + if (custom != null && !"".equals(custom)) { + JSONObject jsonObject = JSON.parseObject(custom); + Object farr = jsonObject.get("farr"); + if (farr != null) { + JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(farr)); + if (jsonArray != null && jsonArray.size() > 0) { + for (Object o : jsonArray) { + JSONObject field = JSON.parseObject(JSON.toJSONString(o)); + Object fieldEn = field.get("fieldEn"); + if (fieldEn != null && !"".equals(fieldEn)) { + fieldEns.add(fieldEn.toString()); + } + } + } + } + } + return fieldEns; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/DataCleanUtils.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/DataCleanUtils.java new file mode 100644 index 0000000..a4c633a --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/util/strategyx/DataCleanUtils.java @@ -0,0 +1,95 @@ +package com.fibo.ddp.common.utils.util.strategyx; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class DataCleanUtils { + public static Map> recursionGroup(List param, List keys){ + return param.stream().collect(Collectors.groupingBy(item->{ + String cond = ""; + for (String key : keys) { + if (StringUtils.isNotBlank(cond)){ + cond+="_"; + } + cond += getObjByKeyAndJson(item,key); +// String[] split = key.split("\\."); +// if (split.length>1){ +// JSONObject jsonObject = item; +// for (int i = 0; i < split.length; i++) { +// if (i secs[i].x) + i++; + if (i < j) { + secs[j] = secs[i]; + j--; + } + } + secs[i] = temp; + + if (low < i) + SecSort(secs, low, i - 1); + if (high > j) + SecSort(secs, j + 1, high); + } + + private static boolean inSection(Section[] secs, Section s, int offset) { + boolean ret = false; + for (int k = 0; k < secs.length; k++) { + if (secs[k].x == secs[k].y || s.x == s.y) + continue; + + if (secs[k].x == s.x || secs[k].y == s.y) + continue; + + if (secs[k].x <= s.x && secs[k].y >= s.y && offset != k) { + ret = true; + break; + } else if (secs[k].x <= s.x && s.x < secs[k].y && offset != k) { + ret = true; + break; + } + } + return ret; + + } + + public static boolean checkSectionCoincide(List section_list) { + boolean ret = false; + String temp = ""; + float min = 0; + float max = 0; + + Section[] sections = new Section[section_list.size()]; + for (int i = 0; i < section_list.size(); i++) { + temp = section_list.get(i); + String chars[] = temp.split(","); + if (chars.length == 2) { + if ("(".equals(chars[0]) || "[".equals(chars[0])) { + min = min_float; + } else { + if (chars[0].indexOf("(") == 0) { + temp = chars[0].replace("(", ""); + min = parseFloat(temp); + } else if (chars[0].indexOf("[") == 0) { + temp = chars[0].replace("[", ""); + min = parseFloat(temp); + } + } + if (")".equals(chars[1]) || "]".equals(chars[1])) { + max = max_float; + } else { + if (chars[1].indexOf(")") > 0) { + temp = chars[1].replace(")", ""); + max = parseFloat(temp); + } else if (chars[1].indexOf("]") > 0) { + temp = chars[1].replace("]", ""); + max = parseFloat(temp); + } + } + sections[i] = new Section(min, max); + } else { + sections[i] = new Section(parseFloat(temp), parseFloat(temp)); + } + } + + int n = sections.length; + SecSort(sections, 0, n - 1); + for (int i = 0; i < n; i++) { + ret = inSection(sections, sections[i], i); + if (ret) + break; + } + return ret; + } + + public static boolean checkSectionValid(List section_list) { + boolean ret_min = false; + boolean ret_max = false; + boolean ret_lr = false; + String temp = ""; + + HashMap left_hp = new HashMap(); + HashMap right_hp = new HashMap(); + HashMap collection = new HashMap(); + + for (int i = 0; i < section_list.size(); i++) { + temp = section_list.get(i); + String chars[] = temp.split(","); + + if (chars.length == 2) { + if ("(".equals(chars[0]) || "[".equals(chars[0])) { + if ("(".equals(chars[0])) + ret_min = true; + } else { + if (chars[0].indexOf("(") == 0) { + temp = chars[0].replace("(", ""); + collection.put(temp, temp); + if (left_hp.get(chars[0]) != null) { + left_hp.put(chars[0], left_hp.get(chars[0]) + 1); + } else { + left_hp.put(chars[0], 1); + } + } else if (chars[0].indexOf("[") == 0) { + temp = chars[0].replace("[", ""); + collection.put(temp, temp); + if (left_hp.get(chars[0]) != null) { + left_hp.put(chars[0], left_hp.get(chars[0]) + 1); + } else { + left_hp.put(chars[0], 1); + } + } + } + + if (")".equals(chars[1]) || "]".equals(chars[1])) { + if (")".equals(chars[1])) + ret_max = true; + } else { + if (chars[1].indexOf(")") > 0) { + temp = chars[1].replace(")", ""); + collection.put(temp, temp); + + if (right_hp.get(chars[1]) != null) { + right_hp.put(chars[1], right_hp.get(chars[1]) + 1); + } else { + right_hp.put(chars[1], 1); + } + } else if (chars[1].indexOf("]") > 0) { + temp = chars[1].replace("]", ""); + collection.put(temp, temp); + if (right_hp.get(chars[1]) != null) { + right_hp.put(chars[1], right_hp.get(chars[1]) + 1); + } else { + right_hp.put(chars[1], 1); + } + } + } + } else { + if (right_hp.get(String.format("%s]", temp)) != null) { + right_hp.put(String.format("%s]", temp), + right_hp.get(String.format("%s]", temp)) + 1); + } else { + right_hp.put(String.format("%s]", temp), 1); + } + + if (left_hp.get(String.format("[%s", temp)) != null) { + left_hp.put(String.format("[%s", temp), + left_hp.get(String.format("[%s", temp)) + 1); + } else { + left_hp.put(String.format("[%s", temp), 1); + } + } + } + + int ct1 = 0; + int ct2 = 0; + for (Map.Entry entry : left_hp.entrySet()) { + String key = entry.getKey(); + ct1++; + if (key.indexOf("(") == 0) { + key = key.replace("(", ""); + key = String.format("%s]", key); + if (right_hp.get(key) != null && right_hp.get(key) == 1) { + + ct2++; + } + + } else if (key.indexOf("[") == 0) { + key = key.replace("[", ""); + key = String.format("%s)", key); + if (right_hp.get(key) != null && right_hp.get(key) == 1) { + ct2++; + } + } + } + + if (ct1 == ct2) { + ret_lr = true; + } + return (ret_min && ret_max && ret_lr); + } + + public static float parseFloat(String s) { + float i = 0f; + try { + i = Float.parseFloat(s); + } catch (Exception e) { + e.printStackTrace(); + } + return i; + } + + public static void main(String[] args) { + ArrayList section_list = new ArrayList(); + section_list.add("[0,3)"); + section_list.add("(4,)"); + section_list.add("(,0.5)"); + section_list.add("[3,4]"); + System.out.println("区间是否完整:"+checkSectionValid(section_list)); //检测表达式区间完整度 + System.out.println("区间是否重叠:"+checkSectionCoincide(section_list)); //检测表达式区间完整度 + } +} \ No newline at end of file diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/config/WebSocketConfig.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/config/WebSocketConfig.java new file mode 100644 index 0000000..28475d7 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/config/WebSocketConfig.java @@ -0,0 +1,52 @@ +package com.fibo.ddp.common.utils.websocket.config; + + +import com.fibo.ddp.common.utils.websocket.handler.MyWebSocketHandler; +import com.fibo.ddp.common.utils.websocket.interceptor.H5HandshakeInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; + +import javax.annotation.Resource; + +@Configuration +@EnableWebSocket +public class WebSocketConfig implements WebSocketConfigurer { + + private static final int MAX_MESSAGE_SIZE = 1024 * 1024; + private static final long MAX_IDLE = 60 * 60 * 1000; + /** + * 注入拦截器 + */ + @Resource + private H5HandshakeInterceptor h5HandshakeInterceptor; + @Bean + public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() { + ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); + container.setMaxTextMessageBufferSize(MAX_MESSAGE_SIZE); + container.setMaxBinaryMessageBufferSize(MAX_MESSAGE_SIZE); + container.setMaxSessionIdleTimeout(MAX_IDLE); + return container; + } + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) { + + webSocketHandlerRegistry + //添加myHandler消息处理对象,和websocket访问地址 + .addHandler(myHandler(), "/ws") + //设置允许跨域访问 + .setAllowedOrigins("*") + //添加拦截器可实现用户链接前进行权限校验等操作 + .addInterceptors(h5HandshakeInterceptor); + } + + @Bean + public WebSocketHandler myHandler() { + return new MyWebSocketHandler(); + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/constant/SendToWebConst.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/constant/SendToWebConst.java new file mode 100644 index 0000000..1040e8e --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/constant/SendToWebConst.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.common.utils.websocket.constant; + +public class SendToWebConst { + public static final String connected = "hello"; + public static final String CLIENT_ID_REPEAT = "client_id_repeat";//客户端id重复 + public static final String DATAX_CACHE_CHANGE = "datax_cache_change"; + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MessageHandler.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MessageHandler.java new file mode 100644 index 0000000..668ee71 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MessageHandler.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.common.utils.websocket.handler; + + +import com.fibo.ddp.common.utils.websocket.manager.MyWebSocketSessionManager; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +@Component +@Slf4j +/** + * webSocket接收到消息处理的类 + */ +public class MessageHandler { + //处理收到的websocket消息 + public synchronized static void handlerReceiveMessage(WebSocketSession session, String message) { + try { + String uid = session.getAttributes().get("uid").toString(); + if (uid == null) { + return; + } + if (StringUtils.isNotBlank(message)) { + session.sendMessage(new TextMessage(String.format("收到用户:【%s】发来的【%s】", session.getAttributes().get("uid"), message))); + } + } catch (Exception e) { + log.error("信息处理异常,message:" + message); + e.printStackTrace(); + } + } + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MyWebSocketHandler.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MyWebSocketHandler.java new file mode 100644 index 0000000..573838b --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/handler/MyWebSocketHandler.java @@ -0,0 +1,68 @@ +package com.fibo.ddp.common.utils.websocket.handler; + +import com.alibaba.fastjson.JSON; +import com.fibo.ddp.common.utils.websocket.constant.SendToWebConst; +import com.fibo.ddp.common.utils.websocket.manager.MyWebSocketSessionManager; +import com.fibo.ddp.common.utils.websocket.model.vo.SendToWebModel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.BinaryMessage; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.io.IOException; + +@Slf4j +public class MyWebSocketHandler extends TextWebSocketHandler { + + @Override + public void handleTextMessage(WebSocketSession session, TextMessage message) + throws IOException { + log.info("获取到"+session.getAttributes().get("uid")+"消息 >> " + message.getPayload()); + if(message.getPayload().equals("ping")){ + session.sendMessage(new TextMessage("pong")); + //存储处理生存节点的信息 +// MessageHandler.handlerReceivePing(session); + }else { + MessageHandler.handlerReceiveMessage(session,message.getPayload()); + + } + } + + @Override + protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) { + super.handleBinaryMessage(session, message); + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws + Exception { + log.info("获取到拦截器中用户ID : " + session.getAttributes().get("uid")); + String uid = session.getAttributes().get("uid").toString(); + //TODO: 重复链接拒绝掉 + WebSocketSession old = MyWebSocketSessionManager.get(uid); + MyWebSocketSessionManager.addOnlineCount(); + if (old!=null&&old.isOpen()){ + session.sendMessage(new TextMessage(JSON.toJSONString( new SendToWebModel(SendToWebConst.CLIENT_ID_REPEAT,"连接失败,客户端:"+uid+"已存在一个链接,如果确需连接,请断开此客户端其他链接后再重试")))); + session.close(); + return; + } + //TODO: 提示再其他地方上线,本机被顶替 + MyWebSocketSessionManager.add(uid,session); + log.info(uid + "加入webSocket!当前人数为" + MyWebSocketSessionManager.getOnlineNum()); + session.sendMessage(new TextMessage(JSON.toJSONString( new SendToWebModel(SendToWebConst.connected,"欢迎连接到ws服务! 当前人数为:" + MyWebSocketSessionManager.getOnlineNum())))); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) + throws Exception { + String uid = session.getAttributes().get("uid").toString(); + log.warn(uid+"》》断开连接!"); + MyWebSocketSessionManager.remove(uid); + MyWebSocketSessionManager.remove(uid); + MyWebSocketSessionManager.subOnlineCount(); + } + + +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/interceptor/H5HandshakeInterceptor.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/interceptor/H5HandshakeInterceptor.java new file mode 100644 index 0000000..c83a646 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/interceptor/H5HandshakeInterceptor.java @@ -0,0 +1,48 @@ +package com.fibo.ddp.common.utils.websocket.interceptor; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +@Component +@Slf4j +public class H5HandshakeInterceptor implements HandshakeInterceptor { + /** + * 握手之前,若返回false,则不建立链接 * + * + * @param request + * @param response + * @param wsHandler + * @param attributes + * @return + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse + response, WebSocketHandler wsHandler, Map attributes) { + //将用户id放入socket处理器的会话(WebSocketSession)中 + ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request; + //获取参数 + String userId = serverHttpRequest.getServletRequest().getParameter("userId"); + //不是以h5开头的连接过滤掉 + if (StringUtils.isBlank(userId) || !userId.startsWith("h5_")){ + log.info("【webSocket拒绝连接】uid:{}, 连接信息",userId, request); + return false; + } + attributes.put("uid", userId); + //可以在此处进行权限验证,当用户权限验证通过后,进行握手成功操作,验证失败返回false + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse + response, WebSocketHandler wsHandler, Exception exception) { + log.info("【webSocket连接完成】,uid:{}", ((ServletServerHttpRequest) request).getServletRequest().getParameter("userId")); + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/manager/MyWebSocketSessionManager.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/manager/MyWebSocketSessionManager.java new file mode 100644 index 0000000..fbd630c --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/manager/MyWebSocketSessionManager.java @@ -0,0 +1,132 @@ +package com.fibo.ddp.common.utils.websocket.manager; + + +import com.fibo.ddp.common.utils.websocket.service.MyWebSocketService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +public class MyWebSocketSessionManager { + /** + * 保存连接 session 的地方 + */ + private static ConcurrentHashMap SESSION_POOL = new ConcurrentHashMap<>(); + //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 + private static AtomicInteger onlineNum = new AtomicInteger(); + /** + * 添加 session + * + * @param key + */ + public static void add(String key, WebSocketSession session) { + // 添加 session + SESSION_POOL.put(key, session); + } + + public static AtomicInteger getOnlineNum() { + return onlineNum; + } + /** + * 删除 session,会返回删除的 session + * + * @param key + * @return + */ + public static WebSocketSession remove(String key) { + // 删除 session + return SESSION_POOL.remove(key); + } + + /** + * 删除并同步关闭连接 + * + * @param key + */ + public static void removeAndClose(String key) { + WebSocketSession session = remove(key); + if (session != null) { + try { + // 关闭连接 + session.close(); + log.info("【WebSocket连接关闭】MyWebSocketSessionManager,session:{}",session); + } catch (IOException e) { + // todo: 关闭出现异常处理 + e.printStackTrace(); + } + } + } + + /** + * 获得 session + * + * @param key + * @return + */ + public static WebSocketSession get(String key) { + // 获得 session + if (SESSION_POOL!=null) { + return SESSION_POOL.get(key); + } + return null; + } + + /** + * 添加链接人数 + */ + public static void addOnlineCount() { + onlineNum.incrementAndGet(); + } + + /** + * 移除链接人数 + */ + public static void subOnlineCount() { + onlineNum.decrementAndGet(); + } + + + public static boolean sendHeartbeat(Map map) { + if (SESSION_POOL!=null&&!SESSION_POOL.isEmpty()){ + for (Map.Entry entry : SESSION_POOL.entrySet()) { + try { + boolean b = MyWebSocketService.sendMessageToSession(map, entry.getValue()); + if (!b){ + //发送失败 + removeAndClose(entry.getKey()); + } + }catch (Exception e){ + e.printStackTrace(); + continue; + } + } + } + return true; + } + + public static boolean sendTextToWeb(String string){ + if (SESSION_POOL!=null&&!SESSION_POOL.isEmpty()){ + for (Map.Entry entry : SESSION_POOL.entrySet()) { + if (entry.getKey().startsWith("h5_")){ + try { + boolean b = MyWebSocketService.sendTextMessageToSession(string, entry.getValue()); + if (!b){ + //发送失败 + log.error("【缓存更新通知失败】,websocket向web端推送消息失败,uid:{}",entry.getKey()); + removeAndClose(entry.getKey()); + } + }catch (Exception e){ + log.error("【缓存更新通知异常】,websocket向web端推送消息失败,uid:{}, 异常信息:{}",entry.getKey(),e); + e.printStackTrace(); + continue; + } + } + } + } + return true; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/model/vo/SendToWebModel.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/model/vo/SendToWebModel.java new file mode 100644 index 0000000..507eda3 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/model/vo/SendToWebModel.java @@ -0,0 +1,16 @@ +package com.fibo.ddp.common.utils.websocket.model.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class SendToWebModel { + private String code; + private Object data; + + public SendToWebModel(String code, Object data) { + this.code = code; + this.data = data; + } +} diff --git a/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/service/MyWebSocketService.java b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/service/MyWebSocketService.java new file mode 100644 index 0000000..0ff6442 --- /dev/null +++ b/ddp-common/ddp-utils/src/main/java/com/fibo/ddp/common/utils/websocket/service/MyWebSocketService.java @@ -0,0 +1,75 @@ +package com.fibo.ddp.common.utils.websocket.service; + +import com.alibaba.fastjson.JSON; + +import com.fibo.ddp.common.utils.websocket.manager.MyWebSocketSessionManager; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.socket.*; + +import java.io.IOException; +import java.util.Map; + +public class MyWebSocketService { + private static Logger logger = LoggerFactory.getLogger(MyWebSocketService.class); + + public static boolean sendMessageToSession(Object message,String sessionId){ + WebSocketSession webSocketSession = MyWebSocketSessionManager.get(sessionId); + if (webSocketSession==null){ + return false; + } + boolean b = sendMessageToSession(message,webSocketSession ); + return b; + } + + public static boolean sendMessageToSession(Object message, WebSocketSession session){ + boolean result = false; + if (message==null||session==null){ + return false; + } + try { + result = sendTextMessageToSession(JSON.toJSONString(message), session); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public static boolean sendTextMessageToSession(String message,WebSocketSession session) throws IOException { + if (StringUtils.isNotBlank(message)&&session!=null){ + TextMessage textMessage = new TextMessage(message); + session.sendMessage(textMessage); + logger.info("向"+session.getAttributes().get("uid")+"发送消息:"+message); + return true; + } + return false; + }; + + public static boolean sendPingToSession(WebSocketSession session) throws IOException { + session.sendMessage(new PingMessage()); + return true; + }; + + public static boolean sendPongToSession(WebSocketSession session) throws IOException { + session.sendMessage(new PongMessage()); + return false; + } + + public static boolean sendBinaryMessageToSession(String message,WebSocketSession session) throws IOException { + session.sendMessage(new BinaryMessage(message.getBytes())); + return true; + }; + + public static boolean sendTextToWeb(String string){ + return MyWebSocketSessionManager.sendTextToWeb(string); + } + public static boolean sendObjectToWeb(Object o){ + return sendTextToWeb(JSON.toJSONString(o)); + } + + public static boolean sendHeartbeat(Map map){ + boolean b= MyWebSocketSessionManager.sendHeartbeat(map); + return true; + } +} diff --git a/ddp-common/pom.xml b/ddp-common/pom.xml new file mode 100644 index 0000000..65da093 --- /dev/null +++ b/ddp-common/pom.xml @@ -0,0 +1,22 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-common + pom + + ddp-service + ddp-dao + ddp-model + ddp-utils + + + + \ No newline at end of file diff --git a/ddp-datax/dataflow-field/pom.xml b/ddp-datax/dataflow-field/pom.xml new file mode 100644 index 0000000..c48f7d4 --- /dev/null +++ b/ddp-datax/dataflow-field/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-datax + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-datax-dataflow-field + + + \ No newline at end of file diff --git a/ddp-datax/offline-field/pom.xml b/ddp-datax/offline-field/pom.xml new file mode 100644 index 0000000..13d0b14 --- /dev/null +++ b/ddp-datax/offline-field/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-datax + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-datax-offline-field + + + \ No newline at end of file diff --git a/ddp-datax/pom.xml b/ddp-datax/pom.xml new file mode 100644 index 0000000..4bb9ed1 --- /dev/null +++ b/ddp-datax/pom.xml @@ -0,0 +1,28 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-datax + pom + + realtime-field + offline-field + dataflow-field + + + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/ddp-datax/realtime-field/pom.xml b/ddp-datax/realtime-field/pom.xml new file mode 100644 index 0000000..9f9475e --- /dev/null +++ b/ddp-datax/realtime-field/pom.xml @@ -0,0 +1,14 @@ + + + + ddp-datax + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-datax-realtime-field + + \ No newline at end of file diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/cache/DataXCacheController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/cache/DataXCacheController.java new file mode 100644 index 0000000..0ba0bc8 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/cache/DataXCacheController.java @@ -0,0 +1,43 @@ +package com.fibo.ddp.datax.realtime.controller.cache; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.service.datax.cache.DataXCacheService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@RequestMapping("/v3/datax/cache") +public class DataXCacheController { + //长轮询间隔时间 + private static long REQUEST_INTERVAL_SECONDS = 10; + @Autowired + private DataXCacheService dataXCacheService; + + @PostMapping("/setRequestInterval/{interval}") + public ResponseEntityDto setRequestInterval(@PathVariable("interval") long interval) { + if (interval > 0) { + REQUEST_INTERVAL_SECONDS = interval; + } + return ResponseEntityBuilder.buildNormalResponse(); + } + + @PostMapping("/queryForChange") + public ResponseEntityDto queryForChange(@RequestBody Map param) { + Map result = new HashMap(); + Map map = dataXCacheService.queryForChange(param,REQUEST_INTERVAL_SECONDS); + if (map != null) { + result = map; + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/push") + public ResponseEntityDto push(@RequestBody Map param) { + dataXCacheService.pushRedisSub(null,""); + return ResponseEntityBuilder.buildNormalResponse(); + } +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datainterface/InterfaceController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datainterface/InterfaceController.java new file mode 100644 index 0000000..b433103 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datainterface/InterfaceController.java @@ -0,0 +1,142 @@ +package com.fibo.ddp.datax.realtime.controller.datainterface; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.datax.datainterface.request.InterfaceUpdateStatusParam; +import com.fibo.ddp.common.model.datax.datainterface.vo.InterfaceVo; +import com.fibo.ddp.common.service.datax.cache.DataXChange; +import com.fibo.ddp.common.service.datax.datainterface.InterfaceService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; + +/** + * 提供interface相关接口 + * + * @apiDefine interface 2.接口管理 + */ +@RestController +@RequestMapping("v3/interface") +public class InterfaceController { + + @Autowired + InterfaceService interfaceService; + + @RequestMapping("testInterface") + public String test(){ + String str = "{\n" + + " \"status\": \"1\",\n" + + " \"error\": \"00000000\",\n" + + " \"msg\": null,\n" + + " \"data\": {\n" + + " \"name\": \"张三\",\n" + + " \"age\": 25\n" + + " }\n" + + "}"; + return str; + } + + /** + * @api {POST} /v3/interface/getInterfaceInfo/{userId} 3.19. V3获取Interface信息 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Long} userId : 规则id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":666,"name":"2021_4_6测试接口","versionCode":"test2021_4_6第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":"2021-04-07T05:12:52.000+00:00","ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":15,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":666,"parentId":14,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":16,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":14,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":16,"fieldId":10000,"fieldValue":"test01","ruleId":666},{"userId":17,"fieldId":10000,"fieldValue":"test02","ruleId":666}]}} + */ + @RequestMapping(value = "getInterfaceInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getInterfaceById(@PathVariable Long id) { + if (id==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + InterfaceVo interfaceVo = interfaceService.getInterfaceById(id); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(interfaceVo); + return ruleResponseEntityDto; + } + + //测试http请求,并获得响应 + @PostMapping("getHttpResponse") + public ResponseEntityDto getHttpResponse(@RequestBody InterfaceInfo interfaceInfo) { + String result = interfaceService.getHttpResponse(interfaceInfo); + ResponseEntityDto interfaceResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(result); + return interfaceResponseEntityDto; + } + + //查询所有接口 + @PostMapping("getInterfaceList") + public ResponseEntityDto getInterfaceList(@RequestBody QueryListParam param) { +// PageBean pageBean = interfaceService.pageQuery(inputParam.getPageNo(), inputParam.getPageSize()); +// ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(pageBean); + + PageInfo pageInfo = interfaceService.queryByEntity(param); + HashMap responseMap = new HashMap<>(); + responseMap.put("pageInfo",pageInfo); + responseMap.put("klist",pageInfo.getList()); + pageInfo.setList(null); + ResponseEntityDto interfaceResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + + return interfaceResponseEntityDto; + } + + //添加接口 + @PostMapping("addInterface") + @ArchivesLog(operationType = OpTypeConst.ADD_INTERFACE) + @DataXChange(changeName = DataXCacheConst.Type.INTERFACE) + public ResponseEntityDto addInterface(@RequestBody InterfaceVo interfaceVo ) { + InterfaceVo insert = interfaceService.inserInterfaceInfo(interfaceVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + //删除接口 + @PostMapping("deleteInterface") + @ArchivesLog(operationType = OpTypeConst.DELETE_INTERFACE) + @DataXChange(changeName = DataXCacheConst.Type.INTERFACE) + public ResponseEntityDto deleteInterface(@RequestBody InterfaceVo interfaceVo ) { + Boolean bool = interfaceService.deleteInterfaceInfo(interfaceVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(bool); + return ruleResponseEntityDto; + } + + //编辑接口 + @PostMapping("updateInterface") + @ArchivesLog(operationType = OpTypeConst.UPDATE_INTERFACE) + @DataXChange(changeName = DataXCacheConst.Type.INTERFACE) + public ResponseEntityDto updateInterface(@RequestBody InterfaceVo interfaceVo ) { + InterfaceVo insert = interfaceService.updateInterfaceInfo(interfaceVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + //批量更新接口状态 + @PostMapping("updateInterfaceStatus") + @ArchivesLog(operationType = OpTypeConst.UPDATE_INTERFACE_STATUS) + @DataXChange(changeName = DataXCacheConst.Type.INTERFACE) + public ResponseEntityDto updateStatus(@RequestBody InterfaceUpdateStatusParam param) { + Long[] ids = param.getIds(); + Integer status = param.getStatus(); + if (ids==null||ids.length==0||status==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + boolean updateResult = interfaceService.updateStatus(ids, status); + if (updateResult){ + return ResponseEntityBuilder.buildNormalResponse(updateResult); + }else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldCallController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldCallController.java new file mode 100644 index 0000000..0c82963 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldCallController.java @@ -0,0 +1,40 @@ +package com.fibo.ddp.datax.realtime.controller.datamanage; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.datax.datamanage.FieldCall; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldCallParam; +import com.fibo.ddp.common.service.datax.datamanage.FieldCallLogService; +import com.github.pagehelper.PageInfo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/DataX/statistics") +public class FieldCallController { + @Autowired + private FieldCallLogService fieldCallLogService; + + @PostMapping("/getFieldCallList") + public ResponseEntityDto getFieldCallList(@RequestBody QueryListParam param){ + PageInfo pageInfo = fieldCallLogService.queryFieldCallList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/getFieldCallLogList") + public ResponseEntityDto getFieldCallLogList(@RequestBody QueryListParam param){ + PageInfo pageInfo = fieldCallLogService.queryFieldCallLogList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/getFieldCallCountList") + public ResponseEntityDto getFieldCallLogList(@RequestBody FieldCallParam param){ + List fieldCalls = fieldCallLogService.queryFieldCallCountList(param); + return ResponseEntityBuilder.buildNormalResponse(fieldCalls); + } +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldController.java new file mode 100644 index 0000000..e65fa8c --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datamanage/FieldController.java @@ -0,0 +1,883 @@ +package com.fibo.ddp.datax.realtime.controller.datamanage; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.datax.common.ValueType; +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.datax.datamanage.FieldCond; +import com.fibo.ddp.common.model.datax.datamanage.FieldType; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldSaveParam; +import com.fibo.ddp.common.model.datax.datamanage.request.FieldTreeParam; +import com.fibo.ddp.common.model.datax.datamanage.vo.FieldEnumVo; +import com.fibo.ddp.common.model.datax.datamanage.vo.FieldFormulaVo; +import com.fibo.ddp.common.model.datax.datamanage.vo.FieldSubCondVo; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.cache.DataXChange; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.datax.datamanage.FieldTypeService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.regex.Pattern; + +/** + * 提供field相关接口 + * + * @apiDefine datamanage 2.指标管理 + */ +@Controller("fieldControllerV2") +@RequestMapping("/v2/datamanage/field") +@ResponseBody +public class FieldController { + + @Autowired + private FieldTypeService fieldTypeService; + @Autowired + private FieldService fieldService; + /** + * @api {POST} /v2/datamanage/datamanage/listTree 2.01. 获取节点树 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {Integer} parentId parentId, 值为 0或 空字符串都行(此时获取的是所有文件夹目录) + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} Success-Response: + * {"data":[{"userId":135,"organId":46,"status":1,"isCommon":1,"parentId":303,"children":[{"children":[{"children":[],"fieldType":"信用卡","icon":"../resource/images/authority/folder.png","userId":306,"isCommon":1,"isParent":"true","page":0,"parentId":305,"rows":0}],"fieldType":"银行","icon":"../resource/images/authority/folder.png","userId":305,"isCommon":1,"isParent":"true","page":0,"parentId":0,"rows":0},{"children":[{"children":[],"fieldType":"网点余额不足风险","icon":"../resource/images/authority/folder.png","userId":304,"isCommon":1,"isParent":"true","page":0,"parentId":302,"rows":0},{"children":[],"fieldType":"代收货款与到付","icon":"../resource/images/authority/folder.png","userId":303,"isCommon":1,"isParent":"true","page":0,"parentId":302,"rows":0}],"fieldType":"物流","icon":"../resource/images/authority/folder.png","userId":302,"isCommon":1,"isParent":"true","page":0,"parentId":0,"rows":0}],"fieldType":"通用字段","userId":99999999}],"error":"00000000","status":"1"} + */ + @RequestMapping(value = "/listTree", method = RequestMethod.POST) + public ResponseEntityDto listTree(@RequestBody Map paramMap) { + + SysUser loginAccount = SessionManager.getLoginAccount(); + paramMap.put("userId", loginAccount.getUserId()); + paramMap.put("organId", loginAccount.getOrganId()); + paramMap.put("status", 1); + + Integer isCommon = 1; + Integer engineId = null; + if (paramMap.containsKey("engineId") && !paramMap.get("engineId").equals("")) { + isCommon = null; + engineId = Integer.valueOf((String) paramMap.get("engineId")).intValue(); + paramMap.put("engineId", engineId); + } else { + paramMap.put("engineId", null); + } + paramMap.put("isCommon", isCommon); + + List klist = fieldTypeService.getFieldTypeList(paramMap); + for (FieldType fieldTypeVo : klist) { + if (engineId != null && fieldTypeVo.getIsCommon() == 1) { + String fieldType = fieldTypeVo.getFieldType(); + fieldTypeVo.setFieldType(fieldType + "(通用)"); + } + paramMap.put("parentId", fieldTypeVo.getId()); + fieldTypeVo.setChildren(getChildren(paramMap)); + } + FieldType[] kArray = new FieldType[klist.size()]; + kArray = klist.toArray(kArray); + paramMap.put("children", kArray); + paramMap.put("fieldType", "通用字段"); + paramMap.put("id", 99999999); + + ArrayList list = new ArrayList<>(); + list.add(paramMap); + + return ResponseEntityBuilder.buildNormalResponse(list); + } + @RequestMapping(value = "/newListTree", method = RequestMethod.POST) + public ResponseEntityDto newListTree(@RequestBody FieldTreeParam param) { + if (param==null||param.getType()==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + List list = fieldTypeService.getTreeList(param); + Map paramMap=new HashMap<>(); + paramMap.put("children", list); + paramMap.put("fieldType", "通用字段"); + paramMap.put("id", 99999999); + List response= new ArrayList<>(); + response.add(paramMap); + return ResponseEntityBuilder.buildNormalResponse(response); + } + + /** + * getChildren:(获取树形节点的子节点信息) + * + * @param paramMap + * @return + */ + private FieldType[] getChildren(Map paramMap) { + List klist = fieldTypeService.getFieldTypeList(paramMap); + for (FieldType fieldTreeVo : klist) { + paramMap.put("parentId", fieldTreeVo.getId()); + fieldTreeVo.setChildren(getChildren(paramMap)); + } + FieldType[] kArray = new FieldType[klist.size()]; + kArray = klist.toArray(kArray); + return kArray; + } + + /** + * @api {POST} /v2/datamanage/datamanage/addTree 2.02. 添加树节点 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {String} fieldType 文件夹的名字 + * @apiParam {String} parentId parentId + * @apiParam {Integer} [userId] id可传可不传,无实际意义 + * @apiParamExample {json} Request: + * { + * "parentId": "302", + * "fieldType": "测试类型" + * } + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"parentId":"302","fieldType":"测试类型","userId":135,"organId":46,"engineId":null,"isCommon":1,"fieldTypeId":365,"userId":2810,"result":1}} + */ + @RequestMapping(value = "/addTree", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_FILED_TREE) + public ResponseEntityDto addTree(@RequestBody Map paramMap) { + + // fieldTypeId, parentId, userId + + SysUser loginAccount = SessionManager.getLoginAccount(); + paramMap.put("userId", loginAccount.getUserId()); + paramMap.put("organId", loginAccount.getOrganId()); + + Integer isCommon = 1; + Integer engineId = null; + if (paramMap.containsKey("engineId") && !paramMap.get("engineId").equals("")) { + isCommon = 0; + engineId = Integer.valueOf((String) paramMap.get("engineId")).intValue(); + paramMap.put("engineId", engineId); + } else { + isCommon = 1; + paramMap.put("engineId", null); + } + paramMap.put("isCommon", isCommon); + + FieldType fieldTypeVo = new FieldType(); + fieldTypeVo.setIsCommon(isCommon); + fieldTypeVo.setParentId(Integer.valueOf( paramMap.get("parentId").toString())); + fieldTypeVo.setFieldType((String) paramMap.get("fieldType")); + fieldTypeVo.setType(Integer.valueOf(paramMap.get("type").toString())); + boolean flag = fieldTypeService.createFieldType(fieldTypeVo, paramMap); + if (flag) { + paramMap.put("result", 1); + } else { + paramMap.put("result", -1); + } + + return ResponseEntityBuilder.buildNormalResponse(paramMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/updateTree 2.03. 修改树节点 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {Integer} userId userId + * @apiParam {String} fieldType 文件夹的名称 + * @apiParam {Integer} fieldType 文件夹的名称 + * @apiParam {String} [status] -1表示删除 + * @apiParamExample {json} Request: + * { + * "parentId":302, + * "fieldType": "测试哈哈类型", + * "userId": 365, + * "status": 1 + * } + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"parentId":302,"fieldType":"测试哈哈类型","userId":365,"status":1,"userId":135,"engineId":null,"organId":46,"isCommon":1,"result":1}} + */ + @RequestMapping(value = "/updateTree", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_FILED_TREE) + public ResponseEntityDto updateTree(@RequestBody FieldTreeParam param) { + Integer status = param.getStatus(); + + boolean b = fieldTypeService.updateFieldType(param); + if (b){ + return ResponseEntityBuilder.buildNormalResponse(); + } + return ResponseEntityBuilder.buildErrorResponse("修改指标文件夹错误","修改指标文件夹错误"); +// int num = this.fieldTypeAjaxValidate(paramMap); +// if (num > 0) { +// throw new ApiException(ErrorCodeEnum.FIELD_TYPE_REPEAT.getVersionCode(), ErrorCodeEnum.FIELD_TYPE_REPEAT.getMessage()); +// } + +// SysUser loginAccount = SessionManager.getLoginAccount(); +// paramMap.put("userId", loginAccount.getUserId()); +// paramMap.put("organId", loginAccount.getOrganId()); +// +// Integer isCommon = 1; +// Integer engineId = null; +// if (paramMap.containsKey("engineId") && paramMap.get("engineId") != null && !paramMap.get("engineId").equals("")) { +// isCommon = 0; +// engineId = Integer.valueOf((String) paramMap.get("engineId")).intValue(); +// paramMap.put("engineId", engineId); +// } else { +// isCommon = 1; +// paramMap.put("engineId", null); +// } +// +// paramMap.put("isCommon", isCommon); +// +// boolean flag = fieldTypeService.updateFieldType(paramMap); +// if (flag) { +// paramMap.put("result", 1); +// } else { +// paramMap.put("result", -1); +// } + + } + + private int fieldTypeAjaxValidate(Map paramMap) { + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + if (!paramMap.containsKey("engineId")) { + paramMap.put("engineId", null); + } + + return fieldService.isExistsFieldType(paramMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/list 2.04. 获取指标列表 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {Integer} isCommon isCommon 值为1时查询通用字段, 数据库管理不用传isCommon + * @apiParam {String} [fieldTypeId] 指标类型id,当fieldTypeId为空或不传时,查询的时整个通用字段下面的所有指标 + * @apiParam {Integer} pageNo 第几页,默认为 1 + * @apiParam {Integer} [pageSize] 每页的条数,默认为 10 + * @apiParamExample {json} Request: + * { + * "isCommon": 1, + * "fieldTypeId": 99999999, + * "pageNo": 1, + * "pageSize": 2 + * } + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"fieldVos":[{"page":0,"rows":0,"total":null,"userId":876,"fieldEn":"network_real_amount_derive","fieldCn":"网点余额衍生字段","fieldTypeId":302,"fieldType":"物流","valueType":1,"valueTypeName":null,"valueScope":"[-1,9999999)","isDerivative":1,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":135,"nickName":"管理员","created":1615535468000,"engineId":null,"engineName":null,"status":"1","fieldCondList":null,"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":873,"fieldEn":"ziduan111733","fieldCn":"字段111733","fieldTypeId":327,"fieldType":"ddd","valueType":2,"valueTypeName":null,"valueScope":"qwer","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":135,"nickName":"管理员","created":1615455268000,"engineId":null,"engineName":null,"status":"1","fieldCondList":null,"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":null}],"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":261,"pages":131,"list":[{"page":0,"rows":0,"total":null,"userId":876,"fieldEn":"network_real_amount_derive","fieldCn":"网点余额衍生字段","fieldTypeId":302,"fieldType":"物流","valueType":1,"valueTypeName":null,"valueScope":"[-1,9999999)","isDerivative":1,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":135,"nickName":"管理员","created":1615535468000,"engineId":null,"engineName":null,"status":"1","fieldCondList":null,"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":873,"fieldEn":"ziduan111733","fieldCn":"字段111733","fieldTypeId":327,"fieldType":"ddd","valueType":2,"valueTypeName":null,"valueScope":"qwer","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":135,"nickName":"管理员","created":1615455268000,"engineId":null,"engineName":null,"status":"1","fieldCondList":null,"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":null}],"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"firstPage":1,"lastPage":8},"searchKey":null,"fieldTypeId":null,"engineId":null}} + */ + @RequestMapping(value = "/list", method = RequestMethod.POST) + public ResponseEntityDto list(@RequestBody HashMap paramMap) { + + if (paramMap.get("fieldTypeId") != null && paramMap.get("fieldTypeId").toString().equals("99999999")) { + paramMap.put("fieldTypeId", null); + } + + Integer pageNo = paramMap.get("pageNo") == null ? 1 : Integer.valueOf(paramMap.get("pageNo").toString()); + Integer pageSize = paramMap.get("pageSize") == null ? 10 : Integer.valueOf(paramMap.get("pageSize").toString()); + + SysUser loginAccount = SessionManager.getLoginAccount(); + paramMap.put("userId", loginAccount.getUserId()); + paramMap.put("organId", loginAccount.getOrganId()); + + String searchKey = (String) paramMap.get("searchKey"); + paramMap.put("searchKey", null); + + if (!paramMap.containsKey("status")) + paramMap.put("status", null); + if (!paramMap.containsKey("engineId")) + paramMap.put("engineId", null); + + PageHelper.startPage(pageNo, pageSize); + List fieldList = fieldService.findByFieldType(paramMap); + PageInfo pageInfo = new PageInfo<>(fieldList); + + if (fieldList == null) { + return ResponseEntityBuilder.buildNormalResponse(null); + } + + HashMap modelMap = new HashMap<>(); + modelMap.put("pager", pageInfo); + modelMap.put("engineId", null); + modelMap.put("klist",pageInfo.getList()); + modelMap.put("searchKey", searchKey); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/updateStatus 2.05. 指标停用、启用、删除 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {Integer} status 0表示停用, 1表示启用, -1表示删除 + * @apiParam {String} ids id组成的字符串,用逗号分隔 + * @apiParam {Integer} fieldTypeId fieldTypeId 文件夹的id + * @apiParamExample {json} 请求示例: + * {"status":0,"ids":"820,819,818","fieldTypeId":303} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"status":0,"ids":"820,819,818","fieldTypeId":"303","userId":135,"organId":46,"engineId":null,"Ids":[820,819,818],"fieldId":818,"fieldIds":[818],"fieldList":[],"listDbList":[],"ruleList":[],"scorecardList":[],"nodelistDbList":[],"beUsed":false,"result":true}} + */ + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_FILED_STATUS) + @DataXChange(changeName = DataXCacheConst.Type.FIELD) + public ResponseEntityDto updateStatus(@RequestBody Map param) { + + SysUser loginAccount = SessionManager.getLoginAccount(); + param.put("userId", loginAccount.getUserId()); + param.put("organId", loginAccount.getOrganId()); + + param.put("engineId", null); + + String idsStr = (String) param.get("ids"); + List Ids = StringUtil.toLongList(idsStr); + param.put("Ids", Ids); + + String strFieldTypeId = String.valueOf(param.get("fieldTypeId")); + if (strFieldTypeId == null) { + strFieldTypeId = ""; + } + //Long fieldTypeId = fieldService.findFieldTypeId(inputParam); + + fieldService.updateStatus(param); + + param.put("fieldTypeId", strFieldTypeId); + + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/datamanage/datamanage/save 2.06. 添加指标 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {String} searchKey searchKey + * @apiParam {Long} [userId] 指标ID + * @apiParam {String} formula 衍生字段公式 + * @apiParam {String} formulaShow 衍生字段公式回显信息 + * @apiParam {Long} engineId 归属的引擎ID + * @apiParam {String} fieldEn 指标英文名:拼接前缀"f_" + * @apiParam {String} fieldCn 指标中文名 + * @apiParam {Long} fieldTypeId 字段类型编号 + * @apiParam {Integer} valueType 字段存值类型,待选(0),数值型(1),字符型(2),枚举型(3),小数型(4) + * @apiParam {Integer} isDerivative 是否衍生字段,0代表不是,1代表是 + * @apiParam {Integer} isOutput 是否输出字段,0代表不是,1代表是 + * @apiParam {String} valueScope 字段约束范围 + * @apiParam {JSONArray} fieldCondList 条件区域内容(传字符串) + * @apiParam (fieldCondList) {String} conditionValue 字段条件值 + * @apiParam (fieldCondList) {JSONArray} fieldSubCond 字段列表 + * @apiParam (fieldSubCond) {String} fieldId 条件字段编号 + * @apiParam (fieldSubCond) {String} operator 条件字段的运算符 + * @apiParam (fieldSubCond) {String} fieldValue 条件字段的条件设置值 + * @apiParam (fieldSubCond) {String} logical 条件字段间的逻辑符 + * @apiParam {JSONArray} formulaHidden 公式编辑、groovy脚本内容(传字符串) + * @apiParam (formulaHidden) {String} formula 衍生字段公式 + * @apiParam (formulaHidden) {String} idx 下标 + * @apiParam (formulaHidden) {JSONArray} farr 字段列表 + * @apiParam (farr) {String} fieldCN 字段中文名 + * @apiParam (farr) {String} fieldCond 字段条件区域 + * @apiParam {Boolean} isUseSql 是否使用sql获取指标 + * @apiParam {Integer} dataSourceId 使用sql获取指标时对应的数据源 + * @apiParam {String} sqlStatement 使用sql获取指标时对应的sql语句 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"searchKey":"","fieldTypeId":"302","userId":"","formula":"","formulaShow":"","engineId":"","fieldEn":"f_f_f_network_real_amount_derive","fieldCn":"网点余额衍生字段","valueType":"1","isDerivative":"1","isOutput":"0","valueScope":"[-1,9999999)","fieldCondList":[{"fieldSubCond":[{"fieldId":"824","operator":">","fieldValue":"2000","logical":"&&"},{"fieldId":"826","operator":"<","fieldValue":"5000"}],"conditionValue":"666"},{"fieldSubCond":[{"fieldId":"824","operator":"<=","fieldValue":"2000","logical":"&&"},{"fieldId":"826","operator":"<","fieldValue":"5000"}],"conditionValue":"888"}],"formulaHidden":[{"fvalue":"","formula":"@同盾_评分@ - @第三方分值@ ","idx":"0","farr":[{"fieldCN":"同盾_评分","fieldCond":""},{"fieldCN":"第三方分值 ","fieldCond":""}]}],"isUseSql":"0","dataSourceId":null,"sqlStatement":""} + * @apiSuccessExample {json} 成功返回数据示例: + * {} + */ + @RequestMapping(value = "/save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_FILED) + @DataXChange(changeName = DataXCacheConst.Type.FIELD) + public ResponseEntityDto save(@RequestBody FieldSaveParam fieldSaveParam) { + + Field fieldVo = new Field(); + BeanUtils.copyProperties(fieldSaveParam, fieldVo); + fieldVo.setIsUseSql(fieldSaveParam.getIsUseSql()); + fieldVo.setIsInterface(fieldSaveParam.getIsInterface());//是否使用接口 + Map param = JSONObject.parseObject(JSONObject.toJSONString(fieldSaveParam), Map.class); + fieldService.sqlFieldCheck(param); + // 校验 + HashMap fieldEnValidateMap = new HashMap<>(); + fieldEnValidateMap.put("fieldEn", param.get("fieldEn")); + fieldEnValidateMap.put("engineId", param.get("engineId")); + fieldEnValidateMap.put("Id", param.get("userId")); + int fieldEnNum = fieldEnAjaxValidate(fieldEnValidateMap); + if (fieldEnNum > 0) { + throw new ApiException(ErrorCodeEnum.FIELD_EN_REPEAT.getCode(), ErrorCodeEnum.FIELD_EN_REPEAT.getMessage()); + } + + HashMap fieldCnValidateMap = new HashMap<>(); + fieldCnValidateMap.put("fieldCn", param.get("fieldCn")); + fieldCnValidateMap.put("engineId", param.get("engineId")); + fieldCnValidateMap.put("Id", param.get("userId")); + int fieldCnNum = fieldCnAjaxValidate(fieldCnValidateMap); + if (fieldCnNum > 0) { + throw new ApiException(ErrorCodeEnum.FIELD_CN_REPEAT.getCode(), ErrorCodeEnum.FIELD_CN_REPEAT.getMessage()); + } + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + param.put("userId", userId); + fieldVo.setAuthor(userId); + fieldVo.setOrganId(organId); + + //校验字段英文名命名 + String fieldEn = fieldVo.getFieldEn(); + Pattern.matches("\\[A-z]|_|d+", fieldEn); + + param.put("fieldEn", fieldVo.getFieldEn()); + param.put("fieldCn", fieldVo.getFieldCn()); + param.put("organId", organId); + param.put("engineId", null); + //组织通用字段 + Integer isCommon = 1; + fieldVo.setIsCommon(isCommon); +// String formulaFields = "1,2,3,4"; +// inputParam.put("formulaFields", formulaFields); + + fieldService.createField(fieldVo, param); + + // model.addAttribute("engineId", null); + // model.addAttribute("fieldTypeId", Long.valueOf(fieldVo.getFieldTypeId())); + // model.addAttribute("isCommon", 1); + HashMap modelMap = new HashMap<>(); + modelMap.put("engineId", null); + modelMap.put("fieldTypeId", Long.valueOf(fieldVo.getFieldTypeId())); + modelMap.put("isCommon", 1); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/getFieldInfo/{userId} 2.07. 获取指标详情 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {Integer} userId 路径参数{userId}:指标的id + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"hasGroovy":null,"fieldFormulaList":[],"fieldVo":{"page":0,"rows":0,"total":null,"userId":876,"fieldEn":"network_real_amount_derive","fieldCn":"网点余额衍生字段","fieldTypeId":302,"fieldType":"物流","valueType":1,"valueTypeName":null,"valueScope":"[-1,9999999)","isDerivative":1,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":"824,826","origFieldId":"824,826","author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[{"page":0,"rows":0,"total":null,"userId":null,"fieldId":876,"conditionValue":"777","content":"[{\"fieldId\":\"824\",\"operator\":\">\",\"fieldValue\":\"2000\",\"logical\":\"&&\"},{\"fieldId\":\"826\",\"operator\":\"<\",\"fieldValue\":\"5000\"}]","condFieldId":null,"condFieldOperator":null,"condFieldValue":null,"condFieldLogical":null,"created":null,"fieldSubCond":[{"fieldId":824,"operator":">","fieldValue":"2000","logical":"&&","valueType":1,"valueScope":"[-1,9999999)","values":["[-1,9999999)"],"fieldCn":"网点实际余额"},{"fieldId":826,"operator":"<","fieldValue":"5000","logical":null,"valueType":1,"valueScope":"[-1,9999999)","values":["[-1,9999999)"],"fieldCn":"网点关闭余额"}]},{"page":0,"rows":0,"total":null,"userId":null,"fieldId":876,"conditionValue":"999","content":"[{\"fieldId\":\"824\",\"operator\":\"<=\",\"fieldValue\":\"2000\",\"logical\":\"&&\"},{\"fieldId\":\"826\",\"operator\":\"<\",\"fieldValue\":\"5000\"}]","condFieldId":null,"condFieldOperator":null,"condFieldValue":null,"condFieldLogical":null,"created":null,"fieldSubCond":[{"fieldId":824,"operator":"<=","fieldValue":"2000","logical":"&&","valueType":1,"valueScope":"[-1,9999999)","values":["[-1,9999999)"],"fieldCn":"网点实际余额"},{"fieldId":826,"operator":"<","fieldValue":"5000","logical":null,"valueType":1,"valueScope":"[-1,9999999)","values":["[-1,9999999)"],"fieldCn":"网点关闭余额"}]}],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":null},"scopeList":["[-1","9999999)"],"searchKey":null,"fieldTypeId":302,"hasFormula":null,"engineId":null}} + */ + @RequestMapping(value = "/getFieldInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getFieldInfo(@PathVariable long id, @RequestBody Map param) { + + Map paramMap = new HashMap<>(); + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + paramMap.put("userId", userId); + paramMap.put("organId", organId); + paramMap.put("engineId", null); + paramMap.put("id", id); + paramMap.put("searchKey", param.get("searchKey")); + + Field fieldVo = fieldService.findByFieldId(paramMap); + + String fieldEn = fieldVo.getFieldEn(); + if (!fieldEn.equals("") && fieldEn != null) { +// fieldEn = fieldEn.replace("f_", ""); + fieldVo.setFieldEn(fieldEn); + } + + for (FieldCond f : fieldVo.getFieldCondList()) { + + List fieldSubCondList = JSONObject.parseArray(f.getContent(), FieldSubCondVo.class); + for (FieldSubCondVo fs : fieldSubCondList) { + Map paramMap2 = new HashMap(); + paramMap2.put("userId", userId); + paramMap2.put("organId", organId); + paramMap2.put("id", fs.getFieldId()); + + Field subField = fieldService.findByFieldId(paramMap2); + + fs.setValueType(subField.getValueType()); + fs.setValueScope(subField.getValueScope()); + fs.setFieldCn(subField.getFieldCn()); + } + f.setFieldSubCond(fieldSubCondList); + } + + //编辑页面返回字段列表时去掉自己 + paramMap.put("fieldId", id); +// List flist = fieldService.findByUser(paramMap); + String valueScope = fieldVo.getValueScope(); + List scopeList = null; + if(StringUtils.isNotBlank(valueScope)){ + scopeList = Arrays.asList(valueScope.split(",")); + } + + List fieldFormulaList = new ArrayList(); + String hasGroovy = null; + if (fieldVo.getFormulaShow() != null && !fieldVo.getFormulaShow().equals("")) { + fieldFormulaList = JSONObject.parseArray(fieldVo.getFormulaShow(), FieldFormulaVo.class); + + for (FieldFormulaVo fieldFormulaVo : fieldFormulaList) { + if (fieldFormulaVo.getFormula() != null && fieldFormulaVo.getFormula().contains("def main")) { + hasGroovy = "y"; + } + } + } + + String hasFormula = null; + if (StringUtils.isNotBlank(fieldVo.getFormula())) { + hasFormula = "y"; + } + + // model.addAttribute("fieldVo", fieldVo); + // model.addAttribute("hasFormula", hasFormula); + // model.addAttribute("hasGroovy", hasGroovy); + // model.addAttribute("engineId", null); + // model.addAttribute("fieldTypeId", Long.valueOf(fieldVo.getFieldTypeId())); + // model.addAttribute("searchKey", inputParam.get("searchKey")); + // model.addAttribute("flist", flist); + // model.addAttribute("scopeList", scopeList); + // model.addAttribute("fieldFormulaList", fieldFormulaList); + HashMap modelMap = new HashMap<>(); + modelMap.put("fieldVo", fieldVo); + modelMap.put("hasFormula", hasFormula); + modelMap.put("hasGroovy", hasGroovy); + modelMap.put("engineId", null); + modelMap.put("fieldTypeId", Long.valueOf(fieldVo.getFieldTypeId())); + modelMap.put("searchKey", param.get("searchKey")); +// modelMap.put("flist", flist); + modelMap.put("scopeList", scopeList); + modelMap.put("fieldFormulaList", fieldFormulaList); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/update 2.08. 编辑指标 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {String} searchKey searchKey + * @apiParam {Long} userId 指标ID + * @apiParam {String} formula 衍生字段公式 + * @apiParam {String} formulaShow 衍生字段公式回显信息 + * @apiParam {Long} engineId 归属的引擎ID + * @apiParam {String} fieldEn 指标英文名:拼接前缀"f_" + * @apiParam {String} fieldCn 指标中文名 + * @apiParam {Long} fieldTypeId 字段类型编号 + * @apiParam {Integer} valueType 字段存值类型,待选(0),数值型(1),字符型(2),枚举型(3),小数型(4) + * @apiParam {Integer} isDerivative 是否衍生字段,0代表不是,1代表是 + * @apiParam {Integer} isOutput 是否输出字段,0代表不是,1代表是 + * @apiParam {String} valueScope 字段约束范围 + * @apiParam {JSONArray} fieldCondList 条件区域内容(传字符串) + * @apiParam (fieldCondList) {String} conditionValue 字段条件值 + * @apiParam (fieldCondList) {JSONArray} fieldSubCond 字段列表 + * @apiParam (fieldSubCond) {String} fieldId 条件字段编号 + * @apiParam (fieldSubCond) {String} operator 条件字段的运算符 + * @apiParam (fieldSubCond) {String} fieldValue 条件字段的条件设置值 + * @apiParam (fieldSubCond) {String} logical 条件字段间的逻辑符 + * @apiParam {JSONArray} formulaHidden 公式编辑、groovy脚本内容(传字符串) + * @apiParam (formulaHidden) {String} formula 衍生字段公式 + * @apiParam (formulaHidden) {String} idx 下标 + * @apiParam (formulaHidden) {JSONArray} farr 字段列表 + * @apiParam (farr) {String} fieldCN 字段中文名 + * @apiParam (farr) {String} fieldCond 字段条件区域 + * @apiParam {Boolean} isUseSql 是否使用sql获取指标 + * @apiParam {Integer} dataSourceId 使用sql获取指标时对应的数据源 + * @apiParam {String} sqlStatement 使用sql获取指标时对应的sql语句 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"searchKey":"","fieldTypeId":"302","userId":876,"formula":"","formulaShow":"","engineId":"","fieldEn":"f_f_f_network_real_amount_derive","fieldCn":"网点余额衍生字段","valueType":"1","isDerivative":"1","isOutput":"0","valueScope":"[-1,9999999)","fieldCondList":[{"fieldSubCond":[{"fieldId":"824","operator":">","fieldValue":"2000","logical":"&&"},{"fieldId":"826","operator":"<","fieldValue":"5000"}],"conditionValue":"666"},{"fieldSubCond":[{"fieldId":"824","operator":"<=","fieldValue":"2000","logical":"&&"},{"fieldId":"826","operator":"<","fieldValue":"5000"}],"conditionValue":"888"}],"formulaHidden":[{"fvalue":"","formula":"@同盾_评分@ - @第三方分值@ ","idx":"0","farr":[{"fieldCN":"同盾_评分","fieldCond":""},{"fieldCN":"第三方分值 ","fieldCond":""}]}],"isUseSql":"0","dataSourceId":null,"sqlStatement":""} + * @apiSuccessExample {json} 成功返回数据示例: + * {} + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_FILED) + @DataXChange(changeName = DataXCacheConst.Type.FIELD) + public ResponseEntityDto update(@RequestBody FieldSaveParam fieldSaveParam) { + + Map paramMap = JSONObject.parseObject(JSONObject.toJSONString(fieldSaveParam), Map.class); + + // 校验 + HashMap fieldEnValidateMap = new HashMap<>(); + fieldEnValidateMap.put("fieldEn", paramMap.get("fieldEn")); + fieldEnValidateMap.put("engineId", paramMap.get("engineId")); + fieldEnValidateMap.put("Id", paramMap.get("id")); + int fieldEnNum = fieldEnAjaxValidate(fieldEnValidateMap); + if (fieldEnNum > 0) { + throw new ApiException(ErrorCodeEnum.FIELD_EN_REPEAT.getCode(), ErrorCodeEnum.FIELD_EN_REPEAT.getMessage()); + } + fieldService.sqlFieldCheck(paramMap); + HashMap fieldCnValidateMap = new HashMap<>(); + fieldCnValidateMap.put("fieldCn", paramMap.get("fieldCn")); + fieldCnValidateMap.put("engineId", paramMap.get("engineId")); + fieldCnValidateMap.put("Id", paramMap.get("id")); + int fieldCnNum = fieldCnAjaxValidate(fieldCnValidateMap); + if (fieldCnNum > 0) { + throw new ApiException(ErrorCodeEnum.FIELD_CN_REPEAT.getCode(), ErrorCodeEnum.FIELD_CN_REPEAT.getMessage()); + } + + HashMap checkFieldMap = new HashMap<>(); + checkFieldMap.put("fieldId", paramMap.get("id").toString()); + Map checkFieldresult = checkField(checkFieldMap); + boolean beUsed = (boolean) checkFieldresult.get("beUsed"); + if (beUsed) { + throw new ApiException(ErrorCodeEnum.FIELD_BE_USERD.getCode(), ErrorCodeEnum.FIELD_BE_USERD.getMessage()); + } + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + paramMap.put("userId", userId); + paramMap.put("organId", organId); + + paramMap.put("engineId", null); + //组织通用字段 + Integer isCommon = 1; + paramMap.put("isCommon", isCommon); +// String formulaFields = "50,70,90"; +// paramMap.put("formulaFields", formulaFields); + + fieldService.updateField(paramMap); + + // model.addAttribute("engineId", null); + // model.addAttribute("fieldTypeId", fieldTypeId); + // model.addAttribute("searchKey", paramMap.get("searchKey")); + // model.addAttribute("isCommon", 1); + + HashMap modelMap = new HashMap<>(); + modelMap.put("engineId", null); + //modelMap.put("fieldTypeId",fieldTypeId); + modelMap.put("searchKey", paramMap.get("searchKey")); + modelMap.put("isCommon", 1); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/findFieldByUser 2.09. 获当前用户的所有指标 + * @apiGroup datamanage + * @apiVersion 2.0.0 + * @apiParam {String} [searchKey] searchKey + * @apiParam {String} [engineId] engineId + * @apiParam {String} [fieldId] fieldId + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"organId":46,"isCommon":1,"searchKey":"","userId":135,"fieldList":[{"page":0,"rows":0,"total":null,"userId":587,"fieldEn":"f_hr_age","fieldCn":"年龄准入","fieldTypeId":270,"fieldType":"准入","valueType":1,"valueTypeName":null,"valueScope":"(-1,999999]","isDerivative":null,"isDerivativeName":null,"isOutput":null,"isOutputName":null,"isCommon":null,"formula":null,"formulaShow":null,"usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":null,"fieldRelId":8739,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":871,"fieldEn":"f_ziduan111428","fieldCn":"字段111428","fieldTypeId":362,"fieldType":"3月11日测试","valueType":2,"valueTypeName":null,"valueScope":"qwer","isDerivative":null,"isDerivativeName":null,"isOutput":null,"isOutputName":null,"isCommon":null,"formula":null,"formulaShow":null,"usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":null,"fieldRelId":10294,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":872,"fieldEn":"f_ziduan111518","fieldCn":"字段111518","fieldTypeId":327,"fieldType":"ddd","valueType":2,"valueTypeName":null,"valueScope":"qwer","isDerivative":null,"isDerivativeName":null,"isOutput":null,"isOutputName":null,"isCommon":null,"formula":null,"formulaShow":null,"usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":null,"fieldRelId":10295,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":873,"fieldEn":"f_ziduan111733","fieldCn":"字段111733","fieldTypeId":327,"fieldType":"ddd","valueType":2,"valueTypeName":null,"valueScope":"qwer","isDerivative":null,"isDerivativeName":null,"isOutput":null,"isOutputName":null,"isCommon":null,"formula":null,"formulaShow":null,"usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":null,"fieldRelId":10296,"dataSourceId":null,"sqlStatement":null,"useSql":null},{"page":0,"rows":0,"total":null,"userId":876,"fieldEn":"f_f_f_network_real_amount_derive","fieldCn":"网点余额衍生字段","fieldTypeId":302,"fieldType":"物流","valueType":1,"valueTypeName":null,"valueScope":"[-1,9999999)","isDerivative":null,"isDerivativeName":null,"isOutput":null,"isOutputName":null,"isCommon":null,"formula":null,"formulaShow":null,"usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":null,"fieldRelId":10299,"dataSourceId":null,"sqlStatement":null,"useSql":null}],"engineId":null,"fieldId":""}} + */ + @RequestMapping(value = "/findFieldByUser", method = RequestMethod.POST) + public ResponseEntityDto findFieldByUser(@RequestBody HashMap paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + paramMap.put("userId", userId); + paramMap.put("organId", organId); + + Integer isCommon = 1; + Integer engineId = null; + if (paramMap.containsKey("engineId") && !paramMap.get("engineId").equals("")) { + isCommon = 0; + engineId = Integer.valueOf((String) paramMap.get("engineId")).intValue(); + paramMap.put("engineId", engineId); + } else { + isCommon = 1; + paramMap.put("engineId", null); + } + paramMap.put("isCommon", isCommon); + + if (!paramMap.containsKey("fieldId")) { + paramMap.put("fieldId", null); + } + + List fieldList = fieldService.findByUser(paramMap); + + paramMap.put("fieldList", fieldList); + + return ResponseEntityBuilder.buildNormalResponse(paramMap); + } + + private Map checkField(Map param) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + param.put("userId", userId); + param.put("organId", organId); + param.put("engineId", null); + + return fieldService.checkField(param); + } + + public int fieldEnAjaxValidate(HashMap paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + if ("".equals(paramMap.get("engineId"))) { + paramMap.put("engineId", null); + } + + if ("".equals(paramMap.get("Id"))) { + paramMap.put("Id", null); + } + + paramMap.put("fieldCn", null); + + return fieldService.isExists(paramMap); + } + + public int fieldCnAjaxValidate(HashMap paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + if ("".equals(paramMap.get("engineId"))) { + paramMap.put("engineId", null); + } + + if ("".equals(paramMap.get("Id"))) { + paramMap.put("Id", null); + } + + paramMap.put("fieldEn", null); + + return fieldService.isExists(paramMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/downTemplate 2.10. 指标导入模板下载 + * @apiGroup datamanage + * @apiVersion 2.0.0 + */ + @RequestMapping("downTemplate") + public ResponseEntity downExcelTemplate() throws IOException { + ClassPathResource classPathResource = new ClassPathResource("excleTemplate/datamanage.xlsx"); + InputStream inputStream = classPathResource.getInputStream(); + HttpHeaders headers = new HttpHeaders(); + String fileName = new String("基础指标导入模板.xlsx".getBytes("UTF-8"), "iso-8859-1");//为了解决中文名称乱码问题 + headers.setContentDispositionFormData("attachment", fileName); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity(IOUtils.toByteArray(inputStream), headers, HttpStatus.CREATED); + } + + /** + * @api {POST} /v2/datamanage/datamanage/upload 2.11. 批量导入指标 + * @apiGroup datamanage + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "upload", method = RequestMethod.POST) + @DataXChange(changeName = DataXCacheConst.Type.FIELD) + public ResponseEntityDto upload(HttpServletRequest request) throws Exception { + //将当前上下文初始化给 CommonsMutipartResolver (多部分解析器) + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); + //检查form中是否有enctype="multipart/form-data" + + String accessUrl = ""; + String fileName = ""; + if (multipartResolver.isMultipart(request)) { + //将request变成多部分request + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + //获取multiRequest 中所有的文件名 + Iterator iter = multiRequest.getFileNames(); + while (iter.hasNext()) { + //一次遍历所有文件 + MultipartFile file = multiRequest.getFile(iter.next().toString()); + if (file != null) { + + String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/fieldUpload/"; + if (!new File(uploadDir).exists()) { + File dir = new File(uploadDir); + dir.mkdirs(); + } + fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); + String path = uploadDir + fileName; + //上传 + file.transferTo(new File(path)); + accessUrl = path; + } + } + } + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + Map paramMap = new HashMap<>(); + paramMap.put("userId", userId); + paramMap.put("author", userId); + paramMap.put("organId", organId); + Integer isCommon = 0; + if (paramMap.get("engineId") == null) { + isCommon = 1; + } else { + isCommon = 0; + } + paramMap.put("isCommon", isCommon); + + Map resultMap = fieldService.importExcel(accessUrl, paramMap); + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + + /** + * @api {POST} /v2/datamanage/datamanage/getEngineFields 2.xx. 获取引擎可用字段 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} isOutput 是否输出字段,0代表不是,1代表是,默认不是(0) + * @apiParam {Integer} [engineId] 引擎id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"isOutput":0} + * {"isOutput":1} + * {"isOutput":0,"engineId":211} + * {"isOutput":1,"engineId":211} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/getEngineFields", method = RequestMethod.POST) + public ResponseEntityDto getEngineFields(@RequestBody Map paramMap) { + //通过引擎编号查询可用字段,后面可以放到缓存中 + SysUser sysUser = SessionManager.getLoginAccount(); + paramMap.put("userId", sysUser.getUserId()); + paramMap.put("organId", sysUser.getOrganId()); + List fields = fieldService.getFieldList(paramMap); + if (CollectionUtil.isNotNullOrEmpty(fields)) { + List fieldEnumVos = new ArrayList(); + FieldEnumVo fieldEnumVo = null; + for (Field field : fields) { + fieldEnumVo = new FieldEnumVo(); + fieldEnumVo.setField(field); + if (field.getValueType() == ValueType.Enum.getValue()) { + //如果是枚举 + String valueScope = field.getValueScope(); + if (StringUtil.isValidStr(valueScope)) { + //获取枚举值 + fieldEnumVo.setEnums(Arrays.asList(valueScope.split(CommonConst.SYMBOL_COMMA))); + } + } + fieldEnumVos.add(fieldEnumVo); + } + return ResponseEntityBuilder.buildNormalResponse(fieldEnumVos); + } + return ResponseEntityBuilder.buildNormalResponse(new ArrayList()); + } + + @PostMapping(value = "/updateFieldFolder") + @ArchivesLog(operationType = OpTypeConst.UPDATE_FIELD_FOLDER) + @DataXChange(changeName = DataXCacheConst.Type.FIELD) + public ResponseEntityDto updateFieldFolder(@RequestBody UpdateFolderParam param){ + UpdateFolderParam.checkNotNull(param); + int result = fieldService.updateFieldFolder(param); + if (result>0){ + return ResponseEntityBuilder.buildNormalResponse("成功移动"+result+"条数据"); + } + return ResponseEntityBuilder.buildErrorResponse("移动失败",""); + } +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/DataSourceController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/DataSourceController.java new file mode 100644 index 0000000..cbd04b0 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/DataSourceController.java @@ -0,0 +1,65 @@ +package com.fibo.ddp.datax.realtime.controller.datasource; + + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import com.fibo.ddp.common.model.datax.datasource.request.DataSourceListParam; +import com.fibo.ddp.common.model.datax.datasource.vo.DataSourceVo; +import com.fibo.ddp.common.service.datax.cache.DataXChange; +import com.fibo.ddp.common.service.datax.datasource.DataSourceService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/datasource") +public class DataSourceController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + DataSourceService dataSourceService; + + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.DATA_SOURCE_SAVE) + @DataXChange(changeName = DataXCacheConst.Type.DATA_SOURCE) + public ResponseEntityDto save(@RequestBody DataSourceVo dataSourceVo) { + Integer result = dataSourceService.saveDataSource(dataSourceVo); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.DATA_SOURCE_MODIFY) + @DataXChange(changeName = DataXCacheConst.Type.DATA_SOURCE) + public ResponseEntityDto update(@RequestBody DataSourceVo dataSourceVo) { + Integer result = dataSourceService.updateDataSource(dataSourceVo); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @RequestMapping(value = "/getDataSource/{id}", method = RequestMethod.GET) + public ResponseEntityDto getDataSourceById(@PathVariable Integer id) { + DataSourceVo dataSourceVo = dataSourceService.getDataSourceById(id); + return ResponseEntityBuilder.buildNormalResponse(dataSourceVo); + } + + @RequestMapping(value = "getDataSourceList", method = RequestMethod.POST) + public ResponseEntityDto getDataSourceList(@RequestBody DataSourceListParam param) { + Map result = dataSourceService.getDataSourceList(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) + @ArchivesLog(operationType = OpTypeConst.DATA_SOURCE_DELETE) + @DataXChange(changeName = DataXCacheConst.Type.DATA_SOURCE) + public ResponseEntityDto deleteDataSourceById(@PathVariable Integer id) { + Integer result = dataSourceService.deleteDataSourceById(id); + return ResponseEntityBuilder.buildNormalResponse(result); + } + +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/MqSourceController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/MqSourceController.java new file mode 100644 index 0000000..e50dfd1 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/datasource/MqSourceController.java @@ -0,0 +1,66 @@ +package com.fibo.ddp.datax.realtime.controller.datasource; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.datax.consts.DataXCacheConst; +import com.fibo.ddp.common.model.datax.datasource.MqSource; +import com.fibo.ddp.common.service.datax.cache.DataXChange; +import com.fibo.ddp.common.service.datax.datasource.MqSourceService; +import com.github.pagehelper.PageInfo; + +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * (MqSource)表控制层 + * + * @author jgp + * @since 2021-12-20 13:31:51 + */ +@RestController +@RequestMapping("/mqSource") +public class MqSourceController { + /** + * 服务对象 + */ + @Resource + private MqSourceService mqSourceService; + + @PostMapping("/getMqSourceInfo/{id}") + public ResponseEntityDto getInfo(@PathVariable("id") Long id) { + MqSource result = mqSourceService.queryById(id); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/getMqSourceList") + public ResponseEntityDto getMqSourceList(@RequestBody QueryListParam param) { + PageInfo result = mqSourceService.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/addMqSource") + @DataXChange(changeName = DataXCacheConst.Type.MQ_SOURCE) + public ResponseEntityDto addMqSource(@RequestBody MqSource param) { + MqSource result = mqSourceService.add(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/updateMqSource") + @DataXChange(changeName = DataXCacheConst.Type.MQ_SOURCE) + public ResponseEntityDto updateMqSource(@RequestBody MqSource param) { + MqSource result = mqSourceService.update(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/updateStatus") + @DataXChange(changeName = DataXCacheConst.Type.MQ_SOURCE) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = mqSourceService.updateStatus(param.getList(),param.getStatus()); + if (updateResult){ + return ResponseEntityBuilder.buildNormalResponse(updateResult); + }else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TABLES_UPDATE_ERROR); + } + } +} diff --git a/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/home/DataXHomeController.java b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/home/DataXHomeController.java new file mode 100644 index 0000000..d3fee49 --- /dev/null +++ b/ddp-datax/realtime-field/src/main/java/com/fibo/ddp/datax/realtime/controller/home/DataXHomeController.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.datax.realtime.controller.home; + + + + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.service.datax.home.HomeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/DataX/home") +public class DataXHomeController { + + @Autowired + @Qualifier("dataXService") + HomeService homeService; + + + @PostMapping("/getIndexInfo") + @ResponseBody + public ResponseEntityDto getIndexInfo(){ + Map result = homeService.getIndexInfo(); + if (result==null){ + result = new HashMap<>(); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-enginex/dataflow-engine/pom.xml b/ddp-enginex/dataflow-engine/pom.xml new file mode 100644 index 0000000..c701ea6 --- /dev/null +++ b/ddp-enginex/dataflow-engine/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-dataflow-engine + + + \ No newline at end of file diff --git a/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineController.java b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineController.java new file mode 100644 index 0000000..2a77d2c --- /dev/null +++ b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineController.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.enginex.dataflow.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.service.enginex.dataflow.EngineServiceV3; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * (Engine)表控制层 + * + * @author jgp + * @since 2021-12-22 13:28:09 + */ +@RestController +@RequestMapping("/v3/engine") +@Slf4j +public class DataFlowEngineController { + /** + * 服务对象 + */ + @Resource + private EngineServiceV3 engineServiceV3; + + + @PostMapping(value = "/getEngineList") + public ResponseEntityDto getList(@RequestBody QueryListParam param) { + PageInfo pageInfo = engineServiceV3.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 生成一个雪花id作为引擎的code + * + * @return + */ + @PostMapping(value = "/getEngineCode") + public ResponseEntityDto getEngineCode() { + return ResponseEntityBuilder.buildNormalResponse(SnowFlakUtil.snowflakeIdStr()); + } + + @PostMapping(value = "/addEngine") + @ArchivesLog(operationType = OpTypeConst.SAVE_ENGINE) + @ResponseBody + public ResponseEntityDto addEngine(@RequestBody Engine engine) { + + Engine result = engineServiceV3.addEngine(engine); + if (result==null){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping(value = "/updateEngine") + @ArchivesLog(operationType = OpTypeConst.UPDATE_ENGINE) + @ResponseBody + public ResponseEntityDto updateEngine(@RequestBody Engine engine) { + Engine result = engineServiceV3.updateEngine(engine); + if (result==null){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"修改引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping(value = "/updateStatus") + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean result = engineServiceV3.updateStatus(param.getList(), param.getStatus()); + if (!result) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改状态失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionContentController.java b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionContentController.java new file mode 100644 index 0000000..f62d433 --- /dev/null +++ b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionContentController.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.enginex.dataflow.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionContentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v3/engineVersionContent") +public class DataFlowEngineVersionContentController { + + @Autowired + private EngineVersionContentService engineVersionContentService; + + @PostMapping("/getEngineVersionContentInfo") + public ResponseEntityDto getEngineVersionContentInfo(@RequestBody EngineVersionContentVo param ){ + EngineVersionContent result = engineVersionContentService.queryById(param.getEngineVersionId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/updateEngineVersionContentInfo") + public ResponseEntityDto updateEngineVersionContentInfo(@RequestBody EngineVersionContentVo param){ + boolean result = engineVersionContentService.updateVersionContent(param); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"修改引擎内容失败"); + } +} diff --git a/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionController.java b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionController.java new file mode 100644 index 0000000..e9f7ad2 --- /dev/null +++ b/ddp-enginex/dataflow-engine/src/main/java/com/fibo/ddp/enginex/dataflow/controller/DataFlowEngineVersionController.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.enginex.dataflow.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionServiceV3; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/v3/engineVersion") +@Slf4j +public class DataFlowEngineVersionController { + + @Autowired + private EngineVersionServiceV3 engineVersionServiceV3; + + @PostMapping("/getEngineVersionPage") + public ResponseEntityDto getEngineVersionPage(@RequestBody QueryListParam param){ + PageInfo pageInfo = engineVersionServiceV3.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/getEngineVersionList") + public ResponseEntityDto getEngineVersionList(@RequestBody EngineVersion param){ + List result = engineVersionServiceV3.queryByEngineId(param.getEngineId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/addEngineVersion") + public ResponseEntityDto addEngineVersion(@RequestBody EngineVersion param){ + boolean result = engineVersionServiceV3.addEngineVersion(param); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增版本失败"); + } + @PostMapping("/copyEngineVersion") + public ResponseEntityDto copyEngineVersion(@RequestBody EngineVersion param){ + boolean result = engineVersionServiceV3.copyEngineVersion(param.getVersionId()); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增版本失败"); + } +} diff --git a/ddp-enginex/marketing-engine/pom.xml b/ddp-enginex/marketing-engine/pom.xml new file mode 100644 index 0000000..b86bf9c --- /dev/null +++ b/ddp-enginex/marketing-engine/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-marketing-engine + + + \ No newline at end of file diff --git a/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineController.java b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineController.java new file mode 100644 index 0000000..8e19c82 --- /dev/null +++ b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineController.java @@ -0,0 +1,75 @@ +package com.fibo.ddp.enginex.marketing.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.service.enginex.dataflow.EngineServiceV3; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/engine/marketing") +@Slf4j +public class MarketingEngineController { + + @Resource + private EngineServiceV3 engineServiceV3; + + @PostMapping(value = "/getEngineList") + public ResponseEntityDto getList(@RequestBody QueryListParam param) { + PageInfo pageInfo = engineServiceV3.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 生成一个雪花id作为引擎的code + * + * @return + */ + @PostMapping(value = "/getEngineCode") + public ResponseEntityDto getEngineCode() { + return ResponseEntityBuilder.buildNormalResponse(SnowFlakUtil.snowflakeIdStr()); + } + + @PostMapping(value = "/addEngine") + @ArchivesLog(operationType = OpTypeConst.SAVE_ENGINE) + @ResponseBody + public ResponseEntityDto addEngine(@RequestBody Engine engine) { + + Engine result = engineServiceV3.addEngine(engine); + if (result == null) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "新增引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @PostMapping(value = "/updateEngine") + @ArchivesLog(operationType = OpTypeConst.UPDATE_ENGINE) + @ResponseBody + public ResponseEntityDto updateEngine(@RequestBody Engine engine) { + Engine result = engineServiceV3.updateEngine(engine); + if (result == null) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @PostMapping(value = "/updateStatus") + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean result = engineServiceV3.updateStatus(param.getList(), param.getStatus()); + if (!result) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改状态失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineResultController.java b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineResultController.java new file mode 100644 index 0000000..11b2729 --- /dev/null +++ b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineResultController.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.enginex.marketing.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.marketing.entity.MarketingEngineResult; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingDataResultReqVo; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingDataResultRspVo; +import com.fibo.ddp.common.model.enginex.marketing.vo.MarketingListResultReqVo; +import com.fibo.ddp.common.service.enginex.marketing.MarketingEngineResultService; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 营销引擎结果表(MarketingEngineResult)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@RestController +@RequestMapping("/engineResult/marketing") +public class MarketingEngineResultController { + + @Autowired + private MarketingEngineResultService marketingEngineResultService; + + /** + * 获取营销引擎结果列表页 + * + * @param param + * @return + */ + @RequestMapping(value = "queryListByPage", method = RequestMethod.POST) + public ResponseEntityDto> queryListByPage(@RequestBody MarketingListResultReqVo param) { + PageInfo pageInfo = marketingEngineResultService.getListByPage(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 获取营销引擎数据详情 + * + * @param param + * @return + */ + @RequestMapping(value = "queryEngineDataByDate", method = RequestMethod.POST) + public ResponseEntityDto queryEngineDataByDate(@RequestBody MarketingDataResultReqVo param) { + MarketingDataResultRspVo marketingDataResultRspVo = marketingEngineResultService.getEngineDataByDate(param); + return ResponseEntityBuilder.buildNormalResponse(marketingDataResultRspVo); + } +} diff --git a/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionContentController.java b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionContentController.java new file mode 100644 index 0000000..b7378df --- /dev/null +++ b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionContentController.java @@ -0,0 +1,38 @@ +package com.fibo.ddp.enginex.marketing.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionContentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/engineVersionContent/marketing") +@Slf4j +public class MarketingEngineVersionContentController { + + @Autowired + private EngineVersionContentService engineVersionContentService; + + @PostMapping("/getEngineVersionContentInfo") + public ResponseEntityDto getEngineVersionContentInfo(@RequestBody EngineVersionContent param ){ + EngineVersionContentVo result = engineVersionContentService.queryById(param.getEngineVersionId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @PostMapping("/updateEngineVersionContentInfo") + public ResponseEntityDto updateEngineVersionContentInfo(@RequestBody EngineVersionContentVo param){ + boolean result = engineVersionContentService.updateVersionContent(param); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"修改引擎内容失败"); + } +} diff --git a/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionController.java b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionController.java new file mode 100644 index 0000000..e4b04d4 --- /dev/null +++ b/ddp-enginex/marketing-engine/src/main/java/com/fibo/ddp/enginex/marketing/controller/MarketingEngineVersionController.java @@ -0,0 +1,29 @@ +package com.fibo.ddp.enginex.marketing.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionServiceV3; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/engineVersion/marketing") +@Slf4j +public class MarketingEngineVersionController { + + @Autowired + private EngineVersionServiceV3 engineVersionServiceV3; + + @PostMapping("/getEngineVersionList") + public ResponseEntityDto getEngineVersionList(@RequestBody EngineVersion param){ + List result = engineVersionServiceV3.queryByEngineId(param.getEngineId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-enginex/personas-engine/pom.xml b/ddp-enginex/personas-engine/pom.xml new file mode 100644 index 0000000..5ab0a55 --- /dev/null +++ b/ddp-enginex/personas-engine/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-personas-engine + + + \ No newline at end of file diff --git a/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineController.java b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineController.java new file mode 100644 index 0000000..f7e3f92 --- /dev/null +++ b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineController.java @@ -0,0 +1,84 @@ +package com.fibo.ddp.enginex.persons.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.service.enginex.dataflow.EngineServiceV3; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.util.SnowFlakUtil; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * (Engine)表控制层 + * + * @author jgp + * @since 2021-12-22 13:28:09 + */ +@RestController +@RequestMapping("/v3/engine/personas") +@Slf4j +public class PersonasEngineController { + /** + * 服务对象 + */ + @Resource + private EngineServiceV3 engineServiceV3; + + + @PostMapping(value = "/getEngineList") + public ResponseEntityDto getList(@RequestBody QueryListParam param) { + PageInfo pageInfo = engineServiceV3.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 生成一个雪花id作为引擎的code + * + * @return + */ + @PostMapping(value = "/getEngineCode") + public ResponseEntityDto getEngineCode() { + return ResponseEntityBuilder.buildNormalResponse(SnowFlakUtil.snowflakeIdStr()); + } + + @PostMapping(value = "/addEngine") + @ArchivesLog(operationType = OpTypeConst.SAVE_ENGINE) + @ResponseBody + public ResponseEntityDto addEngine(@RequestBody Engine engine) { + + Engine result = engineServiceV3.addEngine(engine); + if (result == null) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "新增引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @PostMapping(value = "/updateEngine") + @ArchivesLog(operationType = OpTypeConst.UPDATE_ENGINE) + @ResponseBody + public ResponseEntityDto updateEngine(@RequestBody Engine engine) { + Engine result = engineServiceV3.updateEngine(engine); + if (result == null) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改引擎失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + + @PostMapping(value = "/updateStatus") + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean result = engineServiceV3.updateStatus(param.getList(), param.getStatus()); + if (!result) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), "修改状态失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } +} diff --git a/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineResultController.java b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineResultController.java new file mode 100644 index 0000000..0de77fb --- /dev/null +++ b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineResultController.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.enginex.persons.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResult; +import com.fibo.ddp.common.model.enginex.personas.PersonasEngineResultDetail; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReport; +import com.fibo.ddp.common.model.enginex.personas.vo.PersonasReportParam; +import com.fibo.ddp.common.service.enginex.personas.PersonasEngineResultDetailService; +import com.fibo.ddp.common.service.enginex.personas.PersonasEngineResultService; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/v3/engineResult/personas") +public class PersonasEngineResultController { + @Autowired + private PersonasEngineResultService personasEngineResultService; + @Autowired + private PersonasEngineResultDetailService personasEngineResultDetailService; + + @PostMapping("/getResultList") + public ResponseEntityDto getResultList(QueryListParam param){ + PageInfo resultPageInfo = personasEngineResultService.queryByEntity(param); + Map responseMap = ResponseUtil.getResponseMap(resultPageInfo); + return ResponseEntityBuilder.buildNormalResponse(responseMap); + } + @PostMapping("/getResultDetailList") + public ResponseEntityDto getResultDetailList(QueryListParam param){ + PageInfo resultPageInfo = personasEngineResultDetailService.queryByEntity(param); + Map responseMap = ResponseUtil.getResponseMap(resultPageInfo); + return ResponseEntityBuilder.buildNormalResponse(responseMap); + } + @PostMapping("/getReportList") + public ResponseEntityDto getReportList(QueryListParam param){ + Map map = personasEngineResultDetailService.queryReportList(param); + return ResponseEntityBuilder.buildNormalResponse(map); + } +} diff --git a/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionContentController.java b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionContentController.java new file mode 100644 index 0000000..d1a5f9a --- /dev/null +++ b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionContentController.java @@ -0,0 +1,35 @@ +package com.fibo.ddp.enginex.persons.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.dataflow.EngineVersionContent; +import com.fibo.ddp.common.model.enginex.dataflow.vo.EngineVersionContentVo; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionContentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v3/engineVersionContent/personas") +public class PersonasEngineVersionContentController { + + @Autowired + private EngineVersionContentService engineVersionContentService; + + @PostMapping("/getEngineVersionContentInfo") + public ResponseEntityDto getEngineVersionContentInfo(@RequestBody EngineVersionContent param ){ + EngineVersionContent result = engineVersionContentService.queryById(param.getEngineVersionId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/updateEngineVersionContentInfo") + public ResponseEntityDto updateEngineVersionContentInfo(@RequestBody EngineVersionContentVo param){ + boolean result = engineVersionContentService.updateVersionContent(param); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"修改引擎内容失败"); + } +} diff --git a/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionController.java b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionController.java new file mode 100644 index 0000000..aa8d50a --- /dev/null +++ b/ddp-enginex/personas-engine/src/main/java/com/fibo/ddp/enginex/persons/controller/PersonasEngineVersionController.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.enginex.persons.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.enginex.dataflow.EngineVersionServiceV3; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/v3/engineVersion/personas") +@Slf4j +public class PersonasEngineVersionController { + + @Autowired + private EngineVersionServiceV3 engineVersionServiceV3; + + @PostMapping("/getEngineVersionPage") + public ResponseEntityDto getEngineVersionPage(@RequestBody QueryListParam param){ + PageInfo pageInfo = engineVersionServiceV3.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/getEngineVersionList") + public ResponseEntityDto getEngineVersionList(@RequestBody EngineVersion param){ + List result = engineVersionServiceV3.queryByEngineId(param.getEngineId()); + return ResponseEntityBuilder.buildNormalResponse(result); + } + @PostMapping("/addEngineVersion") + public ResponseEntityDto addEngineVersion(@RequestBody EngineVersion param){ + boolean result = engineVersionServiceV3.addEngineVersion(param); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增版本失败"); + } + @PostMapping("/copyEngineVersion") + public ResponseEntityDto copyEngineVersion(@RequestBody EngineVersion param){ + boolean result = engineVersionServiceV3.copyEngineVersion(param.getVersionId()); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(result); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),"新增版本失败"); + } +} diff --git a/ddp-enginex/pom.xml b/ddp-enginex/pom.xml new file mode 100644 index 0000000..27bf310 --- /dev/null +++ b/ddp-enginex/pom.xml @@ -0,0 +1,31 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex + pom + + risk-engine + rule-engine + dataflow-engine + personas-engine + marketing-engine + runner-node + + + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/ddp-enginex/risk-engine/pom.xml b/ddp-enginex/risk-engine/pom.xml new file mode 100644 index 0000000..ed54eae --- /dev/null +++ b/ddp-enginex/risk-engine/pom.xml @@ -0,0 +1,21 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-risk-engine + + + + com.fibo.ddp + ddp-enginex-runner-node + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ChildEngineNodeController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ChildEngineNodeController.java new file mode 100644 index 0000000..8c60237 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ChildEngineNodeController.java @@ -0,0 +1,81 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.request.EngineListParam; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.risk.EngineService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 子引擎节点接口 + */ +@RestController +@RequestMapping("childEngineNode") +public class ChildEngineNodeController { + + @Autowired + private EngineService engineService; + @Autowired + private EngineNodeService engineNodeService; + + /** + * @api {POST} /childEngineNode/getEngineList 7.81. 子引擎节点 获取引擎列表 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiParam {Long} nodeId 节点id + * @apiParam {Long} engineId 引擎id + * @apiParam {String} [searchString] 搜索关键字 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":5,"nodeId":0,"engineId":220,"searchString":"信用卡"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":5,"size":2,"startRow":1,"endRow":2,"total":2,"pages":1,"list":null,"prePage":0,"nextPage":0,"isFirstPage":true,"isLastPage":true,"hasPreviousPage":false,"hasNextPage":false,"navigatePages":8,"navigatepageNums":[1],"navigateFirstPage":1,"navigateLastPage":1,"lastPage":1,"firstPage":1},"engineList":[{"userId":220,"versionCode":"7eb07302-cbf3-4f6e-95b5-075e89b59f4c","name":"信用卡引擎2","description":"信用卡引擎2","status":1,"createDatetime":1610505340000,"updateDatetime":1610505340000,"creator":142,"userId":null,"organId":46,"searchString":null,"engineVersionList":null,"runState":0,"checked":false,"callbackType":1,"callbackUrl":null},{"userId":219,"versionCode":"5bc79716-8c62-4248-bf91-de07f654668a","name":"信用卡引擎1","description":"信用卡引擎1","status":1,"createDatetime":1610505333000,"updateDatetime":1610505333000,"creator":142,"userId":null,"organId":46,"searchString":null,"engineVersionList":null,"runState":0,"checked":false,"callbackType":1,"callbackUrl":null}]}} + */ + @RequestMapping(value = "getEngineList", method = RequestMethod.POST) + public ResponseEntityDto getEngineList(@RequestBody EngineListParam param) { + String searchString = param.getSearchString(); + Long nodeId = param.getNodeId(); + List list = new ArrayList(); + SysUser user = SessionManager.getLoginAccount(); + Long organId = user.getOrganId(); + + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + //查询对应的引擎 + List engineList = engineService.getEngineList(organId, searchString, list); + + EngineNode engineNode = engineNodeService.findById(nodeId); + if (engineNode != null) { + for (Engine engine : engineList) { + if (engine.getId().toString().equals(engineNode.getNodeJson())) { + engine.setChecked(true); + break; + } + } + } + + PageInfo pageInfo = new PageInfo(engineList); + pageInfo.setList(null); + HashMap resultMap = new HashMap(); + resultMap.put("pager", pageInfo); + resultMap.put("engineList", engineList); + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/DecisionFlowController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/DecisionFlowController.java new file mode 100644 index 0000000..4246a9a --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/DecisionFlowController.java @@ -0,0 +1,633 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.enginex.risk.request.NodeParam; +import com.fibo.ddp.common.model.enginex.risk.response.param.DecisionFlowOutputResponse; +import com.fibo.ddp.common.model.enginex.risk.response.param.NodeTypeResponse; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.enginex.util.EngineNodeUtil; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 决策流 + */ +@Controller("DecisionFlowControllerV2") +@RequestMapping("/v2/decision_flow") +@ResponseBody +public class DecisionFlowController { + + @Autowired + private EngineNodeService engineNodeService; + @Autowired + private EngineVersionService engineVersionService; + + /** + * @api {POST} /v2/decision_flow/getNodeList/{versionId} 7.10. 根据versionId获取所有节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiSuccess {Number} maxOrder 版下节点的最大顺序号 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"versionId":448,"maxOrder":3,"engineNodeList":[{"nodeId":3121,"parentId":null,"versionId":448,"nodeName":"开始","nodeCode":"ND_START","nodeOrder":1,"nodeType":1,"nodeX":86.68,"nodeY":187.81,"nodeScript":null,"nodeJson":null,"params":"{\"arr_linkId\":\"\",\"dataId\":\"-1\",\"url\":\"/Riskmanage/resource/images/decision/start.png\",\"type\":\"1\"}","nextNodes":"ND_2","cardId":null,"ruleList":null,"lastNextnode":null},{"nodeId":3228,"parentId":3121,"versionId":448,"nodeName":"客户分群_2","nodeCode":"ND_2","nodeOrder":2,"nodeType":3,"nodeX":276.98,"nodeY":163.46,"nodeScript":"{\"fields\":[{\"field_id\":\"698\",\"field_code\":\"f_ms_id_card\",\"field_type\":\"2\",\"field_name\":\"身份证号码\"}],\"conditions\":[{\"nextNode\":\"ND_3\",\"formula\":\"(#{f_ms_id_card}contains32)\"}]}","nodeJson":"{\"conditions\":[{\"group_name\":\"分组1\",\"nextNode\":\"ND_3\",\"formulas\":[{\"field_code1\":\"f_ms_id_card\",\"operator1\":\"contains\",\"value1\":\"32\",\"relative_operator\":\"\"}],\"original_name\":\"\"}],\"fields\":[{\"field_code\":\"f_ms_id_card\",\"field_name\":\"身份证号码\",\"field_id\":\"698\",\"field_type\":\"2\"}]}","params":"{\"dataId\":\"3\",\"url\":\"/Riskmanage/resource/images/decision/createUserGroup.png\",\"type\":3,\"html\":\"
      \",\"groupSelHtml\":\"\\n\\t\\t\\t\\t\\n\\t\\t\\t\"}","nextNodes":"ND_3","cardId":null,"ruleList":null,"lastNextnode":null},{"nodeId":3229,"parentId":3228,"versionId":448,"nodeName":"规则集_3","nodeCode":"ND_3","nodeOrder":3,"nodeType":2,"nodeX":404.29,"nodeY":145.16,"nodeScript":null,"nodeJson":"{\"addOrSubRules\":\"\",\"deny_rules\":\"{\\\"isSerial\\\":0,\\\"rules\\\":[{\\\"userId\\\":508,\\\"parentId\\\":1083,\\\"priority\\\":0,\\\"versionCode\\\":\\\"r_N01027\\\",\\\"name\\\":\\\"逾期总次数\\\"}]}\",\"selectedRule\":\"[{\\\"versionCode\\\":\\\"r_N01027\\\",\\\"name\\\":\\\"逾期总次数\\\",\\\"userId\\\":508,\\\"priority\\\":0,\\\"parentId\\\":1083}]\"}","params":"{\"dataId\":\"4\",\"url\":\"/Riskmanage/resource/images/decision/createRuleGroup.png\",\"type\":\"2\"}","nextNodes":null,"cardId":null,"ruleList":null,"lastNextnode":null}]}} + */ + @RequestMapping(value = "/getNodeList/{versionId}", method = RequestMethod.POST) + public ResponseEntityDto getNodeList(@PathVariable Long versionId) { + List nodeList = engineNodeService.getEngineNodeListByEngineVersionId(versionId); + + int maxOrder = 1; + if (nodeList.size() > 0) { + maxOrder = engineNodeService.getMaxNodeOrder(versionId); + } + + HashMap resultMap = new HashMap<>(); + + // if (CollectionUtil.isNotNullOrEmpty(nodeList)) { + // resultMap.put("maxOrder", maxOrder); // 版下节点的最大顺序号 + // } else { + // resultMap.put("maxOrder", 1); + // } + + resultMap.put("versionId", versionId); + resultMap.put("maxOrder", maxOrder); + resultMap.put("engineNodeList", nodeList); + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + + /** + * @api {POST} /v2/decision_flow/getNode/{nodeId} 7.11. 获取节点信息(已废除) + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 路径参数:节点id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/getNode/{nodeId}", method = RequestMethod.POST) + public ResponseEntityDto getNode(@PathVariable Long nodeId) { + EngineNode engineNode = engineNodeService.findById(nodeId); + return ResponseEntityBuilder.buildNormalResponse(engineNode); + } + + /** + * @api {POST} /v2/decision_flow/getNodeConditionInputParam 7.25. 获取决策流节点条件入参 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"nodeId":3559} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"nodeTypeList":[{"nodeTypeName":"评分卡","nodeInfoList":[{"nodeId":3731,"nodeName":"评分卡","strategyOutputList":[{"fieldEn":"final_scorecard"}]}]}]}} + */ + @RequestMapping(value = "/getNodeConditionInputParam", method = RequestMethod.POST) + public ResponseEntityDto getNodeConditionInputParam(@RequestBody Map paramMap) { + DecisionFlowOutputResponse decisionFlowOutputResponse = new DecisionFlowOutputResponse(); + Long nodeId = Long.parseLong(paramMap.get("nodeId").toString()); + List nodeTypeList = engineNodeService.getPreviousNodeOutput(nodeId); + decisionFlowOutputResponse.setNodeTypeList(nodeTypeList); + return ResponseEntityBuilder.buildNormalResponse(decisionFlowOutputResponse); + } + + /** + * @api {POST} /v2/decision_flow/save 7.30. save:新增空节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} userId 值为0,表示新添加一个空节点 + * @apiParam {Number} versionId versionId + * @apiParam {Number} nodeType NodeTypeEnum:4评分卡, + * @apiParam {String} nodeName 节点名称 + * @apiParam {String} nodeCode 节点code + * @apiParam {Number} nodeOrder 节点顺序 + * @apiParam {Number} nodeX nodeX + * @apiParam {Number} nodeY nodeY + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"userId":0,"nodeType":4,"versionId":457,"nodeName":"测试节点-评分卡","nodeCode":"ND_11","nodeOrder":11,"nodeX":666.66,"nodeY":666.77} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"nodeId":3268,"parentId":null,"versionId":457,"nodeName":"测试节点-评分卡","nodeCode":"ND_test","nodeOrder":null,"nodeType":4,"nodeX":666.66,"nodeY":666.77,"nodeScript":null,"nodeJson":null,"params":null,"nextNodes":null,"cardId":null,"ruleList":null,"lastNextnode":null}} + */ + @RequestMapping(value = "/save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_NODE) + public ResponseEntityDto save(@RequestBody Map param) { + EngineNode engineNode = new EngineNode(); + engineNode.setNodeType(Integer.parseInt(param.get("nodeType").toString())); + engineNode.setVersionId(Long.parseLong(param.get("versionId").toString())); + engineNode.setNodeName(param.get("nodeName").toString()); + engineNode.setNodeCode(param.get("nodeCode").toString()); + engineNode.setNodeOrder(Integer.valueOf(param.get("nodeOrder").toString())); + engineNode.setNodeX(Double.parseDouble(param.get("nodeX").toString())); + engineNode.setNodeY(Double.parseDouble(param.get("nodeY").toString())); + EngineNode node = engineNodeService.saveEngineNodeV2(engineNode); + return ResponseEntityBuilder.buildNormalResponse(node); + } + + /** + * @api {POST} /v2/decision_flow/update 7.31. update:修改节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} userId 节点id + * @apiParam {String} initEngineVersionId versionId + * @apiParam {Number} nodeType 节点类型:4评分卡, + * @apiParam {Number} [cardId] 评分卡的id + * @apiParam {Number} [targetId] targetId:设置 target节点的父节点 为 本节点 { 客户分群连线时使用 } + * @apiParam {String} nodeName 节点名称 + * @apiParam {String} nodeCode 节点code + * @apiParam {Number} nodeOrder 节点顺序 + * @apiParam {Number} nodeX 节点X轴 + * @apiParam {Number} nodeY 节点Y轴 + * @apiParam {String} params 节点类型,图标等信息(JSON字符串) + * @apiParam {String} nodeJson 节点json(结构由节点类型决定)(JSON字符串) + * @apiParam {String} params.dataId 例如:"7" + * @apiParam {String} params.url 例如:"/Riskmanage/resource/images/decision/createDcisionOption.png" + * @apiParam {String} params.type 例如:"9" + * @apiParam {Integer} nodeJson.inputs 例如:1 + * @apiParam {Integer} nodeJson.condition_type 例如:1 + * @apiParam {JSONArray} nodeJson.input 数组,[{"field_id":102,"field_code":"SC_task_card5_score","field_name":"评分卡-申请","field_scope":"","field_type":1}] + * @apiParam {JSON} nodeJson.output 例如:{"field_id":682,"field_code":"f_decision_limit_rate","field_name":"决策和额度利率","field_type":2,"field_scope":""} + * @apiParam {JSONArray} nodeJson.conditions 例如:[{"result":"2,0.03,0.67,10,1500,6,三,-1","resultKey":"2,0.03,0.67,10,1500,6,三,-1","formula":[{"field_code":"SC_task_card5_score","operator":">=","result":"485","resultKey":"485"},{"field_code":"SC_task_card5_score","operator":"<","result":"525","resultKey":"525","sign":"and"}]}] + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 评分卡 + * {"userId":3265,"initEngineVersionId":"457","nodeType":4,"cardId":102,"nodeName":"测试节点-评分卡","nodeCode":"ND_22","nodeOrder":22,"nodeX":489,"nodeY":402,"nodeJson":"102","params":{"dataId":5,"url":"/Riskmanage/resource/images/decision/createScoreLevel.png","type":4}} + * @apiParamExample {json} 规则集 + * {"userId":3265,"initEngineVersionId":"457","nodeType":2,"nodeName":"测试节点-规则集","nodeCode":"ND_5","nodeOrder":5,"nodeX":489,"nodeY":402,"params":{"dataId":"4","url":"/Riskmanage/resource/images/decision/createRuleGroup.png","type":"2"},"deny_rules":{"isSerial":1,"rules":[{"userId":559,"parentId":1088,"priority":0,"versionCode":"r_N04015","name":"近1月实际借款平台数"},{"userId":553,"parentId":1088,"priority":0,"versionCode":"r_N04008","name":"借贷app安装数量"},{"userId":580,"parentId":1084,"priority":0,"versionCode":"r_N0210013","name":"ML-Y"}]},"addOrSubRules":""} + * @apiParamExample {json} 决策选项 + * {"condition_type":1,"input":[{"field_id":95,"field_code":"SC_test_card2_score","field_name":"客户评分卡-有盾","field_scope":"","field_type":1}],"output":{"field_id":681,"field_code":"f_decision_limit_rate","field_name":"决策和额度利率","field_type":2,"field_scope":""},"conditions":[{"result":"2,0.03,0.67,10,1500,6,-1,-1","resultKey":"2,0.03,0.67,10,1500,6,-1,-1","formula":[{"field_code":"SC_test_card2_score","operator":">","result":"370","resultKey":"370"},{"field_code":"SC_test_card2_score","operator":"<=","result":"400","resultKey":"400","sign":"and"}]},{"result":"2,0.03,0.67,10,1500,6,-1,-1","resultKey":"2,0.03,0.67,10,1500,6,-1,-1","formula":[{"field_code":"SC_test_card2_score","operator":">","result":"330","resultKey":"330"},{"field_code":"SC_test_card2_score","operator":"<=","result":"370","resultKey":"370","sign":"and"}]},{"result":"3,0.03,0.67,10,1500,6,-1,-1","resultKey":"3,0.03,0.67,10,1500,6,-1,-1","formula":[{"field_code":"SC_test_card2_score","operator":">","result":"0","resultKey":"0"},{"field_code":"SC_test_card2_score","operator":"<=","result":"330","resultKey":"330","sign":"and"}]}]} + * @apiParamExample {json} 沙盒比例 + * {"userId":3311,"initEngineVersionId":"433","nodeType":7,"nodeName":"测试节点-沙盒比例","nodeCode":"ND_5","nodeOrder":5,"nodeX":489,"nodeY":402,"params":{"dataId":"2","url":"/Riskmanage/resource/images/decision/createRiverRate.png","type":"7"},"nodeJson":[{"proportion":"80","sandbox":"1","nextNode":"ND_16"},{"proportion":"20","sandbox":"2","nextNode":"ND_20"}]} + * @apiParamExample {json} 客户分群 + * {"userId":2770,"initEngineVersionId":"419","nodeType":3,"nodeName":"测试节点-客户分群","nodeCode":"ND_5","nodeOrder":5,"nodeX":489,"nodeY":402,"nodeJson":{"conditions":[{"group_name":"分组1","nextNode":"ND_8","formulas":[{"field_code1":"f_bj_finalScore","operator1":">","value1":"626","relative_operator":""}]},{"group_name":"分组2","nextNode":"ND_12","formulas":[{"field_code1":"f_bj_finalScore","operator1":">","value1":"578","relative_operator":"&&","field_code2":"f_bj_finalScore","operator2":"<=","value2":"626"}]},{"group_name":"分组3","nextNode":"ND_16","formulas":[{"field_code1":"f_bj_finalScore","operator1":"<=","value1":"578","relative_operator":""}]}],"fields":[{"field_code":"f_bj_finalScore","field_name":"第三方分值","field_id":"659","field_type":"1"}]},"params":{"dataId":3,"url":"/Riskmanage/resource/images/decision/createUserGroup.png","type":3,"html":"
      分组1
      分组2
      分组3
      ","groupSelHtml":""}} + * @apiParamExample {json} (模型) + * {"userId":3450,"initEngineVersionId":"454","nodeType":15,"nodeName":"测试模型","nodeCode":"ND_11","nodeOrder":11,"nodeX":489,"nodeY":402,"nodeJson":"2","params":{"dataId":12,"url":"/Riskmanage/resource/images/decision/models.png","type":15}} + * @apiParamExample {json} (子引擎) + * {"userId":3451,"initEngineVersionId":"454","nodeType":14,"nodeName":"反欺诈引擎","nodeCode":"ND_12","nodeOrder":12,"nodeX":489,"nodeY":402,"nodeJson":"214","params":{"dataId":11,"url":"/Riskmanage/resource/images/decision/childEngine.png","type":14}} + * @apiParamExample {json} (分组下面连线) + * {"userId":2781,"targetId":2784,"initEngineVersionId":"419","nodeType":3,"nodeName":"运营商认证距离上次认证时长_4_3_18","nodeCode":"ND_18","nodeOrder":18,"nextNodes":"ND_19,ND_21","nodeX":489,"nodeY":402,"nodeJson":{"conditions":[{"group_name":"分组1","nextNode":"ND_21","formulas":[{"field_code1":"f_mid_operatorValid","operator1":">=","value1":"90","relative_operator":""}]},{"group_name":"分组2","nextNode":"ND_19","formulas":[{"field_code1":"f_mid_operatorValid","operator1":"<","value1":"90","relative_operator":""}]}],"fields":[{"field_code":"f_mid_operatorValid","field_name":"运营商认证距离上次认证时间差","field_id":"593","field_type":"1"}]}} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_NODE) + public ResponseEntityDto update(@RequestBody Map param) { + String idStr = param.get("id").toString(); + + String targetIdStr = null; + if (null != param.get("targetId")) { + targetIdStr = param.get("targetId").toString(); + } + + Long id = idStr == null ? null : Long.parseLong(idStr); + Long targetId = targetIdStr == null ? null : Long.parseLong(targetIdStr); + + EngineNode engineNode = EngineNodeUtil.boxEngineNode(param); + engineNode.setNodeId(id); + + boolean flag = engineNodeService.updateNode(engineNode, targetId); + if (flag) { + param.put("result", 1); + param.put("nodeId", id); + param.put("EngineNode", engineNode); + } else { + param.put("result", -1); + } + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/decision_flow/copy 7.33. 复制节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点id + * @apiParam {Number} [type] 知识库类型(t_node_knowledge_rel.knowledge_type)1规则集,2评分卡,null客户分群决策选项 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"nodeId":2808} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/copy", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.COPY_NODE) + public ResponseEntityDto copy(@RequestBody Map param) { + + Long id = Long.parseLong(param.get("nodeId").toString()); + + EngineNode eNode = engineNodeService.findById(id); + + // 设置需要更改的属性 + int maxOrder = engineNodeService.getMaxNodeOrder(eNode.getVersionId()); + eNode.setNodeX(eNode.getNodeX() + 50); + eNode.setNodeY(eNode.getNodeY() + 50); + eNode.setNodeOrder(maxOrder + 1); + eNode.setNodeCode("ND_" + (maxOrder + 1)); + eNode.setNodeName(eNode.getNodeName().substring(0, eNode.getNodeName().lastIndexOf("_") + 1) + eNode.getNodeOrder()); + eNode.setNextNodes(""); + eNode.setParentId(null); + + // 设置params属性 + String params = eNode.getParams(); + if (params != null && params.trim().length() > 0) { + JSONObject obj = JSONObject.parseObject(params); + obj.put("arr_linkId", ""); + eNode.setParams(obj.toJSONString()); + } + + boolean flag = engineNodeService.saveEngineNode(eNode); + + if (flag) { + param.put("result", 1); + param.put("eNode", eNode); + } else { + param.put("result", -1); + + } + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/decision_flow/removeNode 7.34. 删除节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} currentNodeId 当前节点id + * @apiParam {Number} preNodeId 上一节点id,没有则为-1 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"currentNodeId":3258,"preNodeId":-1} + * {"currentNodeId":3431,"preNodeId":3430} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/removeNode", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.DELETE_NODE) + public ResponseEntityDto removeNode(@RequestBody NodeParam param) { + Long currentNodeId = param.getCurrentNodeId(); + String preNodeId = param.getPreNodeId(); + if (currentNodeId != null && preNodeId != null) { + engineNodeService.removeNode(currentNodeId, preNodeId); + } + return ResponseEntityBuilder.buildNormalResponse(null); + } + + /** + * @api {POST} /v2/decision_flow/removeNodeList 7.35. 批量删除节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} currentNodeId 当前节点id + * @apiParam {Number} preNodeId 上一节点id,没有则为-1 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * [{"currentNodeId":3258,"preNodeId":-1}, + * {"currentNodeId":3431,"preNodeId":3430}] + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/removeNodeList", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.BATCH_DELETE_NODE) + public ResponseEntityDto removeNodeList(@RequestBody List paramList) { + for (NodeParam param : paramList) { + Long currentNodeId = param.getCurrentNodeId(); + String preNodeId = param.getPreNodeId(); + if (currentNodeId != null && preNodeId != null) { + engineNodeService.removeNode(currentNodeId, preNodeId); + } + } + return ResponseEntityBuilder.buildNormalResponse(null); + } + + /** + * @api {POST} /v2/decision_flow/updatePropertyForMove 7.41. 移动节点位置 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点id + * @apiParam {Number} nodeX X坐标 + * @apiParam {Number} nodeY Y坐标 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiSuccess {String} data.result 移动结果:1成功,-1失败 + * @apiParamExample {json} 请求示例: + * {"nodeId":2808,"nodeX":666.66,"nodeY":421} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"nodeId":"2808","nodeX":"666.66","nodeY":"421","result":"1"}} + */ + @RequestMapping(value = "/updatePropertyForMove", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_NODE) + public ResponseEntityDto updatePropertyForMove(@RequestBody Map param) { + String s = param.get("nodeId"); + Long nodeId = StringUtil.getStrToLong(s); + if (nodeId==null||nodeId==0){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + EngineNode engineNode = this.engineNodeService.findById(nodeId); + + engineNode.setNodeX(Double.parseDouble(param.get("nodeX"))); + engineNode.setNodeY(Double.parseDouble(param.get("nodeY"))); + boolean flag = this.engineNodeService.updateNodeForMove(engineNode); + if (flag) { + param.put("result", "1"); + } else { + param.put("result", "-1"); + } + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/decision_flow/updateProperty 7.42. 节点连线(客户分群连线,不是调用此接口,应该去调用接口7.31) + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {String} nodeId_1 起点 + * @apiParam {String} nodeId_2 终点 + * @apiParam {String} [nextNodes_1] + * @apiParam {String} [nextNodes_2] + * @apiParam {String} [parentId_2] + * @apiParam {String} [node_json_1] 沙盒比例的信息 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例1: + * {"nodeId_1":"2923","nodeId_2":"3037"} + * @apiParamExample {json} 请求示例2(沙盒比例) + * {"nodeId_1":"3273","nodeId_2":"3274","nextNodes_1":"ND_24,ND_23","nextNodes_2":"ND_15","parentId_2":"","node_json_1":[{"proportion":"20","sandbox":"1","nextNode":"ND_23"},{"proportion":"80","sandbox":"2","nextNode":"ND_24"}]} + * @apiSuccessExample {json} 成功返回数据示例 + * {待完善} + */ + @RequestMapping(value = "/updateProperty", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_NODE) + public ResponseEntityDto updateProperty(@RequestBody Map param) { + List eList = new ArrayList<>(); + boolean flag = false; + Long sourceNodeId = Long.parseLong((String) param.get("nodeId_1")); + Long targetNodeId = Long.parseLong((String) param.get("nodeId_2")); + //获取开始节点和目标节点 + EngineNode sourceNode = engineNodeService.findById(sourceNodeId); + EngineNode targetNode = engineNodeService.findById(targetNodeId); + if (sourceNode != null && targetNode != null) { + String nextNodes = sourceNode.getNextNodes() == null ? "" : sourceNode.getNextNodes().trim(); + if (StringUtil.isValidStr(nextNodes)) { + nextNodes = nextNodes.concat(CommonConst.SYMBOL_COMMA).concat(targetNode.getNodeCode()); + } else { + nextNodes = targetNode.getNodeCode(); + } + if (param.containsKey("node_json_1")) { + String sourceNodeJson = param.get("node_json_1").toString(); + if (StringUtil.isValidStr(sourceNodeJson)) { + sourceNode.setNodeJson(sourceNodeJson); + } + } + sourceNode.setNextNodes(nextNodes); + + //设置目标节点的parentId + String targetParentId = targetNode.getParentId(); + if(StringUtils.isNotBlank(targetParentId)){ + targetParentId = targetParentId.concat(CommonConst.SYMBOL_COMMA).concat(sourceNodeId.toString()); + } else { + targetParentId = sourceNodeId.toString(); + } + targetNode.setParentId(targetParentId); + + eList.add(targetNode); + eList.add(sourceNode); + flag = engineNodeService.updateNodeForNextOrderAndParams(eList); + } + + if (flag) { + param.put("result", 1); + return ResponseEntityBuilder.buildNormalResponse(param); + } else { + param.put("result", -1); + return ResponseEntityBuilder.buildUnNormalResponse(param,ErrorCodeEnum.FAIL_IN_LINK); + } + + } + + /** + * @api {POST} /v2/decision_flow/removeLink 7.43. 删除连线 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} currentNodeId 当前节点id + * @apiParam {Number} preNodeId 上一个节点id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 + * {"currentNodeId":3259,"preNodeId":2802} + * @apiSuccessExample {json} 成功返回数据示例 + * {待完善} + */ + @RequestMapping(value = "/removeLink", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.DELETE_NODE_LINK) + public ResponseEntityDto removeLink(@RequestBody Map param) { + String engineNodeIdStr = param.get("currentNodeId").toString(); + String preEngineNodeIdStr = param.get("preNodeId").toString(); + Long engineNodeId = Long.parseLong(engineNodeIdStr); + Long preEngineNodeId = Long.parseLong(preEngineNodeIdStr); + engineNodeService.removeLink(engineNodeId, preEngineNodeId); + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/decision_flow/renameNode 7.44. 修改节点名称 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点id + * @apiParam {String} nodeName 名称 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 + * {"nodeId":3089,"nodeName":"我是节点001"} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/renameNode", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_NODE) + public ResponseEntityDto renameNode(@RequestBody Map param) { + int count = engineNodeService.renameNode(param); + if (count == 1) { + param.put("result", 1); + } else { + param.put("result", -1); + } + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/decision_flow/saveVersion/{versionId} 7.51. 复制版本 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/saveVersion/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_VERSION) + public ResponseEntityDto saveVersion(@PathVariable Long versionId) { + + SysUser sysUser = SessionManager.getLoginAccount(); + EngineVersion engineVersion = engineVersionService.selectByPrimaryKey(versionId); // 通过versionId获取当前选中的版本 + List nodeList = engineNodeService.getEngineNodeListByEngineVersionId(versionId); + + Map map = new HashMap<>(); + if (engineVersion != null) { + //获取当前版本最新子版本 + EngineVersion engineVer = engineVersionService.getLatestEngineSubVersion(engineVersion); + //组装版本信息 + EngineVersion latestVersion = new EngineVersion(); + latestVersion.setBootState(0); + latestVersion.setEngineId(engineVersion.getEngineId()); + latestVersion.setLatestUser(sysUser.getUserId()); + latestVersion.setLayout(0); + latestVersion.setStatus(1); + latestVersion.setUserId(sysUser.getUserId()); + latestVersion.setVersion(engineVersion.getVersion()); + latestVersion.setSubVersion(engineVer.getSubVersion() + 1); // 子版本 +1 + Long verId = engineVersionService.saveEngineVersion(latestVersion, nodeList); // 此处待修改 t_node_knowledge_rel + // 修复新增版本t_engine_node表parent_id问题 + updateParentId(verId); + map.put("result", "1"); + map.put("versionId", verId); + map.put("msg", "保存成功"); + return ResponseEntityBuilder.buildNormalResponse(map); + } + map.put("result", "-1"); + map.put("msg", "保存失败"); + return ResponseEntityBuilder.buildNormalResponse(map); + } + + /** + * 修复新增版本t_engine_node表parent_id问题 + * + * @param versionId + */ + private void updateParentId(Long versionId) { + if (versionId == null) { + return; + } + List nodeList = engineNodeService.getEngineNodeListByEngineVersionId(versionId); + if (nodeList == null || nodeList.isEmpty()) { + return; + } + + Map nodeCodeMap = new HashMap<>(); + for (EngineNode engineNode : nodeList) { + nodeCodeMap.put(engineNode.getNodeCode(), engineNode); + } + + for (EngineNode sourceEngineNode : nodeList) { + String nextNodes = sourceEngineNode.getNextNodes(); + if (StringUtils.isNotBlank(nextNodes)) { + String[] nextNodesArr = nextNodes.split(","); + for (String nextNode : nextNodesArr) { + EngineNode targetEngineNode = nodeCodeMap.get(nextNode); + if (targetEngineNode != null) { + // 拼接多个父节点 + String parentId = targetEngineNode.getParentId(); + if(StringUtils.isNotBlank(parentId)){ + parentId = parentId + "," + sourceEngineNode.getNodeId(); + } else { + parentId = sourceEngineNode.getNodeId().toString(); + } + engineNodeService.updateParentIdByNodeId(targetEngineNode.getNodeId(), parentId); + // 更新修改后的engineNode信息 + targetEngineNode.setParentId(parentId); + nodeCodeMap.put(nextNode, targetEngineNode); + } + } + } + } + } + + /** + * @api {POST} /v2/decision_flow/validateBranch 7.52. 删除分组 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} engineNodeId XXXXX + * @apiParam {String} branch XXXXX + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"engineNodeId":2787,"branch":"分组3"} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/validateBranch", method = RequestMethod.POST) + public ResponseEntityDto validateBranch(@RequestBody Map paramMap) { + //获取节点编号 + String engineNodeIdStr = paramMap.get("engineNodeId").toString(); + Long engineNodeId = Long.parseLong(engineNodeIdStr); + EngineNode engineNode = engineNodeService.findById(engineNodeId); + if (engineNode != null) { + //从map中获取 + String branch = paramMap.get("branch").toString(); + String jsonStr = engineNode.getNodeJson(); + if (engineNode.getNodeType() == NodeTypeEnum.CLASSIFY.getValue()) { + if (StringUtil.isValidStr(jsonStr)) { + JSONObject jsonObject = JSONObject.parseObject(jsonStr); + JSONArray conditions = jsonObject.getJSONArray("conditions"); + if (conditions != null && !conditions.isEmpty()) { + JSONObject object = null; + for (int i = 0; i < conditions.size(); i++) { + object = conditions.getJSONObject(i); + if (object.getString("group_name").equals(branch)) { + String nextNode = object.getString("nextNode"); + if (StringUtil.isValidStr(nextNode)) { + paramMap.put("result", 1); + break; + } + } + } + } else { + paramMap.put("result", 0); + } + } else { + paramMap.put("result", 0); + } + } else if (engineNode.getNodeType() == NodeTypeEnum.SANDBOX.getValue()) { + if (StringUtil.isValidStr(jsonStr)) { + JSONArray conditions = JSONArray.parseArray(jsonStr); + if (conditions != null && !conditions.isEmpty()) { + JSONObject object = null; + for (int i = 0; i < conditions.size(); i++) { + object = conditions.getJSONObject(i); + if (object.getString("sandbox").equals(branch)) { + String nextNode = object.getString("nextNode"); + if (StringUtil.isValidStr(nextNode)) { + paramMap.put("result", 1); + break; + } + } + } + } else { + paramMap.put("result", 0); + } + } else { + paramMap.put("result", 0); + } + } + } else { + paramMap.put("result", 1); + } + return ResponseEntityBuilder.buildNormalResponse(paramMap); + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineController.java new file mode 100644 index 0000000..3880976 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineController.java @@ -0,0 +1,517 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.enginex.risk.EngineVersionVo; +import com.fibo.ddp.common.model.enginex.risk.IndexEngineReportVo; +import com.fibo.ddp.common.model.enginex.risk.response.TestResponse; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.monitor.logger.LogService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.util.CollectionUtil; +import com.fibo.ddp.common.utils.util.DataHelp; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 引擎 + */ +@Controller("engineControllerV2") +@RequestMapping("/v2/engine") + +public class EngineController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private EngineService engineService; + @Autowired + private EngineVersionService engineVersionService; + @Autowired + private LogService loggerService; + + /** + * 获取引擎列表 + * + * @param searchString + * @param pageNo + * @param pageSize + * @return + */ + @RequestMapping(value = "getEngineList") + @ResponseBody + public ResponseEntityDto enginIndex(@RequestParam(required = false) String searchString, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + List list = new ArrayList<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + PageHelper.startPage(pageNo, pageSize); + //查询对应的引擎 + List enginelist = engineService.getEngineList(organId, searchString, list); + // 引擎列表添加运行状态字段 + for (Engine engine : enginelist) { + for (EngineVersion engineVersion : engine.getEngineVersionList()) { + if (engineVersion.getBootState() == 1) { + engine.setRunState(engineVersion.getBootState()); + break; + } + } + engine.setEngineVersionList(null); + } + PageInfo pageInfo = new PageInfo<>(enginelist); + Map hashMap = new HashMap<>(); + hashMap.put("pager", pageInfo); + hashMap.put("enginelist", pageInfo.getList()); + return ResponseEntityBuilder.buildNormalResponse(hashMap); + } + + /** + * 获取UUID + * + * @return + */ + @RequestMapping("getUUID") + @ResponseBody + public ResponseEntityDto getUUID() { + return ResponseEntityBuilder.buildNormalResponse(UUID.randomUUID()); + } + + /** + * 引擎信息数据回显 + * + * @param id + * @return + */ + @RequestMapping("initupdate/{id}") + @ResponseBody + public ResponseEntityDto initupdate(@PathVariable String id) { + try { + Engine engineVo = new Engine(); + engineVo.setId(Long.parseLong(id)); + SysUser sysUser = SessionManager.getLoginAccount(); + engineVo.setOrganId(sysUser.getOrganId()); + engineVo = engineService.getEngineById(engineVo); + return ResponseEntityBuilder.buildNormalResponse(engineVo); + } catch (Exception e) { + logger.error("获取引擎信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + + } + + /** + * 保存及更新引擎信息 + * + * @param engine + * @param + * @return + */ + @RequestMapping(value = "update", method = RequestMethod.PUT) + @ArchivesLog(operationType = OpTypeConst.UPDATE_ENGINE) + @ResponseBody + public ResponseEntityDto update(@RequestBody Engine engine) { + SysUser sysUser = SessionManager.getLoginAccount(); + engine.setOrganId(sysUser.getOrganId()); + try { + if (engine.getId() == null) { + engine.setCreator(sysUser.getUserId()); + engine.setStatus(1); + boolean flag = engineService.saveEngine(engine); + } else { + int count = engineService.updateEngine(engine); + engine.setUserId(sysUser.getUserId()); + } + return ResponseEntityBuilder.buildNormalResponse(1); + } catch (Exception e) { + logger.error("保存引擎信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * @api {POST} /v2/engine/version/{engineId} 7.01. 根据engineId获取擎下所有版本 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} engineId 引擎id(路径参数)例如211 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiSuccess {JSON} engineVersion 左边的(主版本、选出的) + * @apiSuccess {JSONArray} subEngineVersionList 右边的(子版本) + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":[{"engineVersion":{"versionId":462,"engineId":223,"version":0,"subVersion":0,"bootState":0,"status":1,"layout":0,"userId":145,"createTime":"Fri Feb 05 10:45:20 CST 2021","latestUser":145,"latestTime":"Fri Feb 05 10:45:20 CST 2021","engineNodeList":null,"engineName":null,"engineDesc":null},"subEngineVersionList":[{"versionId":465,"engineId":223,"version":0,"subVersion":1,"bootState":0,"status":1,"layout":0,"userId":148,"createTime":"Mon Feb 22 13:55:07 CST 2021","latestUser":148,"latestTime":"Mon Feb 22 13:55:07 CST 2021","engineNodeList":null,"engineName":null,"engineDesc":null}]},{"engineVersion":{"versionId":464,"engineId":223,"version":1,"subVersion":0,"bootState":0,"status":1,"layout":0,"userId":145,"createTime":"Fri Feb 05 10:59:48 CST 2021","latestUser":145,"latestTime":"Fri Feb 05 10:59:48 CST 2021","engineNodeList":null,"engineName":null,"engineDesc":null},"subEngineVersionList":[]}]} + */ + @ResponseBody + @RequestMapping(value = "/version/{engineId}", method = RequestMethod.POST) + public ResponseEntityDto getEngineVersionList(@PathVariable long engineId) { + // 查出引擎下所有版本 + List versions0 = engineVersionService.getEngineVersionListByEngineIdV2(engineId); // 调用 V2 + + // 过滤:status为1的 + List versions = new ArrayList<>(); + for (EngineVersion engineVersion : versions0) { + if (engineVersion.getStatus() == 1) { + versions.add(engineVersion); + } + } + + Map map = new TreeMap<>( + new Comparator() { + public int compare(Integer obj1, Integer obj2) { + // 升序排序 + return obj1.compareTo(obj2); + } + }); + // 如果不是空的 + if (CollectionUtil.isNotNullOrEmpty(versions)) { + EngineVersionVo engineVersionVo = null; + int key = 0; + // 对版本进行排序 + Collections.sort(versions); + for (EngineVersion engineVersion : versions) { + key = engineVersion.getVersion(); + // 首先把subversion是0的保存起来 + if (map.containsKey(engineVersion.getVersion())) { + if (engineVersion.getSubVersion() != 0) { + map.get(engineVersion.getVersion()) + .getSubEngineVersionList().add(engineVersion); + } + } else { + engineVersionVo = new EngineVersionVo(); + if (engineVersion.getSubVersion() == 0) { + engineVersionVo.setEngineVersion(engineVersion); + engineVersionVo.setSubEngineVersionList( + new ArrayList()); + } else { + List engineVersions = new ArrayList<>(); + engineVersions.add(engineVersion); + engineVersionVo.setSubEngineVersionList(engineVersions); + } + } + map.put(key, engineVersionVo); + } + } else { + // TODO 如果是空的,则代表模型创建有逻辑错误 + } + + List engineVersionVos = new ArrayList<>(); + for (EngineVersionVo v : map.values()) { + engineVersionVos.add(v); + } + + return ResponseEntityBuilder.buildNormalResponse(engineVersionVos); + } + + /** + * @api {POST} /v2/engine/pageCheck 7.54. pageCheck页面填写 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {String} valueScope xxxxx + * @apiParam {String} complex xxxxx + * @apiParam {String} versionId xxxxx + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/pageCheck", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.FILL_DATA) + @ResponseBody + public ResponseEntityDto pageCheck(@RequestParam String valueScope, @RequestParam String complex, @RequestParam String versionId) { + Map inputMap = new HashMap<>(); + if (null != valueScope && !"".equals(valueScope)) { + JSONArray array = JSONArray.parseArray(valueScope); + for (int i = 0; i < array.size(); i++) { + JSONObject json = JSONObject.parseObject(array.get(i).toString()); + for (Map.Entry entry : json.entrySet()) { + inputMap.put(entry.getKey(), entry.getValue()); + } + } + } + + inputMap.put("complexfield", complex); + Map resultMap = engineService.getEngineVersionExecute(inputMap, versionId); + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + + /** + * @api {POST} /v2/engine/engineTestList 7.55. 引擎批量测试版本列表页 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} engineId engineId + * @apiParam {Number} [pageNo=1] + * @apiParam {Number} [pageSize=10] + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"engineId":229,"pageNo":1,"pageSize":10} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @ResponseBody + @RequestMapping(value = "/engineTestList", method = RequestMethod.POST) + public ResponseEntityDto engineTestList(@RequestBody HashMap paramMap) { + Integer pageNo = paramMap.get("pageNo") == null ? 1 : Integer.valueOf(paramMap.get("pageNo").toString()); + Integer pageSize = paramMap.get("pageSize") == null ? 10 : Integer.valueOf(paramMap.get("pageSize").toString()); + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + PageHelper.startPage(pageNo, pageSize); + + List engineVersionList = engineVersionService.getEngineVersionByEngineId(paramMap); + + // 对表t_engine_version中的latest_time字段的日期(Thu Mar 16 16:56:52 CST 2017)进行回显处理 + for (Iterator iterator = engineVersionList.iterator(); iterator.hasNext(); ) { + EngineVersion engineVersion = (EngineVersion) iterator.next(); + String latestTime = engineVersion.getLatestTime(); + if (latestTime != null && !latestTime.equals("")) { + DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + DateFormat sdf2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'CST' yyyy", Locale.US); + try { + Date date = sdf2.parse(latestTime); + engineVersion.setLatestTime(sdf1.format(date)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + + PageInfo pageInfo = new PageInfo<>(engineVersionList); + + HashMap modelMap = new HashMap<>(); + + modelMap.put("pager", pageInfo); + // modelMap.put("engineVersionList", pageInfo.getList()); + modelMap.put("engineId", paramMap.get("engineId")); + modelMap.put("searchString", paramMap.get("searchString")); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + +// /** +// * @api {POST} /v2/engine/results 7.66.01. 结果集 页面内容 list +// * @apiGroup zzzzz01 +// * @apiVersion 2.0.0 +// * @apiParam {Number} engineId 引擎id +// * @apiParam {String} [startDate] 开始时间,示例:"2021-03-26 23:59:59" 或 "2020-03-26" +// * @apiParam {String} [endDate] 结束时间,示例:"2021-03-26 23:59:59" 或 "2020-03-26" +// * @apiParam {Number} [pageNo=1] 第几页 +// * @apiParam {Number} [pageSize=10] 每页的条数 +// * @apiSuccess {String} status 状态:1成功,0失败 +// * @apiParamExample {json} 请求示例 +// * {"engineId":213,"startDate":"2018-03-26","endDate":"2021-03-26 23:59:59","pageNo":1,"pageSize":10} +// * @apiSuccessExample {json} 成功返回数据示例 +// * {"status":"1","error":"00000000","msg":null,"data":{"engineId":213,"startDate":"2018-03-26","endDate":"2021-03-26 23:59:59","pageNo":1,"pageSize":10,"pager":{"pageNum":1,"pageSize":10,"size":10,"startRow":1,"endRow":10,"total":839,"pages":84,"list":[{"userId":888,"uid":"15662010322","pid":"10001","input":"{\"queryKey\":\"t0 = '370983'\",\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":1,\"f_mx_dial_cnt\":94,\"tableName\":\"organ_46_b_115\",\"f_ms_mac_num\":0,\"f_mx_contact_loan\":1,\"revQueryKey\":\"\",\"ND_10_3020\":\"1\",\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"370983\",\"f_mx_idcard_with_other_names\":0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_score\":578,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"山东省泰安市岱岳区\",\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":180,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_first_trans_start_end_time\":180,\"f_mx_idcard_match\":1,\"f_ms_contact_abnormal_name_length_rate\":0.13,\"f_ms_imei_num\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"nodeName\":\"黑名单_2\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":3,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":76,\"f_ms_isolduser\":0,\"f_mx_contacts_router_ratio\":0.03,\"f_mx_reliability\":1,\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":231,\"f_mx_contact_credit_card\":1,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_mx_call_cnt_rata\":108.33,\"f_ms_contact_num\":227,\"listDb\":{\"userId\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":29,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_hit_black_device_list\":0,\"f_ms_present_address_detail\":\"泺亨国际一号楼一单元1801\"}","output":null,"create_datetime":1561023271000,"result":"1","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":"决策选项_10:1","batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]},{"userId":886,"uid":"15878591521","pid":"10001","input":"{\"nodeName\":\"黑名单_2\",\"queryKey\":\"t0 = '450981'\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":2,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":63,\"f_ms_isolduser\":0,\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":0,\"f_mx_dial_cnt\":79,\"tableName\":\"organ_46_b_115\",\"f_mx_contacts_router_ratio\":0.0,\"f_ms_mac_num\":0,\"f_mx_reliability\":1,\"f_mx_contact_loan\":0,\"revQueryKey\":\"\",\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":367,\"f_mx_contact_credit_card\":0,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"450981\",\"f_mx_idcard_with_other_names\":0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"广西玉林市北流市\",\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":0,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_call_cnt_rata\":148.67,\"f_ms_contact_num\":40,\"f_mx_first_trans_start_end_time\":174,\"f_mx_idcard_match\":1,\"listDb\":{\"userId\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":24,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_contact_abnormal_name_length_rate\":0.05,\"f_ms_imei_num\":0,\"f_ms_hit_black_device_list\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"f_ms_present_address_detail\":\"新城国际69栋二单元502\"}","output":null,"create_datetime":1561023270000,"result":"拒绝","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":null,"batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]},{"userId":887,"uid":"13359659815","pid":"10001","input":"{\"queryKey\":\"t0 = '230521'\",\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":0,\"f_mx_dial_cnt\":716,\"tableName\":\"organ_46_b_115\",\"f_ms_mac_num\":0,\"f_mx_contact_loan\":0,\"revQueryKey\":\"\",\"ND_10_3020\":\"3\",\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"230521\",\"f_mx_idcard_with_other_names\":0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_score\":323,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"黑龙江省双鸭山集贤县\",\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":171,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_first_trans_start_end_time\":133,\"f_mx_idcard_match\":1,\"f_ms_contact_abnormal_name_length_rate\":0.19,\"f_ms_imei_num\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"nodeName\":\"黑名单_2\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":0,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":67,\"f_ms_isolduser\":0,\"f_mx_contacts_router_ratio\":0.02,\"f_mx_reliability\":1,\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":426,\"f_mx_contact_credit_card\":0,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_mx_call_cnt_rata\":380.67,\"f_ms_contact_num\":121,\"listDb\":{\"userId\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":31,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_hit_black_device_list\":0,\"f_ms_present_address_detail\":\"福利镇繁荣街征港48号\"}","output":null,"create_datetime":1561023270000,"result":"3","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":"决策选项_10:3","batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]}],"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"firstPage":1,"lastPage":8}}} +// */ +// @RequestMapping(dictValue = "/results", method = RequestMethod.POST) +// public ResponseEntityDto getResults(@RequestBody Map inputParam) { +// +// // @RequestParam(defaultValue = "1") Integer pageNo +// // @RequestParam(defaultValue = "5") Integer pageSize, +// +// Integer pageNo = inputParam.get("pageNo") == null ? 1 : Integer.valueOf(inputParam.get("pageNo").toString()); +// Integer pageSize = inputParam.get("pageSize") == null ? 10 : Integer.valueOf(inputParam.get("pageSize").toString()); +// +// PageHelper.startPage(pageNo, pageSize); +// List resultSets = s.resultSetService.getEngineResultSetBySegment(inputParam); +// +// PageInfo pageInfo = new PageInfo<>(resultSets); +// +// HashMap modelMap = new HashMap<>(); +// // modelMap.put("rlist", resultSets); +// modelMap.put("pager", pageInfo); +// modelMap.putAll(inputParam); +// +// return ResponseEntityBuilder.buildNormalResponse(modelMap); +// } + + + /** + * @api {POST} /v2/engine/createSampleData 7.66.10. 批量生成引擎测试样本数据(模板下载) + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} engineId 引擎id + * @apiParam {Number} versionId versionId + * @apiParam {Number} nullCtRatio nullCtRatio + * @apiParam {Number} elseCtRatio elseCtRatio + * @apiParam {Number} rowCt 样本数 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 + * {"engineId":210,"versionId":419,"nullCtRatio":0,"elseCtRatio":100,"rowCt":2} + * @apiSuccessExample {json} 成功返回数据示例 + * {待完善} + */ + @RequestMapping(value = "/createSampleData", method = RequestMethod.POST) + public void getFieldExcelTemplate(HttpServletRequest request, HttpServletResponse response, @RequestBody HashMap paramMap) { + //构造引擎版本 + EngineVersion engineVersion = new EngineVersion(); + Long versionId = Long.valueOf(String.valueOf(paramMap.get("versionId"))); + engineVersion.setVersionId(versionId); + boolean result = engineService.getFieldExcelTemplate(response, engineVersion); + } + + @PostMapping(value = "/downloadJsonField") + @ResponseBody + public ResponseEntityDto downloadJsonField(@RequestBody EngineVersion engineVersion){ + String jsonField = engineService.getJsonField(engineVersion); + return ResponseEntityBuilder.buildNormalResponse(jsonField); + } + + /** + * @api {POST} /v2/engine/getIndexInfo 7.66.22. 查询首页统计信息 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 + * {} + * @apiSuccessExample {json} 成功返回数据示例 + * {"status":"1","error":"00000000","msg":null,"data":{"lastLoginTime":1613801892000,"recentDayMap":{"datasets":[],"labels":[]},"logList":[{"userId":7966,"opType":"logout","organName":"rik","opName":"登出","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"logout","requestPath":"http://localhost:8080/Riskmanage/v2/login/logout","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d658, status=1, error=00000000, msg=null, data=null)","ip":"0:0:0:0:0:0:0:1","startTime":1617088732000,"endTime":1617088738000},{"userId":7964,"opType":"logout","organName":"rik","opName":"登出","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"logout","requestPath":"http://localhost:8080/Riskmanage/v2/login/logout","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d658, status=1, error=00000000, msg=null, data=null)","ip":"0:0:0:0:0:0:0:1","startTime":1617088616000,"endTime":1617088624000},{"userId":7731,"opType":"saveOrUpdateMenuRole","organName":"rik","opName":"保存、修改资源树","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"insertRoleMenu","requestPath":"http://47.102.125.25:8080/Riskmanage/v2/sysMenu/insertRoleMenu","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d645, status=1, error=00000000, msg=null, data=24)","ip":"127.0.0.1","startTime":1617073017000,"endTime":1617073017000},{"userId":7730,"opType":"saveOrUpdateMenuRole","organName":"rik","opName":"保存、修改资源树","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"insertRoleMenu","requestPath":"http://47.102.125.25:8080/Riskmanage/v2/sysMenu/insertRoleMenu","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d645, status=1, error=00000000, msg=null, data=24)","ip":"127.0.0.1","startTime":1617072896000,"endTime":1617072896000},{"userId":7729,"opType":"saveOrUpdateMenuRole","organName":"rik","opName":"保存、修改资源树","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"insertRoleMenu","requestPath":"http://47.102.125.25:8080/Riskmanage/v2/sysMenu/insertRoleMenu","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d633, status=1, error=00000000, msg=null, data=6)","ip":"127.0.0.1","startTime":1617072804000,"endTime":1617072804000},{"userId":7728,"opType":"saveOrUpdateMenuRole","organName":"rik","opName":"保存、修改资源树","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"insertRoleMenu","requestPath":"http://47.102.125.25:8080/Riskmanage/v2/sysMenu/insertRoleMenu","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d63f, status=1, error=00000000, msg=null, data=18)","ip":"127.0.0.1","startTime":1617072574000,"endTime":1617072574000}],"engineUseRatio":[],"engineBaseInfo":{"engineNum":1,"engineResultNum":0,"engineNodeNum":2},"recentMonthMap":{"datasets":[],"labels":[]}}} + */ + @ResponseBody + @RequestMapping(value = "/getIndexInfo", method = RequestMethod.POST) + public ResponseEntityDto getIndexInfo(){ + Map map = new HashMap<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + Long organId = sysUser.getOrganId(); + Map paramMap = new HashMap<>(); + paramMap.put("organId", organId); + // 查询首页引擎基本信息 + Map engineBaseInfo = engineService.getIndexEngineBaseInfo(paramMap); + + // 查询首页引擎使用占比 + List> engineUseRatio = engineService.getIndexEngineUseRatio(paramMap); + + // 查询首页最近7天引擎使用情况 + List recentDayEngineUseInfo = engineService.getIndexRecentDayEngineUseInfo(paramMap); + Map recentDayMap = parseRecentDayEngineUseInfo(recentDayEngineUseInfo); + + // 查询首页最近6个月引擎使用情况 + List recentMonthEngineUseInfo = engineService.getIndexRecentMonthEngineUseInfo(paramMap); + Map recentMonthMap = parseRecentMonthEngineUseInfo(recentMonthEngineUseInfo); + + // 查询首页上次登录时间 + List lastLoginTimeList = loggerService.getLastLoginInfo(sysUser.getUserId()); + Date lastLoginTime = lastLoginTimeList.size() > 1 ? lastLoginTimeList.get(1) : lastLoginTimeList.get(0); + + // 查询首页当天活动日志 + Map param = new HashMap<>(); + param.put("organId", organId); + param.put("startDate", DataHelp.getDay()); + param.put("endDate", DataHelp.getNowDate()); + PageHelper.startPage(1,6); + List logList = loggerService.getLogList(param); + + map.put("engineBaseInfo", engineBaseInfo); + map.put("engineUseRatio", engineUseRatio); + map.put("recentDayMap", recentDayMap); + map.put("recentMonthMap", recentMonthMap); + map.put("lastLoginTime", lastLoginTime); + map.put("logList", logList); + return ResponseEntityBuilder.buildNormalResponse(map); + } + + @ResponseBody + @RequestMapping(value = "/batchTest", method = RequestMethod.POST) + public ResponseEntityDto batchTest(HttpServletRequest request){ + TestResponse result = result = engineService.batchTest(request); + if (result==null){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR.getCode(),"执行失败"); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } + + private Map parseRecentDayEngineUseInfo(List recentDayEngineUseInfo){ + Map map = new HashMap<>(); + List> datasetList = new ArrayList<>(); + Set dayTimeSet = new TreeSet<>(); + Set engineNameSet = new HashSet<>(); + for(IndexEngineReportVo indexEngineReportVo : recentDayEngineUseInfo){ + dayTimeSet.add(indexEngineReportVo.getDayTime()); + engineNameSet.add(indexEngineReportVo.getEngineName()); + } + + for(String engineName : engineNameSet){ + Map dataMap = new HashMap<>(); + List dataList = new ArrayList<>(); + for(String dayTime : dayTimeSet){ + IndexEngineReportVo engineReportVo = null; + for(IndexEngineReportVo indexEngineReportVo : recentDayEngineUseInfo){ + if(dayTime.equals(indexEngineReportVo.getDayTime()) && engineName.equals(indexEngineReportVo.getEngineName())){ + engineReportVo = indexEngineReportVo; + break; + } + } + if(engineReportVo != null){ + dataList.add(engineReportVo.getUseNum()); + } else { + dataList.add(0); + } + } + dataMap.put("label", engineName); + dataMap.put("data", dataList); + datasetList.add(dataMap); + } + map.put("labels", dayTimeSet); + map.put("datasets", datasetList); + return map; + } + + private Map parseRecentMonthEngineUseInfo(List recentMonthEngineUseInfo){ + Map map = new HashMap<>(); + List> datasetList = new ArrayList<>(); + TreeSet monthTimeSet = new TreeSet<>(); + Set engineNameSet = new HashSet<>(); + for(IndexEngineReportVo indexEngineReportVo : recentMonthEngineUseInfo){ + monthTimeSet.add(indexEngineReportVo.getMonthTime()); + engineNameSet.add(indexEngineReportVo.getEngineName()); + } + + for(String engineName : engineNameSet){ + Map dataMap = new HashMap<>(); + List dataList = new ArrayList<>(); + for(String monthTime : monthTimeSet){ + IndexEngineReportVo engineReportVo = null; + for(IndexEngineReportVo indexEngineReportVo : recentMonthEngineUseInfo){ + if(monthTime.equals(indexEngineReportVo.getMonthTime()) && engineName.equals(indexEngineReportVo.getEngineName())){ + engineReportVo = indexEngineReportVo; + break; + } + } + if(engineReportVo != null){ + dataList.add(engineReportVo.getUseNum()); + } else { + dataList.add(0); + } + } + dataMap.put("label", engineName); + dataMap.put("data", dataList); + datasetList.add(dataMap); + } + map.put("labels", monthTimeSet); + map.put("datasets", datasetList); + return map; + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineVersionController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineVersionController.java new file mode 100644 index 0000000..0e672d8 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/EngineVersionController.java @@ -0,0 +1,358 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineConst; +import com.fibo.ddp.common.utils.constant.enginex.EngineMsg; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@Controller("EngineVersionControllerV2") +@RequestMapping("/v2/engineVersion") +@ResponseBody +public class EngineVersionController { + + @Autowired + private EngineVersionService engineVersionService; + @Autowired + private EngineNodeService engineNodeService; + + /** + * @api {POST} /v2/engineVersion/add/{engineId}/{version} 7.56. 新增版本 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} engineId 路径参数engineId + * @apiParam {Number} version 路径参数version + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/add/{engineId}/{version}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_VERSION) + public ResponseEntityDto addEngineVersion(@PathVariable Long engineId, @PathVariable Integer version) { + + Map map = new HashMap<>(); + // 获取当前系统登录用户,即引擎的创建者 + Long userId = SessionManager.getLoginAccount().getUserId(); + //获取当前选中的版本的最大子版本 + EngineVersion engineVer = new EngineVersion(); + engineVer.setEngineId(engineId); + engineVer.setVersion(version); + EngineVersion engineVersion = engineVersionService.getLatestEngineSubVersion(engineVer); + if (engineVersion != null) { + //无论引擎是否正在运行,皆在此版本下创建子版本 + EngineVersion newEngineVersion = new EngineVersion(); + newEngineVersion.setBootState(0); + newEngineVersion.setCreateTime(new Date().toString()); + newEngineVersion.setEngineId(engineVersion.getEngineId()); + newEngineVersion.setLatestTime(new Date().toString()); + newEngineVersion.setLatestUser(userId); + newEngineVersion.setLayout(0); + newEngineVersion.setStatus(1); + newEngineVersion.setSubVersion(engineVersion.getSubVersion() + 1); // 子版本 +1 + newEngineVersion.setUserId(userId); + newEngineVersion.setVersion(engineVersion.getVersion()); + //新增版本 + Long versionId = saveEngineVersion(newEngineVersion); + map.put("result", 1); + map.put("versionId", versionId); + } else { + map.put("result", -1); + map.put("versionId", 0); + } + return ResponseEntityBuilder.buildNormalResponse(map); + } + + /** + * @api {POST} /v2/engineVersion/clear/{versionId} 7.57. 清空引擎节点(根据versionId清空) + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/clear/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.CLEAR_NODE) + public ResponseEntityDto clear(@PathVariable Long versionId) { + Map map = new HashMap<>(); + // 正在部署的不能清除 + EngineVersion engineVersion = engineVersionService.selectByPrimaryKey(versionId); + if (engineVersion != null) { + if (engineVersion.getBootState() == 1) { + map.put("result", "-1"); + map.put("msg", "版本正在运行,请先停止部署!"); + } else { + boolean flag = engineVersionService.clear(versionId); + if (flag) { + map.put("result", "1"); + map.put("msg", "清除成功!"); + } else { + map.put("result", "-1"); + map.put("msg", "清除失败,请联系管理员!"); + } + } + } else { + map.put("result", "-1"); + map.put("msg", "数据错误,目标版本不存在!"); + } + return ResponseEntityBuilder.buildNormalResponse(map); + } + + /** + * @api {POST} /v2/engineVersion/deploy/{versionId} 7.50.1. 根据versionId部署引擎 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiSuccess {Object} data + * @apiSuccess {Number} data.status 部署结果:1成功,0失败 + * @apiSuccess {String} data.msg 部署结果提示信息 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/deploy/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ENGINDE_DEPLOY) + public ResponseEntityDto deployEngineVersion(@PathVariable Long versionId) { + + int count = engineVersionService.deployEngine(versionId); + + Map resultMap = new HashMap<>(); + resultMap.put("versionId", versionId); + if (count == 1) { + resultMap.put("status", EngineMsg.STATUS_SUCCESS); + resultMap.put("msg", EngineMsg.DEPLOY_SUCCESS); + } else { + resultMap.put("status", EngineMsg.STATUS_FAILED); + resultMap.put("msg", EngineMsg.DEPLOY_FAILED); + } + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + + @RequestMapping(value = "/applyDeploy/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ENGINDE_DEPLOY) + public ResponseEntityDto applyDeployEngineVersion(@PathVariable Long versionId) { + + Map map = engineVersionService.applyDeployEngine(versionId); + if (map!=null&&!map.isEmpty()){ + return ResponseEntityBuilder.buildNormalResponse(map); + }else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + + } + + /** + * @api {POST} /v2/engineVersion/undeploy/{versionId} 7.50.2. 根据versionId停用部署的引擎 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiSuccess {Object} data + * @apiSuccess {Number} data.status 停用部署结果:1已停用,0停用失败 + * @apiSuccess {String} data.msg 停用部署结果提示信息 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/undeploy/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ENGINDE_UNDEPLOY) + public ResponseEntityDto undeployEngineVersion(@PathVariable Long versionId) { + + int count = engineVersionService.undeployEngine(versionId); + + Map resultMap = new HashMap<>(); + resultMap.put("versionId", versionId); + if (count == 1) { + resultMap.put("status", EngineMsg.STATUS_SUCCESS); + resultMap.put("msg", EngineMsg.UNDEPLOY_SUCCESS); + } else { + resultMap.put("status", EngineMsg.STATUS_FAILED); + resultMap.put("msg", EngineMsg.UNDEPLOY_FAILED); + } + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + + /** + * @api {POST} /v2/engineVersion/nodeList/{versionId} 7.66.20. 根据版本编号获取节点列表(这个接口没什么用) + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/nodeList/{versionId}", method = RequestMethod.POST) + public ResponseEntityDto getEngineNodeListByVerionId(@PathVariable Long versionId) { + + List nodeList = engineNodeService.getEngineNodeListByEngineVersionId(versionId); + + // if (CollectionUtil.isNotNullOrEmpty(nodeList)) { + // return ResponseEntityBuilder.buildNormalResponse(nodeList); + // } + // return ResponseEntityBuilder.buildNormalResponse(null); + + return ResponseEntityBuilder.buildNormalResponse(nodeList); + } + + /** + * @api {POST} /v2/engineVersion/getTypedNodes/{versionId} 7.58. 根据类型获取节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiParam {JSONArray} types 节点类型 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * [3,7] + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/getTypedNodes/{versionId}", method = RequestMethod.POST) + public ResponseEntityDto getEngineNodesByType(@PathVariable Long versionId, @RequestBody List types) { + // @RequestParam Map paramMap, + // @RequestParam("types[]") List types + + // Long versionId = Long.parseLong(paramMap.get("versionId").toString()); + + HashMap paramMap = new HashMap<>(); + + List nodeList = engineNodeService.getEngineTypedNodeListByEngineVersionId(versionId, types); + boolean flag = true; + boolean flag1 = true; + if (nodeList != null && nodeList.size() > 0) { + for (EngineNode engineNode : nodeList) { + + if ((int) engineNode.getNodeType() == 7 && flag) { + if (!StringUtil.isBlank(engineNode.getNodeJson())) { + JSONArray json = JSONArray.parseArray(engineNode.getNodeJson()); + if (!StringUtil.isBlank(engineNode.getNextNodes())) { + String[] nextNodes = engineNode.getNextNodes().split(","); + paramMap.put("sanBoxNode", engineNode); + if (json.size() == nextNodes.length) { + paramMap.put("sanbox", "1"); + } else { + paramMap.put("sanbox", "0"); + flag = false; + } + } else { + paramMap.put("sanbox", "0"); + flag = false; + } + } + } + + if ((int) engineNode.getNodeType() == 3 && flag1) { + if (!StringUtil.isBlank(engineNode.getNodeJson())) { + JSONObject jsonObj = JSONObject.parseObject(engineNode.getNodeJson()); + JSONArray json = jsonObj.getJSONArray("conditions"); + if (!StringUtil.isBlank(engineNode.getNextNodes())) { + String[] nextNodes = engineNode.getNextNodes().split(","); + paramMap.put("groupNode", engineNode); + if (json.size() == nextNodes.length) { + paramMap.put("group", "1"); + } else { + paramMap.put("group", "0"); + flag1 = false; + } + } else { + paramMap.put("group", "0"); + flag1 = false; + } + } + } + } + } else { + paramMap.put("sanbox", "-1"); + paramMap.put("group", "-1"); + } + return ResponseEntityBuilder.buildNormalResponse(paramMap); + } + + /** + * @api {POST} /v2/engineVersion/delete/{versionId} 7.66.21. 删除当前版本 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} versionId 路径参数versionId + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {无请求体} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/delete/{versionId}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.DELETE_VERSION) + public ResponseEntityDto deleteEngineVersion(@PathVariable Long versionId) { + + EngineVersion engineVersion = engineVersionService.selectByPrimaryKey(versionId); + + Map map = new HashMap<>(); + // 当前版本是否正在运行 + int bootState = engineVersion.getBootState(); + if (EngineConst.BOOT_STATE_DEPLOY == bootState) { + // 如果正在运行,则提示用户不能删除 + map.put("status", EngineMsg.STATUS_FAILED); + map.put("msg", EngineMsg.DELETE_RUNNING_FAILED); + } else { + // 假删除,是否删除 (0:在回收站中,可恢复,1:正常,2彻底删除) + engineVersion.setStatus(0); // 状态改为0 + int count = engineVersionService.update(engineVersion); + if (count == 1) { + map.put("status", EngineMsg.STATUS_SUCCESS); + map.put("msg", EngineMsg.DELETE_VERSION_SUCCESS); + } else { + map.put("status", EngineMsg.STATUS_FAILED); + map.put("msg", EngineMsg.DELETE_VERSION_FAILED); + } + } + return ResponseEntityBuilder.buildNormalResponse(map); + } + + /** + * 新增版本 + * 新增分为两种情况,一种是自然地新增, + * 一种是当前版本正在运行修改的新增 + * + * @param engineVersion + * @return + */ + @RequestMapping("save") + @ArchivesLog(operationType = OpTypeConst.SAVE_VERSION) + public Long saveEngineVersion(EngineVersion engineVersion) { + List nodeList = new ArrayList<>(); + EngineNode engineNode = new EngineNode(); + engineNode.setNodeX(200d); + engineNode.setNodeY(200d); + engineNode.setNodeName("开始"); + engineNode.setNodeType(1); + engineNode.setNodeOrder(1); + engineNode.setNodeCode("ND_START"); + engineNode.setParams("{\"arr_linkId\":\"\",\"dataId\":\"-1\",\"url\":\"/Riskmanage/resource/images/decision/start.png\",\"type\":\"1\"}"); + nodeList.add(engineNode); + Long versionId = engineVersionService.saveEngineVersion(engineVersion, nodeList); + return versionId; + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ListDbNodeController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ListDbNodeController.java new file mode 100644 index 0000000..8e11e61 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ListDbNodeController.java @@ -0,0 +1,105 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 黑白名单节点接口 + */ +@Controller("listDbNodeControllerV2") +@RequestMapping("v2/bwListNode") +@ResponseBody +public class ListDbNodeController { + + @Autowired + private ListDbService listDbService; + @Autowired + private EngineNodeService engineNodeService; + @Autowired + private EngineVersionService engineVersionService; + @Autowired + private FieldService fieldService; + + /** + * @api {POST} /v2/bwListNode/update 7.73. 黑白名单节点 修改节点信息 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点编号 + * @apiParam {Number} versionId 版本编号 + * @apiParam {Number} nodeType 节点类型:5黑名单,6白名单 + * @apiParam {Number} nodeOrder 节点顺序 + * @apiParam {String} nodeName 节点名称 + * @apiParam {String} nodeCode 节点code + * @apiParam {Number} nodeX 节点X轴 + * @apiParam {Number} nodeY 节点Y轴 + * @apiParam {String} innerListdbs 内部黑名单id,逗号分隔 + * @apiParam {String} outerListdbs 外部黑名单id,逗号分隔 + * @apiParam {String} [nodeJson] 节点json + * @apiParam {String} [nodeScript] 节点脚本 + * @apiParam {String} [params] 节点类型,图标等信息 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"nodeId":3361,"versionId":454,"nodeType":5,"nodeOrder":13,"nodeName":"黑名单66","nodeCode":"ND_13","nodeX":666.66,"nodeY":666.77,"innerListdbs":"112,115","outerListdbs":""} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_NODE) + public ResponseEntityDto update(@RequestBody HashMap paramMap) { + //增加黑白名单库用到的字段绑定,传递engineId和字段id + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); //listDbIds + + String innerListdbs = String.valueOf(paramMap.get("innerListdbs")); + String outerListdbs = String.valueOf(paramMap.get("outerListdbs")); + Object nodeJson = paramMap.get("nodeJson"); + List listDbIds = new ArrayList<>(); + if (nodeJson!=null){ + JSONObject jsonObject = JSON.parseObject(nodeJson.toString()); + JSONArray listDbList = jsonObject.getJSONArray("listDbList"); + if (listDbList!=null&&listDbList.size()>0){ + for (Object o : listDbList) { + JSONObject listDbJson = JSON.parseObject(JSON.toJSONString(o)); + Long listDbId = listDbJson.getLong("listDbId"); + if (listDbId!=null){ + listDbIds.add(listDbId); + } + } + } + } + String snapshot = String.valueOf(paramMap.get("snapshot")); + paramMap.put("listDbIds", listDbIds); + String strFieldIds = listDbService.findFieldsByListDbIds(paramMap); + Long versionId = Long.valueOf(String.valueOf(paramMap.get("versionId"))); + EngineVersion engineVesion = engineVersionService.selectByPrimaryKey(versionId); + Long engineId = engineVesion.getEngineId(); + paramMap.put("engineId", engineId); + paramMap.put("fieldIds", strFieldIds); + fieldService.bindEngineField(paramMap); + paramMap.put("snapshot",snapshot); + engineNodeService.updateNodeSnapshot(paramMap); + return ResponseEntityBuilder.buildNormalResponse(); + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ModelNodeController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ModelNodeController.java new file mode 100644 index 0000000..60c2611 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ModelNodeController.java @@ -0,0 +1,77 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.request.ModelListParam; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.strategyx.aimodel.ModelsService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; + +/** + * 模型节点接口 + */ +@RestController +@RequestMapping("modelNode") +public class ModelNodeController { + + @Autowired + private ModelsService modelsService; + @Autowired + private EngineNodeService engineNodeService; + + /** + * @api {POST} /modelNode/getModelList 7.91. 模型节点 获取模型列表 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiParam {Long} nodeId 节点id + * @apiParam {Long} engineId 引擎id + * @apiParam {String} [searchString] 搜索关键字 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":5,"nodeId":3247,"engineId":214,"searchString":"模型"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":5,"size":1,"startRow":1,"endRow":1,"total":1,"pages":1,"list":null,"prePage":0,"nextPage":0,"isFirstPage":true,"isLastPage":true,"hasPreviousPage":false,"hasNextPage":false,"navigatePages":8,"navigatepageNums":[1],"navigateFirstPage":1,"navigateLastPage":1,"lastPage":1,"firstPage":1},"modelsList":[{"userId":1,"modelName":"老户模型","description":"老户模型描述","modelType":"pmml","fileName":"1614578067937_model_RF.pmml","filePath":"/usr/local/tomcat_riskmanage/webapps/Riskmanage/upload/models/fieldUpload/1614578067937_model_RF.pmml","modelField":"x16,x17,x8,x19,x6,x10,x5,x1,x13,x2,x3,x15,x21,x18,x11,x7,x14,x12,x20","mappingField":"588,590,591,592,593,594,605,606,611,613,610,612,614,615,616,609,617,620,589","status":1,"creator":135,"modifier":135,"organId":46,"createTime":1614578104000,"updateTime":1614578104000,"modelFieldArr":null,"mappingFieldArr":null,"checked":true}]}} + */ + @RequestMapping(value = "getModelList", method = RequestMethod.POST) + public ResponseEntityDto getModelList(@RequestBody ModelListParam param) { + String searchString = param.getSearchString(); + Long nodeId = param.getNodeId(); + SysUser sysUser = SessionManager.getLoginAccount(); + Integer organId = Integer.valueOf(sysUser.getOrganId().toString()); + + PageHelper.startPage(param.getPageNo(), param.getPageSize()); + List modelsList = modelsService.getModelsListByOrganId(organId, searchString); + EngineNode engineNode = engineNodeService.findById(nodeId); + if (engineNode != null) { + for (MachineLearningModels models : modelsList) { + if (models.getId().toString().equals(engineNode.getNodeJson())) { + models.setChecked(true); + break; + } + } + } + + PageInfo pageInfo = new PageInfo(modelsList); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("pager", pageInfo); + modelMap.put("modelsList", modelsList); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/RuleNodeController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/RuleNodeController.java new file mode 100644 index 0000000..bf27a47 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/RuleNodeController.java @@ -0,0 +1,152 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.request.KnowledgeTreeListParam; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.request.RuleListParamV2; +import com.fibo.ddp.common.model.strategyx.knowledge.KnowledgeTree; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.knowledge.KnowledgeTreeService; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller("RuleNodeController") +@RequestMapping("/v2/ruleNode") +@ResponseBody +public class RuleNodeController { + + @Autowired + private RuleService ruleService; + @Autowired + private RuleVersionService versionService; + @Autowired + private RuleScriptVersionService ruleScriptVersionService; + @Autowired + private KnowledgeTreeService knowledgeTreeService; + + /** + * @api {POST} /v2/ruleNode/getTreeDataForEngine 7.61. 获取树形节点集合 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} status 值为1 + * @apiParam {Integer} type 1规则集,2 + * @apiParam {Integer} [pageNo=1] 第几页 + * @apiParam {Integer} [pageSize=5] 每页的条数 + * @apiParam {Integer} [engineId] 引擎id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"status":1,"type":1,"pageNo":1,"pageSize":5,"engineId":211} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/getTreeDataForEngine", method = RequestMethod.POST) + public ResponseEntityDto getTreeDataForEngine(@RequestBody Map param) { + + // @RequestParam Map inputParam, + // @RequestParam(defaultValue = "1") Integer pageNo, + // @RequestParam(defaultValue = "5") Integer pageSize + + Integer pageNo = param.get("pageNo") == null ? 1 : Integer.valueOf(param.get("pageNo").toString()); + Integer pageSize = param.get("pageSize") == null ? 5 : Integer.valueOf(param.get("pageSize").toString()); + + param.putAll(getParam(param)); + param.put("sort", false); + param.put("tree_type", StringUtil.toLongList("0")); + param.put("status", StringUtil.toLongList(param.get("status").toString())); + PageHelper.startPage(pageNo, pageSize); + List klist = knowledgeTreeService.getTreeDataForEngine(param); + PageInfo pageInfo = new PageInfo<>(klist); + param.put("klist", klist); + param.put("pager", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/ruleNode/getRuleDataForEngine 7.62. 获取规则数据为引擎节点 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Integer} status 值为1 + * @apiParam {Integer} parentIds XXXXX + * @apiParam {Integer} [is_select] 值为1 + * @apiParam {Integer} [dictKey] 值为ruleName + * @apiParam {Integer} [dictValue] 搜索关键字 + * @apiParam {Integer} [engineId] 引擎id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例1: + * {"status":1,"parentIds":1038,"engineId":211} + * @apiParamExample {json} 请求示例2: + * {"status":1,"is_select":1,"dictKey":"ruleName","dictValue":"欺诈","engineId":211} + * @apiSuccessExample {json} 成功返回数据示例: + * {待完善} + */ + @RequestMapping(value = "/getRuleDataForEngine", method = RequestMethod.POST) + public ResponseEntityDto getRuleDataForEngine(@RequestBody Map param) { + param.putAll(getParam(param)); + param.put("status", StringUtil.toLongList(param.get("status").toString())); + RuleInfo rule = new RuleInfo(); + rule.setStatus(1); + rule.setOrganId(SessionManager.getLoginAccount().getOrganId()); + if (param.containsKey("parentIds")) { + List parentIds = StringUtil.toLongList(param.get("parentIds").toString()); + param.put("parentIds",parentIds ); + rule.setParentIds(parentIds); + } +// List rlist = s.ruleService.getRuleList(inputParam); + RuleListParamV2 ruleListParam = new RuleListParamV2(); + ruleListParam.setPageNum(0); + ruleListParam.setPageSize(0); + ruleListParam.setRuleInfo(rule); + List list = ruleService.queryByEntity(ruleListParam).getList(); + if (list != null && list.size() > 0) { + for (RuleInfo info : list) { + if (info.getDifficulty() == 2) { + info.setRuleVersionList(versionService.queryVersionListByRuleId(info.getId())); + }else + if (info.getDifficulty() == 3){ + info.setRuleScriptVersionList(ruleScriptVersionService.queryVersionListByRuleId(info.getId())); + } + } + } + param.put("rlist", list); + return ResponseEntityBuilder.buildNormalResponse(param); + } + + // 已选规则预览(待完善)(待讨论) + @RequestMapping(value = "/previewRule", method = RequestMethod.POST) + public ModelAndView previewRule(@RequestParam Map paramMap) { + ModelAndView mav = new ModelAndView("decision/rulesDetails"); + mav.addAllObjects(paramMap); + return mav; + } + + // 根据用户角色或权限,获取所需参数集合 + private Map getParam(Map paramMap) { + SysUser sysUser = SessionManager.getLoginAccount(); + paramMap.put("userId", sysUser.getUserId()); + paramMap.put("organId", sysUser.getOrganId()); + return paramMap; + } + + @RequestMapping(value = "/getFolderList", method = RequestMethod.POST) + public ResponseEntityDto getFolderList(@RequestBody KnowledgeTreeListParam param) { + List list = knowledgeTreeService.getFolderList(param); + Map map = new HashMap<>(); + map.put("klist", list); + return ResponseEntityBuilder.buildNormalResponse(map); + } + +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ScorecardNodeController.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ScorecardNodeController.java new file mode 100644 index 0000000..6f52096 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/controller/ScorecardNodeController.java @@ -0,0 +1,144 @@ +package com.fibo.ddp.enginex.riskengine.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller("ScorecardNodeControllerV2") +@RequestMapping("/v2/cardNode") +@ResponseBody +public class ScorecardNodeController { + + @Autowired + private ScorecardVersionService scorecardVersionService; + @Autowired + private ScorecardService scorecardService; + @Autowired + private EngineNodeService engineNodeService; + + // 决策流 + @RequestMapping("toCardNode") + public ModelAndView toCardNode() { + ModelAndView mav = new ModelAndView("decision/decisions"); + return mav; + } + + /** + * @api {POST} /v2/cardNode/cardList 7.60. 返回评分卡列表 + * @apiGroup zzzzz01 + * @apiVersion 2.0.0 + * @apiParam {Number} nodeId 节点id,0表示新建的 + * @apiParam {Number} status 1 + * @apiParam {String} [dictKey] 值为"scorecardName" + * @apiParam {String} [dictValue] 搜索关键字 + * @apiParam {Number} [pageNo=1] 第几页 + * @apiParam {Number} [pageSize=10] 每页的条数 + * @apiParam {Number} [engineId] 引擎id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例1: + * {"nodeId":3223,"status":1} + * @apiParamExample {json} 请求示例2: + * {"nodeId":3223,"status":1,"dictKey":"scorecardName","dictValue":"客户","pageNo":1,"pageSize":10,"engineId":211} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":1,"size":1,"startRow":1,"endRow":1,"total":9,"pages":9,"list":[{"userId":99,"name":"客户评分卡-有盾","versionCode":"SC_test_card2","description":"客户评分卡-有盾值","version":null,"parentId":1076,"userId":135,"author":135,"authorName":"管理员","engineId":211,"type":1,"status":1,"sFieldList":[],"sContentList":[],"created":1520236208000,"updated":1615889385000,"checked":false,"score":"{\"output\":{\"field_id\":0,\"field_code\":\"score\",\"field_name\":\"信用得分\",\"field_type\":1},\"formula\":\"300+#{f_yd_realNameScore}\",\"formula_show\":\"300+@有盾实名认证分值@\",\"fields\":[{\"field_id\":642,\"field_code\":\"f_yd_realNameScore\",\"field_type\":1,\"field_name\":\"有盾实名认证分值\",\"segments\":[{\"segment\":\"(,29]\",\"dictValue\":0},{\"segment\":\"(29,69]\",\"dictValue\":50},{\"segment\":\"(69,)\",\"dictValue\":100}]}]}","pd":null,"odds":null,"engineName":null,"organId":46,"sRuleContentList":[]}],"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"firstPage":1,"lastPage":8},"keySearch":"客户","list":[{"userId":99,"name":"客户评分卡-有盾","versionCode":"SC_test_card2","description":"客户评分卡-有盾值","version":null,"parentId":1076,"userId":135,"author":135,"authorName":"管理员","engineId":211,"type":1,"status":1,"sFieldList":[],"sContentList":[],"created":1520236208000,"updated":1615889385000,"checked":false,"score":"{\"output\":{\"field_id\":0,\"field_code\":\"score\",\"field_name\":\"信用得分\",\"field_type\":1},\"formula\":\"300+#{f_yd_realNameScore}\",\"formula_show\":\"300+@有盾实名认证分值@\",\"fields\":[{\"field_id\":642,\"field_code\":\"f_yd_realNameScore\",\"field_type\":1,\"field_name\":\"有盾实名认证分值\",\"segments\":[{\"segment\":\"(,29]\",\"dictValue\":0},{\"segment\":\"(29,69]\",\"dictValue\":50},{\"segment\":\"(69,)\",\"dictValue\":100}]}]}","pd":null,"odds":null,"engineName":null,"organId":46,"sRuleContentList":[]}]}} + */ + @RequestMapping(value = "/cardList", method = RequestMethod.POST) + public ResponseEntityDto getCardNode(@RequestBody Map param) { + + + Long nodeId = Long.parseLong(param.get("nodeId").toString()); + Integer pageNo = param.get("pageNo") == null ? 1 : Integer.parseInt(param.get("pageNo").toString()); + Integer pageSize = param.get("pageSize") == null ? 10 : Integer.parseInt(param.get("pageSize").toString()); + + String keySearch = "1"; + param.put("status", StringUtil.toLongList(param.get("status").toString())); + PageHelper.startPage(pageNo, pageSize); + List list = scorecardService.getScorecardList(param); + + // 回显 + if (nodeId != null && nodeId != 0) { + EngineNode byId = engineNodeService.findById(nodeId); + if (byId != null) { + //获取评分卡id; + //long knowledgeId = nodeKnowledge.getKnowledgeId();// + if (StringUtils.isNotBlank(byId.getNodeJson())) { + // && !"".equals(byId.getNodeJson()) +// long knowledgeId = Long.valueOf(byId.getNodeJson()); + long knowledgeId = 0; + if(byId.getNodeJson()!=null&&!byId.getNodeJson().contains("{")){ + knowledgeId = StringUtil.getStrToLong(byId.getNodeJson()); + } + //原来存储id现在被转换为存储的是json + Map scorecardIdMap = new HashMap(); + if (knowledgeId == 0) { + try { + JSONObject jsonObject = JSON.parseObject(byId.getNodeJson()); + JSONArray scorecardList = jsonObject.getJSONArray("scorecardList"); + if (scorecardList!=null&&!scorecardList.isEmpty()){ + for (int i = 0; i < scorecardList.size(); i++) { + JSONObject scorecard = scorecardList.getJSONObject(i); + scorecardIdMap.put(scorecard.getLong("scorecardId"),scorecard.getLong("versionId")); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + }else { + ScorecardVersionVo version = scorecardVersionService.queryById(knowledgeId); + if (version!=null){ + scorecardIdMap.put(version.getScorecardId(),version.getId()); + } + } + //判断并回显 + if (scorecardIdMap != null&& !scorecardIdMap.isEmpty() && list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + Long cardId = list.get(i).getId(); + if (scorecardIdMap.containsKey(cardId)) { + ScorecardVo scorecardInfo = scorecardService.getScorecardInfo(cardId); + scorecardInfo.setChecked(true); + scorecardInfo.setCheckedId(scorecardIdMap.get(cardId)); + list.set(i, scorecardInfo); + } + } + } + } + } + } + + PageInfo pageInfo = new PageInfo<>(list); + + if (param.containsKey("dictValue")) { + keySearch = param.get("dictValue").toString(); + } + + HashMap modelMap = new HashMap<>(); + modelMap.put("list", list); + modelMap.put("pager", pageInfo); + modelMap.put("keySearch", keySearch); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/api/RiskEngineApi.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/api/RiskEngineApi.java new file mode 100644 index 0000000..e53dad6 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/api/RiskEngineApi.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.enginex.riskengine.runner.api; + +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.runner.SessionData; +import com.fibo.ddp.enginex.riskengine.runner.business.DecisionApiBizData; +import com.fibo.ddp.enginex.riskengine.runner.business.DecisionApiRequest; +import com.fibo.ddp.enginex.riskengine.runner.business.RiskEngineBusiness; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("runner") +public class RiskEngineApi { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + public RiskEngineBusiness riskEngineBusiness; + + @RequestMapping(value = "/decision", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") + public String decision(@RequestBody DecisionApiRequest apiRequest) { + long start = System.currentTimeMillis(); + DecisionApiBizData bizData = apiRequest.getBiz_data(); + Map map = new HashMap<>(); + map.put("pid", bizData.getBusinessId()); + map.put("uid", ""); + map.put("reqType", 1); + map.put("engineId", bizData.getEngineId()); + map.put("organId", bizData.getOrganId()); + + SessionData sessionData = new SessionData(); + sessionData.setOrganId(bizData.getOrganId()); + sessionData.setEngineId(bizData.getEngineId()); + sessionData.setReqType(1); + RunnerSessionManager.setSession(sessionData); + + if(bizData.getFields() != null){ + map.put("fields", bizData.getFields()); + } else { + map.put("fields", new HashMap<>()); + } + String result = riskEngineBusiness.engineApi(map); + long end = System.currentTimeMillis(); + logger.info("============ 接口调用耗时:{}ms ============", (end -start)); + return result; + } + + @RequestMapping(value = "/batchExecute", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") + public List batchExecute(@RequestBody List requestList){ + List list = new ArrayList<>(); + for (DecisionApiRequest apiRequest : requestList) { + String decision = this.decision(apiRequest); + list.add(decision); + } + return list; + } +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiBizData.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiBizData.java new file mode 100644 index 0000000..c77c09f --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiBizData.java @@ -0,0 +1,18 @@ +package com.fibo.ddp.enginex.riskengine.runner.business; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Map; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class DecisionApiBizData { + + private String businessId; // 业务id + private Long organId; // 组织id + private Long engineId; // 引擎id + private Map fields; // 指标字段键值对 +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiRequest.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiRequest.java new file mode 100644 index 0000000..0639fe2 --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/DecisionApiRequest.java @@ -0,0 +1,17 @@ +package com.fibo.ddp.enginex.riskengine.runner.business; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class DecisionApiRequest { + + private String tp_code; // 调用方编码 + private String timestamp; // 精确到毫秒 + private String sign; // 签名 + private String biz_enc; // biz_data加密方式(0不加密,1加密) + private DecisionApiBizData biz_data; // 请求的业务数据,json格式的字符串 +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/RiskEngineBusiness.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/RiskEngineBusiness.java new file mode 100644 index 0000000..516934a --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/RiskEngineBusiness.java @@ -0,0 +1,8 @@ +package com.fibo.ddp.enginex.riskengine.runner.business; + +import java.util.Map; + +public interface RiskEngineBusiness { + + String engineApi(Map paramJson); +} diff --git a/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/impl/RiskEngineBusinessImpl.java b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/impl/RiskEngineBusinessImpl.java new file mode 100644 index 0000000..f1ff64e --- /dev/null +++ b/ddp-enginex/risk-engine/src/main/java/com/fibo/ddp/enginex/riskengine/runner/business/impl/RiskEngineBusinessImpl.java @@ -0,0 +1,606 @@ +package com.fibo.ddp.enginex.riskengine.runner.business.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.enginex.risk.EngineResultSetMapper; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import com.fibo.ddp.common.model.enginex.risk.EngineVersion; +import com.fibo.ddp.common.model.monitor.decisionflow.MonitorNode; +import com.fibo.ddp.common.service.enginex.risk.EngineNodeService; +import com.fibo.ddp.common.service.enginex.risk.EngineService; +import com.fibo.ddp.common.service.enginex.risk.EngineVersionService; +import com.fibo.ddp.common.service.monitor.runner.MonitorCenterFactoryRunner; +import com.fibo.ddp.common.service.monitor.runner.MonitorCommonService; +import com.fibo.ddp.common.service.monitor.runner.hbase.IFeatureRecordService; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import com.fibo.ddp.enginex.riskengine.runner.business.RiskEngineBusiness; +import com.fibo.ddp.enginex.runner.node.impl.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.util.concurrent.ListenableFuture; +import org.springframework.util.concurrent.ListenableFutureCallback; +import org.springframework.web.client.AsyncRestTemplate; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; + +@Service +public class RiskEngineBusinessImpl implements RiskEngineBusiness { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + public EngineService engineService; + + @Resource + public EngineVersionService engineVersionService; + + @Resource + public EngineNodeService engineNodeService; + + @Resource + public EngineResultSetMapper resultSetMapper; + + @Resource + private DecisionTablesNode decisionTablesNode; + @Resource + private DecisionTreeNode decisionTreeNode; + + @Autowired + private DecisionOptionsNode decisionOptionsNode; + + @Autowired + private ScorecardNode scorecardNode; + + @Autowired + private RuleSetNode ruleSetNode; + + @Autowired + private GroupNode groupNode; + + @Autowired + private ModelNode modelNode; + + @Autowired + private ChildEngineNode childEngineNode; + + @Autowired + private BlackOrWhiteNode blackOrWhiteNode; + + @Autowired + private AggregationNode aggregationNode; + + @Autowired + private ParallelNode parallelNode; + + @Autowired + private ChampionChallengeNode championChallengeNode; + + @Autowired + private RpcNode rpcNode; + + @Autowired + private SandboxProportionNode sandboxProportionNode; + @Autowired + private MonitorCommonService monitorCommonService; + @Autowired + private IFeatureRecordService featureRecordService; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Value("${monitor.data.storage.type}") + private String storageType; + + @Autowired(required = false) + private AsyncRestTemplate asyncRestTemplate; + + @Override + public String engineApi(Map paramJson) { + logger.info("请求参数,paramJson: {}", JSONObject.toJSONString(paramJson)); + JSONObject jsonObject = new JSONObject(); + JSONArray resultJson = new JSONArray(); + Map> featureMaps = new ConcurrentHashMap<>(); + //时间差小于等于30分钟并且鉴权成功 + if (true){ + Long organId = Long.valueOf(paramJson.get("organId").toString()); + Long engineId = Long.valueOf(paramJson.get("engineId").toString()); + //获取引擎信息 + Engine engine = engineService.getEngineById(engineId); + if(engine != null && !engine.getOrganId().equals(organId)){ + // todo 校验引擎是否为该组织所属 + } + //获取引擎正在运行中的版本 + EngineVersion engineVersion = engineVersionService.getRunningVersion(engineId); + if (engineVersion != null) { + //返回引擎下的所有节点集合 + List engineNodeList = engineNodeService.getEngineNodeListByVersionId(engineVersion.getVersionId()); + Map engineNodeMap = getEngineNodeListByMap(engineNodeList); + try { + //变量池 + Map inputParam = new ConcurrentHashMap<>(); + inputParam.putAll(JSONObject.parseObject(JSONObject.toJSONString(paramJson.get("fields")), Map.class)); + EngineNode engineNode = engineNodeMap.get("ND_START"); + if (null != engineNode && null != engineNode.getNextNodes()) { + //返回输出结果 + Map outMap = new ConcurrentHashMap<>(); + // 记录执行前全量指标 + featureMaps.put("before",inputParam); + //节点执行方法 + recursionEngineNode(inputParam, engineNodeMap.get(engineNode.getNextNodes()), engineNodeMap, outMap); + jsonObject.put("status", "0x0000"); + jsonObject.put("msg", "执行成功"); + if (outMap.containsKey("centens") && outMap.get("centens").equals("true")) { + jsonObject.put("status", "0x0006"); + jsonObject.put("msg", "获取数据失败"); + jsonObject.put("data", ""); + return jsonObject.toString(); + } + //记录执行后的全量指标 + featureMaps.put("after",inputParam); + paramJson.put("versionId",engineNode.getVersionId()); + // todo 压测暂时去掉 +// featureRecordService.recordAllFeature(featureMaps,engine,paramJson); + + String json = JSONObject.toJSONString(inputParam); + jsonObject.put("input", JSONObject.parseObject(json)); + + EngineResultSet resultSet = new EngineResultSet(); + resultSet.setEngineCode(engine.getCode()); + resultSet.setInput(json); + resultSet.setEngineId(engine.getId()); + resultSet.setEngineName(engine.getName()); + resultSet.setType(2); + resultSet.setSubVersion(engineVersion.getSubVersion()); + resultSet.setUid(String.valueOf(paramJson.get("uid"))); + resultSet.setPid(String.valueOf(paramJson.get("pid"))); + + //决策表最终结果 + if (outMap.containsKey("decisionTables")){ + jsonObject.put("decisionTablesResult", outMap.get("decisionTables").toString()); + resultSet.setDecisionTablesResult(outMap.get("decisionTables").toString()); + } + //决策树最终结果 + if (outMap.containsKey("decisionTree")){ + jsonObject.put("decisionTreeResult", outMap.get("decisionTree").toString()); + resultSet.setDecisionTreeResult(outMap.get("decisionTree").toString()); + } + // 节点终止输出 + if (outMap.containsKey("result")) { + resultSet.setResult(outMap.get("result").toString()); + //决策选项最终结果 + jsonObject.put("result", outMap.get("result").toString()); + } + + if (outMap.containsKey("blackJson")) { + resultJson.add(new JSONObject().parse(outMap.get("blackJson").toString())); + } + + if (outMap.containsKey("whiteJson")) { + resultJson.add(new JSONObject().parse(outMap.get("whiteJson").toString())); + } + + if (outMap.containsKey("ruleJson")) { + //规则集节点输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 2); + ruleJson.put("resultJson", outMap.get("ruleJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("scoreJson")) { + //评分卡输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 4); + ruleJson.put("resultJson", outMap.get("scoreJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("decisionJson")) { + //决策选项输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 9); + ruleJson.put("resultJson", outMap.get("decisionJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("childEngineJson")) { + //子引擎节点输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 14); + ruleJson.put("resultJson", outMap.get("childEngineJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("modelJson")) { + //模型节点输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 15); + ruleJson.put("resultJson", outMap.get("modelJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("decisionTablesJson")) { + //决策表输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 16); + ruleJson.put("resultJson", outMap.get("decisionTablesJson")); + resultJson.add(ruleJson); + } + + if (outMap.containsKey("decisionTreeJson")) { + //决策树输出 + JSONObject ruleJson = new JSONObject(); + ruleJson.put("resultType", 17); + ruleJson.put("resultJson", outMap.get("decisionTreeJson")); + resultJson.add(ruleJson); + } + + jsonObject.put("data", resultJson); + String result = JSONObject.toJSONString(jsonObject); + + JSONObject tmpJsonObject = JSONObject.parseObject(result); + tmpJsonObject.remove("input"); + resultSet.setOutput(JSONObject.toJSONString(tmpJsonObject)); + // todo 压测暂时去掉 +// resultSetMapper.insertResultSet(resultSet); + Integer resultId = resultSet.getId(); + // todo 压测暂时去掉 +// this.monitorDecisionFlow(inputParam,engine,engineVersion,engineNodeList,outMap,paramJson,resultId); + // 正常返回结果回调 + decisionCallback(engine.getCallbackUrl(), paramJson, result); + } + } catch (Exception e) { + logger.error("接口请求异常", e); + jsonObject.put("status", "0x0005"); + jsonObject.put("msg", "执行失败"); + jsonObject.put("data", ""); + // 异常回调 + decisionCallback(engine.getCallbackUrl(), paramJson, "执行失败"); + } + } else { + jsonObject.put("status", "0x0004"); + jsonObject.put("msg", "请求引擎不存在或尚未部署运行"); + jsonObject.put("data", ""); + } + } else { + jsonObject.put("status", "0x0001"); + jsonObject.put("msg", "鉴权失败,非法调用"); + jsonObject.put("data", ""); + } + + return jsonObject.toString(); + } + + /** + * 决策流监控 + * @param inputParam + * @param engine + * @param engineVersion + * @param engineNodeList + * @param outMap + * @param paramJson + * @param resultId + */ + private void monitorDecisionFlow(Map inputParam, Engine engine, EngineVersion engineVersion, List engineNodeList, Map outMap, Map paramJson, Integer resultId) { + switch (storageType){ + case MonitorStorageType.Mysql: + MonitorCenterFactoryRunner.getMonitorCenterServiceImp(MonitorStorageType.Mysql).monitorDecisionFlow(inputParam,engine,engineVersion,engineNodeList,outMap,paramJson,resultId); + break; + case MonitorStorageType.HBase: + MonitorCenterFactoryRunner.getMonitorCenterServiceImp(MonitorStorageType.HBase).monitorDecisionFlow(inputParam,engine,engineVersion,engineNodeList,outMap,paramJson,resultId); + break; + default: + logger.info("检查监控存储类型配置是否正确"); + break; + } + } + + /** + * 递归执行节点 + * @param inputParam + * @param engineNode + * @param engineNodeMap + * @param outMap + */ + private EngineNode recursionEngineNode(Map inputParam, EngineNode engineNode, Map engineNodeMap, Map outMap) { + logger.info("请求参数--" + "inputParam:" + JSONObject.toJSONString(inputParam)); + + EngineNode resultNode = null; // 结束时返回节点: 串行流程返回null、并行流程返回聚合节点 + + if(engineNode == null){ + return null; + } + + // 获取节点所需的指标 + getNodeField(engineNode, inputParam); + // 执行节点逻辑 + runNode(engineNode, inputParam, outMap); + + //用于存储执行过的节点 + List executedNodeList = new ArrayList<>(); + //用于存储执行过的节点以及其对应的配置信息(节点id,对应的配置信息,以及结果) + List monitorNodeInfoList = new ArrayList<>(); + if(outMap.containsKey("monitorNodes")){ + monitorNodeInfoList = (List)outMap.get("monitorNodes"); + } + if(outMap.containsKey("executedNodes")){ + executedNodeList =(List) outMap.get("executedNodes"); + } + executedNodeList.add(engineNode.getNodeId()+""); + // 更新执行过节点数组 + outMap.put("executedNodes",executedNodeList); + monitorCommonService.buildMonitorNode(inputParam,engineNode,outMap,monitorNodeInfoList); + // 所有节点监控信息数组放入 输出变量池中 + outMap.put("monitorNodes",monitorNodeInfoList); + + // 递归执行下一个节点 + if (StringUtils.isNotBlank(engineNode.getNextNodes())) { + if(engineNode.getNodeType() == NodeTypeEnum.PARALLEL.getValue()){ + // 并行节点执行 + EngineNode aggregationNode = parallelNode(inputParam, engineNode, engineNodeMap, outMap); + recursionEngineNode(inputParam, aggregationNode, engineNodeMap, outMap); + + } else { + // 串行节点执行 + EngineNode nextEngineNode = engineNodeMap.get(engineNode.getNextNodes()); + //如果输出的map里面有nextNode,则说明有分组,需要走分组下面的节点 + if (outMap.containsKey("nextNode")) { + nextEngineNode = engineNodeMap.get(outMap.get("nextNode")); + outMap.remove("nextNode"); + } + + if(nextEngineNode!=null&&nextEngineNode.getNodeType() == NodeTypeEnum.AGGREGATION.getValue()){ + // 并行节点后面的分支为多线程执行,执行到聚合节点则结束 + resultNode = nextEngineNode; + } else { + resultNode = recursionEngineNode(inputParam, nextEngineNode, engineNodeMap, outMap); + } + } + } + + return resultNode; + } + + + + /** + * 并行节点处理(并行执行后面的分支,并返回最后的聚合节点) + * @param inputParam + * @param engineNode + * @param engineNodeMap + * @param outMap + * @return + */ + private EngineNode parallelNode(Map inputParam, EngineNode engineNode, Map engineNodeMap, Map outMap){ + EngineNode aggregationNode = null; // 聚合节点code + String[] nextNodeArr = engineNode.getNextNodes().split(","); + List> futureList = new ArrayList<>(); + for (String nextNodeCode : nextNodeArr) { + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + EngineNode nextEngineNode = engineNodeMap.get(nextNodeCode); + EngineNode resultNode = recursionEngineNode(inputParam, nextEngineNode, engineNodeMap, outMap); + return resultNode; + }, threadPoolTaskExecutor); + futureList.add(future); + } + + for(CompletableFuture future : futureList){ + try { + EngineNode result = future.get(); + aggregationNode = result; + } catch (Exception e) { + e.printStackTrace(); + } + } + return aggregationNode; + } + + /** + * 获取节点所需的指标 + * @param engineNode + * @param inputParam + */ + private void getNodeField(EngineNode engineNode, Map inputParam) { + switch (engineNode.getNodeType()) { + case 2: + //规则 + ruleSetNode.getNodeField(engineNode, inputParam); + break; + case 3: + //分组 + groupNode.getNodeField(engineNode, inputParam); + break; + case 4: + //评分卡 + scorecardNode.getNodeField(engineNode, inputParam); + break; + case 5: + //黑名单 + blackOrWhiteNode.getNodeField(engineNode, inputParam); + break; + case 6: + //白名单 + blackOrWhiteNode.getNodeField(engineNode, inputParam); + break; + case 9: + //决策选项 + decisionOptionsNode.getNodeField(engineNode, inputParam); + break; + case 14: + //子引擎 + childEngineNode.getNodeField(engineNode, inputParam); + break; + case 15: + //模型 + modelNode.getNodeField(engineNode, inputParam); + break; + case 16: + //决策表 + decisionTablesNode.getNodeField(engineNode, inputParam); + break; + case 17: + //决策树 + decisionTreeNode.getNodeField(engineNode, inputParam); + break; + case 18: + //远程调用节点 + rpcNode.getNodeField(engineNode, inputParam); + break; + case 19: + //并行节点 + parallelNode.getNodeField(engineNode, inputParam); + break; + case 20: + //聚合节点 + aggregationNode.getNodeField(engineNode, inputParam); + break; + case 21: + //冠军挑战节点 + championChallengeNode.getNodeField(engineNode, inputParam); + break; + default: + break; + } + } + + /** + * 执行节点逻辑 + * @param engineNode + * @param inputParam + * @param outMap + */ + private void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + switch (engineNode.getNodeType()) { + case 2: + //规则 + ruleSetNode.runNode(engineNode, inputParam, outMap); + break; + case 3: + //分组 + groupNode.runNode(engineNode, inputParam, outMap); + break; + case 4: + //评分卡 + scorecardNode.runNode(engineNode, inputParam, outMap); + break; + case 5: + //黑名单 + blackOrWhiteNode.runNode(engineNode, inputParam, outMap); + break; + case 6: + //白名单 + blackOrWhiteNode.runNode(engineNode, inputParam, outMap); + break; + case 7: + //沙盒比例 + sandboxProportionNode.runNode(engineNode, inputParam, outMap); + break; + case 9: + //决策选项 + decisionOptionsNode.runNode(engineNode, inputParam, outMap); + break; + case 14: + //子引擎 + childEngineNode.runNode(engineNode, inputParam, outMap); + break; + case 15: + //模型 + modelNode.runNode(engineNode, inputParam, outMap); + break; + case 16: + //决策表 + decisionTablesNode.runNode(engineNode,inputParam,outMap); + break; + case 17: + //决策树 + decisionTreeNode.runNode(engineNode,inputParam,outMap); + break; + case 18: + //远程调用节点 + rpcNode.runNode(engineNode,inputParam,outMap); + break; + case 19: + //并行节点 + parallelNode.runNode(engineNode,inputParam,outMap); + break; + case 20: + //聚合节点 + aggregationNode.runNode(engineNode,inputParam,outMap); + break; + case 21: + //冠军挑战节点 + championChallengeNode.runNode(engineNode,inputParam,outMap); + break; + default: + break; + } + } + + /** + * 把引擎节点,以序号为key放入map + * + * @param nodelist 引擎节点 + * @return map + * @see + */ + private Map getEngineNodeListByMap(List nodelist) { + Map map = new HashMap<>(); + for (int i = 0; i < nodelist.size(); i++) { + map.put(nodelist.get(i).getNodeCode(), nodelist.get(i)); + } + return map; + } + + /** + * 决策流执行完回调(包括决策流正常返回结果回调、以及异常回调) + * @param url + * @param paramJson + * @param result + */ + private void decisionCallback(String url, Map paramJson, String result){ + if(StringUtils.isBlank(url)){ + return; + } + Map paramMap = new HashMap<>(); + paramMap.put("paramJson", JSONObject.toJSONString(paramJson)); + paramMap.put("result", result); + // 设置请求头 + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + // 封装请求体 + JSONObject body = JSONObject.parseObject(JSONObject.toJSONString(paramMap)); + // 封装参数和头信息 + HttpEntity httpEntity = new HttpEntity(body, httpHeaders); + ListenableFuture> future = asyncRestTemplate.postForEntity(url, httpEntity, String.class); + if(future != null){ + future.addCallback(new ListenableFutureCallback>() { + @Override + public void onFailure(Throwable throwable) { + logger.info("引擎回调异步调用失败", throwable); + } + + @Override + public void onSuccess(ResponseEntity stringResponseEntity) { + String result = stringResponseEntity.getBody(); + logger.info("引擎回调异步调用成功,result:{}", result); + } + }); + } + } +} diff --git a/ddp-enginex/rule-engine/pom.xml b/ddp-enginex/rule-engine/pom.xml new file mode 100644 index 0000000..192a3c9 --- /dev/null +++ b/ddp-enginex/rule-engine/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-rule-engine + + + \ No newline at end of file diff --git a/ddp-enginex/runner-node/pom.xml b/ddp-enginex/runner-node/pom.xml new file mode 100644 index 0000000..dd765fe --- /dev/null +++ b/ddp-enginex/runner-node/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-enginex + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-enginex-runner-node + + + \ No newline at end of file diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CacheController.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CacheController.java new file mode 100644 index 0000000..ecae0a0 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CacheController.java @@ -0,0 +1,120 @@ +package com.fibo.ddp.enginex.runner.canal; + +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.dao.datax.datasource.SimpleMapper; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/cache") +public class CacheController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private SimpleMapper simpleMapper; + @Autowired + private RedisManager redisManager; + + @RequestMapping(value = "initCache", method = RequestMethod.GET) + public void initCache() { + logger.info("===================== 缓存初始化开始 ====================="); + long start = System.currentTimeMillis(); + // 遍历表 + for (TableEnum tableEnum : TableEnum.values()) { + String tableName = tableEnum.getTableName(); + logger.info("===================== 开始初始化缓存表[{}] =====================", tableName); + + String sqlStr = "select * from " + tableName; + Map parameterMap = new HashMap<>(); + parameterMap.put("sqlStr", sqlStr); + List> result = simpleMapper.customSelect(parameterMap); + // 遍历行 + for (LinkedHashMap map : result) { + row(tableEnum, map); + } + logger.info("===================== 结束初始化缓存表[{}],共[{}]条数据 =====================", tableName, result.size()); + } + long end = System.currentTimeMillis(); + logger.info("===================== 缓存初始化成功!!耗时:{}ms =====================", (end - start)); + } + + private void row(TableEnum tableEnum, LinkedHashMap map) { + String tableName = tableEnum.getTableName(); + String primaryKey = null; + String foreignKey = null; + + if (StringUtils.isNotBlank(tableEnum.getPrimaryId())) { + String primaryId = map.get(tableEnum.getPrimaryId()).toString(); + primaryKey = RedisUtils.getPrimaryKey(tableName, primaryId); + } + + if (StringUtils.isNotBlank(tableEnum.getForeignId())) { + Object obj = map.get(tableEnum.getForeignId()); + if (obj != null && !"".equals(obj.toString())) { + String foreignId = obj.toString(); + foreignKey = RedisUtils.getForeignKey(tableName, foreignId); + } + } + + if (StringUtils.isNotBlank(primaryKey)) { + // 遍历列 + for (String field : map.keySet()) { + String value = map.get(field) == null ? null : map.get(field).toString(); + setColumnCache(primaryKey, field, value); + } + } + + if (StringUtils.isNotBlank(foreignKey)) { + setForeignKeyCache(primaryKey, foreignKey); + } + + // 指标表特殊处理 + dealSpecialTable(tableName, map); + } + + private void setColumnCache(String primaryKey, String field, String value) { + logger.info("开始主键缓存设置, primaryKey:{}, field:{}, value:{}", primaryKey, field, value); + + redisManager.hset(primaryKey, field, value); + + logger.info("结束主键缓存设置, primaryKey:{}, field:{}, value:{}", primaryKey, field, value); + } + + private void setForeignKeyCache(String primaryKey, String foreignKey) { + logger.info("开始外键缓存设置, primaryKey:{}, foreignKey:{}", primaryKey, foreignKey); + + redisManager.sadd(foreignKey, primaryKey); + + logger.info("结束外键缓存设置, primaryKey:{}, foreignKey:{}", primaryKey, foreignKey); + } + + private void dealSpecialTable(String tableName, LinkedHashMap map) { + if(tableName.equals(TableEnum.T_FIELD.getTableName())){ + String fieldEn = "field_en:" + map.get("organ_id") + ":" + map.get("field_en"); + String fieldEnKey = RedisUtils.getPrimaryKey(tableName, fieldEn); + + String fieldCn = "field_cn:" + map.get("organ_id") + ":" + map.get("field_cn"); + String fieldCnKey = RedisUtils.getPrimaryKey(tableName, fieldCn); + + for (String field : map.keySet()) { + String value = map.get(field) == null ? null : map.get(field).toString(); + setColumnCache(fieldEnKey, field, value); + setColumnCache(fieldCnKey, field, value); + } + } + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CanalClient.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CanalClient.java new file mode 100644 index 0000000..238044a --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/canal/CanalClient.java @@ -0,0 +1,254 @@ +package com.fibo.ddp.enginex.runner.canal; + +import com.alibaba.otter.canal.client.CanalConnector; +import com.alibaba.otter.canal.client.CanalConnectors; +import com.alibaba.otter.canal.protocol.CanalEntry; +import com.alibaba.otter.canal.protocol.Message; +import com.fibo.ddp.common.dao.canal.TableEnum; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.redis.RedisUtils; +import com.fibo.ddp.common.utils.constant.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.net.InetSocketAddress; +import java.util.List; +import java.util.Optional; + +/** + * Canal数据同步 + * 实现ApplicationRunner接口,springboot启动成功后会执行run方法 + */ +@Component +public class CanalClient implements ApplicationRunner { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final static int BATCH_SIZE = 1000; + @Autowired + private RedisManager redisManager; + // canal缓存同步是否开启 + @Value("${switch.canal.cache}") + private String canalCacheSwitch; + // canal主机地址 + @Value("${canal.hostname}") + private String canalHostName; + // canal端口 + @Value("${canal.port}") + private int canalPort; + + @Override + public void run(ApplicationArguments args) throws Exception { + if(Constants.switchFlag.OFF.equals(canalCacheSwitch)){ + return; + } + + // 创建链接 + CanalConnector connector = CanalConnectors.newSingleConnector( + new InetSocketAddress(canalHostName, canalPort), + "example", "", ""); + try { + //打开连接 + connector.connect(); + //订阅数据库表,全部表 + connector.subscribe(".*\\..*"); + //回滚到未进行ack的地方,下次fetch的时候,可以从最后一个没有ack的地方开始拿 + connector.rollback(); + while (true) { + logger.info("canal数据同步监听中..."); + // 获取指定数量的数据 + Message message = connector.getWithoutAck(BATCH_SIZE); + //获取批量ID + long batchId = message.getId(); + //获取批量的数量 + int size = message.getEntries().size(); + //如果没有数据 + if (batchId == -1 || size == 0) { + try { + //线程休眠2秒 + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + //如果有数据,处理数据 + printEntry(message.getEntries()); + } + //进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。 + connector.ack(batchId); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + connector.disconnect(); + } + } + + /** + * 解析binlog获得的实体类信息 + */ + private void printEntry(List entrys) { + for (CanalEntry.Entry entry : entrys) { + if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND) { + //开启/关闭事务的实体类型,跳过 + continue; + } + + String tableName = entry.getHeader().getTableName(); + TableEnum tableEnum = TableEnum.getByTableName(tableName); + if(tableEnum == null){ + // 没有在枚举中定义的表,跳过 + continue; + } + + //RowChange对象,包含了一行数据变化的所有特征 + //比如isDdl 是否是ddl变更操作 sql 具体的ddl sql beforeColumns afterColumns 变更前后的数据字段等等 + CanalEntry.RowChange rowChage; + try { + rowChage = CanalEntry.RowChange.parseFrom(entry.getStoreValue()); + } catch (Exception e) { + throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e); + } + + //获取操作类型:insert/update/delete类型 + CanalEntry.EventType eventType = rowChage.getEventType(); + //打印Header信息 + logger.info(String.format("============= binlog[%s:%s] , name[%s,%s] , eventType : %s =============", + entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(), + entry.getHeader().getSchemaName(), entry.getHeader().getTableName(), + eventType)); + + //判断是否是DDL语句 + if (rowChage.getIsDdl()) { + logger.info("============= isDdl: true,sql:" + rowChage.getSql()); + } + + //获取RowChange对象里的每一行数据 + for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) { + //如果是删除语句 + if (eventType == CanalEntry.EventType.DELETE) { + row(rowData.getBeforeColumnsList(), tableName); + //如果是新增语句 + } else if (eventType == CanalEntry.EventType.INSERT) { + row(rowData.getAfterColumnsList(), tableName); + //如果是更新的语句 + } else { + //变更前的数据 +// printColumn(rowData.getBeforeColumnsList(), tableName); + //变更后的数据 + row(rowData.getAfterColumnsList(), tableName); + } + } + } + } + + private void row(List columns, String tableName) { + Optional keyColumn = columns.stream().filter(item -> item.getIsKey()).findFirst(); + if(keyColumn.isPresent()){ + // 获取主键id + String id = keyColumn.get().getValue(); + // 拼接主键key + String key = RedisUtils.getPrimaryKey(tableName, id); + // 拼接外键key + String foreignKey = null; + // 子表的redis key需要拼接上主表的id + TableEnum tableEnum = TableEnum.getByTableName(tableName); + if(tableEnum != null){ + Optional foreignKeyColumn = columns.stream().filter(item -> item.getName().equals(tableEnum.getForeignId())).findFirst(); + if(foreignKeyColumn.isPresent()){ + String foreignKeyValue = foreignKeyColumn.get().getValue(); + foreignKey = RedisUtils.getForeignKey(tableName, foreignKeyValue); + } + } + + for (CanalEntry.Column column : columns) { + // 更新发生改变的字段缓存 + setUpdatedColumnCache(column, key, foreignKey); + } + + // 指标表特殊处理 + dealSpecialTable(columns, tableName); + } + } + + private void setUpdatedColumnCache(CanalEntry.Column column, String key, String foreignKey){ + if(column.getUpdated()) { + logger.info("开始主键缓存更新, {}, {}, {}", key, column.getName(), column.getValue()); + + redisManager.hset(key, column.getName(), column.getValue()); + + logger.info("结束主键缓存更新, {}, {}, {}", key, column.getName(), column.getValue()); + + if(foreignKey != null){ + logger.info("开始外键缓存更新, {}, {}", key, foreignKey); + + redisManager.sadd(foreignKey, key); + + logger.info("结束外键缓存更新, {}, {}", key, foreignKey); + } + } + } + + private void setAllColumnCache(CanalEntry.Column column, String key){ + logger.info("开始主键缓存更新, {}, {}, {}", key, column.getName(), column.getValue()); + + redisManager.hset(key, column.getName(), column.getValue()); + + logger.info("结束主键缓存更新, {}, {}, {}", key, column.getName(), column.getValue()); + } + + private void dealSpecialTable(List columns, String tableName){ + if(tableName.equals(TableEnum.T_FIELD.getTableName())){ + String organ_id = null; + String field_en = null; + String field_cn = null; + for (CanalEntry.Column column : columns) { + String name = column.getName(); + switch (name) { + case "organ_id": + organ_id = column.getValue(); + break; + case "field_en": + field_en = column.getValue(); + break; + case "field_cn": + field_cn = column.getValue(); + break; + default: + break; + } + } + + String fieldEn = "field_en:" + organ_id + ":" + field_en; + String fieldEnKey = RedisUtils.getPrimaryKey(tableName, fieldEn); + + String fieldCn = "field_cn:" + organ_id + ":" + field_cn; + String fieldCnKey = RedisUtils.getPrimaryKey(tableName, fieldCn); + + // 如果field_en或field_cn发生变化,则对应的key为新生成的,需要保存所有字段缓存 + Optional fieldEnOptional = columns.stream().filter(item -> item.getName().equals("field_en") && item.getUpdated()).findFirst(); + Optional fieldCnOptional = columns.stream().filter(item -> item.getName().equals("field_cn") && item.getUpdated()).findFirst(); + for (CanalEntry.Column column : columns) { + if(fieldEnOptional.isPresent()){ + // 更新所有字段缓存 + setAllColumnCache(column, fieldEnKey); + } else { + // 更新发生改变的字段缓存 + setUpdatedColumnCache(column, fieldEnKey, null); + } + + if(fieldCnOptional.isPresent()){ + setAllColumnCache(column, fieldCnKey); + } else { + setUpdatedColumnCache(column, fieldCnKey, null); + } + } + } + } + +} \ No newline at end of file diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionFactory.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionFactory.java new file mode 100644 index 0000000..55e8f39 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionFactory.java @@ -0,0 +1,60 @@ +package com.fibo.ddp.enginex.runner.ksession; + +import com.fibo.ddp.common.service.redis.RedisManager; +import org.apache.commons.pool2.BaseKeyedPooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.drools.KnowledgeBase; +import org.drools.KnowledgeBaseFactory; +import org.drools.builder.*; +import org.drools.io.ResourceFactory; +import org.drools.runtime.StatefulKnowledgeSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * kSession工厂类 + */ +@Component +public class KSessionFactory extends BaseKeyedPooledObjectFactory { + + @Autowired + private RedisManager redisManager; + + @Override + public StatefulKnowledgeSession create(String key) throws Exception { + StatefulKnowledgeSession kSession = null; + try { + String ruleString = redisManager.get(key); + if(ruleString == null){ + throw new Exception("create kSession fail, key is "+ key + ", ruleString is null!"); + } + + long start = System.currentTimeMillis(); + KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder(); + kb.add(ResourceFactory.newByteArrayResource(ruleString.getBytes("utf-8")), ResourceType.DRL); + KnowledgeBuilderErrors errors = kb.getErrors(); + for (KnowledgeBuilderError error : errors) { + System.out.println(error); + } + KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); + kBase.addKnowledgePackages(kb.getKnowledgePackages()); + kSession = kBase.newStatefulKnowledgeSession(); + long end = System.currentTimeMillis(); + System.out.println("------------------drools kSession创建耗时:" + (end - start) + " ----------------------"); + } catch (Exception e) { + throw e; + } + + return kSession; + } + + @Override + public PooledObject wrap(StatefulKnowledgeSession kSession) { + return new DefaultPooledObject(kSession); + } + + public void setRedisManager(RedisManager redisManager) { + this.redisManager = redisManager; + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionPool.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionPool.java new file mode 100644 index 0000000..dead94c --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/ksession/KSessionPool.java @@ -0,0 +1,67 @@ +package com.fibo.ddp.enginex.runner.ksession; + +import org.apache.commons.pool2.impl.GenericKeyedObjectPool; +import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; +import org.drools.runtime.StatefulKnowledgeSession; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * kSession连接池 + */ +@Component +public class KSessionPool implements InitializingBean { + + private GenericKeyedObjectPool pool; + + @Autowired + private KSessionFactory kSessionFactory; + + /** + * 初始化方法 + * @throws Exception + */ + @Override + public void afterPropertiesSet() throws Exception { + initPool(); + } + + /** + * 初始化连接池 + * @return + * @throws Exception + */ + public void initPool() throws Exception { + GenericKeyedObjectPoolConfig poolConfig = new GenericKeyedObjectPoolConfig(); + poolConfig.setMaxTotalPerKey(200); + poolConfig.setMaxIdlePerKey(50); + poolConfig.setMinIdlePerKey(5); + poolConfig.setMaxTotal(2000); + this.pool = new GenericKeyedObjectPool(kSessionFactory, poolConfig); + } + + /** + * 获取一个连接对象 + * @return + * @throws Exception + */ + public StatefulKnowledgeSession borrowObject(String key) throws Exception { + return pool.borrowObject(key); + } + + /** + * 归还一个连接对象 + * @param ftpClient + */ + public void returnObject(String key, StatefulKnowledgeSession kSession) { + if(kSession != null){ + pool.returnObject(key, kSession); + } + } + + public void setkSessionFactory(KSessionFactory kSessionFactory) { + this.kSessionFactory = kSessionFactory; + } + +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/EngineRunnerNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/EngineRunnerNode.java new file mode 100644 index 0000000..49ff861 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/EngineRunnerNode.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.enginex.runner.node; + +import com.fibo.ddp.common.model.enginex.risk.EngineNode; + +import java.util.Map; + +/** + * 引擎节点执行 + */ +public interface EngineRunnerNode { + + /** + * 获取节点所需的指标 + * @param engineNode + * @param inputParam + */ + void getNodeField(EngineNode engineNode, Map inputParam); + + /** + * 执行节点逻辑 + * @param engineNode + * @param inputParam + * @param outMap + */ + void runNode(EngineNode engineNode, Map inputParam, Map outMap); +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/AggregationNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/AggregationNode.java new file mode 100644 index 0000000..2a1a434 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/AggregationNode.java @@ -0,0 +1,36 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 聚合节点 + */ +@Service +public class AggregationNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + logger.info("start【执行聚合节点】AggregationNode.runNode engineNode:{},inputParam:{},outMap:{}" + , JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam), JSONObject.toJSONString(outMap)); + + // 直接返回下一个节点 + outMap.put("nextNode", engineNode.getNextNodes()); + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + } + +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/BlackOrWhiteNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/BlackOrWhiteNode.java new file mode 100644 index 0000000..50ff76b --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/BlackOrWhiteNode.java @@ -0,0 +1,286 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.dao.datax.datamanage.CustListMapper; +import com.fibo.ddp.common.dao.datax.datamanage.FieldMapper; +import com.fibo.ddp.common.dao.strategyx.listlibrary.TblColumnMapper; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.TblColumn; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.runner.SessionData; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbService; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class BlackOrWhiteNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + @Autowired + private TblColumnMapper tblColumnMapper; + @Resource + private ListDbService listDbService; + @Resource + public FieldMapper fieldMapper; + @Resource + public CustListMapper custListMapper; + @Resource + private StrategyOutputService outputService; + + private List getExecuteVersionIdList(EngineNode engineNode) { + return ExecuteUtils.getExecuteIdList(engineNode, "listDbId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + List list = getExecuteVersionIdList(engineNode); + List fieldIds = new ArrayList<>(); + for (Long l : list) { + fieldIds.addAll(listDbService.getNodeFieldIds(l)); + } + commonService.getFieldByIds(fieldIds, inputParam); + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控中心-节点信息快照记录 + if(engineNode!=null && engineNode.getNodeJson()!=null){ + outMap.put("nodeSnapshot",engineNode.getNodeJson()); + } + inputParam.put("nodeId", engineNode.getNodeId()); + inputParam.put("nodeName", engineNode.getNodeName()); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + //新代码 + String hitKey = "" + engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_size"; + List list = getExecuteVersionIdList(engineNode); + List hitListDb = new ArrayList<>(); + //创建内部多选的名单库结果数组 + JSONArray resultJsonArray = new JSONArray(); + JSONArray strategySnapshot = new JSONArray(); + for (Long id : list) { + ListDb listDb = listDbService.queryById(id); + //监控中心 == 策略层面快照信息 + if (listDb != null && listDb.getSnapshot() != null) { + strategySnapshot.add(listDb.getSnapshot()); + } + boolean isfalg = this.executeListDb(listDb, inputParam, outMap,resultJsonArray); + if (isfalg) { + hitListDb.add(listDb); + } + } + //监控中心==》策略层面快照信息记录 + outMap.put("strategySnapshot",strategySnapshot); + //构造节点信息 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("resultList", resultJsonArray); + + //判断是否出现过同类型的,如果出现过则获取并且增加内容,如果没有则需要构建名单库类型的节点信息 + if (outMap.containsKey("blackJson")) { + //如果出现过黑名单则从黑名单接送中获取 + JSONObject blackJson = (JSONObject) outMap.get("blackJson"); + JSONArray resultJson = blackJson.getJSONArray("resultJson"); + resultJson.add(jsonObject); + } else { + JSONObject nodeResult = new JSONObject(); + nodeResult.put("resultType", 5); + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + nodeResult.put("resultJson",resultJson); + outMap.put("blackJson", nodeResult); + } + +// nodeResult.put("resultJson", resultJsonArray); +// outMap.put("blackJson", nodeResult); +// outMap.put("nodeResult", nodeResult); + inputParam.put(hitKey, hitListDb.size()); + //处理终止条件判断中选择的名单库 + long count = handlerResultCount(engineNode, hitListDb); + this.terminalCondition(engineNode, inputParam, outMap, count); + } + + private boolean executeListDb(ListDb listDb, Map inputParam, Map outMap,JSONArray resultJsonArray) { + SessionData sessionData = RunnerSessionManager.getSession(); + Long organId = sessionData.getOrganId(); + JSONObject resultJson = new JSONObject(); + Integer matchs = 0; + Integer revMatchs = 0; //模糊查询时反向匹配 +// JSONArray strategySnopshot = new JSONArray(); + Long listDbId = listDb.getId(); +// if (listDb.getSnapshot() != null) { +// +// strategySnopshot.add(listDb.getSnapshot()); +// } + inputParam.put("listDb", listDb); + + ListDb version = listDb; + String queryKeyArray[] = listDb.getQueryField().split(","); + if (queryKeyArray.length > 0) { + Integer queryType = version.getQueryType();//and(1),or(0) + Integer matchType = version.getMatchType();//精确匹配(1),模糊匹配(0) + String queryKey = ""; // t1 like '%t1%' + String revQueryKey = ""; // 反向模糊匹配 instr('高档洗浴消费',t1) t1行业字段 eg.'洗浴' + String tableName = "organ" + "_" + organId + "_" + listDb.getListType() + "_" + listDbId; + inputParam.put("tableName", tableName); + inputParam.put("schemaName", getDbName()); + + //获取名单库的匿名字段与注释的关系 + List columnList = tblColumnMapper.getColumnList(inputParam); + + //字段id转匿名字段名,准备待查字段条件 + Integer loc = 0; + List tableColumn = Arrays.asList(version.getTableColumn().split(",")); + int k = 0; + for (int j = 0; j < queryKeyArray.length; j++) { + k = tableColumn.indexOf(queryKeyArray[j]); + if (k < 0) { + continue; + } + Field field = fieldMapper.selectById(queryKeyArray[j]); + String fieldEn = field.getFieldEn(); //age + String columnKey = "t" + k; + for (TblColumn tblColumn : columnList) { + String colName = tblColumn.getColName(); //t5 + String paramValue = inputParam.get(fieldEn).toString(); + if (columnKey.equals(colName)) { + if (paramValue == null || paramValue.equals("")) { + continue ; //数据项缺失导致无法命中,默认返回没命中 + } else { + loc += 1; + if (matchType == 1) { + if (loc > 1 && queryType == 1) { + queryKey += " and "; + } else if (loc > 1 && queryType == 0) { + queryKey += " or "; + } + queryKey += colName + " = '" + paramValue + "'"; + } else if (matchType == 0) { //模糊匹配 + if (loc > 1 && queryType == 1) { + queryKey += " and "; + } else if (loc > 1 && queryType == 0) { + queryKey += " or "; + revQueryKey += " + "; + } + //正向模糊搜索 + queryKey += colName + " like " + "'%" + paramValue + "%'"; // t5 like '%36岁%' + //反向模糊搜索 + revQueryKey += "max(instr('" + paramValue + "'," + colName + "))"; + } + } + } + } + } + inputParam.put("queryKey", queryKey); + inputParam.put("revQueryKey", revQueryKey); + } + matchs += custListMapper.findByQueryKey(inputParam); + if (!"".equals(inputParam.get("revQueryKey"))) { + revMatchs = custListMapper.revFindByQueryKey(inputParam); + } + if (revMatchs == null){ + revMatchs = 0; + } + inputParam.put(listDb.getResultFieldEn(), "未命中"); + List fieldList = new ArrayList<>(); + + JSONObject hitResult = new JSONObject(); + hitResult.put(listDb.getResultFieldEn(), "未命中"); + +// resultJson.put("nodeId", inputParam.get("nodeId").toString()); +// resultJson.put("nodeName", inputParam.get("nodeName").toString()); + resultJson.put("listDbId", listDb.getId()); + resultJson.put("listDbName", listDb.getListName()); + resultJson.put("listDbType", listDb.getListType()); + if (null != listDb.getListDesc()) { + resultJson.put("desc", listDb.getListDesc()); + } + resultJson.put("fieldList", fieldList); + resultJsonArray.add(resultJson); + if (matchs + revMatchs > 0) { + inputParam.put(listDb.getResultFieldEn(), "命中"); + hitResult.put(listDb.getResultFieldEn(), "命中"); + List jsonObjects = outputService.setOutput(new StrategyOutput(Long.valueOf(listDbId.toString()), StrategyType.LIST_DB), inputParam); + fieldList.add(hitResult); + fieldList.addAll(jsonObjects); +// outMap.put("black", listDb); + return true; + } else { + fieldList.add(hitResult); + } + + //监控中心==》策略层面记录策略的快照信息 +// JSONObject strategyObject = new JSONObject(); +// strategyObject.put("strategySnopshot", strategySnopshot); +// outMap.put("strategySnopshot", strategyObject); + return false; + } + + /** + * 根据传入数据监测是否命中黑名单 + * + * @param paramMap + * @return + * @see + */ + public boolean findByQueryKey(Map paramMap, Map outmap, Integer type, EngineNode engineNode) { + + + return false; + } + + + private String getDbName() { + return "riskmanage"; + } + + private long handlerResultCount(EngineNode engineNode,List hitListDb){ + JSONObject jsonObject = JSON.parseObject(engineNode.getNodeJson()); + JSONArray selectedRule = jsonObject.getJSONObject("terminationInfo").getJSONArray("selectedRule"); + List selectedListDbIds = new ArrayList<>(); + if (selectedRule!=null&&selectedRule.size()>0){ + for (Object o : selectedRule) { + if (o==null){ + continue; + } + Long id = JSON.parseObject(JSON.toJSONString(o)).getLong("id"); + if (id==null){ + continue; + } + selectedListDbIds.add(id); + } + } + long count = hitListDb.stream().filter(item -> selectedListDbIds.contains(item.getId())).count(); + return count; + } + + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap, Object executeResult) { + String sizeKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_size"; + Map map = new HashMap<>(); + map.put(sizeKey, executeResult); + ExecuteUtils.terminalCondition(engineNode, inputParam, outMap, map); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChampionChallengeNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChampionChallengeNode.java new file mode 100644 index 0000000..911264d --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChampionChallengeNode.java @@ -0,0 +1,44 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 冠军挑战节点 + */ +@Service +public class ChampionChallengeNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + logger.info("start【执行冠军挑战节点】ChampionChallengeNode.runNode engineNode:{},inputParam:{},outMap:{}" + , JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam), JSONObject.toJSONString(outMap)); + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + JSONArray jsonArray = JSONArray.parseArray(engineNode.getNodeJson()); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + int champion = jsonObject.getIntValue("champion"); + // 返回冠军分支对应的下一个节点 + if(champion == 1){ + outMap.put("nextNode", jsonObject.getString("nextNode")); + break; + } + } + } + +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChildEngineNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChildEngineNode.java new file mode 100644 index 0000000..1abaf5c --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ChildEngineNode.java @@ -0,0 +1,82 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.Engine; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.runner.SessionData; +import com.fibo.ddp.common.service.enginex.risk.EngineService; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class ChildEngineNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + +// @Autowired +// private EngineApiService engineApiService; + @Autowired + public EngineService engineService; + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + SessionData sessionData = RunnerSessionManager.getSession(); + Long organId = sessionData.getOrganId(); + Integer reqType = sessionData.getReqType(); + Long childEngineId = Long.valueOf(engineNode.getNodeJson()); + Map map = new HashMap<>(); + + map.put("fields",inputParam); + map.put("engineId", childEngineId); + map.put("organId",organId); + map.put("reqType",reqType); +// String result = engineApiService.engineApi(map); + String result = null; + String engineResult = ""; + JSONObject jsonObject = JSONObject.parseObject(result); + if (jsonObject.getString("status").equals("0x0000")&&jsonObject.getString("result")!=null) { + engineResult = jsonObject.getString("result"); + } else { + logger.error("子引擎执行失败, childEngineId:{},result:{}", childEngineId, result); + } + + Engine engineVo = engineService.getEngineById(childEngineId); + //监控中心--节点信息记录(不需要监控策略层面的监控) + outMap.put("nodeSnapshot",engineVo); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode",engineNode); + nodeInfo.put("nodeId",engineNode.getNodeId()); + nodeInfo.put("nodeName",engineNode.getNodeName()); + nodeInfo.put("nodeType",engineNode.getNodeType()); + outMap.put("nodeInfo",nodeInfo); + + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("engineId", engineVo.getId()); + jsonObject.put("engineName", engineVo.getName()); + //监控中心====》输出结果写入Hbase + outMap.put("nodeResult",jsonObject); + if (outMap.containsKey("childEngineJson")) { + JSONArray resultJson = (JSONArray) outMap.get("childEngineJson"); + resultJson.add(jsonObject); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("childEngineJson", resultJson); + } + String key = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + engineNode.getNodeJson() + "_result"; + inputParam.put(key, engineResult); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionOptionsNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionOptionsNode.java new file mode 100644 index 0000000..2f58fca --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionOptionsNode.java @@ -0,0 +1,144 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.utils.util.runner.JevalUtil; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 决策选项节点 + */ +@Service +public class DecisionOptionsNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + logger.info("start【获取决策选项节点指标】DecisionOptionsNode.getNodeField engineNode:{},inputParam:{}", JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam)); + JSONObject jsonObject = JSONObject.parseObject(engineNode.getNodeScript()); + JSONArray array = jsonObject.getJSONArray("input"); + List ids = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + JSONObject input = array.getJSONObject(i); + Object fieldId = input.get("field_id"); + if(fieldId != null && !"".equals(fieldId.toString())){ + ids.add(Long.valueOf(fieldId.toString())); + } + } + commonService.getFieldByIds(ids, inputParam); + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控信息--节点信息记录(不需要策略层面的监控) + outMap.put("nodeSnapshot",JSON.parseObject(engineNode.getNodeJson())); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode",engineNode); + nodeInfo.put("nodeId",engineNode.getNodeId()); + nodeInfo.put("nodeName",engineNode.getNodeName()); + nodeInfo.put("nodeType",engineNode.getNodeType()); + outMap.put("nodeInfo",nodeInfo); + JSONObject jsonObject = JSONObject.parseObject(engineNode.getNodeScript()); + JSONArray inputArray = jsonObject.getJSONArray("input"); + List inputList = JSONObject.parseArray(JSONObject.toJSONString(jsonObject.getJSONArray("input")), JSONObject.class); + JSONArray conditionArray = jsonObject.getJSONArray("conditions"); + JSONObject outputJson = jsonObject.getJSONObject("output"); + + // 变量值转义 + Map variablesMap = new HashMap<>(); + for (int i = 0; i < inputArray.size(); i++) { + String input = inputArray.get(i).toString(); + JSONObject inputField = JSONObject.parseObject(input); + String field_code = inputField.getString("field_code"); + Map fieldsMap = new HashMap<>(); + fieldsMap.put(field_code, inputField.getInteger("valueType")); + variablesMap.put(field_code, inputParam.get(field_code)); + variablesMap = JevalUtil.convertVariables(fieldsMap, variablesMap); + } + + // 默认值处理 + String dicisionResult =""; + String defaultValue = outputJson.getString("defaultValue"); + if (StringUtils.isNotBlank(defaultValue)){ + dicisionResult = defaultValue; + } + // 决策条件判断 + if(conditionArray != null && conditionArray.size() > 0){ + for (int i = 0; i < conditionArray.size(); i++) { + JSONObject formulaJson = JSONObject.parseObject(conditionArray.getString(i)); + try { + boolean outfieldvalue = JevalUtil.evaluateBoolean(formulaJson.getString("formula"), variablesMap); + if (outfieldvalue) { + dicisionResult = formulaJson.getString("result"); + // 输出结果计算 + String result = formulaJson.getString("result"); + if(result.contains("{") && result.contains("}")){ + String expression = result; + Pattern pattern = Pattern.compile("\\{[a-zA-Z0-9_\u4e00-\u9fa5()()-]+\\}"); + Matcher matcher = pattern.matcher(expression); + while (matcher.find()) { + String asName = matcher.group(0).replace("{", "").replace("}", ""); + Optional inputObj = inputList.stream().filter(item -> asName.equals(item.getString("asName"))).findFirst(); + if(inputObj.isPresent()){ + String field_code = inputObj.get().getString("field_code"); + expression = expression.replaceAll(asName, field_code); + } + } + expression = expression.replaceAll("\\{", "#{"); + Double calResult = JevalUtil.evaluateNumric(expression, variablesMap); + dicisionResult = calResult.toString(); + } + + break; + } + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + } + } + + Map outFields = new HashMap<>(); + String outputFieldCode = outputJson.getString("field_code"); + outFields.put("fieldId", outputJson.getIntValue("field_id")); + outFields.put("fieldName", outputJson.getString("field_name")); + outFields.put("fieldCode", outputFieldCode); + outFields.put("outValue", dicisionResult); + outMap.put("result", dicisionResult); + String key = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_result"; + inputParam.put(key, dicisionResult); + inputParam.put(outputFieldCode, dicisionResult); + + JSONObject json = new JSONObject(); + json.put("nodeId", engineNode.getNodeId()); + json.put("nodeName", engineNode.getNodeName()); + json.put("outFields", JSONObject.parseObject(JSON.toJSONString(outFields))); + //监控中心===》hbase中写入结果信息 + outMap.put("nodeResult",json); + if (outMap.containsKey("decisionJson")) { + JSONArray resultJson = (JSONArray) outMap.get("decisionJson"); + resultJson.add(json); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(json); + outMap.put("decisionJson", resultJson); + } + } + +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTablesNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTablesNode.java new file mode 100644 index 0000000..20eb0dc --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTablesNode.java @@ -0,0 +1,385 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.risk.InputParam; +import com.fibo.ddp.common.model.enginex.risk.Result; +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.DecisionTablesDetailCondition; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesDetailVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesResultVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesDetailService; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.service.strategyx.decisiontable.impl.DecisionTablesServiceImpl; +import com.fibo.ddp.common.utils.common.MD5; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.enginex.runner.ksession.KSessionPool; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.drools.runtime.StatefulKnowledgeSession; +import org.drools.runtime.rule.FactHandle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +@Service +public class DecisionTablesNode implements EngineRunnerNode { + private static final Logger logger = LoggerFactory.getLogger(DecisionTablesServiceImpl.class); + + @Resource + private RedisManager redisManager; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private KSessionPool kSessionPool; + @Resource + private DecisionTablesService decisionTablesService; + @Autowired + private DecisionTablesDetailService detailService; + @Autowired + private CommonService commonService; + + private List getExecuteVersionIdList(EngineNode engineNode) { + return ExecuteUtils.getExecuteIdList(engineNode, "versionId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + try { + List versionIdList = getExecuteVersionIdList(engineNode); + //获取决策表节点的字段id + List ids = new ArrayList<>(); + for (Long versionId : versionIdList) { + ids.addAll(detailService.queryFieldIdByDecisionTablesVersionId(versionId)); + } + commonService.getFieldByIds(ids, inputParam); + } catch (Exception e) { + logger.error("【DecisionTablesNode】,getNodeField:获取决策表指标异常"); + } + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控中心-节点信息快照记录 + if (engineNode != null && engineNode.getNodeJson() != null) { + outMap.put("nodeSnapshot", engineNode.getNodeJson()); + } + List versionIdList = getExecuteVersionIdList(engineNode); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + JSONArray strategySnapshot = new JSONArray(); + for (Long versionId : versionIdList) { + //获取决策表decisionTablesVo + DecisionTablesVo decisionTablesVo = decisionTablesService.queryByVersionId(versionId); + //监控中心==策略层面快照信息记录 + if (decisionTablesVo.getExecuteVersion().getSnapshot() != null) { + strategySnapshot.add(decisionTablesVo.getExecuteVersion().getSnapshot()); + } + DecisionTablesVersionVo version = decisionTablesVo.getExecuteVersion(); + //获取存放决策表执行结果的变量 + String resultFieldEn = version.getResultFieldEn(); + //执行决策表 + Object executeResult = this.executeDecisionTables(version, inputParam); + //处理结果 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("decisionTablesId", decisionTablesVo.getId()); + jsonObject.put("decisionTablesName", decisionTablesVo.getName()); + jsonObject.put("desc", version.getDescription()); + jsonObject.put("versionId", version.getId()); + jsonObject.put("versionCode", version.getVersionCode()); + if (executeResult != null) { + jsonObject.put("result", executeResult); + JSONObject resultField = new JSONObject(); + resultField.put(resultFieldEn, executeResult); + //将执行结果按照固定格式存入参数map以供后续节点使用. +// inputParam.put("decisionTable_"+decisionTablesId+"_"+engineNode.getNodeId(),executeResult); + inputParam.put(resultFieldEn, executeResult); + List fieldList = new ArrayList<>(); + fieldList.add(resultField); + //处理自定义输出 + List jsonObjects = decisionTablesService.setOutput(versionId, inputParam); + fieldList.addAll(jsonObjects); + jsonObject.put("fieldList", fieldList); + } else { + jsonObject.put("result", ""); +// inputParam.put("decisionTable_"+decisionTablesId+"_"+engineNode.getNodeId(),""); + inputParam.put(resultFieldEn, ""); + } + //将执行结果存入最终返回值 + if (outMap.containsKey("decisionTablesJson")) { + JSONArray resultJson = (JSONArray) outMap.get("decisionTablesJson"); + resultJson.add(jsonObject); + //监控中心==》将执行结果写入Hbase + JSONObject nodeResult = new JSONObject(); + nodeResult.put("result", resultJson); + outMap.put("nodeResult", nodeResult); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("decisionTablesJson", resultJson); + //监控中心==》将执行结果写入Hbase + JSONObject nodeResult = new JSONObject(); + nodeResult.put("result", resultJson); + outMap.put("nodeResult", nodeResult); + } + terminalCondition(engineNode, inputParam, outMap, executeResult); + } + //监控中心==》策略层面快照信息记录 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("snapshot", strategySnapshot); + outMap.put("decisionTableStrategy", jsonObject); + } + + //执行整个决策表返回决策结果数据 + public Object executeDecisionTables(DecisionTablesVersionVo versionVo, Map inputParam) { + Future top = null; + Future left = null; + //取出行列索引 + Integer row = -1; + Integer column = -1; + List leftDetailVo = versionVo.getLeftDetailVo(); + if (CollectionUtils.isEmpty(leftDetailVo) + || (leftDetailVo.size() == 1 + && StringUtils.isBlank(leftDetailVo.get(0).getFieldEn()) + && CollectionUtils.isEmpty(leftDetailVo.get(0).getChildren()))) { + row = 0; + } else { + //左侧执行 + left = threadPoolTaskExecutor.submit(new Callable() { + @Override + public Integer call() { + return executeDecisionTablesDetail(versionVo.getLeftDetailVo(), inputParam); + } + }); + } + //右侧执行 + List topDetailVo = versionVo.getTopDetailVo(); + if (CollectionUtils.isEmpty(topDetailVo) + || (topDetailVo.size() == 1 + && StringUtils.isBlank(topDetailVo.get(0).getFieldEn()) + && CollectionUtils.isEmpty(topDetailVo.get(0).getChildren()))) { + column = 0; + } else { + top = threadPoolTaskExecutor.submit(new Callable() { + @Override + public Integer call() { + return executeDecisionTablesDetail(versionVo.getTopDetailVo(), inputParam); + } + }); + } + try { + if (row == -1) { + row = left.get(); + } + if (column == -1) { + column = top.get(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + //行列值均取到的进行处理 + if (row >= 0 && column >= 0) { + //根据行列去结果集中找结果返回 + DecisionTablesResultVo resultSet = versionVo.getResultSet(); + if (row < resultSet.getRows() && column < resultSet.getColumns()) { + String resultValue = resultSet.getResultValue(); + JSONArray array = JSON.parseArray(resultValue); + JSONArray rowArray = JSON.parseArray(JSON.toJSONString(array.get(row))); + return rowArray.get(column); + } + } + return null; + } + + //执行决策表的条件获取 + public Integer executeDecisionTablesDetail(List decisionTablesDetailList, Map paramMap) { + + for (DecisionTablesDetailVo decisionTablesDetailVo : decisionTablesDetailList) { + //调用drools执行 +// int result = recursionExecuteDecisionTablesDetail(decisionTablesDetailVo, paramMap); + //调用不使用drools执行 + int result = executeDecisionTablesDetail(decisionTablesDetailVo, paramMap); + if (result >= 0) { + return result; + } + } + return -1; + } + + //执行决策表详情得出位置坐标:drools执行 + public int recursionExecuteDecisionTablesDetail(DecisionTablesDetailVo decisionTablesDetailVo, Map paramMap) { + StatefulKnowledgeSession kSession = null; + String keyMd5 = null; + try { + //解析content + String ruleString = decisionTablesDetailVo.getContent().replace("\\r\\n", "\r\n"); + ruleString = ruleString.replace("\\t", "\t"); + keyMd5 = CommonConst.DROOLS_KSESSION_KEY_PREFIX + MD5.GetMD5Code(ruleString); + redisManager.set(keyMd5, ruleString, 120); + + //drools执行 + kSession = kSessionPool.borrowObject(keyMd5); + List resultList = new ArrayList<>(); + InputParam inputParam = new InputParam(); + inputParam.setInputParam(paramMap); + inputParam.setResult(resultList); + FactHandle fact = kSession.insert(inputParam); + kSession.fireAllRules(); + kSession.retract(fact); + //获取执行结果对结果进行分析。 + List results = inputParam.getResult(); + Map resultMap = new HashMap<>(); + if (results != null && results.size() > 0 && results.get(0) != null && results.get(0).getMap() != null) { + resultMap = inputParam.getResult().get(0).getMap(); + } + + //本节点命中后处理 + if (resultMap.containsKey("result")) { + Integer type = decisionTablesDetailVo.getType(); + List children = decisionTablesDetailVo.getChildren(); + if (type != null) { + switch (type) { + //普通节点符合,让子节点继续执行。 + case 1: + if (children != null && children.size() > 0) { + for (DecisionTablesDetailVo child : children) { + int result = this.recursionExecuteDecisionTablesDetail(child, paramMap); + if (result >= 0) { + return result; + } + } + } + break; + //叶子节点符合,返回叶子节点的值。 + case 2: + return decisionTablesDetailVo.getIndexValue(); + default: + break; + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + logger.error("请求异常", e); + } finally { + if (keyMd5 != null && kSession != null) { + kSessionPool.returnObject(keyMd5, kSession); + } + } + //执行至此则不命中。 + return -1; + } + + //不使用drools的执行 + private int executeDecisionTablesDetail(DecisionTablesDetailVo decisionTablesDetailVo, Map paramMap) { + //获取需要执行的条件列表 + List conditionList = decisionTablesDetailVo.getConditionList(); + String fieldEn = decisionTablesDetailVo.getFieldEn(); + String logical = decisionTablesDetailVo.getLogical(); + boolean result = false; + //根据不通关系进行处理 + switch (logical) { + case "||": + result = false; + for (DecisionTablesDetailCondition condition : conditionList) { + ExpressionParam expressionParam = new ExpressionParam(); + BeanUtils.copyProperties(condition, expressionParam); + expressionParam.setFieldEn(fieldEn); + try { + boolean expressionResult = ExecuteUtils.getExpressionResult(expressionParam, paramMap); + if (expressionResult) { + result = true; + break; + } + }catch (Throwable e){ + logger.error("【DecisionTablesNode】,runNode执行异常:expressionParam{}",expressionParam); + result = false; + break; + } + } + break; + case "&&": + result = true; + for (DecisionTablesDetailCondition condition : conditionList) { + ExpressionParam expressionParam = new ExpressionParam(); + BeanUtils.copyProperties(condition, expressionParam); + expressionParam.setFieldEn(fieldEn); + try { + boolean expressionResult = ExecuteUtils.getExpressionResult(expressionParam, paramMap); + if (!expressionResult) { + result = false; + break; + } + }catch (Throwable e){ + logger.error("【DecisionTablesNode】,runNode执行异常:expressionParam{}",expressionParam); + result = false; + break; + } + } + break; + } + //如果本节点符合则执行后续节点 + if (result) { + Integer type = decisionTablesDetailVo.getType(); + List children = decisionTablesDetailVo.getChildren(); + if (type != null) { + switch (type) { + //普通节点符合,让子节点继续执行。 + case 1: + if (children != null && children.size() > 0) { + for (DecisionTablesDetailVo child : children) { + int executeResult = this.executeDecisionTablesDetail(child, paramMap); + if (executeResult >= 0) { + return executeResult; + } + } + } + break; + //叶子节点符合,返回叶子节点的值。 + case 2: + return decisionTablesDetailVo.getIndexValue(); + default: + break; + } + } + } + return -1; + } + + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap, Object executeResult) { + String resultKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_result"; + Map map = new HashMap<>(); + map.put(resultKey, executeResult); + ExecuteUtils.terminalCondition(engineNode, inputParam, outMap, map); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTreeNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTreeNode.java new file mode 100644 index 0000000..a38d908 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/DecisionTreeNode.java @@ -0,0 +1,215 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetail; +import com.fibo.ddp.common.model.strategyx.decisiontree.DecisionTreeDetailCondition; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVo; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeService; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class DecisionTreeNode implements EngineRunnerNode { + @Autowired + private DecisionTreeService decisionTreeService; + @Autowired + private CommonService commonService; + + private List getExecuteVersionIdList(EngineNode engineNode){ + return ExecuteUtils.getExecuteIdList(engineNode,"versionId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + List list = getExecuteVersionIdList(engineNode); + List fieldIds = new ArrayList<>(); + for (Long l : list) { + fieldIds.addAll(decisionTreeService.getNodeFieldIds(l)); + } + commonService.getFieldByIds(fieldIds,inputParam); + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控中心--记录节点快照信息 + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + List list = getExecuteVersionIdList(engineNode); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + JSONArray strategySnapshot = new JSONArray(); + for (Long versionId : list) { + DecisionTreeVo decisionTreeVo = decisionTreeService.queryExecuteDecisionTree(null, versionId); + if (decisionTreeVo == null) { + continue; + } + //监控中心==策略层面快照信息记录 + if(decisionTreeVo.getExecuteVersion().getSnapshot()!=null){ + strategySnapshot.add(decisionTreeVo.getExecuteVersion().getSnapshot()); + } + DecisionTreeVersionVo version = decisionTreeVo.getExecuteVersion(); + String resultFieldEn = version.getResultFieldEn(); + //执行决策表 + Object executeResult = this.executeDecisionTree(version, inputParam); + //处理结果 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("decisionTreeId", decisionTreeVo.getId()); + jsonObject.put("decisionTreeName", decisionTreeVo.getName()); + jsonObject.put("desc", version.getDescription()); + jsonObject.put("versionId", version.getId()); + jsonObject.put("versionCode", version.getVersionCode()); + if (executeResult != null) { + jsonObject.put("result", executeResult); + JSONObject resultField = new JSONObject(); + resultField.put(resultFieldEn, executeResult); + inputParam.put(resultFieldEn, executeResult); + List fieldList = new ArrayList<>(); + fieldList.add(resultField); + //处理自定义输出 + List jsonObjects = decisionTreeService.setOutput(versionId, inputParam); + fieldList.addAll(jsonObjects); + jsonObject.put("fieldList", fieldList); + } else { + jsonObject.put("result", ""); + inputParam.put(resultFieldEn, ""); + } + //将执行结果存入最终返回值 + if (outMap.containsKey("decisionTreeJson")) { + JSONArray resultJson = (JSONArray) outMap.get("decisionTreeJson"); + resultJson.add(jsonObject); + //监控中心==》将执行结果写入Hbase + JSONObject nodeResult = new JSONObject(); + nodeResult.put("result", resultJson); + outMap.put("nodeResult", nodeResult); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("decisionTreeJson", resultJson); + //监控中心==》将执行结果写入Hbase + JSONObject nodeResult = new JSONObject(); + nodeResult.put("result", resultJson); + outMap.put("nodeResult", nodeResult); + } + terminalCondition(engineNode,inputParam,outMap,executeResult); + } + //监控中心==》策略层面快照信息记录 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("snapshot",strategySnapshot); + outMap.put("decisionTreeStrategy",jsonObject); + } + + private Object executeDecisionTree(DecisionTreeVersionVo version, Map inputParam) { + List detailList = version.getDetailList(); + for (DecisionTreeDetail decisionTreeDetail : detailList) { + Object o = executeDecisionTreeDetail(decisionTreeDetail, inputParam); + if (o != null) { + return o; + } + } + return null; + } + + private Object executeDecisionTreeDetail(DecisionTreeDetail detail, Map paramMap) { + //获取需要执行的条件列表 + List conditionList = detail.getConditionList(); + String fieldEn = detail.getFieldEn(); + String logical = detail.getLogical(); + boolean result = false; + //根据不通关系进行处理 + switch (logical) { + case "||": + result = false; + for (DecisionTreeDetailCondition condition : conditionList) { + ExpressionParam expressionParam = new ExpressionParam(); + BeanUtils.copyProperties(condition, expressionParam); + expressionParam.setFieldEn(fieldEn); + boolean expressionResult = ExecuteUtils.getExpressionResult(expressionParam, paramMap); + if (expressionResult) { + result = true; + break; + } + } + break; + case "&&": + result = true; + for (DecisionTreeDetailCondition condition : conditionList) { + ExpressionParam expressionParam = new ExpressionParam(); + BeanUtils.copyProperties(condition, expressionParam); + expressionParam.setFieldEn(fieldEn); + boolean expressionResult = ExecuteUtils.getExpressionResult(expressionParam, paramMap); + if (!expressionResult) { + result = false; + break; + } + } + break; + } + //如果本节点符合则执行后续节点 + if (result) { + Integer type = detail.getNodeType(); + List children = detail.getChildren(); + if (type == null) { + if (children == null || children.isEmpty()) { + type = 2; + } else { + type = 1; + } + } + if (type != null) { + switch (type) { + //普通节点符合,让子节点继续执行。 + case 1: + if (children != null && children.size() > 0) { + for (DecisionTreeDetail child : children) { + Object executeResult = this.executeDecisionTreeDetail(child, paramMap); + if (executeResult != null) { + return executeResult; + } + } + } + break; + //叶子节点符合,返回叶子节点的值。 + case 2: + String resultStr = detail.getResultValue(); + Object resultValue = resultStr; + Integer variableType = detail.getVariableType(); + if (variableType == 2) { + resultValue = ExecuteUtils.getObjFromMap(paramMap, resultStr); + } else if (variableType == 3) { + resultValue = ExecuteUtils.getObjFromScript(paramMap, resultStr); + } + return resultValue; + default: + break; + } + } + } + return null; + } + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap,Object executeResult) { + String resultKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_result"; + Map map = new HashMap<>(); + map.put(resultKey,executeResult); + ExecuteUtils.terminalCondition(engineNode,inputParam,outMap, map); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/GroupNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/GroupNode.java new file mode 100644 index 0000000..1906d0d --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/GroupNode.java @@ -0,0 +1,107 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.utils.constant.CommonConst; +import com.fibo.ddp.common.utils.util.runner.JevalUtil; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class GroupNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + logger.info("start【获取分组节点指标】GroupNode.getNodeField engineNode:{},inputParam:{}", JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam)); + JSONObject jsonObject = JSONObject.parseObject(engineNode.getNodeScript()); + JSONArray array = jsonObject.getJSONArray("fields"); + List ids = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + JSONObject input = array.getJSONObject(i); + Object fieldId = input.get("fieldId"); + if(fieldId != null && !"".equals(fieldId.toString())){ + ids.add(Long.valueOf(fieldId.toString())); + } + } + commonService.getFieldByIds(ids, inputParam); + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + JSONObject jsonScript = JSONObject.parseObject(engineNode.getNodeScript()); + //监控中心--节点信息记录(不需要策略层面的监控) + outMap.put("nodeSnapshot",JSONObject.parse(engineNode.getNodeJson())); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode",engineNode); + nodeInfo.put("nodeId",engineNode.getNodeId()); + nodeInfo.put("nodeName",engineNode.getNodeName()); + nodeInfo.put("nodeType",engineNode.getNodeType()); + outMap.put("nodeInfo",nodeInfo); + try { + String nextNode = handleClassify(jsonScript, inputParam); + outMap.put("nextNode", nextNode); + JSONObject result = new JSONObject(); + result.put("nodeResult",nextNode); + outMap.put("nodeResult",result); + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + } + + private static String handleClassify(JSONObject jsonScript, Map inputParam) throws EvaluationException { + JSONArray conditions = jsonScript.getJSONArray("conditions"); + JSONArray fields = jsonScript.getJSONArray("fields"); + Map variablesMap = new HashMap<>(); + variablesMap.putAll(inputParam); + Map fieldsMap = new HashMap<>(); + for(int i = 0; i < fields.size(); i++){ + JSONObject jsonObject = fields.getJSONObject(i); + fieldsMap.put(jsonObject.getString("fieldCode"), jsonObject.getIntValue("valueType")); + } + JevalUtil.convertVariables(fieldsMap, variablesMap); + + String nextNode = ""; + if (conditions == null || conditions.isEmpty()) { + //TODO 如果为空,如何处理 + return nextNode; + } else { + int size = conditions.size(); + boolean flag = false; + JSONObject formula = null; + for (int i = 0; i < size; i++) { + formula = conditions.getJSONObject(i); + //公式为空,则为else条件分支 + if (CommonConst.STRING_EMPTY.equals(formula.getString("formula"))) { + //else条件 + if (nextNode.equals(CommonConst.STRING_EMPTY)) { + nextNode = formula.getString("nextNode"); + } + } else { + //正常条件分支 + flag = JevalUtil.evaluateBoolean(formula.getString("formula"), variablesMap); + if (flag) { + nextNode = formula.getString("nextNode"); + break; + } + } + } + return nextNode; + } + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ListDbNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ListDbNode.java new file mode 100644 index 0000000..4a7b655 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ListDbNode.java @@ -0,0 +1,284 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbService; +import com.fibo.ddp.common.utils.constant.enginex.NodeTypeEnum; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ListDbNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + + @Resource + private ListDbService listDbService; + + private List getExecuteVersionIdList(EngineNode engineNode){ + return ExecuteUtils.getExecuteIdList(engineNode,"versionId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + List list = getExecuteVersionIdList(engineNode); + List fieldIds = new ArrayList<>(); + for (Long l : list) { + fieldIds.addAll(listDbService.getNodeFieldIds(l)); + } + commonService.getFieldByIds(fieldIds,inputParam); + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控中心--节点信息快照记录,主要用于监控中心节点信息配置页面显示 + JSONObject snapshot = new JSONObject(); + snapshot.put("snapshot",engineNode.getSnapshot()); + outMap.put("nodeSnapshot",snapshot); + inputParam.put("nodeId", engineNode.getNodeId()); + inputParam.put("nodeName", engineNode.getNodeName()); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode",engineNode); + nodeInfo.put("nodeId",engineNode.getNodeId()); + nodeInfo.put("nodeName",engineNode.getNodeName()); + nodeInfo.put("nodeType",engineNode.getNodeType()); + outMap.put("nodeInfo",nodeInfo); + int type = 0; + if(engineNode.getNodeType() == NodeTypeEnum.BLACKLIST.getValue()){ + type = 1; + } else if(engineNode.getNodeType() == NodeTypeEnum.WHITELIST.getValue()){ + type = 2; + } + boolean isfalg = this.findByQueryKey(inputParam, outMap, type,engineNode); + if (isfalg) { + if (type == 1) { + outMap.put("isBlack", "true"); + outMap.put("enginefalg", "true"); +// engineNode.setNextNodes(null); + } else { + outMap.put("isWhite", "true"); + outMap.put("engineWhite", "true"); +// engineNode.setNextNodes(null); + } + } + } + + /** + * 根据传入数据监测是否命中黑名单 + * + * @param paramMap + * @return + * @see + */ + public boolean findByQueryKey(Map paramMap, Map outmap, Integer type,EngineNode engineNode) { +// SessionData sessionData = SessionManager.getSession(); +// Long organId = sessionData.getOrganId(); +// JSONObject blackandWhite = new JSONObject(); +// JSONObject resultJson = new JSONObject(); +// //传递nodeId +// String strlistDbIds = null; +// if (!paramMap.get("nodeId").equals("0")) { +// NodeListDb nodeListDb = nodeListDbMapper.findByNodeId(paramMap); +// strlistDbIds = nodeListDb.getInnerListdbs(); +// //节点配置信息快照,hbase入库用 +//// JSONObject bwNodeSnopshot = new JSONObject(); +//// String strListDbIdsOut = nodeListDb.getOuterListdbs(); +//// if(strListDbIdsOut!=null && strListDbIdsOut.length()>0){ +//// bwNodeSnopshot.put("outerIdList",strListDbIdsOut.split(",")); +//// } +// //循环处理所有内部黑/白名单库 +// String[] arraylistDBIds = null; +// Integer matchs = 0; +// Integer revMatchs = 0; //模糊查询时反向匹配 +// if (strlistDbIds.length() > 0) { +// arraylistDBIds = strlistDbIds.split(","); +//// bwNodeSnopshot.put("innerIdList",arraylistDBIds); +//// outmap.put("nodeSnapshot",bwNodeSnopshot); +// String hitKey = ""+engineNode.getNodeType()+"_"+engineNode.getNodeId()+"_size"; +// int hitSize = 0; +// JSONArray strategySnopshot = new JSONArray(); +// for (int i = 0; i < arraylistDBIds.length; i++) { +// HashMap param1 = new HashMap(); +// param1.put("organId", organId); +// Integer listDbId = Integer.valueOf(arraylistDBIds[i]).intValue(); +// param1.put("listDbId", listDbId); +// ListDb listDb = new ListDb(); +//// listDb = listDbService.findListDbByIdandByorganId(param1); +// //监控中心--策略层面记录名单库快照信息 +// if(listDb.getSnapshot()!=null){ +// strategySnopshot.add(listDb.getSnapshot()); +// } +// paramMap.put("listDb", listDb); +// String listType = listDb.getListType(); +// String queryKeyArray[] = listDb.getQueryField().split(","); +// if (queryKeyArray.length > 0) { +// Integer queryType = listDb.getQueryType();//and(1),or(0) +// Integer matchType = listDb.getMatchType();//精确匹配(1),模糊匹配(0) +// +// String queryKey = ""; // t1 like '%t1%' +// String revQueryKey = ""; // 反向模糊匹配 instr('高档洗浴消费',t1) t1行业字段 eg.'洗浴' +// String tableName = "organ" + "_" + organId + "_" + listType + "_" + listDbId; +// paramMap.put("tableName", tableName); +// paramMap.put("schemaName", getDbName()); +// +// //获取名单库的匿名字段与注释的关系 +// List columnList = tblColumnMapper.getColumnList(paramMap); +// +// //字段id转匿名字段名,准备待查字段条件 +// Integer loc = 0; +// +// for (int j = 0; j < queryKeyArray.length; j++) { +// +// HashMap inputParam = new HashMap(); +// inputParam.put("id", queryKeyArray[j]); +// inputParam.put("organId", organId); +// inputParam.put("engineId", null); +// //id(3)-field(age) +// Field field = fieldMapper.findByFieldIdbyorganId(inputParam); +// String fieldEn = field.getFieldEn(); //age +// +// for (TblColumn tblColumn : columnList) { +// +// String colComment = tblColumn.getColComment(); //age +// String colName = tblColumn.getColName(); //t5 +// String paramValue =paramMap.get(fieldEn).toString(); +// +// if (colName.startsWith("t") && queryKeyArray[j].equals(colComment)) { +// +// if (paramValue == null || paramValue.equals("")) { +// return false; //数据项缺失导致无法命中,默认返回没命中 +// } else { +// loc += 1; +// if (matchType == 1) { +// if (loc > 1 && queryType == 1) { +// queryKey += " and "; +// } else if (loc > 1 && queryType == 0) { +// queryKey += " or "; +// } +// queryKey += colName + " = '" + paramValue + "'"; +// } else if (matchType == 0) { //模糊匹配 +// if (loc > 1 && queryType == 1) { +// queryKey += " and "; +// } else if (loc > 1 && queryType == 0) { +// queryKey += " or "; +// revQueryKey += " + "; +// } +// //正向模糊搜索 +// queryKey += colName + " like " + "'%" + paramValue + "%'"; // t5 like '%36岁%' +// //反向模糊搜索 +// revQueryKey += "max(instr('" + paramValue + "'," + colName + "))"; +// } +// } +// } +// } +// } +// paramMap.put("queryKey", queryKey); +// paramMap.put("revQueryKey", revQueryKey); +// } +// matchs += custListMapper.findByQueryKey(paramMap); +// if (!paramMap.get("revQueryKey").equals("")) { +// revMatchs = custListMapper.revFindByQueryKey(paramMap); +// } +// if (revMatchs == null) +// revMatchs = 0; +// +// paramMap.put(listDb.getResultFieldEn(),"未命中"); +// List fieldList = new ArrayList<>(); +// +// JSONObject hitResult = new JSONObject(); +// hitResult.put(listDb.getResultFieldEn(),"未命中"); +// if (matchs + revMatchs > 0) { +// resultJson.put("nodeId", paramMap.get("nodeId").toString()); +// resultJson.put("nodeName", paramMap.get("nodeName").toString()); +// resultJson.put("status", "0x0000"); +// paramMap.put(listDb.getResultFieldEn(),"命中"); +// hitResult.put(listDb.getResultFieldEn(),"命中"); +// hitSize++; +// List jsonObjects = outputService.setOutput(new StrategyOutput(Long.valueOf(listDbId.toString()), StrategyType.LIST_DB), paramMap); +// fieldList.add(hitResult); +// fieldList.addAll(jsonObjects); +// resultJson.put("fieldList",fieldList); +// if (type == 1) { +// blackandWhite.put("resultType", 5); +// outmap.put("black", listDb); +// resultJson.put("blackId", listDb.getId()); +// resultJson.put("blackName", listDb.getListName()); +// resultJson.put("blackType", listDb.getListType()); +// if (null != listDb.getListDesc()) { +// resultJson.put("desc", listDb.getListDesc()); +// } +// +// blackandWhite.put("resultJson", resultJson); +// //黑名单api返回 +// outmap.put("blackJson", blackandWhite); +// } else { +// blackandWhite.put("resultType", 6); +// resultJson.put("status", "0x0000"); +// resultJson.put("whiteId", listDb.getId()); +// resultJson.put("whiteName", listDb.getListName()); +// resultJson.put("whiteType", listDb.getListType()); +// if (null != listDb.getListDesc()) { +// resultJson.put("desc", listDb.getListDesc()); +// } +// blackandWhite.put("resultJson", resultJson); +// //白名单api返回 +// outmap.put("whiteJson", blackandWhite); +// outmap.put("white", listDb); +// } +// paramMap.put(hitKey,hitSize); +// return true; +// }else { +// //未命中 +// blackandWhite.put("resultJson","未命中"); +// fieldList.add( hitResult); +// } +// //监控中心==》将评分卡的执行结果得分明细放入 输出变量池 用于存入hbase +// outmap.put("nodeResult",blackandWhite); +// } +// paramMap.put(hitKey,hitSize); +// //监控中心==》策略层面记录策略的快照信息 +// JSONObject strategyObject = new JSONObject(); +// strategyObject.put("strategySnopshot",strategySnopshot); +// outmap.put("strategySnopshot",strategyObject); +// } else +// return false; +// } + return false; + } + + /** + * Description: 获取jdbc.properties里配置的数据库名 + * + * @return + * @see + */ + private String getDbName() { + +// ResourceBundle resource = ResourceBundle.getBundle("conf/jdbc"); +// String mysqlUrl = resource.getString("mysql.url"); +// +// String aArray[] = mysqlUrl.split("/"); +// String bArray[] = aArray[3].split("\\?"); +// String dbName = bArray[0]; +// +// return dbName; + return "riskmanage"; + } + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap,Object executeResult) { + String sizeKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_size"; + Map map = new HashMap<>(); + map.put(sizeKey,executeResult); + ExecuteUtils.terminalCondition(engineNode,inputParam,outMap, map); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ModelNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ModelNode.java new file mode 100644 index 0000000..d90335c --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ModelNode.java @@ -0,0 +1,128 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.aimodel.ModelsService; +import com.fibo.ddp.common.service.strategyx.aimodel.PMMLExecutor.PMMLExecutor; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ModelNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + @Resource + public ModelsService modelsService; + @Resource(name = "PMMLExecutorRFImpl") + private PMMLExecutor pmmlExecutor; + @Resource + private StrategyOutputService outputService; + + private List getExecuteVersionIdList(EngineNode engineNode) { + return ExecuteUtils.getExecuteIdList(engineNode, "modelId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + logger.info("start【获取模型节点指标】ModelNode.getNodeField engineNode:{},inputParam:{}", JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam)); +// Long modelId = Long.valueOf(engineNode.getNodeJson()); + List modelIds = getExecuteVersionIdList(engineNode); + List ids = new ArrayList<>(); + for (Long modelId : modelIds) { + MachineLearningModels models = modelsService.selectById(Integer.valueOf(modelId.toString())); + ids.addAll(StringUtil.toLongList(models.getMappingField())); + } + try { + commonService.getFieldByIds(ids, inputParam); + }catch (Exception e){ + logger.error("模型中字段未完全找到"); + e.printStackTrace(); + } + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + + List modelIds = getExecuteVersionIdList(engineNode); + if (modelIds == null || modelIds.isEmpty()){ + logger.error("模型节点内容为空,node:{}",engineNode); + return; + } + Long modelId = modelIds.get(0); + MachineLearningModels models = modelsService.selectById(Integer.valueOf(modelId.toString())); + //监控中心--节点信息记录 + outMap.put("nodeSnapshot", models); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + // 加载模型文件 + org.jpmml.evaluator.Evaluator evaluator = pmmlExecutor.loadPmml(models.getFilePath()); + + Map input = new HashMap<>(); + String[] modelFieldArr = models.getModelField().split(","); + String[] mappingFieldArr = models.getMappingField().split(","); + for (int i = 0; i < modelFieldArr.length; i++) { + input.put(modelFieldArr[i], inputParam.get(mappingFieldArr[i])); + } + // 调用模型 + double modelResult = 0d; + try { + modelResult =pmmlExecutor.predict(evaluator, input); + }catch (Exception e){ + logger.error("模型节点执行异常,node:{}",engineNode); + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("modelId", models.getId()); + jsonObject.put("modelName", models.getModelName()); + List fieldList = new ArrayList<>(); + JSONObject result = new JSONObject(); + result.put(models.getResultFieldEn(), modelResult); + fieldList.add(result); + fieldList.addAll(outputService.setOutput(new StrategyOutput(modelId, StrategyType.MODELS), input)); + jsonObject.put("fieldList", fieldList); + outMap.put("nodeResult", jsonObject); + if (outMap.containsKey("modelJson")) { + JSONArray resultJson = (JSONArray) outMap.get("modelJson"); + resultJson.add(jsonObject); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("modelJson", resultJson); + } + inputParam.put("model_" + modelId, modelResult); + inputParam.put(models.getResultFieldEn(), modelResult); + outMap.put("model_" + modelId, modelResult); + terminalCondition(engineNode, inputParam, outMap, modelResult); + } + + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap, Object executeResult) { + String resultKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_result"; + Map map = new HashMap<>(); + map.put(resultKey, executeResult); + ExecuteUtils.terminalCondition(engineNode, inputParam, outMap, map); + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ParallelNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ParallelNode.java new file mode 100644 index 0000000..7a3131e --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ParallelNode.java @@ -0,0 +1,33 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 并行节点 + */ +@Service +public class ParallelNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + logger.info("start【执行并行节点】ParallelNode.runNode engineNode:{},inputParam:{},outMap:{}" + , JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam), JSONObject.toJSONString(outMap)); + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RpcNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RpcNode.java new file mode 100644 index 0000000..1db8f2e --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RpcNode.java @@ -0,0 +1,59 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.datax.datainterface.InterfaceInfo; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.service.datax.datainterface.InterfaceService; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 远程调用节点 + */ +@Service +public class RpcNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private InterfaceService interfaceService; + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + logger.info("start【执行RPC节点】RpcNode.runNode engineNode:{},inputParam:{},outMap:{}" + , JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam), JSONObject.toJSONString(outMap)); + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + JSONObject nodeJson = JSONObject.parseObject(engineNode.getNodeJson()); + JSONObject callConfig = nodeJson.getJSONObject("callConfig"); + int callType = callConfig.getInteger("callType"); + JSONArray resultConfig = nodeJson.getJSONArray("resultConfig"); + InterfaceInfo interfaceInfo = interfaceService.getInterfaceById(callConfig.getInteger("interfaceId")); + // 发送http请求 + String result = interfaceService.getHttpResponse(interfaceInfo, inputParam, callType); + // 解析指标 + parseField(result, resultConfig, inputParam); + } + + private void parseField(String result, JSONArray resultConfig, Map inputParam){ + if(resultConfig != null && !resultConfig.isEmpty() && StringUtils.isNotBlank(result)){ + JSONObject configJson = resultConfig.getJSONObject(0); + String fieldEn = configJson.getString("fieldEn"); + String parseField = configJson.getString("parseField"); + String fieldValue = interfaceService.interfaceParseField(parseField, result); + inputParam.put(fieldEn, fieldValue); + } + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RuleSetNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RuleSetNode.java new file mode 100644 index 0000000..3d93652 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/RuleSetNode.java @@ -0,0 +1,769 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; +import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleConditionService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +@Service +public class RuleSetNode implements EngineRunnerNode { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + @Resource + private RuleService ruleService; + @Autowired + private RuleConditionService conditionService; + @Resource + private RuleScriptVersionService ruleScriptVersionService; + @Resource + private FieldService fieldService; + @Autowired + private RuleVersionService versionService; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + logger.info("start【获取规则集节点指标】RuleSetNode.getNodeField engineNode:{},inputParam:{}", JSONObject.toJSONString(engineNode), JSONObject.toJSONString(inputParam)); + JSONObject nodeJson = JSONObject.parseObject(engineNode.getNodeJson()); + List ids = new ArrayList<>(); + List versionIds = new ArrayList<>(); // 复杂规则集 + List scriptVersionIds = new ArrayList<>(); // 脚本规则集 + + JSONArray jsonArray = null; + int groupType = nodeJson.getInteger("groupType"); + if (groupType == Constants.ruleNode.MUTEXGROUP) { + jsonArray = nodeJson.getJSONObject("mutexGroup").getJSONArray("rules"); + } else { + jsonArray = nodeJson.getJSONObject("executeGroup").getJSONArray("rules"); + } + + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject ruleObj = jsonArray.getJSONObject(i); + Long versionId = ruleObj.getLong("ruleVersionId"); + Long difficulty = ruleObj.getLong("difficulty"); + if (difficulty != null && difficulty == 3) { + scriptVersionIds.add(versionId); // 脚本式规则 + } else if (versionId != null) { + versionIds.add(versionId); // 复杂规则 + } + } + + //获取字段en + List fieldEnList = new ArrayList<>(); + if (!versionIds.isEmpty()) { + fieldEnList.addAll(conditionService.queryFieldEnByVersionIds(versionIds)); + } + if (!scriptVersionIds.isEmpty()) { + fieldEnList.addAll(ruleScriptVersionService.queryFieldEnByVersionIds(scriptVersionIds)); + } + + //筛选调那些循环或者嵌套中的字段 + fieldEnList = fieldEnList.stream().distinct().filter(f -> f != null && !f.contains(".") && !f.contains("%")).collect(Collectors.toList()); + if (fieldEnList != null && !fieldEnList.isEmpty()) { + List fieldList = fieldService.selectFieldListByEns(fieldEnList); + for (Field field : fieldList) { + ids.add(field.getId()); + } + } + + if (!ids.isEmpty()) { + commonService.getFieldByIds(ids, inputParam); + } + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + JSONObject nodeJson = JSONObject.parseObject(engineNode.getNodeJson()); + //监控中心--记录节点快照信息 + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + int groupType = nodeJson.getInteger("groupType") == null ? Constants.ruleNode.EXECUTEGROUP : nodeJson.getInteger("groupType"); + CopyOnWriteArrayList ruleResultList = new CopyOnWriteArrayList<>();// 规则执行结果集合 + List ruleHitList = new ArrayList<>(); // 命中的规则集合 + + // 互斥组(串行) + if (groupType == Constants.ruleNode.MUTEXGROUP) { + JSONArray jsonArray = nodeJson.getJSONObject("mutexGroup").getJSONArray("rules"); + List ruleInfoList = getRuleFromJsonArray(jsonArray); + //监控中心--循环获取策略层面的快照信息 + recordStrategySnopshot(ruleInfoList, outMap); + ruleHitList = serialRule(inputParam, outMap, ruleInfoList, ruleResultList); + } + // 执行组(并行) + else if (groupType == Constants.ruleNode.EXECUTEGROUP) { + JSONArray jsonArray = nodeJson.getJSONObject("executeGroup").getJSONArray("rules"); + List ruleInfoList = getRuleFromJsonArray(jsonArray); + //监控中心--循环获取策略层面的快照信息 + recordStrategySnopshot(ruleInfoList, outMap); + ruleHitList = parallelRule(inputParam, outMap, ruleInfoList, ruleResultList); + } + + // 终止条件处理 + terminalCondition(engineNode, nodeJson, outMap, ruleHitList); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("ruleResultList", ruleResultList); + + if (outMap.containsKey("ruleJson")) { + JSONArray resultJson = (JSONArray) outMap.get("ruleJson"); + resultJson.add(jsonObject); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("ruleJson", resultJson); + } + int hitSize = 0; + double scoreSum = 0d; + for (Map map : ruleResultList) { + Object ruleScore = map.get("ruleScore"); + Object ruleResult = map.get("ruleResult"); + if (null != ruleResult && "命中".equals(ruleResult)) { + hitSize++; + if (null != ruleScore) { + try { + scoreSum += Double.valueOf(ruleScore.toString()); + } catch (Exception e) { + continue; + } + } + } + } + String hitKey = "" + engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_size"; + String scoreKey = "" + engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_score"; + inputParam.put(hitKey, hitSize); + inputParam.put(scoreKey, scoreSum); + //监控中心==》记录节点输出结果 + //记录整个规则集中的所有规则的命中情况,以及总的统计次数 放到输出变量池 + JSONObject nodeResult = new JSONObject(); + nodeResult.put("ruleResultList", ruleResultList); + nodeResult.put("hitNum", hitSize); + nodeResult.put("scoreTotal", scoreSum); + outMap.put("nodeResult", nodeResult); + } + + /** + * 监控中心--获取策略层面快照信息 + * + * @param ruleInfoList + * @param outMap + */ + private void recordStrategySnopshot(List ruleInfoList, Map outMap) { + JSONArray jsonObject = new JSONArray(); + ruleInfoList.stream().forEach(ruleInfo -> { + logger.info("===========================监控添加策略信息快照情况==============版本id:{}=====:{}",ruleInfo.getVersion().getId(),ruleInfo.getVersion().getSnapshot()); + if (ruleInfo.getVersion().getSnapshot() != null) { + jsonObject.add(ruleInfo.getVersion().getSnapshot()); + + } + }); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("snopshot", jsonObject); + logger.info("===========================监控添加策略信息快照情况:{}",jsonObject1); + outMap.put("strategySnopshot", jsonObject1); + } + + /** + * 串行执行规则 + * + * @param inputParam + * @param outMap + * @param ruleInfoList + * @param ruleResultList + * @return + */ + private List serialRule(Map inputParam, Map outMap, List ruleInfoList, CopyOnWriteArrayList ruleResultList) { + logger.info("请求参数--串行执行规则" + "map:" + JSONObject.toJSONString(inputParam)); + List resultList = new ArrayList<>(); + for (int i = 0; i < ruleInfoList.size(); i++) { + RuleInfo rule = ruleInfoList.get(i); + boolean hitFlag = executeByDifficulty(inputParam, outMap, rule, ruleResultList); + if (hitFlag) { + resultList.add(rule); + break; + } + } + return resultList; + } + + + /** + * 并行执行规则 + * + * @param inputParam + * @param outMap + * @param ruleInfoList + * @param ruleResultList + * @return + */ + private List parallelRule(Map inputParam, Map outMap, List ruleInfoList, CopyOnWriteArrayList ruleResultList) { + logger.info("请求参数--并行执行规则" + "map:" + JSONObject.toJSONString(inputParam)); + List resultList = new ArrayList<>(); + List> futureList = new ArrayList<>(); + for (int i = 0; i < ruleInfoList.size(); i++) { + final int index = i; + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + RuleInfo rule = ruleInfoList.get(index); + boolean hitFlag = executeByDifficulty(inputParam, outMap, rule, ruleResultList); + if (hitFlag) { + return rule; + } else { + return null; + } + }, threadPoolTaskExecutor); + + futureList.add(future); + } + + for (CompletableFuture future : futureList) { + try { + RuleInfo rule = future.get(); + if (rule != null) { + resultList.add(rule); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + + return resultList; + } + + /** + * 根究规则类型选择执行 + * + * @param inputParam + * @param outMap + * @param rule + * @param ruleResultList + * @return + */ + private boolean executeByDifficulty(Map inputParam, Map outMap, RuleInfo rule, CopyOnWriteArrayList ruleResultList) { + boolean hitFlag = false; + if (rule.getDifficulty() == 2) { + hitFlag = executeComplexRule(inputParam, outMap, rule, ruleResultList); + } else if (rule.getDifficulty() == 3) { + hitFlag = executeScriptRule(inputParam, outMap, rule, ruleResultList); + } + return hitFlag; + } + + /** + * 执行复杂规则 + * + * @param input + * @param output + * @param rule + * @param ruleResultList + * @return + */ + public boolean executeComplexRule(Map input, Map output, RuleInfo rule, CopyOnWriteArrayList ruleResultList) { + boolean hitFlag = false; + //获取需要执行的整个规则。 +// RuleVo rule = ruleService.queryByVersionId(ruleId); +// Long versionId = rule.getVersionId(); +// if (versionId==null){ +// return false; +// } +// RuleVersionVo ruleVersion = versionService.queryByVersionId(versionId); + RuleVersionVo ruleVersion = rule.getVersion(); + if (ruleVersion == null) { + return false; + } + + //取出本规则的条件列表 + Map ruleMap = new HashMap<>(); + ruleMap.put("ruleId", rule.getId()); + ruleMap.put("ruleVersionId",ruleVersion.getId()); + ruleMap.put("ruleCode", rule.getCode()); + ruleMap.put("ruleName", rule.getName()); + ruleMap.put("versionCode", ruleVersion.getVersionCode()); + ruleMap.put("versionDesc", ruleVersion.getDescription()); + ruleMap.put("desc", rule.getDescription()); + ruleMap.put("ruleResult", "未命中"); + + //获取规则需要执行的condition逻辑。 + RuleConditionVo ruleCondition = ruleVersion.getRuleConditionVo(); + //传入输入参数、中间变量、输出参数和需要执行的condition逻辑获取执行结果 + Map temp = JSON.parseObject(JSON.toJSONString(input), Map.class); + boolean result = this.executeRuleCondition(temp, output, ruleCondition); + String resultFieldEn = ruleVersion.getResultFieldEn(); + if (resultFieldEn == null || "".equals(resultFieldEn)) { + resultFieldEn = "rule_2_"+rule.getId()+"_"+ruleVersion.getId()+"_hitResult"; + } + String scoreFieldEn = ruleVersion.getScoreFieldEn(); + if (StringUtils.isBlank(scoreFieldEn)){ + scoreFieldEn = "rule_2_"+rule.getId()+"_"+ruleVersion.getId()+"_score"; + } + input.put(resultFieldEn, "未命中"); + //根据执行的最终结果处理此规则输出内容 + List fieldList = new ArrayList<>(); + JSONObject resultJson = new JSONObject(); + if (result) { + ruleMap.put("ruleResult", "命中"); + ruleMap.put("ruleScore", rule.getScore()); + JSONObject scoreJson = new JSONObject(); + resultJson.put(resultFieldEn, "命中"); + fieldList.add(resultJson); +// if (StringUtils.isNotBlank(ruleVersion.getScoreFieldEn())) { + scoreJson.put(scoreFieldEn, ruleVersion.getScore()); + fieldList.add(scoreJson); + input.put(scoreFieldEn, ruleVersion.getScore()); +// } + input.put(resultFieldEn, "命中"); + //处理此规则需要输出的内容 + fieldList.addAll(ruleService.setComplexRuleOutput(ruleVersion.getId(), temp, input, StrategyType.OutType.SUCCESS_OUT)); + ruleMap.put("fieldList", fieldList); + hitFlag = true; + } else { + resultJson.put(resultFieldEn, "未命中"); + ruleMap.put("ruleScore", 0); + input.put(scoreFieldEn,0); + fieldList.add(resultJson); + fieldList.addAll(ruleService.setComplexRuleOutput(ruleVersion.getId(), temp, input, StrategyType.OutType.FAIL_OUT)); + ruleMap.put("fieldList", fieldList); + } + ruleResultList.add(ruleMap); + return hitFlag; + } + + //执行规则的条件 + private boolean executeRuleCondition(Map input, Map output, RuleConditionVo ruleCondition) { + Integer conditionType = ruleCondition.getConditionType(); + boolean result = false; + switch (conditionType) { + //关系条件节点 &&和|| + case RuleConst.RELATION_CONDITION: + //循环结果的条件 + case RuleConst.LOOP_RESULT_CONDITION: + case RuleConst.CONDITION_RESULT_CONDITION: + result = executeRelation(input, output, ruleCondition); + break; + //表达式条件节点 + case RuleConst.EXPRESSION_CONDITION: + result = executeExpression(input, output, ruleCondition); + break; + //循环条件根节点 + case RuleConst.LOOP_CONDITION: + result = executeLoop(input, output, ruleCondition); + break; + //条件组根节点 + case RuleConst.CONDITION_GROUP_CONDITION: + result = executeCondGroup(input, output, ruleCondition); + break; + } + return result; + } + + //执行条件组 + private boolean executeCondGroup(Map input, Map output, RuleConditionVo ruleCondition) { + //取出子条件 + List children = ruleCondition.getChildren(); + //存储命中条数 + int hitNum = 0; + if (children == null) { + return false; + } + //执行条件组中条件列表,命中则添加命中条数 + for (RuleConditionVo child : children) { + boolean childResult = executeRuleCondition(input, output, child); + if (childResult) { + hitNum++; + } + } + //获取条件组命中条件,为null直接不命中 + RuleConditionVo condGroup = ruleCondition.getCondGroupResultCondition(); + if (condGroup == null) { + return false; + } + //传入命中条件和组内命中条数执行并返回 + Map map = new HashMap<>(); + //将命中条数存入map然后判断执行结果 + map.put("hitNum", hitNum); + return executeRuleCondition(map, output, condGroup); + } + + //关系条件节点 &&和|| + private boolean executeRelation(Map input, Map output, RuleConditionVo ruleCondition) { + //获取关系逻辑 + String logical = ruleCondition.getLogical(); + //处理子逻辑 + List children = ruleCondition.getChildren(); + + boolean result = false; + switch (logical) { + case "||": + result = false; + for (RuleConditionVo child : children) { + boolean childResult = executeRuleCondition(input, output, child); + if (childResult) { + return true; + } + } + break; + case "&&": + result = true; + for (RuleConditionVo child : children) { + boolean childResult = executeRuleCondition(input, output, child); + if (!childResult) { + return false; + } + } + break; + } + return result; + } + + //表达式条件节点 + private boolean executeExpression(Map input, Map output, RuleConditionVo ruleCondition) { + String executionLogic = ruleCondition.getExecutionLogic(); + boolean result = false; + ExpressionParam expressionParam = new ExpressionParam(); + //复制执行的关键参数到统一入参 + BeanUtils.copyProperties(ruleCondition, expressionParam); + result = ExecuteUtils.getExpressionResult(expressionParam, input); + return result; + } + + //循环条件根节点 + private boolean executeLoop(Map input, Map output, RuleConditionVo ruleCondition) { + List children = ruleCondition.getChildren(); + String fieldEn = ruleCondition.getFieldEn(); + + //对循环中每个条件进行处理 + String[] split = fieldEn.split("\\."); + //从map中取元素返回最终取到的对象 + Object obj = ExecuteUtils.getObjFromMap(input, fieldEn); + List arrayList = new ArrayList(); + if (obj != null) { + arrayList.addAll(JSON.parseObject(JSON.toJSONString(obj), ArrayList.class)); + } + //取不到这个数组 + if (arrayList.isEmpty()) { + return false; + } + //拼接当前对象的key + String currentKey = "%" + split[split.length - 1] + "%"; + for (RuleConditionVo child : children) { + List loopGroupActions = child.getLoopGroupActions(); + // 调用for循环条件下的操作,并且将其存入input中 + for (RuleLoopGroupAction loopGroupAction : loopGroupActions) { + this.initLoopGroupAction(loopGroupAction, input); + } + } + for (Object currentObj : arrayList) { + //将循环时的当前对象存入input + input.put(currentKey, currentObj); + //循环执行当前for中的每个判断单元 + for (RuleConditionVo child : children) { + if (executeRuleCondition(input, output, child)) { + List loopGroupActions = child.getLoopGroupActions(); + // 调用for循环条件下的操作,并且将其存入input中 + for (RuleLoopGroupAction loopGroupAction : loopGroupActions) { + this.saveLoopGroupAction(loopGroupAction, input); + } + } + } + } + //计算for的返回结果 + RuleConditionVo loopResultCondition = ruleCondition.getLoopResultCondition(); + boolean result = executeRuleCondition(input, output, loopResultCondition); + return result; + } + + //保存循环规则的动作 + private void saveLoopGroupAction(RuleLoopGroupAction loopGroupAction, Map input) { + Integer actionType = loopGroupAction.getActionType(); + String actionKey = loopGroupAction.getActionKey(); + String actionValue = loopGroupAction.getActionValue(); + if (actionType == null) { + return; + } + switch (actionType) { + case RuleConst.LOOP_GROUP_ACTION_TYPE_SUM: + Integer count = 1; + if (input.containsKey(actionKey) && StringUtils.isNumeric(ExecuteUtils.getObjFromMap(input, actionKey).toString())) { + count = count + Integer.parseInt(ExecuteUtils.getObjFromMap(input, actionKey).toString()); + } + input.put(actionKey, count); + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_ASSIGNMENT: + //赋值待添加 + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_OUT_CONST: + input.put(actionKey, actionValue); + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_OUT_VARIABLE: + input.put(actionKey, ExecuteUtils.getObjFromMap(input, actionValue)); + break; + } + } + + + private void initLoopGroupAction(RuleLoopGroupAction loopGroupAction, Map input){ + Integer actionType = loopGroupAction.getActionType(); + String actionKey = loopGroupAction.getActionKey(); + String actionValue = loopGroupAction.getActionValue(); + if (actionType == null) { + return; + } + switch (actionType) { + case RuleConst.LOOP_GROUP_ACTION_TYPE_SUM: + input.put(actionKey, 0); + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_ASSIGNMENT: + //赋值待添加 + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_OUT_CONST: + input.put(actionKey, ""); + break; + case RuleConst.LOOP_GROUP_ACTION_TYPE_OUT_VARIABLE: + input.put(actionKey,new HashSet<>()); + break; + } + } + + /** + * 终止条件判断 + * + * @param engineNode + * @param inputParam + * @param outMap + * @param ruleHitList + */ + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap, List ruleHitList) { + if (StringUtils.isBlank(engineNode.getNodeScript())) { + return; + } + JSONObject nodeScript = JSONObject.parseObject(engineNode.getNodeScript()); + JSONObject terminationInfo = nodeScript.getJSONObject("terminationInfo"); + JSONArray selectedRule = terminationInfo.getJSONArray("selectedRule"); + String conditions = terminationInfo.getString("conditions"); + if (!selectedRule.isEmpty()) { + if (!selectedRule.isEmpty()) { + List selectedRuleList = JSONObject.parseArray(JSONObject.toJSONString(selectedRule), JSONObject.class); + // 查找已选规则中命名的规则集合 + List selectedHitRules = new ArrayList<>(); + for (JSONObject jsonObject : selectedRuleList) { + Optional rule = ruleHitList.stream().filter(item -> item.getId().equals(jsonObject.getLong("id"))).findFirst(); + if (rule.isPresent()) { + selectedHitRules.add(rule.get()); + } + } + + int totalSize = selectedHitRules.size(); // 规则命名个数 + double totalScore = selectedHitRules.stream().mapToDouble(RuleInfo::getScore).sum(); // 规则总得分 + String sizeKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_size"; + String scoreKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_score"; + Map variablesMap = new HashMap<>(); + variablesMap.put(sizeKey, totalSize); + variablesMap.put(scoreKey, totalScore); + + ExecuteUtils.terminalCondition(engineNode,inputParam,outMap,variablesMap); + } + } + } + + private List getRuleFromJsonArray(JSONArray jsonArray) { + List ruleIds = new ArrayList<>(); + Map map = new HashMap<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject ruleObj = jsonArray.getJSONObject(i); + Long versionId = ruleObj.getLong("ruleVersionId"); + Long ruleId = ruleObj.getLong("id"); + if (ruleId != null) { + ruleIds.add(ruleId); + if (versionId != null) { + map.put(ruleId, versionId); + } + } + } + + List ruleInfoList = ruleService.getRuleList(ruleIds); + for (RuleInfo ruleInfo : ruleInfoList) { + if (ruleInfo.getDifficulty() == 2 || ruleInfo.getDifficulty() == 3) { + Long versionId = map.get(ruleInfo.getId()); + ruleInfo.setVersionId(versionId); + if (versionId != null) { + switch (ruleInfo.getDifficulty()) { + case 2: + RuleVersionVo ruleVersionVo = versionService.queryById(versionId); + ruleInfo.setVersion(ruleVersionVo); + ruleInfo.setScore(ruleVersionVo.getScore()); + break; + case 3: + RuleScriptVersion ruleScriptVersion = ruleScriptVersionService.queryById(versionId); + ruleInfo.setScriptVersion(ruleScriptVersion); + ruleInfo.setVersion(JSON.parseObject(JSON.toJSONString(ruleScriptVersion), RuleVersionVo.class)); + ruleInfo.setScore(0); + break; + } + } else { + ruleInfo.setScore(0); + } + } + } + + return ruleInfoList; + } + + /** + * 执行脚本规则 + * + * @param inputParam + * @param outMap + * @param rule + * @param ruleResultList + * @return + */ + private boolean executeScriptRule(Map inputParam, Map outMap, RuleInfo rule, CopyOnWriteArrayList ruleResultList) { + boolean hitFlag = false; + RuleScriptVersion scriptVersion = rule.getScriptVersion(); + if (RuleConst.ScriptType.GROOVY.equals(rule.getScriptType())&&RuleConst.ScriptType.GROOVY.equals( scriptVersion.getScriptType())) { + //groovy脚本执行 + //取出需要执行的版本 + if (scriptVersion == null || StringUtils.isBlank(scriptVersion.getScriptContent())) { + return false; + } + //取出脚本内容 + String scriptContent = scriptVersion.getScriptContent(); + //取出本规则集的规则列表 + Map ruleMap = new HashMap<>(); + ruleMap.put("ruleId", rule.getId()); + ruleMap.put("ruleVersionId",scriptVersion.getId()); + ruleMap.put("ruleCode", rule.getCode()); + ruleMap.put("ruleName", rule.getName()); + ruleMap.put("versionCode", scriptVersion.getVersionCode()); + ruleMap.put("versionDesc", scriptVersion.getDescription()); + ruleMap.put("desc", rule.getDescription()); + ruleMap.put("ruleResult", "未命中"); + + + String resultFieldEn = "hitResult"; + String resultEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_"+scriptVersion.getId()+"_hitResult"; + String scoreEn = "rule_"+rule.getDifficulty()+"_"+rule.getId()+"_"+scriptVersion.getId()+"_score"; + inputParam.put(resultEn, "未命中"); + inputParam.put(scoreEn,0); + //根据执行的最终结果处理此规则输出内容 + List fieldList = new ArrayList<>(); + JSONObject resultJson = new JSONObject(); + try { + Object resp = ExecuteUtils.getObjFromScript(inputParam, scriptContent); + String result = "未命中"; + JSONObject executeResult = null; + int ruleScore = 0; + if (resp instanceof HashMap) { + Map resultMap = (HashMap) resp; + executeResult = JSON.parseObject(JSON.toJSONString(resultMap)); + ruleScore = executeResult.getIntValue("ruleScore"); + result = executeResult.getString(resultFieldEn); + JSONArray fieldListJson = executeResult.getJSONArray("fieldList"); + JSONObject updateInputMap = executeResult.getJSONObject("updateInputMap"); + if (fieldListJson != null) { + fieldList = fieldListJson.toJavaList(Object.class); + List list = new ArrayList(); + for (Object o : fieldList) { + if (o!=null&& o instanceof Map){ + Map map = ExecuteUtils.handleGroovyResult((Map) o); + list.add(map); + } + } + fieldList = list; + } + + if (executeResult != null) { + ruleMap.put("ruleResult", result); + ruleMap.put("ruleScore", ruleScore); + resultJson.put(resultFieldEn, result); + fieldList.add(resultJson); + inputParam.put(resultFieldEn, result); + //处理此规则需要输出的内容 + ruleMap.put("fieldList", fieldList); + } + if ("命中".equals(result)) { + hitFlag = true; + inputParam.put(resultEn,"命中"); + inputParam.put(scoreEn,ruleScore); + } + //更新入参 + if (updateInputMap!=null&&!updateInputMap.isEmpty()){ + Set> entries = ExecuteUtils.handleGroovyResult(updateInputMap).entrySet(); + for (Map.Entry entry : entries) { + inputParam.put(entry.getKey(),entry.getValue()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("脚本规则集执行错误:{}" + e); + } + ruleResultList.add(ruleMap); + } + return hitFlag; + } + +// public static void main(String[] args) { +//// HashMap result = new HashMap<>(); //规则执行的返回值 +//// int ruleScore = 0; //规则命中时得分 +//// String hitResult = "未命中"; //命中结果,可选类型为:命中、未命中 +//// HashMap updateInputMap = new HashMap<>(); //用于更新入参的map,此map中的所有内容将被更新到入参中,key重复的将被覆盖。 +//// ArrayList> fieldList = new ArrayList<>(); //用于存放输出字段的值 +//// //自定义代码区域,根据需要书写逻辑代码 +//// +//// +//// +//// //返回固定格式的结果用于后续执行 +//// result.put("hitResult",hitResult); +//// result.put("ruleScore",ruleScore); +//// result.put("fieldList",fieldList); +//// result.put("updateInputMap",updateInputMap); +//// return result; +// } + +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/SandboxProportionNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/SandboxProportionNode.java new file mode 100644 index 0000000..852971a --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/SandboxProportionNode.java @@ -0,0 +1,114 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.enginex.runner.Sandbox; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +@Service +public class SandboxProportionNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + if (null != engineNode.getNodeScript()) { + List list = JSON.parseArray(engineNode.getNodeScript(), Sandbox.class); + //监控中心-- 节点配置信息记录(不需要策略层面的监控) + JSONObject nodeSnapshot = new JSONObject(); + nodeSnapshot.put("nodeSnapshot",JSON.parseArray(engineNode.getNodeJson())); + outMap.put("nodeSnapshot",nodeSnapshot); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode",engineNode); + nodeInfo.put("nodeId",engineNode.getNodeId()); + nodeInfo.put("nodeName",engineNode.getNodeName()); + nodeInfo.put("nodeType",engineNode.getNodeType()); + outMap.put("nodeInfo",nodeInfo); + int num = 0;//随机生成的数 + int startNum = 0; + int endNum = 0; + for (int i = 0; i < list.size(); i++) { + Sandbox sandbox = list.get(i); + endNum = startNum + sandbox.getProportion(); + if (num == 0) + num = getRandoms(0, sandbox.getSum(), 1)[0]; + int[] range = getRandoms(startNum, endNum, sandbox.getProportion()); + for (int j = 0; j < range.length; j++) { + if (range[j] == num) { + if (StringUtils.isBlank(sandbox.getNextNode())) { + List sblist = JSON.parseArray(engineNode.getNodeJson(), Sandbox.class); + for (Sandbox sb : sblist) { + if (sb.getSandbox() == sandbox.getSandbox()) { + sandbox.setNextNode(sb.getNextNode()); + break; + } + } + } + + outMap.put("nextNode", sandbox.getNextNode()); + JSONObject nodeResult = new JSONObject(); + nodeResult.put("nodeResult",sandbox.getNextNode()); + outMap.put("nodeResult",nodeResult); + break; + } + } + startNum = endNum; + } + } + } + + /** + * 根据min和max随机生成count个不重复的随机数组 + * + * @param min + * @param max + * @param count + * @return int[] + */ + public int[] getRandoms(int min, int max, int count) { + int[] randoms = new int[count]; + List listRandom = new ArrayList(); + + if (count > (max - min + 1)) { + return null; + } + // 将所有的可能出现的数字放进候选list + for (int i = min; i < max; i++) { + listRandom.add(i); + } + // 从候选list中取出放入数组,已经被选中的就从这个list中移除 + for (int i = 0; i < count; i++) { + int index = getRandom(0, listRandom.size() - 1); + randoms[i] = listRandom.get(index); + listRandom.remove(index); + } + + return randoms; + } + + /** + * 根据min和max随机生成一个范围在[min,max]的随机数,包括min和max + * + * @param min + * @param max + * @return int + */ + public int getRandom(int min, int max) { + Random random = new Random(); + return random.nextInt(max - min + 1) + min; + } +} diff --git a/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ScorecardNode.java b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ScorecardNode.java new file mode 100644 index 0000000..b15c179 --- /dev/null +++ b/ddp-enginex/runner-node/src/main/java/com/fibo/ddp/enginex/runner/node/impl/ScorecardNode.java @@ -0,0 +1,264 @@ +package com.fibo.ddp.enginex.runner.node.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.enginex.risk.EngineNode; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDetail; +import com.fibo.ddp.common.model.strategyx.scorecard.ScorecardDimension; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardDetailVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardDimensionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.datax.runner.CommonService; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDetailService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardDimensionService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.utils.util.runner.JevalUtil; +import com.fibo.ddp.common.utils.util.runner.StrUtils; +import com.fibo.ddp.common.utils.util.runner.jeval.EvaluationException; +import com.fibo.ddp.enginex.runner.node.EngineRunnerNode; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class ScorecardNode implements EngineRunnerNode { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private CommonService commonService; + + @Resource + public FieldService fieldService; + + @Resource + public ScorecardService scorecardService; + + @Autowired + private ScorecardDimensionService scorecardDimensionService; // 维度 + + @Autowired + private ScorecardDetailService scorecardDetailService; // 明细 + + private List getExecuteVersionIdList(EngineNode engineNode) { + return ExecuteUtils.getExecuteIdList(engineNode,"versionId"); + } + + @Override + public void getNodeField(EngineNode engineNode, Map inputParam) { + List versionIdList = getExecuteVersionIdList(engineNode); + Set fieldIdSet = new HashSet<>(); + for (Long versionId : versionIdList) { + List scorecardDimensions = scorecardDimensionService.getDimensionListByVersionId(versionId); + + List dimensionIds = scorecardDimensions.stream().map(item -> item.getId()).collect(Collectors.toList()); + + List scorecardDetails = scorecardDetailService.getDetailListByDimensionIds(dimensionIds); + fieldIdSet.addAll(scorecardDetails.stream().map(item -> Long.valueOf(item.getFieldId().toString())).collect(Collectors.toSet())); + } + List ids = new ArrayList<>(fieldIdSet); + + commonService.getFieldByIds(ids, inputParam); + } + + @Override + public void runNode(EngineNode engineNode, Map inputParam, Map outMap) { + //监控中心--节点快照信息 + if (engineNode != null && engineNode.getSnapshot() != null) { + outMap.put("nodeSnapshot", engineNode.getSnapshot()); + } + List versionIdList = getExecuteVersionIdList(engineNode); + for (Long versionId : versionIdList) { + ScorecardVo scorecard = scorecardService.queryExecuteScorecard(versionId); + JSONObject nodeInfo = new JSONObject(); + nodeInfo.put("engineNode", engineNode); + nodeInfo.put("nodeId", engineNode.getNodeId()); + nodeInfo.put("nodeName", engineNode.getNodeName()); + nodeInfo.put("nodeType", engineNode.getNodeType()); + outMap.put("nodeInfo", nodeInfo); + + List hitDetailList = new ArrayList<>(); // 命中的评分字段列表 + ScorecardVersionVo versionVo = scorecard.getExecuteVersion(); + List scorecardDimensions = new ArrayList<>(); + if (versionVo != null) { + //监控中心 == 策略层面快照信息 + if (versionVo != null && versionVo.getSnapshot() != null) { + outMap.put("scorecardStrategy", versionVo.getSnapshot()); + } + scorecardDimensions = versionVo.getScorecardDimension(); + for (ScorecardDimensionVo scorecardDimensionVo : scorecardDimensions) { + List scorecardDetailVoList = scorecardDimensionVo.getChildren(); + scorecardHit(hitDetailList, 0, scorecardDetailVoList, inputParam); + } + } + Double totalScore = 0d; + List scoreDetail = new ArrayList<>(); + for (ScorecardDimension scorecardDimension : scorecardDimensions) { + Double dimensionScore = 0d; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("dimensionName", scorecardDimension.getDimensionName()); + jsonObject.put("dimensionId", scorecardDimension.getId()); + for (ScorecardDetail scorecardDetail : hitDetailList) { + if (!scorecardDetail.getDimensionId().equals(scorecardDimension.getId())) { + continue; + } + String fieldEn = scorecardDetail.getFieldEn(); + Integer scoreCalculateType = scorecard.getScoreCalculateType(); + Integer calculateType = scorecardDetail.getCalculateType(); + // 计算方式为 得分 + if (calculateType == 1) { + if (scoreCalculateType == 1) { // 评分计算方式为 求和 + Double value = scorecardDetail.getScore(); + totalScore += value; + dimensionScore += value; + } else if (scoreCalculateType == 2) { // 评分计算方式为 加权求和 + Double value = scorecardDetail.getScore() * scorecardDimension.getWeight(); + totalScore += value; + dimensionScore += value; + } + } + // 计算方式为 系数 + else if (calculateType == 2) { + if (scoreCalculateType == 1) { // 评分计算方式为 求和 + Double value = Double.valueOf(inputParam.get(fieldEn).toString()) * scorecardDetail.getCoefficient(); + totalScore += value; + dimensionScore += value; + } else if (scoreCalculateType == 2) { // 评分计算方式为 加权求和 + Double value = Double.valueOf(inputParam.get(fieldEn).toString()) * scorecardDetail.getCoefficient() * scorecardDimension.getWeight(); + totalScore += value; + dimensionScore += value; + } + } + // 计算方式为 自定义 + else if (calculateType == 3) { + double value = 0d; + String custom = scorecardDetail.getCustom(); + if (custom != null && !"".equals(custom)) { + Double result = StrUtils.strToDouble(ExecuteUtils.getObjFromScript(inputParam, custom).toString()); + if (result != null) { + value = result; + } + } + totalScore += value; + dimensionScore += value; + } + } + jsonObject.put("score", dimensionScore); + scoreDetail.add(jsonObject); + } + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nodeId", engineNode.getNodeId()); + jsonObject.put("nodeName", engineNode.getNodeName()); + jsonObject.put("cardId", scorecard.getId()); + jsonObject.put("cardName", scorecard.getName()); + jsonObject.put("cardCode", scorecard.getCode()); + String versionCode = ""; + Long cardVersionId = null; + if (versionVo != null) { + versionCode = versionVo.getVersionCode(); + cardVersionId = versionVo.getId(); + } + + jsonObject.put("cardVersion", versionCode); + jsonObject.put("cardVersionId",cardVersionId); + jsonObject.put("desc", scorecard.getDescription()); + jsonObject.put("score", totalScore); + jsonObject.put("scoreDetail", scoreDetail); + //给入参中放入评分卡执行结果 + String resultFieldEn = versionVo.getResultFieldEn(); + if (StringUtils.isBlank(resultFieldEn)) { + resultFieldEn = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_" + versionVo.getId() + "_score"; + } + inputParam.put(resultFieldEn, totalScore); + inputParam.put(scorecard.getCode(), totalScore); + List fieldList = new ArrayList<>(); + JSONObject scoreResult = new JSONObject(); + scoreResult.put(resultFieldEn, totalScore); + fieldList.add(scoreResult); + if (totalScore != 0) { + List jsonObjects = scorecardService.setOutput(scorecard.getId(), inputParam); + fieldList.addAll(jsonObjects); + } + jsonObject.put("fieldList", fieldList); + //监控中心==》将评分卡的执行结果得分明细放入 输出变量池 用于存入hbase + outMap.put("nodeResult", jsonObject); + if (outMap.containsKey("scoreJson")) { + JSONArray resultJson = (JSONArray) outMap.get("scoreJson"); + resultJson.add(jsonObject); + } else { + JSONArray resultJson = new JSONArray(); + resultJson.add(jsonObject); + outMap.put("scoreJson", resultJson); + } + terminalCondition(engineNode,inputParam,outMap,totalScore); + } + } + + /** + * 评分卡命中判断 + * + * @param hitDetailList + * @param detailId + * @param scorecardDetailVoList + * @param inputParam + */ + private void scorecardHit(List hitDetailList, Integer detailId, List scorecardDetailVoList, Map inputParam) { + List scorecardDetailVos = scorecardDetailVoList.stream().filter(item -> item.getParentId().equals(detailId)).collect(Collectors.toList()); + for (ScorecardDetailVo scorecardDetailVo : scorecardDetailVos) { + Field field = fieldService.queryById(Long.valueOf(scorecardDetailVo.getFieldId())); + String fieldEn = field.getFieldEn(); + scorecardDetailVo.setFieldEn(fieldEn); + + String condition = scorecardDetailVo.getCondition(); + Boolean isHit = isScoreFieldValue(inputParam, fieldEn, condition); + if (isHit) { + if (scorecardDetailVo.getType() == 1) { + hitDetailList.add(scorecardDetailVo); + } else { + this.scorecardHit(hitDetailList, scorecardDetailVo.getId(), scorecardDetailVoList, inputParam); + } + } + } + } + + /** + * 评分卡字段是否在区间内 + * + * @param map + * @param fieldCode + * @param condition + * @return + */ + private Boolean isScoreFieldValue(Map map, String fieldCode, String condition) { + if ("(,)".equals(condition)) { + return true; + } + String exp = JevalUtil.getNumericInterval(condition, fieldCode); + try { + if (JevalUtil.evaluateBoolean(exp, map)) { + return true; + } + } catch (EvaluationException e) { + e.printStackTrace(); + logger.error("请求异常", e); + } + return false; + } + + private void terminalCondition(EngineNode engineNode, Map inputParam, Map outMap,Object executeResult) { + String resultKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_score"; + Map map = new HashMap<>(); + map.put(resultKey,executeResult); + ExecuteUtils.terminalCondition(engineNode,inputParam,outMap, map); + } +} diff --git a/ddp-manager-web/pom.xml b/ddp-manager-web/pom.xml new file mode 100644 index 0000000..0c70ff7 --- /dev/null +++ b/ddp-manager-web/pom.xml @@ -0,0 +1,135 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + ddp-manager-web + jar + + + + + com.fibo.ddp + ddp-datax-realtime-field + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-strategyx-guide-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-script-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-score-card + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-list-library + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-ai-model + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-decision-table + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-decision-tree + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-collection-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-data-clean + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-tag + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-enginex-risk-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-dataflow-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-personas-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-marketing-engine + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-authx + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-monitor + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-analysis + 1.0-SNAPSHOT + + + + + + + src/main/java + + + **/*.xml + + + + + src/main/resources + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/JarDdpManagerWebApplication.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/JarDdpManagerWebApplication.java new file mode 100644 index 0000000..6a4d249 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/JarDdpManagerWebApplication.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.manager.web; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +@MapperScan({"com.fibo.ddp.common.dao.**"}) +@ComponentScan(basePackages = "com.fibo.ddp.**") +@EnableAsync +public class JarDdpManagerWebApplication { + + public static void main(String[] args) { + SpringApplication.run(JarDdpManagerWebApplication.class, args); + } + +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/aop/ExceptionAop.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/aop/ExceptionAop.java new file mode 100644 index 0000000..c3cdbff --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/aop/ExceptionAop.java @@ -0,0 +1,114 @@ +package com.fibo.ddp.manager.web.aop; + +import com.alibaba.fastjson.JSONObject; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.common.AccountSessionWrap; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.RequestUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartRequest; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +/** + * 异常处理 + */ +@Order(1) +@Aspect +@Component +public class ExceptionAop { + private static final Logger logger = LoggerFactory.getLogger(ExceptionAop.class); + public static final String EDP = "execution(* com.fibo.ddp..controller..*.*(..))"; + + /** + * 处理运行异常的切面 + */ + @Around(EDP) + public Object deal(ProceedingJoinPoint pjp) throws Throwable { + Object returnMessage = null; + Long beginTimeMills = System.currentTimeMillis(); + String className = pjp.getTarget().getClass().getName(); + String methodName = pjp.getSignature().getName(); + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + HttpServletRequest request = sra.getRequest(); + String addIp = RequestUtil.getClientIP(request); + String requestMethod = request.getMethod(); + StringBuffer requestURL = request.getRequestURL(); + MethodSignature methodSignature = (MethodSignature) pjp.getSignature(); + + AccountSessionWrap session = SessionManager.getSession(); + Long userId = session.getSysUser() != null && session.getSysUser().getUserId() != null ? session.getSysUser().getUserId() : 0; + String reqUuid = null; + String argsWrap = null; + + try { + reqUuid = session.getTraceId(); + argsWrap = getParam(pjp.getArgs(), methodSignature.getParameterNames()); + logger.info("===>> 切面BEGIN: {} - {} {} enter {}.{} method, ### traceId:{} ###, request args: {}, userId:{} ===>>", + addIp, requestMethod, requestURL, className, methodName, reqUuid, argsWrap, userId); + returnMessage = pjp.proceed(); + } catch (ApiException e1) { + logger.info("方法[" + pjp.getSignature().getName() + "]发生业务异常Exception-{}", e1); + returnMessage = ResponseEntityBuilder.buildErrorResponse(e1.errCode, e1.message); + } catch (NullPointerException e2) { + logger.error("方法[" + pjp.getSignature().getName() + "]发生运行时异常NullPointerException-{}", e2); + returnMessage = ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.NULL_POINT_EREXCEPTION.getCode(), ErrorCodeEnum.NULL_POINT_EREXCEPTION.getMessage()); + } catch (ClassCastException e2) { + logger.error("方法[" + pjp.getSignature().getName() + "]发生运行时异常ClassCastException-{}", e2); + returnMessage = ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.CLASS_CAST_EXCEPTION.getCode(), ErrorCodeEnum.CLASS_CAST_EXCEPTION.getMessage()); + } catch (Exception e2) { + logger.error("方法[" + pjp.getSignature().getName() + "]发生运行时异常Exception-{}", e2); + returnMessage = ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } catch (Throwable e) { + logger.error("方法[" + pjp.getSignature().getName() + "]发生运行时异常Throwable-{}", e); + returnMessage = ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + } + logger.info("<<==== 切面END: exit {}.{} method,### traceId:{}, userId:{}, cost time: {} ms ###, returnResult:{} <<====", + className, methodName, reqUuid, userId, (System.currentTimeMillis() - beginTimeMills), JSONObject.toJSONString(returnMessage)); + return returnMessage; + + } + + private String getParam(Object[] fieldValues, String[] filedNames) { + if (fieldValues == null + || fieldValues.length == 0 + || filedNames == null + || filedNames.length == 0 + || fieldValues.length != filedNames.length) { + return null; + } + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 0; i < fieldValues.length; i++) { + if (fieldValues[i] instanceof HttpServletRequest + || fieldValues[i] instanceof MultipartRequest + || fieldValues[i] instanceof HttpServletResponse + || fieldValues[i] instanceof HttpSession) { + continue; + } + stringBuffer.append("{"); + if (i < filedNames.length) { + stringBuffer.append(filedNames[i]); + stringBuffer.append(":"); + } + stringBuffer.append(JSONObject.toJSONString(fieldValues[i])); + stringBuffer.append("},"); + } + return stringBuffer.toString(); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ApplicationInitConfig.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ApplicationInitConfig.java new file mode 100644 index 0000000..3e032bc --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ApplicationInitConfig.java @@ -0,0 +1,37 @@ +package com.fibo.ddp.manager.web.config; + + + + +import com.fibo.ddp.common.service.authx.dictionary.DictionaryService; +import com.fibo.ddp.common.service.datax.cache.DataXCacheService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +@Component("applicationInitConfig") +@Slf4j +public class ApplicationInitConfig implements ApplicationListener { + + @Autowired + DictionaryService dictionaryService; + @Autowired + DataXCacheService dataXCacheService; + + @Override + //启动时将所有可连接的通道链接上 + public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { + initDictionary(); + initDataXCache(); + } + + private void initDictionary(){ + dictionaryService.refreshCache(); + } + + private void initDataXCache(){ + dataXCacheService.initRedisSub(); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigHolder.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigHolder.java new file mode 100644 index 0000000..e1e1b8b --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigHolder.java @@ -0,0 +1,61 @@ +package com.fibo.ddp.manager.web.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class ConfigHolder { + + //redisConfig + @Value("${redis.host}") + private String redisHost; + @Value("${redis.port}") + private int redisPort; + @Value("${redis.db}") + private int redisDb; + @Value("${redis.password}") + private String redisPwd; + @Value("${redis.pool.maxTotal}") + private int redisMaxTotal; + @Value("${redis.pool.maxIdle}") + private int redisMaxIdle; + @Value("${redis.pool.maxWait}") + private int redisMaxWait; + @Value("${redis.pool.timeout}") + private int redisTimeout; + + @Value("${monitor.data.storage.type}") + private String monitorStoreType; + //jdbcConfig + /*@Value("${jdbc.url}") + private String jdbcUrl; + @Value("${jdbc.driver}") + private String DriverName; + @Value("${pool.maxPoolSize}") + private int maxPoolSize; + @Value("${jdbc.username}") + private String jdbcUserName; + @Value("${jdbc.password}") + private String jdbcPwd; + @Value("${pool.maxWait}") + private int jdbcMaxWait; + @Value("${pool.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + @Value("${pool.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + @Value("${pool.validationQuery}") + private String validationQuery; + + //rabbitconfig + @Value("${rabbitMQ.host}") + private String rabbitHost; + @Value("${rabbitMQ.port}") + private int rabbitPort; + @Value("${rabbitMQ.username}") + private String rabbitUsername; + @Value("${rabbitMQ.password}") + private String rabbitPassword;*/ + +} \ No newline at end of file diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigurationContainor.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigurationContainor.java new file mode 100644 index 0000000..486535d --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/ConfigurationContainor.java @@ -0,0 +1,46 @@ +package com.fibo.ddp.manager.web.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +import javax.annotation.Resource; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +public class ConfigurationContainor { + + @Resource + private ConfigHolder configHolder; + + @Bean(name = "threadPoolTaskExecutor") + ThreadPoolTaskExecutor threadPoolTaskExecutor(){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(500); + executor.setMaxPoolSize(1000); + executor.setQueueCapacity(200); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); + return executor; + } + + @Bean(name = "jedisPool") + public JedisPool jedisPool(){ + JedisPoolConfig config = new JedisPoolConfig(); + config.setMaxTotal(configHolder.getRedisMaxTotal()); + config.setMaxIdle(configHolder.getRedisMaxIdle()); + config.setMaxWaitMillis(configHolder.getRedisMaxWait()); + config.setTestOnBorrow(true); +// config.setTestOnReturn(true); + + JedisPool pool = new JedisPool(config, + configHolder.getRedisHost(), + configHolder.getRedisPort(), + configHolder.getRedisTimeout(), + configHolder.getRedisPwd(), + configHolder.getRedisDb()); + return pool; + } + +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/DataSourceConfig.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/DataSourceConfig.java new file mode 100644 index 0000000..88e7429 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/DataSourceConfig.java @@ -0,0 +1,56 @@ +package com.fibo.ddp.manager.web.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + // 将所有前缀为spring.datasource.druid下的配置项都加载DataSource中 + @ConfigurationProperties(prefix = "spring.datasource.druid") + @Bean + public DruidDataSource druidDataSource() { + return new DruidDataSource(); + } + + @Bean(name = "dataSourceTransactionManager") + public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("druidDataSource") DruidDataSource defaultDataSource){ + DataSourceTransactionManager dm = new DataSourceTransactionManager(); + dm.setDataSource(defaultDataSource); + return dm; + } + + @Bean + public SqlSessionFactory sqlSessionFactory( + @Qualifier("druidDataSource") DataSource druidDataSource) + throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] mapperXmlResource = resolver.getResources("classpath*:**/*Mapper.xml"); + bean.setDataSource(druidDataSource); + bean.setMapperLocations(mapperXmlResource); + bean.setTypeAliasesPackage("com.fibo.ddp.common.model"); + bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); + bean.getObject().getConfiguration().setCacheEnabled(false); + return bean.getObject(); + } + + @Bean(name = "sqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) + throws Exception { + return new SqlSessionTemplate(sqlSessionFactory); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/RestTemplateConfig.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/RestTemplateConfig.java new file mode 100644 index 0000000..ab6eada --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/RestTemplateConfig.java @@ -0,0 +1,27 @@ +package com.fibo.ddp.manager.web.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate配置类 + */ +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory){ + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(300000000);//单位为ms + factory.setConnectTimeout(500000000);//单位为ms + return factory; + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/WebMvcConfig.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/WebMvcConfig.java new file mode 100644 index 0000000..2243e2e --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/config/WebMvcConfig.java @@ -0,0 +1,25 @@ +package com.fibo.ddp.manager.web.config; + + +import com.fibo.ddp.manager.web.interceptor.SessionInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Autowired + private SessionInterceptor sessionInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 添加拦截器 + registry.addInterceptor(sessionInterceptor) + .excludePathPatterns("") // 排除拦截器要拦截的路径 + .addPathPatterns("/**"); // 添加拦截器需要要拦截的路径 + + } + +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/AppTemplateController.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/AppTemplateController.java new file mode 100644 index 0000000..b763ddb --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/AppTemplateController.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.manager.web.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.message.template.entity.AppTemplate; +import com.fibo.ddp.common.model.common.message.template.vo.AppTemplateReqVo; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.common.message.template.AppTemplateService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * APP推送模板表(AppTemplate)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@RestController +@RequestMapping("message/appTemplate") +public class AppTemplateController { + + @Autowired + private AppTemplateService appTemplateService; + + @PostMapping("queryListByPage") + public ResponseEntityDto> queryListByPage(@RequestBody AppTemplateReqVo appTemplateReqVo){ + Long organId = SessionManager.getLoginAccount().getOrganId(); + PageHelper.startPage(appTemplateReqVo.getPageNo(), appTemplateReqVo.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppTemplate::getOrganId, organId); + queryWrapper.ne(AppTemplate::getStatus, -1); + List list = appTemplateService.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(list); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @PostMapping("queryById/{id}") + public ResponseEntityDto queryById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.appTemplateService.getById(id)); + } + + /** + * 新增数据 + * + * @param appTemplate 实体 + * @return 新增是否成功 + */ + @PostMapping("add") + public ResponseEntityDto add(@RequestBody AppTemplate appTemplate) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + appTemplate.setOrganId(organId.intValue()); + return ResponseEntityBuilder.buildNormalResponse(this.appTemplateService.save(appTemplate)); + } + + /** + * 编辑数据 + * + * @param appTemplate 实体 + * @return 编辑是否成功 + */ + @PostMapping("edit") + public ResponseEntityDto edit(@RequestBody AppTemplate appTemplate) { + return ResponseEntityBuilder.buildNormalResponse(this.appTemplateService.updateById(appTemplate)); + } + + /** + * 删除数据 + * + * @param id 主键 + * @return 删除是否成功 + */ + @PostMapping("deleteById/{id}") + public ResponseEntityDto deleteById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.appTemplateService.removeById(id)); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/MessageSendRecordController.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/MessageSendRecordController.java new file mode 100644 index 0000000..a3eda85 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/MessageSendRecordController.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.manager.web.controller; + +import com.fibo.ddp.common.service.common.message.template.MessageSendRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 消息发送记录表(MessageSendRecord)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:13:24 + */ +@RestController +@RequestMapping("message/messageSendRecord") +public class MessageSendRecordController { + + @Autowired + private MessageSendRecordService messageSendRecordService; + +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/SmsTemplateController.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/SmsTemplateController.java new file mode 100644 index 0000000..1a485e5 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/SmsTemplateController.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.manager.web.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.message.template.entity.SmsTemplate; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.common.message.template.SmsTemplateService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 短信模板表(SmsTemplate)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@RestController +@RequestMapping("message/smsTemplate") +public class SmsTemplateController { + + @Autowired + private SmsTemplateService smsTemplateService; + + @PostMapping("queryListByPage") + public ResponseEntityDto> queryListByPage(@RequestBody BaseParam baseParam){ + Long organId = SessionManager.getLoginAccount().getOrganId(); + PageHelper.startPage(baseParam.getPageNo(), baseParam.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SmsTemplate::getOrganId, organId); + queryWrapper.ne(SmsTemplate::getStatus, -1); + List list = smsTemplateService.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(list); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @PostMapping("queryById/{id}") + public ResponseEntityDto queryById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.smsTemplateService.getById(id)); + } + + /** + * 新增数据 + * + * @param smsTemplate 实体 + * @return 新增是否成功 + */ + @PostMapping("add") + public ResponseEntityDto add(@RequestBody SmsTemplate smsTemplate) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + smsTemplate.setOrganId(organId.intValue()); + return ResponseEntityBuilder.buildNormalResponse(this.smsTemplateService.save(smsTemplate)); + } + + /** + * 编辑数据 + * + * @param smsTemplate 实体 + * @return 编辑是否成功 + */ + @PostMapping("edit") + public ResponseEntityDto edit(@RequestBody SmsTemplate smsTemplate) { + return ResponseEntityBuilder.buildNormalResponse(this.smsTemplateService.updateById(smsTemplate)); + } + + /** + * 删除数据 + * + * @param id 主键 + * @return 删除是否成功 + */ + @PostMapping("deleteById/{id}") + public ResponseEntityDto deleteById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.smsTemplateService.removeById(id)); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WebhookTemplateController.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WebhookTemplateController.java new file mode 100644 index 0000000..c93e382 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WebhookTemplateController.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.manager.web.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.message.template.entity.WebhookTemplate; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.common.message.template.WebhookTemplateService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * webhook模板表(WebhookTemplate)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:12:03 + */ +@RestController +@RequestMapping("message/webhookTemplate") +public class WebhookTemplateController { + + @Autowired + private WebhookTemplateService webhookTemplateService; + + @PostMapping("queryListByPage") + public ResponseEntityDto> queryListByPage(@RequestBody BaseParam baseParam){ + Long organId = SessionManager.getLoginAccount().getOrganId(); + PageHelper.startPage(baseParam.getPageNo(), baseParam.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WebhookTemplate::getOrganId, organId); + queryWrapper.ne(WebhookTemplate::getStatus, -1); + List list = webhookTemplateService.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(list); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @PostMapping("queryById/{id}") + public ResponseEntityDto queryById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.webhookTemplateService.getById(id)); + } + + /** + * 新增数据 + * + * @param webhookTemplate 实体 + * @return 新增是否成功 + */ + @PostMapping("add") + public ResponseEntityDto add(@RequestBody WebhookTemplate webhookTemplate) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + webhookTemplate.setOrganId(organId.intValue()); + return ResponseEntityBuilder.buildNormalResponse(this.webhookTemplateService.save(webhookTemplate)); + } + + /** + * 编辑数据 + * + * @param webhookTemplate 实体 + * @return 编辑是否成功 + */ + @PostMapping("edit") + public ResponseEntityDto edit(@RequestBody WebhookTemplate webhookTemplate) { + return ResponseEntityBuilder.buildNormalResponse(this.webhookTemplateService.updateById(webhookTemplate)); + } + + /** + * 删除数据 + * + * @param id 主键 + * @return 删除是否成功 + */ + @PostMapping("deleteById/{id}") + public ResponseEntityDto deleteById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.webhookTemplateService.removeById(id)); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WechatTemplateController.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WechatTemplateController.java new file mode 100644 index 0000000..48f7d80 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/controller/WechatTemplateController.java @@ -0,0 +1,87 @@ +package com.fibo.ddp.manager.web.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fibo.ddp.common.model.common.BaseParam; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.message.template.entity.WechatTemplate; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.common.message.template.WechatTemplateService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 微信服务号模板表(WechatTemplate)表控制层 + * + * @author andy.wang + * @since 2022-01-07 18:11:16 + */ +@RestController +@RequestMapping("message/wechatTemplate") +public class WechatTemplateController { + + @Autowired + private WechatTemplateService wechatTemplateService; + + @PostMapping("queryListByPage") + public ResponseEntityDto> queryListByPage(@RequestBody BaseParam baseParam){ + Long organId = SessionManager.getLoginAccount().getOrganId(); + PageHelper.startPage(baseParam.getPageNo(), baseParam.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WechatTemplate::getOrganId, organId); + queryWrapper.ne(WechatTemplate::getStatus, -1); + List list = wechatTemplateService.list(queryWrapper); + PageInfo pageInfo = new PageInfo<>(list); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @PostMapping("queryById/{id}") + public ResponseEntityDto queryById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.wechatTemplateService.getById(id)); + } + + /** + * 新增数据 + * + * @param wechatTemplate 实体 + * @return 新增是否成功 + */ + @PostMapping("add") + public ResponseEntityDto add(@RequestBody WechatTemplate wechatTemplate) { + Long organId = SessionManager.getLoginAccount().getOrganId(); + wechatTemplate.setOrganId(organId.intValue()); + return ResponseEntityBuilder.buildNormalResponse(this.wechatTemplateService.save(wechatTemplate)); + } + + /** + * 编辑数据 + * + * @param wechatTemplate 实体 + * @return 编辑是否成功 + */ + @PostMapping("edit") + public ResponseEntityDto edit(@RequestBody WechatTemplate wechatTemplate) { + return ResponseEntityBuilder.buildNormalResponse(this.wechatTemplateService.updateById(wechatTemplate)); + } + + /** + * 删除数据 + * + * @param id 主键 + * @return 删除是否成功 + */ + @PostMapping("deleteById/{id}") + public ResponseEntityDto deleteById(@PathVariable Integer id) { + return ResponseEntityBuilder.buildNormalResponse(this.wechatTemplateService.removeById(id)); + } +} diff --git a/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/interceptor/SessionInterceptor.java b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/interceptor/SessionInterceptor.java new file mode 100644 index 0000000..2477613 --- /dev/null +++ b/ddp-manager-web/src/main/java/com/fibo/ddp/manager/web/interceptor/SessionInterceptor.java @@ -0,0 +1,99 @@ +package com.fibo.ddp.manager.web.interceptor; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.common.AccountSessionWrap; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.redis.RedisManager; +import com.fibo.ddp.common.utils.constant.Constants; +import com.fibo.ddp.common.utils.constant.ServiceFilterConstant; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.RequestUtil; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.util.UUID; + +/** + * 会话拦截器 + */ +@Component +public class SessionInterceptor extends HandlerInterceptorAdapter { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private RedisManager redisManager; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String uri = request.getRequestURI(); + String ip = RequestUtil.getClientIP(request); + AccountSessionWrap acsw = new AccountSessionWrap(ip, uri); + String reqUuid = UUID.randomUUID().toString().replaceAll("-", ""); + String requestMethod = request.getMethod(); + StringBuffer requestURL = request.getRequestURL(); + acsw.setTraceId(reqUuid); + String token = request.getHeader(Constants.SYSTEM_KEY_TOKEN); + logger.debug("===>> 【会话拦截】-BEGIN: {} - {} {}, ### traceId:{},{}, token:{} ### ===>>", ip, requestMethod, requestURL, reqUuid, uri, token); + SessionManager.setSession(acsw); + if (ServiceFilterConstant.isSessionFilter(uri)) { + return true; + } + if (StringUtils.isBlank(token)) { + output(response, ErrorCodeEnum.ERROR_TOKEN_EXPIRE.getCode(),ErrorCodeEnum.ERROR_TOKEN_EXPIRE.getMessage()); + return false; + } + + try { + String value = redisManager.get(token); + if(StringUtils.isBlank(value)){ + output(response, ErrorCodeEnum.ERROR_TOKEN_EXPIRE.getCode(),ErrorCodeEnum.ERROR_TOKEN_EXPIRE.getMessage()); + return false; + } + + // token更新频率,设置离过期时间还剩n秒以内才更新一次token + Long time = redisManager.ttl(token); + if(time.intValue() <= Constants.LOGIN_TOKEN_REFRESH_TIME.intValue()){ + redisManager.set(token, value, Constants.LOGIN_TOKEN_TIME.intValue()); + } + + SysUser sysUser = JSONObject.parseObject(value, SysUser.class); + acsw.setSysUser(sysUser); + } catch (ApiException e1) { + output(response, e1.errCode, e1.getMessage()); + return false; + } catch (Exception e) { + logger.error("【会话拦截】调用Token验证服务异常,uri:{},token:{},IP:{}",uri,token,ip,e); + output(response, ErrorCodeEnum.SERVER_ERROR.getCode(), ErrorCodeEnum.SERVER_ERROR.getMessage()); + return false; + } + + return true; + } + + private void output(HttpServletResponse response, String errCode, String errMsg) { + ResponseEntityDto ret = ResponseEntityBuilder.buildErrorResponse(errCode, errMsg); + try { + logger.info("【会话拦截】未通过,{\"errCode\":" + errCode + ",\"errMsg:\":" + errMsg + "}"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Type", "application/json;charset=UTF-8"); + byte[] jsonBytes = JSON.toJSONBytes(ret); + OutputStream output = response.getOutputStream(); + output.write(jsonBytes); + output.flush(); + } catch (IOException e) { + logger.error("【会话拦截】输出响应报文异常!,{},{}",errCode,errMsg, e); + } + } +} \ No newline at end of file diff --git a/ddp-manager-web/src/main/resources/application-dev.properties b/ddp-manager-web/src/main/resources/application-dev.properties new file mode 100644 index 0000000..829af3d --- /dev/null +++ b/ddp-manager-web/src/main/resources/application-dev.properties @@ -0,0 +1,62 @@ +server.port=8080 +server.servlet.context-path=/Riskmanage + +logging.config=classpath:logging-config.xml + +# mysql +spring.datasource.druid.url=jdbc:mysql://localhost:3306/riskmanage?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true +spring.datasource.druid.username=root +spring.datasource.druid.password=enginex +spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.druid.initialSize=20 +spring.datasource.druid.minIdle=20 +spring.datasource.druid.maxActive=100 +spring.datasource.druid.maxWait=60000 +spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 +spring.datasource.druid.minEvictableIdleTimeMillis=300000 +spring.datasource.druid.testWhileIdle=true +spring.datasource.druid.testOnBorrow=true +spring.datasource.druid.testOnReturn=false +spring.datasource.druid.poolPreparedStatements=true +spring.datasource.druid.maxOpenPreparedStatements=20 +spring.datasource.druid.validationQuery=SELECT 1 +spring.datasource.druid.validation-query-timeout=500 +spring.datasource.druid.filters=stat + +# redis +redis.host=localhost +redis.port=6379 +redis.db=0 +redis.password=enginex +redis.pool.maxTotal=3000 +redis.pool.maxIdle=100 +redis.pool.maxWait=1000 +redis.pool.timeout=100000 + +# mail +spring.mail.host=smtp.exmail.qq.com +spring.mail.username=xxx +spring.mail.password=xxx +spring.mail.port=465 +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.timeout=50000 +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.socketFactory.port=465 +spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory +spring.mail.properties.mail.smtp.socketFactory.fallback=false + +# hbase +spring.data.hbase.quorum: localhost:2181 +spring.data.hbase.rootDir: /usr/local/hbase/datatest +spring.data.hbase.nodeParent: /hbase + +runner.url: http://localhost:8081 + +# \u76D1\u63A7\u4E2D\u5FC3 \u6570\u636E\u5B58\u50A8\u65B9\u5F0F mysql \u6216\u8005 hbase +monitor.data.storage.type=mysql + +# canal +switch.use.cache=off +switch.canal.cache=off +canal.hostname=localhost +canal.port=11111 \ No newline at end of file diff --git a/ddp-manager-web/src/main/resources/application.properties b/ddp-manager-web/src/main/resources/application.properties new file mode 100644 index 0000000..257b306 --- /dev/null +++ b/ddp-manager-web/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.profiles.active=dev \ No newline at end of file diff --git a/ddp-manager-web/src/main/resources/logging-config.xml b/ddp-manager-web/src/main/resources/logging-config.xml new file mode 100644 index 0000000..a6ff773 --- /dev/null +++ b/ddp-manager-web/src/main/resources/logging-config.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-modelx/pom.xml b/ddp-modelx/pom.xml new file mode 100644 index 0000000..e4c08b0 --- /dev/null +++ b/ddp-modelx/pom.xml @@ -0,0 +1,15 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-modelx + + + \ No newline at end of file diff --git a/ddp-monitor/pom.xml b/ddp-monitor/pom.xml new file mode 100644 index 0000000..1d8b8c3 --- /dev/null +++ b/ddp-monitor/pom.xml @@ -0,0 +1,21 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-monitor + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorCenterFactory.java b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorCenterFactory.java new file mode 100644 index 0000000..eb5a0d8 --- /dev/null +++ b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorCenterFactory.java @@ -0,0 +1,26 @@ +package com.fibo.ddp.monitor.controller.decisionflow; + +import com.fibo.ddp.common.service.monitor.decisionflow.IMonitorService; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class MonitorCenterFactory implements ApplicationContextAware{ + private static Map monitorCenterDiffStorageBeanMap; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map map = applicationContext.getBeansOfType(IMonitorService.class); + monitorCenterDiffStorageBeanMap = new HashMap<>(); + map.forEach((key,value)->monitorCenterDiffStorageBeanMap.put(value.getStorageType(),value)); + } + + public static T getMonitorCenterServiceImp(String storageType){ + return (T)monitorCenterDiffStorageBeanMap.get(storageType); + } +} diff --git a/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorController.java b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorController.java new file mode 100644 index 0000000..1f45c0e --- /dev/null +++ b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/decisionflow/MonitorController.java @@ -0,0 +1,127 @@ +package com.fibo.ddp.monitor.controller.decisionflow; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.enginex.risk.EngineResultSet; +import com.fibo.ddp.common.model.monitor.decisionflow.DecisionFlowRequestDTO; +import com.fibo.ddp.common.utils.constant.monitor.MonitorStorageType; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @apiDefine 决策流运行轨迹 + */ +@RestController +@RequestMapping("/v2/monitor") +public class MonitorController { + + private static final Logger logger = LoggerFactory.getLogger(MonitorController.class); + + /** + * @api {POST} /v2/monitor/results 8.10.01. 结果集 页面内容 list + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 * @apiParam {Number} engineId 引擎id + * @apiParam {String} [startDate] 开始时间,示例:"2021-03-26 23:59:59" 或 "2020-03-26" + * @apiParam {String} [endDate] 结束时间,示例:"2021-03-26 23:59:59" 或 "2020-03-26" + * @apiParam {String} [businessId] 业务ID + * @apiParam {Number} [pageNo=1] 第几页 + * @apiParam {Number} [pageSize=10] 每页的条数 + * {"engineId":213,"startDate":"2018-03-26","endDate":"2021-03-26 23:59:59","pageNo":1,"pageSize":10} + * @apiSuccessExample {json} 成功返回数据示例 + * {"status":"1","error":"00000000","msg":null,"data":{"engineId":213,"startDate":"2018-03-26","endDate":"2021-03-26 23:59:59","pageNo":1,"pageSize":10,"pager":{"pageNum":1,"pageSize":10,"size":10,"startRow":1,"endRow":10,"total":839,"pages":84,"list":[{"id":888,"uid":"15662010322","pid":"10001","input":"{\"queryKey\":\"t0 = '370983'\",\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":1,\"f_mx_dial_cnt\":94,\"tableName\":\"organ_46_b_115\",\"f_ms_mac_num\":0,\"f_mx_contact_loan\":1,\"revQueryKey\":\"\",\"ND_10_3020\":\"1\",\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"370983\",\"f_mx_idcard_with_other_names\":0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_score\":578,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"山东省泰安市岱岳区\",\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":180,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_first_trans_start_end_time\":180,\"f_mx_idcard_match\":1,\"f_ms_contact_abnormal_name_length_rate\":0.13,\"f_ms_imei_num\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"nodeName\":\"黑名单_2\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":3,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":76,\"f_ms_isolduser\":0,\"f_mx_contacts_router_ratio\":0.03,\"f_mx_reliability\":1,\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":231,\"f_mx_contact_credit_card\":1,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_mx_call_cnt_rata\":108.33,\"f_ms_contact_num\":227,\"listDb\":{\"id\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":29,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_hit_black_device_list\":0,\"f_ms_present_address_detail\":\"泺亨国际一号楼一单元1801\"}","output":null,"create_datetime":1561023271000,"result":"1","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":"决策选项_10:1","batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]},{"id":886,"uid":"15878591521","pid":"10001","input":"{\"nodeName\":\"黑名单_2\",\"queryKey\":\"t0 = '450981'\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":2,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":63,\"f_ms_isolduser\":0,\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":0,\"f_mx_dial_cnt\":79,\"tableName\":\"organ_46_b_115\",\"f_mx_contacts_router_ratio\":0.0,\"f_ms_mac_num\":0,\"f_mx_reliability\":1,\"f_mx_contact_loan\":0,\"revQueryKey\":\"\",\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":367,\"f_mx_contact_credit_card\":0,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"450981\",\"f_mx_idcard_with_other_names\":0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"广西玉林市北流市\",\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":0,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_call_cnt_rata\":148.67,\"f_ms_contact_num\":40,\"f_mx_first_trans_start_end_time\":174,\"f_mx_idcard_match\":1,\"listDb\":{\"id\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":24,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_contact_abnormal_name_length_rate\":0.05,\"f_ms_imei_num\":0,\"f_ms_hit_black_device_list\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"f_ms_present_address_detail\":\"新城国际69栋二单元502\"}","output":null,"create_datetime":1561023270000,"result":"拒绝","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":null,"batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]},{"id":887,"uid":"13359659815","pid":"10001","input":"{\"queryKey\":\"t0 = '230521'\",\"schemaName\":\"riskmanage\",\"f_mx_contacts_class1_blacklist_cnt\":0,\"f_mx_dial_cnt\":716,\"tableName\":\"organ_46_b_115\",\"f_ms_mac_num\":0,\"f_mx_contact_loan\":0,\"revQueryKey\":\"\",\"ND_10_3020\":\"3\",\"f_ms_imsi_num\":0,\"f_ms_id_card\":\"230521\",\"f_mx_idcard_with_other_names\":0,\"f_mx_phone_with_other_idcards\":0,\"f_mx_score\":323,\"f_mx_roam_day_cnt_3m\":0,\"f_ms_present_address\":\"黑龙江省双鸭山集贤县\",\"f_ms_hit_address_black_list\":0,\"f_mx_second_trans_start_end_time\":171,\"f_mx_phone_with_other_names\":0,\"f_mx_name_match\":1,\"f_ms_contact_abnormal_phone_rate\":0.0,\"f_mx_first_trans_start_end_time\":133,\"f_mx_idcard_match\":1,\"f_ms_contact_abnormal_name_length_rate\":0.19,\"f_ms_imei_num\":0,\"nodeId\":2959,\"f_ms_idfa_num\":0,\"nodeName\":\"黑名单_2\",\"f_ms_uuid_num\":0,\"f_mx_contact_bank\":0,\"f_ms_iswhitelist\":0,\"f_mx_phone_used_time\":67,\"f_ms_isolduser\":0,\"f_mx_contacts_router_ratio\":0.02,\"f_mx_reliability\":1,\"f_mx_is_name_and_idcard_in_court_black\":0,\"f_mx_dialed_cnt\":426,\"f_mx_contact_credit_card\":0,\"f_ms_contact_same_province_rate\":0.0,\"f_ms_contact_abnormal_name_rate\":0.0,\"f_mx_is_name_and_idcard_in_finance_black\":0,\"f_mx_call_cnt_rata\":380.67,\"f_ms_contact_num\":121,\"listDb\":{\"id\":115,\"listDesc\":\"户籍地限制区域\",\"listName\":\"身份证户籍地_黑名单\",\"listType\":\"b\",\"matchType\":1,\"page\":0,\"queryField\":\"698\",\"queryType\":0,\"rows\":0},\"f_ms_age\":31,\"f_ms_hit_black_list\":0,\"f_mx_is_name_and_mobile_in_finance_black\":0,\"f_ms_hit_black_device_list\":0,\"f_ms_present_address_detail\":\"福利镇繁荣街征港48号\"}","output":null,"create_datetime":1561023270000,"result":"3","engine_id":213,"engine_version":null,"uuid":null,"engine_name":"准入引擎","engine_code":"8bff0e95-3ba9-4b59-b9a0-8e11b6a830fa","startDate":null,"endDate":null,"type":2,"subVersion":0,"scorecardscore":null,"datilResult":"决策选项_10:3","batchNo":null,"startTime":null,"costTime":null,"resultSetList":[]}],"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"firstPage":1,"lastPage":8}}} + */ + @RequestMapping(value = "/results", method = RequestMethod.POST) + public ResponseEntityDto getResults(@RequestBody Map param) { + logger.info("/v2/monitor//results inputParam :{}",param); + Integer pageNo = param.get("pageNo") == null ? 1 : Integer.valueOf(param.get("pageNo").toString()); + Integer pageSize = param.get("pageSize") == null ? 10 : Integer.valueOf(param.get("pageSize").toString()); + PageHelper.startPage(pageNo, pageSize); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.HBase).getEngineResultSetBySegment(param); + PageInfo pageInfo = new PageInfo<>(resultSets); + HashMap modelMap = new HashMap<>(); + modelMap.put("pager", pageInfo); + modelMap.putAll(param); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + + /** + * @api {POST} /v2/monitor/decisionFlow 8.10.01. 查看决策流某条对应的详情(全部节点树以及执行过的节点轨迹) + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 * @apiParam {hbaseRowKey} hbase行键 行键 + * @apiParam {String} [hbaseRowKey] hbase行键,示例:'09223370413793177785' + * {"hbaseRowKey":"09223370413793177785"} + * @apiSuccessExample {json} 成功返回数据示例 + *"status":"1","error":"00000000","msg":null,"data":[{"rowKey":3474863778681796400,"monitorInfo":{"params":{"99":10,"f_hr_age":100,"4_3851_113_score":1,"vip1_user_num":100,"test1":1,"4_3861_114_score":10},"snapshot":[{"nodeId":3483,"parentId":null,"versionId":507,"nodeName":"开始","nodeCode":"ND_START","nodeOrder":1,"nodeType":1,"nodeX":-981,"nodeY":-352,"nodeScript":null,"nodeJson":null,"params":"{\"arr_linkId\":\"\",\"dataId\":\"-1\",\"url\":\"/Riskmanage/resource/images/decision/start.png\",\"type\":\"1\"}","nextNodes":"ND_7","cardId":null,"ruleList":null,"lastNextnode":null},{"nodeId":3851,"parentId":"3483","versionId":507,"nodeName":"评分卡","nodeCode":"ND_7","nodeOrder":7,"nodeType":4,"nodeX":-807.45,"nodeY":-354.3,"nodeScript":null,"nodeJson":"113","params":"{\"dataId\":5,\"url\":\"/Riskmanage/resource/images/decision/createScoreLevel.png\",\"type\":4}","nextNodes":"ND_11","cardId":null,"ruleList":null,"lastNextnode":null},{"nodeId":3861,"parentId":"3851","versionId":507,"nodeName":"评分卡","nodeCode":"ND_11","nodeOrder":11,"nodeType":4,"nodeX":-591.5,"nodeY":-355.32,"nodeScript":null,"nodeJson":"114","params":"{\"dataId\":5,\"url\":\"/Riskmanage/resource/images/decision/createScoreLevel.png\",\"type\":4}","nextNodes":null,"cardId":null,"ruleList":null,"lastNextnode":null}],"process":["3851","3861"]},"baseInfo":{"businessId":"\"113313131\"","engineName":"\"客户经理评分卡\"","engineVersionId":"\"507\"","engineInfo":null}}] + * */ + @RequestMapping(value = "/decisionFlow", method = RequestMethod.POST) + public ResponseEntityDto getResultDecisionFlowDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/decisionFlow inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.HBase).getResultDecisionFlowDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets); + } + + @RequestMapping(value = "/decisionFlowMysql", method = RequestMethod.POST) + public ResponseEntityDto getResultDecisionFlowMysqlDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/decisionFlowMysql inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.Mysql).getResultDecisionFlowDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets); + } + + + /** + * @api {POST} /v2/monitor/node 8.10.01. 查看节点配置详情(节点下配置等) + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 * @apiParam {hbaseRowKey} hbase行键 行键 + * @apiParam {String} [hbaseRowKey] hbase行键,示例:'09223370413793177785' + * {"hbaseRowKey":"09223370413793177785"} + * @apiSuccessExample {json} 成功返回数据示例 + * */ + @RequestMapping(value = "/node", method = RequestMethod.POST) + public ResponseEntityDto getResultNodeDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/node inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.HBase).getResultNodeDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets); + } + + @RequestMapping(value = "/nodeMysql", method = RequestMethod.POST) + public ResponseEntityDto getResultNodeMysqlDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/nodeMysql inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.Mysql).getResultNodeDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets); + } + /** + * @api {POST} /v2/monitor/strategy 8.10.01. 查看策略配置详情(具体策略下配置等) + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例 * @apiParam {hbaseRowKey} hbase行键 行键 + * @apiParam {String} [hbaseRowKey] hbase行键,示例:'09223370413793177785' + * {"hbaseRowKey":"09223370413793177785"} + * @apiSuccessExample {json} 成功返回数据示例 + * */ + @RequestMapping(value = "/strategy", method = RequestMethod.POST) + public ResponseEntityDto getResultStrategyDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/strategy inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.HBase).getResultStrategyDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets!=null?resultSets.get(0):""); + } + @RequestMapping(value = "/strategyMysql", method = RequestMethod.POST) + public ResponseEntityDto getResultStrategyMysqlDetail(@RequestBody DecisionFlowRequestDTO param) { + logger.info("/v2/monitor/strategyMysql inputParam :{}",param); + List resultSets = MonitorCenterFactory.getMonitorCenterServiceImp(MonitorStorageType.Mysql).getResultStrategyDetail(param); + return ResponseEntityBuilder.buildNormalResponse(resultSets); + } +} diff --git a/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/logger/LoggerController.java b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/logger/LoggerController.java new file mode 100644 index 0000000..d9a36e7 --- /dev/null +++ b/ddp-monitor/src/main/java/com/fibo/ddp/monitor/controller/logger/LoggerController.java @@ -0,0 +1,106 @@ +package com.fibo.ddp.monitor.controller.logger; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.monitor.logger.Logger; +import com.fibo.ddp.common.model.monitor.logger.request.LoggerParam; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.LogService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller("loggerControllerV2") +@RequestMapping("v2/sysLog") +@ResponseBody +public class LoggerController { + + @Autowired + private LogService loggerService; + + /** + * @api {POST} /v2/sysLog/getLogList 6.51. 获取日志列表 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Integer} pageNo 页数 + * @apiParam {Integer} pageSize 每页的条数 + * @apiParam {String} searchKey 搜索关键字 + * @apiParam {String} startDate 搜索开始时间 + * @apiParam {String} endDate 搜索结束时间 + * @apiSuccess {JSON} pager 分页信息 + * @apiSuccess {JSONArray} logList 日志列表 + * @apiSuccess (logList) {Long} userId 日志Id + * @apiSuccess (logList) {String} opType 操作类型 + * @apiSuccess (logList) {String} organName 公司名称 + * @apiSuccess (logList) {String} opName 操作名称 + * @apiSuccess (logList) {Long} opUserId 操作人员id + * @apiSuccess (logList) {String} opUserName 操作人员名称 + * @apiSuccess (logList) {Long} organId 组织id + * @apiSuccess (logList) {String} method 方法名 + * @apiSuccess (logList) {String} requestPath 请求地址 + * @apiSuccess (logList) {String} requestParam 请求参数 + * @apiSuccess (logList) {String} responseParam 响应参数 + * @apiSuccess (logList) {String} ip 请求ip + * @apiSuccess (logList) {Long} startTime 开始时间 + * @apiSuccess (logList) {Long} endTime 结束时间 + * @apiParamExample {json} 请求示例: + * {"pageNo":1,"pageSize":2,"searchKey":"修改","startDate":"2021-3-11","endDate":"2021-3-21"} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":283,"pages":142,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3,4,5,6,7,8],"navigateFirstPage":1,"navigateLastPage":8,"firstPage":1,"lastPage":8},"logList":[{"userId":5345,"opType":"updateSysMenu","organName":"rik","opName":"修改系统菜单","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"update","requestPath":"http://localhost:8080/Riskmanage/v2/sysMenu/update","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d62e, status=1, error=00000000, msg=null, data=1)","ip":"0:0:0:0:0:0:0:1","startTime":1616251925000,"endTime":1616251938000},{"userId":5342,"opType":"updateOrgan","organName":"rik","opName":" 修改组织信息","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"update","requestPath":"http://localhost:8080/Riskmanage/v2/sysOrganization/update","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d62e, status=1, error=00000000, msg=null, data=1)","ip":"0:0:0:0:0:0:0:1","startTime":1616234345000,"endTime":1616234352000}]}} + */ + @RequestMapping(value = "getLogList", method = RequestMethod.POST) + public ResponseEntityDto getLogList(@RequestBody LoggerParam loggerParam){ + Map param = JSONObject.parseObject(JSONObject.toJSONString(loggerParam), Map.class); + SysUser sysUser = SessionManager.getLoginAccount(); + if(!sysUser.getNickName().equals("超级管理员")){ + param.put("organId", sysUser.getOrganId()); + } + PageHelper.startPage(loggerParam.getPageNo(), loggerParam.getPageSize()); + List logList = loggerService.getLogList(param); + PageInfo pageInfo = new PageInfo(logList); + pageInfo.setList(null); + HashMap modelMap = new HashMap<>(); + modelMap.put("pager", pageInfo); + modelMap.put("logList", logList); + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/sysLog/getLogInfo/{userId} 6.52. 获取日志详情 + * @apiGroup sysManager + * @apiVersion 2.0.0 + * @apiParam {Long} userId 日志Id(url参数) + * @apiSuccess {Long} userId 日志Id + * @apiSuccess {String} opType 操作类型 + * @apiSuccess {String} organName 公司名称 + * @apiSuccess {String} opName 操作名称 + * @apiSuccess {Long} opUserId 操作人员id + * @apiSuccess {String} opUserName 操作人员名称 + * @apiSuccess {Long} organId 组织id + * @apiSuccess {String} method 方法名 + * @apiSuccess {String} requestPath 请求地址 + * @apiSuccess {String} requestParam 请求参数 + * @apiSuccess {String} responseParam 响应参数 + * @apiSuccess {String} ip 请求ip + * @apiSuccess {Long} startTime 开始时间 + * @apiSuccess {Long} endTime 结束时间 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":5342,"opType":"updateOrgan","organName":"rik","opName":" 修改组织信息","opUserId":1,"opUserName":"超级管理员","organId":1,"method":"update","requestPath":"http://localhost:8080/Riskmanage/v2/sysOrganization/update","requestParam":"}","responseParam":"ResponseEntityDto(super=com.risk.riskmanage.common.model.ResponseEntityDto@8bc7d62e, status=1, error=00000000, msg=null, data=1)","ip":"0:0:0:0:0:0:0:1","startTime":1616234345000,"endTime":1616234352000}} + */ + @RequestMapping(value = "getLogInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getLogInfo(@PathVariable Long id){ + Logger logger = loggerService.findById(id); + return ResponseEntityBuilder.buildNormalResponse(logger); + } + +} diff --git a/ddp-runner-api/pom.xml b/ddp-runner-api/pom.xml new file mode 100644 index 0000000..ea1b1f2 --- /dev/null +++ b/ddp-runner-api/pom.xml @@ -0,0 +1,135 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + ddp-runner-api + jar + + + + + com.fibo.ddp + ddp-datax-realtime-field + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-strategyx-guide-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-script-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-score-card + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-list-library + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-ai-model + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-decision-table + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-decision-tree + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-collection-rule + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-tag + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-strategyx-data-clean + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-enginex-risk-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-dataflow-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-personas-engine + 1.0-SNAPSHOT + + + com.fibo.ddp + ddp-enginex-runner-node + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-authx + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-monitor + 1.0-SNAPSHOT + + + + com.fibo.ddp + ddp-analysis + 1.0-SNAPSHOT + + + + + + + src/main/java + + + **/*.xml + + + + + src/main/resources + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/JarDdpRunnerApiApplication.java b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/JarDdpRunnerApiApplication.java new file mode 100644 index 0000000..681e567 --- /dev/null +++ b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/JarDdpRunnerApiApplication.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.runner.api; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +@MapperScan({"com.fibo.ddp.common.dao.**"}) +@ComponentScan(basePackages = "com.fibo.ddp.**") +@EnableAsync +public class JarDdpRunnerApiApplication { + + public static void main(String[] args) { + SpringApplication.run(JarDdpRunnerApiApplication.class, args); + } + +} diff --git a/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigHolder.java b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigHolder.java new file mode 100644 index 0000000..db5a23d --- /dev/null +++ b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigHolder.java @@ -0,0 +1,72 @@ +package com.fibo.ddp.runner.api.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class ConfigHolder { + + //redisConfig + @Value("${redis.host}") + private String redisHost; + @Value("${redis.port}") + private int redisPort; + @Value("${redis.db}") + private int redisDb; + @Value("${redis.password}") + private String redisPwd; + @Value("${redis.pool.maxTotal}") + private int redisMaxTotal; + @Value("${redis.pool.maxIdle}") + private int redisMaxIdle; + @Value("${redis.pool.maxWait}") + private int redisMaxWait; + @Value("${redis.pool.timeout}") + private int redisTimeout; + + // 业务逻辑是否使用缓存 + @Value("${switch.use.cache}") + private String cacheSwitch; + // canal缓存同步是否开启 + @Value("${switch.canal.cache}") + private String canalCacheSwitch; + // canal主机地址 + @Value("${canal.hostname}") + private String canalHostName; + // canal端口 + @Value("${canal.port}") + private int canalPort; + + //jdbcConfig + /*@Value("${jdbc.url}") + private String jdbcUrl; + @Value("${jdbc.driver}") + private String DriverName; + @Value("${pool.maxPoolSize}") + private int maxPoolSize; + @Value("${jdbc.username}") + private String jdbcUserName; + @Value("${jdbc.password}") + private String jdbcPwd; + @Value("${pool.maxWait}") + private int jdbcMaxWait; + @Value("${pool.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + @Value("${pool.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + @Value("${pool.validationQuery}") + private String validationQuery; + + //rabbitconfig + @Value("${rabbitMQ.host}") + private String rabbitHost; + @Value("${rabbitMQ.port}") + private int rabbitPort; + @Value("${rabbitMQ.username}") + private String rabbitUsername; + @Value("${rabbitMQ.password}") + private String rabbitPassword;*/ + +} \ No newline at end of file diff --git a/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigurationContainor.java b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigurationContainor.java new file mode 100644 index 0000000..5c6f52a --- /dev/null +++ b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/ConfigurationContainor.java @@ -0,0 +1,46 @@ +package com.fibo.ddp.runner.api.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +import javax.annotation.Resource; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +public class ConfigurationContainor { + + @Resource + private ConfigHolder configHolder; + + @Bean(name = "threadPoolTaskExecutor") + ThreadPoolTaskExecutor threadPoolTaskExecutor(){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2000); + executor.setMaxPoolSize(10000); + executor.setQueueCapacity(100000); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + return executor; + } + + @Bean(name = "jedisPool") + public JedisPool jedisPool(){ + JedisPoolConfig config = new JedisPoolConfig(); + config.setMaxTotal(configHolder.getRedisMaxTotal()); + config.setMaxIdle(configHolder.getRedisMaxIdle()); + config.setMaxWaitMillis(configHolder.getRedisMaxWait()); + config.setTestOnBorrow(true); +// config.setTestOnReturn(true); + + JedisPool pool = new JedisPool(config, + configHolder.getRedisHost(), + configHolder.getRedisPort(), + configHolder.getRedisTimeout(), + configHolder.getRedisPwd(), + configHolder.getRedisDb()); + return pool; + } + +} diff --git a/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/DataSourceConfig.java b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/DataSourceConfig.java new file mode 100644 index 0000000..da390c2 --- /dev/null +++ b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/DataSourceConfig.java @@ -0,0 +1,69 @@ +package com.fibo.ddp.runner.api.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.fibo.ddp.common.service.datax.runner.mysql.DynamicDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class DataSourceConfig { + + // 将所有前缀为spring.datasource.druid下的配置项都加载DataSource中 + @ConfigurationProperties(prefix = "spring.datasource.druid") + @Bean + public DruidDataSource druidDataSource() { + return new DruidDataSource(); + } + + @Bean + public DynamicDataSource dynamicDataSource(@Qualifier("druidDataSource") DruidDataSource defaultDataSource) { + DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); + Map map = new HashMap<>(); + map.put("default", defaultDataSource); + dynamicDataSource.setTargetDataSources(map); + dynamicDataSource.setDefaultTargetDataSource(defaultDataSource); + return dynamicDataSource; + } + + @Bean(name = "dataSourceTransactionManager") + public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("druidDataSource") DruidDataSource defaultDataSource){ + DataSourceTransactionManager dm = new DataSourceTransactionManager(); + dm.setDataSource(defaultDataSource); + return dm; + } + + @Bean + public SqlSessionFactory sqlSessionFactory( + @Qualifier("dynamicDataSource") DataSource dynamicDataSource) + throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] mapperXmlResource = resolver.getResources("classpath*:**/*Mapper.xml"); + bean.setDataSource(dynamicDataSource); + bean.setMapperLocations(mapperXmlResource); + bean.setTypeAliasesPackage("com.fibo.ddp.common.model"); + bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); + bean.getObject().getConfiguration().setCacheEnabled(false); + return bean.getObject(); + } + + @Bean(name = "sqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) + throws Exception { + return new SqlSessionTemplate(sqlSessionFactory); + } +} diff --git a/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/RestTemplateConfig.java b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/RestTemplateConfig.java new file mode 100644 index 0000000..cd74432 --- /dev/null +++ b/ddp-runner-api/src/main/java/com/fibo/ddp/runner/api/config/RestTemplateConfig.java @@ -0,0 +1,52 @@ +package com.fibo.ddp.runner.api.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.http.client.AsyncClientHttpRequestFactory; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.AsyncRestTemplate; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate配置 + */ +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(@Qualifier("clientHttpRequestFactory") ClientHttpRequestFactory factory){ + return new RestTemplate(factory); + } + + @Bean + public AsyncRestTemplate asyncRestTemplate(@Qualifier("asyncClientHttpRequestFactory") AsyncClientHttpRequestFactory factory){ + return new AsyncRestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory clientHttpRequestFactory(){ + // 创建一个 httpCilent 简单工厂 + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + // 设置连接超时 + factory.setConnectTimeout(15000); + // 设置读取超时 + factory.setReadTimeout(5000); + return factory; + } + + @Bean + public AsyncClientHttpRequestFactory asyncClientHttpRequestFactory(){ + // 创建一个 httpCilent 简单工厂 + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + // 设置连接超时 +// factory.setConnectTimeout(15000); + // 设置读取超时 +// factory.setReadTimeout(5000); + //设置异步任务(线程不会重用,每次调用时都会重新启动一个新的线程) + factory.setTaskExecutor(new SimpleAsyncTaskExecutor()); + return factory; + } +} diff --git a/ddp-runner-api/src/main/resources/application-dev.properties b/ddp-runner-api/src/main/resources/application-dev.properties new file mode 100644 index 0000000..96bd486 --- /dev/null +++ b/ddp-runner-api/src/main/resources/application-dev.properties @@ -0,0 +1,59 @@ +server.port=8081 + +logging.config=classpath:logging-config.xml + +# mysql +spring.datasource.druid.url=jdbc:mysql://localhost:3306/riskmanage?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true +spring.datasource.druid.username=root +spring.datasource.druid.password=enginex +spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.druid.initialSize=20 +spring.datasource.druid.minIdle=20 +spring.datasource.druid.maxActive=100 +spring.datasource.druid.maxWait=60000 +spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 +spring.datasource.druid.minEvictableIdleTimeMillis=300000 +spring.datasource.druid.testWhileIdle=true +spring.datasource.druid.testOnBorrow=true +spring.datasource.druid.testOnReturn=false +spring.datasource.druid.poolPreparedStatements=true +spring.datasource.druid.maxOpenPreparedStatements=20 +spring.datasource.druid.validationQuery=SELECT 1 +spring.datasource.druid.validation-query-timeout=500 +spring.datasource.druid.filters=stat + +# redis +redis.host=localhost +redis.port=6379 +redis.db=1 +redis.password=enginex +redis.pool.maxTotal=3000 +redis.pool.maxIdle=100 +redis.pool.maxWait=1000 +redis.pool.timeout=100000 + +# mail +spring.mail.host=smtp.exmail.qq.com +spring.mail.username=xxx +spring.mail.password=xxx +spring.mail.port=465 +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.timeout=50000 +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.socketFactory.port=465 +spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory +spring.mail.properties.mail.smtp.socketFactory.fallback=false + +# hbase +spring.data.hbase.quorum: localhost:2181 +spring.data.hbase.rootDir: /usr/local/hbase/datatest +spring.data.hbase.nodeParent: /hbase + +# canal +switch.use.cache=off +switch.canal.cache=off +canal.hostname=localhost +canal.port=11111 + +# \u76D1\u63A7\u4E2D\u5FC3 \u6570\u636E\u5B58\u50A8\u65B9\u5F0F mysql \u6216\u8005 hbase +monitor.data.storage.type=mysql \ No newline at end of file diff --git a/ddp-runner-api/src/main/resources/application.properties b/ddp-runner-api/src/main/resources/application.properties new file mode 100644 index 0000000..257b306 --- /dev/null +++ b/ddp-runner-api/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.profiles.active=dev \ No newline at end of file diff --git a/ddp-runner-api/src/main/resources/logging-config.xml b/ddp-runner-api/src/main/resources/logging-config.xml new file mode 100644 index 0000000..7b474b5 --- /dev/null +++ b/ddp-runner-api/src/main/resources/logging-config.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ddp-strategyx/ai-model/pom.xml b/ddp-strategyx/ai-model/pom.xml new file mode 100644 index 0000000..0c16a42 --- /dev/null +++ b/ddp-strategyx/ai-model/pom.xml @@ -0,0 +1,14 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-ai-model + + \ No newline at end of file diff --git a/ddp-strategyx/ai-model/src/main/java/com/fibo/ddp/strategyx/aimodel/controller/ModelsController.java b/ddp-strategyx/ai-model/src/main/java/com/fibo/ddp/strategyx/aimodel/controller/ModelsController.java new file mode 100644 index 0000000..4a4875c --- /dev/null +++ b/ddp-strategyx/ai-model/src/main/java/com/fibo/ddp/strategyx/aimodel/controller/ModelsController.java @@ -0,0 +1,245 @@ +package com.fibo.ddp.strategyx.aimodel.controller; + +import com.fibo.ddp.common.dao.strategyx.aimodel.MachineLearningModelsMapper; +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.aimodel.MachineLearningModels; +import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.aimodel.ModelsService; +import com.fibo.ddp.common.service.strategyx.aimodel.PMMLExecutor.PMMLExecutor; +import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.constant.strategyx.StrategyType; +import org.apache.commons.lang3.StringUtils; +import org.jpmml.evaluator.Evaluator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.util.*; + +/** + * 模型相关接口 + */ +@RestController +@RequestMapping(value = "models") +public class ModelsController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource(name = "PMMLExecutorRFImpl") + private PMMLExecutor pmmlExecutor; + @Autowired + private ModelsService modelsService; + @Resource + public FieldService fieldService; + @Resource + private StrategyOutputService outputService; + @Autowired + private MachineLearningModelsMapper machineLearningModelsMapper; + + /** + * 获取模型列表信息 + * @return + */ + @RequestMapping(value = "getModelsList", method = RequestMethod.POST) + public ResponseEntityDto getModelsList(){ + SysUser sysUser = SessionManager.getLoginAccount(); + Integer organId = Integer.valueOf(sysUser.getOrganId().toString()); + try { + List modelsList = modelsService.getModelsListByOrganId(organId, null); + return ResponseEntityBuilder.buildNormalResponse(modelsList); + } catch (Exception e) { + logger.error("获取模型列表信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 获取组织下全量指标信息 + * @param + * @return + */ + @RequestMapping(value = "getAllFields", method = RequestMethod.POST) + public ResponseEntityDto getAllFields(){ + Map paramMap = new HashMap<>(); + SysUser sysUser = SessionManager.getLoginAccount(); + paramMap.put("organId", sysUser.getOrganId()); + paramMap.put("isOutput", 0); + try { + List> resultList = new ArrayList<>(); + List fieldList = fieldService.getFieldList(paramMap); + for(Field field : fieldList){ + Map map = new HashMap<>(); + map.put("key", field.getId()); + map.put("label", field.getFieldCn()); + resultList.add(map); + } + return ResponseEntityBuilder.buildNormalResponse(resultList); + } catch (Exception e) { + logger.error("获取全量指标信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 上传并解析模型文件 + * @param request + * @return + */ + @RequestMapping(value = "uploadAndParseFile", method = RequestMethod.POST) + public ResponseEntityDto uploadAndParseFile(HttpServletRequest request){ + String fileName = ""; + String accessUrl = ""; + try { + // 上传文件 + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + Iterator iter = multiRequest.getFileNames(); + while (iter.hasNext()) { + MultipartFile file = multiRequest.getFile(iter.next().toString()); + if (file != null) { + String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/models/fieldUpload/"; + if (!new File(uploadDir).exists()) { + File dir = new File(uploadDir); + dir.mkdirs(); + } + fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); + String path = uploadDir + fileName; + //上传 + file.transferTo(new File(path)); + accessUrl = path; + } + } + + // 解析文件 + Evaluator evaluator = pmmlExecutor.loadPmml(accessUrl); + List fieldList = pmmlExecutor.parseField(evaluator); + + Map resultMap = new HashMap<>(); + resultMap.put("fileName", fileName); + resultMap.put("filePath", accessUrl); + resultMap.put("fieldList", fieldList); + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } catch (Exception e) { + logger.error("上次解析模型文件失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 添加模型 + * @param models + * @return + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_MODELS) + public ResponseEntityDto saveModels(@RequestBody MachineLearningModels models){ + modelsService.checkNameNotRepeat(models); + SysUser sysUser = SessionManager.getLoginAccount(); + models.setCreator(Integer.valueOf(sysUser.getUserId().toString())); + models.setModifier(Integer.valueOf(sysUser.getUserId().toString())); + models.setOrganId(Integer.valueOf(sysUser.getOrganId().toString())); + try { + models.setModelField(StringUtils.join(models.getModelFieldArr(), ",")); + models.setMappingField(StringUtils.join(models.getMappingFieldArr(), ",")); + int result = machineLearningModelsMapper.insert(models); + if (result>0){ + outputService.insertTacticsOutput(models.getId().longValue(),models.getStrategyOutputList()); + } + return ResponseEntityBuilder.buildNormalResponse(result); + } catch (Exception e) { + logger.error("保存模型信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 删除模型 + * @param id + * @return + */ + @RequestMapping(value = "delete/{id}", method = RequestMethod.DELETE) + @ArchivesLog(operationType = OpTypeConst.DELETE_MODELS) + public ResponseEntityDto deleteModels(@PathVariable Integer id){ + try { + MachineLearningModels models = new MachineLearningModels(); + models.setId(id); + models.setStatus(0); + int result = machineLearningModelsMapper.updateById(models); + return ResponseEntityBuilder.buildNormalResponse(result); + } catch (Exception e) { + logger.error("删除模型信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 修改模型 + * @param models + * @return + */ + @RequestMapping(value = "update/{id}", method = RequestMethod.PUT) + @ArchivesLog(operationType = OpTypeConst.UPDATE_MODELS) + public ResponseEntityDto updateModels(@PathVariable Integer id , @RequestBody MachineLearningModels models){ + + modelsService.checkNameNotRepeat(models); + SysUser sysUser = SessionManager.getLoginAccount(); + models.setModifier(Integer.valueOf(sysUser.getUserId().toString())); + models.setId(id); + try { + models.setModelField(StringUtils.join(models.getModelFieldArr(), ",")); + models.setMappingField(StringUtils.join(models.getMappingFieldArr(), ",")); + int result = machineLearningModelsMapper.updateById(models); + outputService.updateTacticsOutput(id.longValue(),models.getStrategyOutputList(), StrategyType.MODELS); + return ResponseEntityBuilder.buildNormalResponse(result); + } catch (Exception e) { + logger.error("修改模型信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + /** + * 获取模型详细信息 + * @param id + * @return + */ + @RequestMapping(value = "getDetailInfo/{id}", method = RequestMethod.GET) + public ResponseEntityDto getDetailInfo(@PathVariable Integer id){ + try { + MachineLearningModels models = machineLearningModelsMapper.selectById(id); + if(models != null){ + String modelField = models.getModelField(); + models.setModelFieldArr(StringUtils.isBlank(modelField) ? new ArrayList<>() : Arrays.asList(modelField.split(","))); + + String mappingField = models.getMappingField(); + List mappingFieldArr = new ArrayList<>(); + if(StringUtils.isNotBlank(mappingField)){ + String[] mappingFields = mappingField.split(","); + for(String str : mappingFields){ + mappingFieldArr.add(Integer.valueOf(str)); + } + } + models.setMappingFieldArr(mappingFieldArr); + List strategyOutputList = outputService.queryByTactics(new StrategyOutput(id.longValue(), StrategyType.MODELS)); + models.setStrategyOutputList(strategyOutputList); + } + return ResponseEntityBuilder.buildNormalResponse(models); + } catch (Exception e) { + logger.error("获取模型详细信息失败", e); + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + +} diff --git a/ddp-strategyx/collection-rule/pom.xml b/ddp-strategyx/collection-rule/pom.xml new file mode 100644 index 0000000..cba7a88 --- /dev/null +++ b/ddp-strategyx/collection-rule/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-collection-rule + + + \ No newline at end of file diff --git a/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationController.java b/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationController.java new file mode 100644 index 0000000..b6b19df --- /dev/null +++ b/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationController.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.strategyx.collectionrule.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperation; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + + +@RestController +@RequestMapping("/v3/listOperation") +public class ListOperationController { + /** + * 服务对象 + */ + @Resource + private ListOperationService listOperationService; + + @ResponseBody + @RequestMapping(value = "/getListOperation/{id}", method = RequestMethod.POST) + public ResponseEntityDto getListOperation(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + ListOperation listOperation = listOperationService.queryById(id); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(listOperation); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "getListOperationList", method = RequestMethod.POST) + public ResponseEntityDto getListOperationList(@RequestBody QueryListParam listParam) { + PageInfo pageInfo = listOperationService.queryByEntity(listParam); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "addListOperation", method = RequestMethod.POST) + public ResponseEntityDto addListOperation(@RequestBody ListOperation listOperation) { + ListOperation insert = listOperationService.insert(listOperation); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateListOperation", method = RequestMethod.POST) + public ResponseEntityDto updateListOperation(@RequestBody ListOperation listOperation) { + ListOperation update = listOperationService.update(listOperation); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateListOperationStatus", method = RequestMethod.POST) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = listOperationService.updateStatus(param.getList(), param.getStatus()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TREE_UPDATE_ERROR); + } + + } + + @ResponseBody + @RequestMapping(value = "updateListOperationFolder", method = RequestMethod.POST) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = listOperationService.updateFolder(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } +} diff --git a/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationVersionController.java b/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationVersionController.java new file mode 100644 index 0000000..d81cd66 --- /dev/null +++ b/ddp-strategyx/collection-rule/src/main/java/com/fibo/ddp/strategyx/collectionrule/controller/ListOperationVersionController.java @@ -0,0 +1,91 @@ +package com.fibo.ddp.strategyx.collectionrule.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.collectionrule.ListOperationVersion; +import com.fibo.ddp.common.service.strategyx.collectionrule.ListOperationVersionService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +@RestController +@RequestMapping("/v3/listOperation/version") +public class ListOperationVersionController { + /** + * 服务对象 + */ + @Resource + private ListOperationVersionService versionService; + /** + * 查询指定版本下的内容 + * + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + ListOperationVersion version = versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * + * @param version + * @return + */ + @PostMapping("/addVersion") + public ResponseEntityDto addVersion(@RequestBody ListOperationVersion version) { + boolean b = versionService.addVersion(version); + if (!b) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List ruleVersionList = versionService.queryListByListOpId(version.getListOpId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * + * @param version + * @return + */ + @PostMapping("/copyVersion") + public ResponseEntityDto copyVersion(@RequestBody ListOperationVersion version) { + boolean b = versionService.copyVersion(version); + List ruleVersionList = versionService.queryListByListOpId(version.getListOpId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * + * @param version + * @return + */ + @PostMapping("/updateVersion") + public ResponseEntityDto updateVersion(@RequestBody ListOperationVersion version) { + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryListByListOpId(version.getListOpId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List ruleVersionList = versionService.queryListByListOpId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + +} diff --git a/ddp-strategyx/data-clean/pom.xml b/ddp-strategyx/data-clean/pom.xml new file mode 100644 index 0000000..12e4859 --- /dev/null +++ b/ddp-strategyx/data-clean/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-data-clean + + + \ No newline at end of file diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanController.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanController.java new file mode 100644 index 0000000..dea85f6 --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanController.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.strategyx.dataclean.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataClean; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanService; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + + +@RestController +@RequestMapping("/dataClean") +public class DataCleanController { + /** + * 服务对象 + */ + @Resource + private DataCleanService dataCleanService; + + @ResponseBody + @RequestMapping(value = "/getDataClean/{id}", method = RequestMethod.POST) + public ResponseEntityDto getDataClean(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + DataClean dataClean = dataCleanService.queryById(id); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(dataClean); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "getDataCleanList", method = RequestMethod.POST) + public ResponseEntityDto getDataCleanList(@RequestBody QueryListParam listParam) { + PageInfo pageInfo = dataCleanService.queryByEntity(listParam); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "addDataClean", method = RequestMethod.POST) + public ResponseEntityDto addDataClean(@RequestBody DataClean dataClean) { + DataClean insert = dataCleanService.insert(dataClean); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateDataClean", method = RequestMethod.POST) + public ResponseEntityDto updateDataClean(@RequestBody DataClean dataClean) { + DataClean update = dataCleanService.update(dataClean); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateDataCleanStatus", method = RequestMethod.POST) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = dataCleanService.updateStatus(param.getList(), param.getStatus()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TREE_UPDATE_ERROR); + } + + } + + @ResponseBody + @RequestMapping(value = "updateDataCleanFolder", method = RequestMethod.POST) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = dataCleanService.updateFolder(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanVersionController.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanVersionController.java new file mode 100644 index 0000000..a745c2a --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/controller/DataCleanVersionController.java @@ -0,0 +1,91 @@ +package com.fibo.ddp.strategyx.dataclean.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +@RestController +@RequestMapping("/dataClean/version") +public class DataCleanVersionController { + /** + * 服务对象 + */ + @Resource + private DataCleanVersionService versionService; + /** + * 查询指定版本下的内容 + * + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + DataCleanVersion version = versionService.queryById(versionId,false); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * + * @param version + * @return + */ + @PostMapping("/addVersion") + public ResponseEntityDto addVersion(@RequestBody DataCleanVersion version) { + boolean b = versionService.addVersion(version); + if (!b) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * + * @param version + * @return + */ + @PostMapping("/copyVersion") + public ResponseEntityDto copyVersion(@RequestBody DataCleanVersion version) { + boolean b = versionService.copyVersion(version); + List ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * + * @param version + * @return + */ + @PostMapping("/updateVersion") + public ResponseEntityDto updateVersion(@RequestBody DataCleanVersion version) { + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List ruleVersionList = versionService.queryListByListOpId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/api/DataCleanApi.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/api/DataCleanApi.java new file mode 100644 index 0000000..fd2746a --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/api/DataCleanApi.java @@ -0,0 +1,53 @@ +package com.fibo.ddp.strategyx.dataclean.execute.api; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam; +import com.fibo.ddp.common.service.common.runner.RunnerSessionManager; +import com.fibo.ddp.common.service.common.runner.SessionData; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.strategyx.dataclean.execute.business.DataCleanBusiness; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/dataCleanApi") +@Slf4j +public class DataCleanApi { + + @Resource + private DataCleanBusiness dataCleanBusiness; + + @PostMapping("/runner") + public Object runnerListOp(@RequestBody RunnerDataCleanParam param){ + long start = System.currentTimeMillis(); + SessionData sessionData = new SessionData(); + sessionData.setOrganId(param.getOrganId()); + RunnerSessionManager.setSession(sessionData); + JSONObject result = new JSONObject(); + try { + JSONObject jsonObject = dataCleanBusiness.runner(param); + result.put("status", ErrorCodeEnum.SUCCESS.getCode()); + result.put("msg", ErrorCodeEnum.SUCCESS.getMessage()); + result.put("data", jsonObject); + long end = System.currentTimeMillis(); + log.info("=========数据清洗接口调用成功,耗时:{}ms", (end - start)); + } catch (ApiException apiException) { + result.put("status", apiException.errCode); + result.put("msg", apiException.message); + result.put("data", apiException.data); + log.error("数据清洗接口发生业务异常,errCode: {}, message: {}", apiException.errCode, apiException.message); + } catch (Exception e) { + result.put("status", ErrorCodeEnum.SERVER_ERROR.getCode()); + result.put("msg", ErrorCodeEnum.SERVER_ERROR.getMessage()); + result.put("data", null); + log.error("数据清洗接口发生运行时异常", e); + } + return result; + } +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/DataCleanBusiness.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/DataCleanBusiness.java new file mode 100644 index 0000000..e34b8ea --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/DataCleanBusiness.java @@ -0,0 +1,9 @@ +package com.fibo.ddp.strategyx.dataclean.execute.business; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam; + +public interface DataCleanBusiness { + + JSONObject runner(RunnerDataCleanParam param); +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/impl/DataCleanBusinessImpl.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/impl/DataCleanBusinessImpl.java new file mode 100644 index 0000000..c5fe7c2 --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/business/impl/DataCleanBusinessImpl.java @@ -0,0 +1,192 @@ +package com.fibo.ddp.strategyx.dataclean.execute.business.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.strategyx.dataclean.*; +import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanService; +import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService; +import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils; +import com.fibo.ddp.strategyx.dataclean.execute.business.DataCleanBusiness; +import com.fibo.ddp.strategyx.dataclean.execute.handler.DataCleanFilterConditionHandler; +import com.fibo.ddp.strategyx.dataclean.execute.handler.DataCleanModifyElementHandler; +import com.fibo.ddp.strategyx.dataclean.execute.handler.ListOpConditionHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("dataCleanBusiness") +@Slf4j +public class DataCleanBusinessImpl implements DataCleanBusiness { + + @Resource + private DataCleanVersionService versionService; + @Resource + private DataCleanService dataCleanService; + @Resource + private DataCleanModifyElementHandler modifyElementHandler; + @Resource + private DataCleanFilterConditionHandler filterConditionHandler; + @Resource + private ListOpConditionHandler listOpConditionHandler; + + @Override + public JSONObject runner(RunnerDataCleanParam param) { +// DataClean dataClean = param.getDataClean(); + long startTime = System.currentTimeMillis(); + JSONObject result = null; + //查出内容 + DataClean dataClean = dataCleanService.queryByCode(param.getDataCleanCode(),param.getVersionCode()); + if (dataClean==null){ + log.debug("【规则查询】拒绝执行:未查找到规则版本信息,耗时:{}, dataCleanCode:{} versionCode:{}", + System.currentTimeMillis() - startTime, param.getDataCleanCode(), param.getVersionCode()); + return result; + } + List versionList = dataClean.getVersionList(); + DataCleanVersion version = null; + if (CollectionUtils.isNotEmpty(versionList)){ + version = versionList.get(0); + } +// version = versionService.queryById(param.getVersionId()); + long queryEnd = System.currentTimeMillis(); + log.debug("【规则查询】查询规则详情完成,耗时:{}, ruleCode:{} versionId:{}", + queryEnd - startTime, param.getDataCleanCode(), param.getVersionCode()); + if (version == null) { + log.debug("【规则查询】拒绝执行:未查找到规则版本信息,耗时:{}, dataCleanId:{} versionCode:{}", + System.currentTimeMillis() - startTime, version.getDataCleanId(), param.getVersionCode()); + return result; + } + +// Date date = new Date(); +// //判断有效期 如果有有效期则需要判断 +// if (dataClean == null +// || (dataClean.getStartTime() != null && date.compareTo(dataClean.getStartTime()) < 0) +// || (dataClean.getEndTime() != null && date.compareTo(dataClean.getEndTime()) > 0) +// || dataClean.getStatus() != 1) { +// return result; +// } + + String inputFieldEn = "default"; + switch (version.getInputFieldType()) { + case "map": + result = this.mapHandlerV1(inputFieldEn, param.getParam(), version, version.getVersionCode()); + break; + case "list": + break; + } + long endTime = System.currentTimeMillis(); + log.debug("【规则执行】执行规则完成,耗时:{}, ruleCode:{}, versionCode:{}", + (endTime - queryEnd), version.getVersionCode(), param.getVersionCode()); + return result; + } + + public JSONObject mapHandlerV1(String inputEn, Map param, DataCleanVersion version, String ruleCode) { + List> result = new ArrayList<>(); + JSONObject intputObject = null; + Object paramMap = param.get(inputEn); + if (paramMap == null) { + //未能获取到参数直接返回 + return null; + } + if (paramMap instanceof Map) { + intputObject = JSONObject.parseObject(JSONObject.toJSONString(paramMap)); + } + + DataCleanOriginalDataOp originalDataOp = version.getOriginalDataOp(); + String opField = originalDataOp.getOpField(); + JSONArray forTarget = intputObject.getJSONArray(opField); + List forTargetJson = new ArrayList<>(); + for(Object obj : forTarget){ + forTargetJson.add((JSONObject) obj); + } + // 循环对象 + for(JSONObject forObject : forTargetJson){ + this.listHandlerV1(intputObject, forObject, version, ruleCode); + } + intputObject.put(opField, forTargetJson); + return intputObject; + } + + public List> listHandlerV1(JSONObject intputObject, JSONObject forObject, DataCleanVersion version, String ruleCode) { + List> result = new ArrayList<>(); + List conditionAndOutPutList = version.getConditionAndOutPutList(); + // 新ratePlanList 返回每个组价格最低的一个元素 + List newRatePlanList = new ArrayList<>(); + // 多块处理 + for (DataCleanConditionAndOutPut conditionAndOutPut : conditionAndOutPutList) { + DataCleanBlock dataCleanBlock = conditionAndOutPut.getDataCleanBlock(); + String handleCollection = dataCleanBlock.getHandleCollection(); + JSONArray targetCollection = forObject.getJSONArray(handleCollection); + if(targetCollection == null){ + //未能获取到参数直接返回 + return null; + } + List inputArray = new ArrayList<>(); + for (Object obj : targetCollection) { + inputArray.add((JSONObject) obj); + } + + DataCleanFilterCondition filterCondition = conditionAndOutPut.getInputFilterCondition(); + List executeArray = inputArray; + if (filterCondition != null) { + //执行进入过滤条件 + executeArray = filterConditionHandler.filterByCondition(executeArray, filterCondition); + } + // 执行分组 + Map> listMap = null; + String groupFieldsStr = conditionAndOutPut.getDataCleanBlock().getGroupFields(); + List groupFields = null; + if (groupFieldsStr != null && !"[]".equals(groupFieldsStr)) { + groupFields = JSON.parseArray(groupFieldsStr, String.class); + } + if (groupFields != null && !groupFields.isEmpty()) { + listMap = groupBy(groupFields, executeArray); + } else { + listMap = new HashMap<>(); + listMap.put("default", executeArray); + } + + // 遍历每一个组 + for (Map.Entry> entry : listMap.entrySet()) { + Map localParamMap = new HashMap<>(); + Map localOutPutMap = new HashMap<>(); + List list = entry.getValue(); + DataCleanCondition condition = conditionAndOutPut.getCondition(); + if (condition != null || condition.getChildren() != null) { + for(JSONObject collectionObject : list){ + // 执行修改元素条件 + boolean conditionResult = modifyElementHandler.conditionHandler(condition, localParamMap, intputObject, forObject, collectionObject); + if (conditionResult) { + // 命中修改元素 + modifyElementHandler.outputListHandler(conditionAndOutPut.getSuccessOutput(), localParamMap, localOutPutMap, collectionObject); + } else { + // 未命中修改元素 + modifyElementHandler.outputListHandler(conditionAndOutPut.getFailOutput(), localParamMap, localOutPutMap, collectionObject); + } + } + } + if (!localOutPutMap.isEmpty()) { + result.add(localOutPutMap); + } + // 组内返回结果过滤 + DataCleanFilterCondition resultFilterCondition = conditionAndOutPut.getResultFilterCondition(); + JSONObject resultFilterJson = listOpConditionHandler.conditionHandler(resultFilterCondition, null, list); + newRatePlanList.add(resultFilterJson); + } + } + forObject.put("ratePlanList", newRatePlanList); + return result; + } + + public Map> groupBy(List groupFields, List groupArray) { + Map> listMap = DataCleanUtils.recursionGroup(groupArray, groupFields); + return listMap; + } +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/consts/ListOpConst.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/consts/ListOpConst.java new file mode 100644 index 0000000..0a8ef4d --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/consts/ListOpConst.java @@ -0,0 +1,21 @@ +package com.fibo.ddp.strategyx.dataclean.execute.consts; + +public class ListOpConst { + + public static class OpType{ + //计数 + public static final String COUNT = "count"; + //去重计数 + public static final String DISTINCT_COUNT = "distinct_count"; + //最大值 + public static final String MAX = "max"; + //最小值 + public static final String MIN = "min"; + //平均 + public static final String AVG = "avg"; + //元素 + public static final String LIST_ELEMENT = "list_element"; + //自定义 + public static final String CUSTOM = "custom"; + } +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanFilterConditionHandler.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanFilterConditionHandler.java new file mode 100644 index 0000000..da692d1 --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanFilterConditionHandler.java @@ -0,0 +1,100 @@ +package com.fibo.ddp.strategyx.dataclean.execute.handler; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConst; +import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class DataCleanFilterConditionHandler { + public List filterByCondition(List list, DataCleanFilterCondition filterCondition){ + + if (filterCondition==null||filterCondition.getChildren()==null||filterCondition.getChildren().isEmpty()) { + return list; + } + //过滤框架 + List result = list.stream().filter(item->{ + return executeCondition(item,filterCondition); + }).collect(Collectors.toList()); + return result; + } + + public boolean executeCondition(JSONObject json,DataCleanFilterCondition filterCondition){ + Integer conditionType = filterCondition.getConditionType(); + boolean result = false; + switch (conditionType) { + //关系条件节点 &&和|| + case RuleConst.RELATION_CONDITION: + result = executeRelation(filterCondition, json); + break; + //表达式条件节点 + case RuleConst.EXPRESSION_CONDITION: + result = executeExpression(filterCondition, json); + break; + } + return result; + } + + private boolean executeRelation(DataCleanFilterCondition condition, JSONObject json) { + //获取关系逻辑 + String logical = condition.getLogical(); + //处理子逻辑 + List children = condition.getChildren(); + + boolean result = false; + switch (logical) { + case "||": + result = false; + for (DataCleanFilterCondition child : children) { + boolean childResult = executeCondition(json,child); + if (childResult) { + return true; + } + } + break; + case "&&": + result = true; + for (DataCleanFilterCondition child : children) { + boolean childResult = executeCondition(json,child); + if (!childResult) { + return false; + } + } + break; + } + return result; + } + + private boolean executeExpression(DataCleanFilterCondition condition, JSONObject json) { + Object condKey = DataCleanUtils.getObjByKeyAndJson(json, condition.getOpKey()); + Object condValue = null; + String condValueStr = condition.getVariableValue(); + String operator = condition.getOperator(); + switch (operator){ + case "in": + case "not in": + condValue = new ArrayList<>(); + Collections.addAll((List)condValue,condValueStr.split(",")); + break; + case "black_list": + condKey = 1; + operator= "=="; + condValue = ExecuteUtils.getValueByKey(condition.getVariableType(),new HashMap<>(),condition.getVariableValue(), Arrays.asList(json)); + break; + case "not_black_list": + condKey = 0; + operator= "=="; + condValue = ExecuteUtils.getValueByKey(condition.getVariableType(),new HashMap<>(),condition.getVariableValue(), Arrays.asList(json)); + break; + default: + condValue = condValueStr; + } + return ExecuteUtils.getCondResult(operator, condKey, condValue); + + } +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanModifyElementHandler.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanModifyElementHandler.java new file mode 100644 index 0000000..31a5e43 --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/DataCleanModifyElementHandler.java @@ -0,0 +1,120 @@ +package com.fibo.ddp.strategyx.dataclean.execute.handler; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanCondition; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOutput; +import com.fibo.ddp.common.service.datax.runner.ExecuteUtils; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConst; +import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class DataCleanModifyElementHandler { + public boolean conditionHandler(DataCleanCondition condition, Map input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) { + boolean result = executeListCondition(condition, input, intputObject, forObject, collectionObject); + return result; + } + + private boolean executeListCondition(DataCleanCondition condition, Map input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) { + Integer conditionType = condition.getConditionType(); + boolean result = false; + switch (conditionType) { + //关系条件节点 &&和|| + case RuleConst.RELATION_CONDITION: + result = executeRelation(condition, input, intputObject, forObject, collectionObject); + break; + //表达式条件节点 + case RuleConst.EXPRESSION_CONDITION: + result = executeExpression(condition, input, intputObject, forObject, collectionObject); + break; + } + return result; + } + + private boolean executeExpression(DataCleanCondition condition, Map input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) { + Object opValue = null; + String opType = condition.getOpType(); + switch (opType) { + case "original": // 源数据 + opValue = DataCleanUtils.getObjByKeyAndJson(intputObject, condition.getOpKey()); + break; + case "data_op": // 循环对象元素 + opValue = DataCleanUtils.getObjByKeyAndJson(forObject, condition.getOpKey()); + break; + case "handle_collection": // 集合元素 + opValue = DataCleanUtils.getObjByKeyAndJson(collectionObject, condition.getOpKey()); + break; + } + + //条件判断输入的值 + List list = new ArrayList<>(); + list.add(collectionObject); + Object variableValue = ExecuteUtils.getValueByKey(condition.getVariableType(), input, condition.getVariableValue(), list); + //操作符 + String operator = condition.getOperator(); + return ExecuteUtils.getCondResult(operator, opValue, variableValue); + } + + private boolean executeRelation(DataCleanCondition condition, Map input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) { + //获取关系逻辑 + String logical = condition.getLogical(); + //处理子逻辑 + List children = condition.getChildren(); + + boolean result = false; + switch (logical) { + case "||": + result = false; + for (DataCleanCondition child : children) { + boolean childResult = executeListCondition(child, input, intputObject, forObject, collectionObject); + if (childResult) { + return true; + } + } + break; + case "&&": + result = true; + for (DataCleanCondition child : children) { + boolean childResult = executeListCondition(child, input, intputObject, forObject, collectionObject); + if (!childResult) { + return false; + } + } + break; + } + return result; + } + + public boolean outputListHandler(List outputList, Map localParamMap, Map outMap, JSONObject collectionObject) { + if (outputList == null || outputList.isEmpty()) { + return true; + } + for (DataCleanOutput outputField : outputList) { + outputHandler(outputField,localParamMap, outMap, collectionObject); + } + return true; + } + + public boolean outputHandler(DataCleanOutput output, Map localParamMap, Map outMap, JSONObject collectionObject) { + String outputKey = output.getOutputKey(); + Object result = null; + //处理自定义内容 + if (StringUtils.isNotBlank(output.getOutputValue())) { + result = ExecuteUtils.getValueByKeyYiHao(output.getVariableType(), localParamMap, output.getOutputValue(), collectionObject); + } + outMap.put(outputKey, result); + + // todo price修改 + JSONArray channels = collectionObject.getJSONArray("channels"); + JSONArray nightlyRates = channels.getJSONObject(0).getJSONArray("nightlyRates"); + nightlyRates.getJSONObject(0).put("price", result); + return true; + } + +} diff --git a/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/ListOpConditionHandler.java b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/ListOpConditionHandler.java new file mode 100644 index 0000000..78555a9 --- /dev/null +++ b/ddp-strategyx/data-clean/src/main/java/com/fibo/ddp/strategyx/dataclean/execute/handler/ListOpConditionHandler.java @@ -0,0 +1,123 @@ +package com.fibo.ddp.strategyx.dataclean.execute.handler; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition; +import com.fibo.ddp.common.utils.constant.strategyx.RuleConst; +import com.fibo.ddp.common.utils.util.runner.NumUtils; +import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils; +import com.fibo.ddp.strategyx.dataclean.execute.consts.ListOpConst; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class ListOpConditionHandler { + public JSONObject conditionHandler(DataCleanFilterCondition condition, Map input, List list) { + JSONObject result = executeListCondition(condition, input, list); + return result; + } + + private JSONObject executeListCondition(DataCleanFilterCondition condition, Map input, List list) { + Integer conditionType = condition.getConditionType(); + JSONObject result = null; + switch (conditionType) { + //关系条件节点 &&和|| + case RuleConst.RELATION_CONDITION: + result = executeRelation(condition, input, list); + break; + //表达式条件节点 + case RuleConst.EXPRESSION_CONDITION: + result = executeExpression(condition, input, list); + break; + } + return result; + } + + private JSONObject executeExpression(DataCleanFilterCondition condition, Map input, List list) { + Object opValue = getOpValueByKey(condition.getOpKey(), condition.getOperator(), list); + return (JSONObject) opValue; + } + + private JSONObject executeRelation(DataCleanFilterCondition condition, Map input, List list) { + //获取关系逻辑 + String logical = condition.getLogical(); + //处理子逻辑 + List children = condition.getChildren(); + + switch (logical) { + case "||": + for (DataCleanFilterCondition child : children) { + if("min".equals(child.getOperator())){ + JSONObject childResult = executeListCondition(child, input, list); + return childResult; + } + } + break; + case "&&": + for (DataCleanFilterCondition child : children) { + if("min".equals(child.getOperator())){ + JSONObject childResult = executeListCondition(child, input, list); + return childResult; + } + } + break; + } + return null; + } + + private Object getOpValueByKey(String opKey, String opType, List list) { + //确定操作是根据哪个字段的 + Comparator comparator = Comparator.comparing(item -> { + return DataCleanUtils.getObjByKeyAndJson(item, opKey).toString(); + }); + Object result = null; + switch (opType) { + case ListOpConst + .OpType.COUNT: + int count = list.size(); + result = count; + break; + case ListOpConst + .OpType.DISTINCT_COUNT: + int distinctCount = list.stream().collect(Collectors.collectingAndThen(Collectors. + toCollection(() -> new TreeSet<>(comparator)), ArrayList::new)).size(); + result = distinctCount; + break; + case ListOpConst + .OpType.MAX: + Optional maxOptional = list.stream().max(comparator); + if (maxOptional.isPresent()) { + Object max = DataCleanUtils.getObjByKeyAndJson(maxOptional.get(), opKey); + result = max; + } + break; + case ListOpConst + .OpType.MIN: + Optional minOptional = list.stream().min(comparator); + if (minOptional.isPresent()) { +// Object min = DataCleanUtils.getObjByKeyAndJson(minOptional.get(), opKey); +// result = min; + result = minOptional.get(); + } + break; + case ListOpConst + .OpType.AVG: + double avg = list.stream().mapToDouble(item -> { + return NumUtils.toDouble(DataCleanUtils.getObjByKeyAndJson(item, opKey)); + }).average().getAsDouble(); + result = avg; + break; + case ListOpConst + .OpType.LIST_ELEMENT: + result = list.stream().map(item -> { + return DataCleanUtils.getObjByKeyAndJson(item, opKey); + }).collect(Collectors.toList()); + break; + case ListOpConst + .OpType.CUSTOM: + break; + } + return result; + } +} diff --git a/ddp-strategyx/decision-table/pom.xml b/ddp-strategyx/decision-table/pom.xml new file mode 100644 index 0000000..8403e43 --- /dev/null +++ b/ddp-strategyx/decision-table/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-decision-table + + + \ No newline at end of file diff --git a/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesController.java b/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesController.java new file mode 100644 index 0000000..6f4083e --- /dev/null +++ b/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesController.java @@ -0,0 +1,98 @@ +package com.fibo.ddp.strategyx.decisiontable.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.request.DecisionTablesListParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * (DecisionTables)表控制层 + * + * @author jgp + * @since 2021-04-12 17:54:48 + */ +@RestController +@RequestMapping("v3/decisionTables") +public class DecisionTablesController { + + @Resource + private DecisionTablesService decisionTablesService; + + + @ResponseBody + @RequestMapping(value = "getDecisionTablesInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getDecisionTablesInfo(@PathVariable Long id ) { + if (id==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + DecisionTablesVo decisionTablesVo = decisionTablesService.queryById(id); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(decisionTablesVo); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "getDecisionTablesList", method = RequestMethod.POST) + public ResponseEntityDto getDecisionTablesList(@RequestBody DecisionTablesListParam listParam) { + PageInfo pageInfo = decisionTablesService.queryByEntity(listParam); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "addDecisionTables", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ADD_DECISION_TABLES) + public ResponseEntityDto addDecisionTables(@RequestBody DecisionTablesVo decisionTablesVo ) { + DecisionTablesVo insert = decisionTablesService.insertDecisionTables(decisionTablesVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + @ResponseBody + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TABLES) + @RequestMapping(value = "updateDecisionTables", method = RequestMethod.POST) + public ResponseEntityDto updateDecisionTables(@RequestBody DecisionTablesVo decisionTablesVo ) { + DecisionTablesVo update = decisionTablesService.updateDecisionTables(decisionTablesVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateDecisionTablesStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TABLES_STATUS) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = decisionTablesService.updateStatus(param.getList(), param.getStatus()); + if (updateResult){ + return ResponseEntityBuilder.buildNormalResponse(updateResult); + }else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TABLES_UPDATE_ERROR); + } + + } + @ResponseBody + @RequestMapping(value = "updateDecisionTablesParent", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TABLES_FOLDER) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = decisionTablesService.updateParent(param.getIds(), param.getFolderId()); + if (updateResult){ + return ResponseEntityBuilder.buildNormalResponse(updateResult); + }else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + +} diff --git a/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesVersionController.java b/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesVersionController.java new file mode 100644 index 0000000..c3c1163 --- /dev/null +++ b/ddp-strategyx/decision-table/src/main/java/com/fibo/ddp/strategyx/decisiontable/controller/DecisionTablesVersionController.java @@ -0,0 +1,95 @@ +package com.fibo.ddp.strategyx.decisiontable.controller; + + +import com.baomidou.mybatisplus.extension.api.ApiController; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVersionVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (DecisionTablesVersion)表控制层 + */ +@RestController +@RequestMapping("v3/decisionTables/version") +public class DecisionTablesVersionController extends ApiController { + /** + * 服务对象 + */ + @Resource + private DecisionTablesVersionService versionService; + /** + * 查询指定版本下的内容 + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + DecisionTablesVersionVo version =versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * @param version + * @return + */ + @PostMapping("/addVersion") + @ArchivesLog(operationType = OpTypeConst.ADD_DECISION_TABLES_VERSION) + public ResponseEntityDto addVersion(@RequestBody DecisionTablesVersionVo version){ + boolean b = versionService.addVersion(version); + if (!b){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List< DecisionTablesVersionVo> ruleVersionList = versionService.queryVersionListByDecisionTablesId(version.getDecisionTablesId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * @param version + * @return + */ + @PostMapping("/copyVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_DECISION_TABLES_VERSION) + public ResponseEntityDto copyVersion(@RequestBody DecisionTablesVersionVo version){ + boolean b = versionService.copyVersion(version); + List< DecisionTablesVersionVo> ruleVersionList = versionService.queryVersionListByDecisionTablesId(version.getDecisionTablesId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * @param version + * @return + */ + @PostMapping("/updateVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TABLES_VERSION) + public ResponseEntityDto updateVersion(@RequestBody DecisionTablesVersionVo version){ + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryVersionListByDecisionTablesId(version.getDecisionTablesId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TABLES_VERSION_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List ruleVersionList = versionService.queryVersionListByDecisionTablesId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + +} diff --git a/ddp-strategyx/decision-tree/pom.xml b/ddp-strategyx/decision-tree/pom.xml new file mode 100644 index 0000000..af2f200 --- /dev/null +++ b/ddp-strategyx/decision-tree/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-decision-tree + + + \ No newline at end of file diff --git a/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeController.java b/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeController.java new file mode 100644 index 0000000..c365f63 --- /dev/null +++ b/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeController.java @@ -0,0 +1,102 @@ +package com.fibo.ddp.strategyx.decisiontree.controller; + + +import com.baomidou.mybatisplus.extension.api.ApiController; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontable.vo.DecisionTablesVo; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * (DecisionTree)表控制层 + */ +@RestController +@RequestMapping("v3/decisionTree") +public class DecisionTreeController extends ApiController { + /** + * 服务对象 + */ + @Resource + private DecisionTreeService decisionTreeService; + + + @ResponseBody + @RequestMapping(value = "getDecisionTreeInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getDecisionTreeInfo(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + DecisionTreeVo decisionTablesVo = decisionTreeService.queryById(id); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(decisionTablesVo); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "getDecisionTreeList", method = RequestMethod.POST) + public ResponseEntityDto getDecisionTreeList(@RequestBody QueryListParam listParam) { + PageInfo pageInfo = decisionTreeService.queryByEntity(listParam); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "addDecisionTree", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ADD_DECISION_TREE) + public ResponseEntityDto addDecisionTree(@RequestBody DecisionTreeVo decisionTreeVo) { + DecisionTreeVo insert = decisionTreeService.insertDecisionTree(decisionTreeVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateDecisionTree", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TREE) + public ResponseEntityDto updateDecisionTree(@RequestBody DecisionTreeVo decisionTreeVo) { + DecisionTreeVo update = decisionTreeService.updateDecisionTree(decisionTreeVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateDecisionTreeStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TREE_STATUS) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = decisionTreeService.updateStatus(param.getList(), param.getStatus()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TREE_UPDATE_ERROR); + } + + } + + @ResponseBody + @RequestMapping(value = "updateDecisionTreeFolder", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TREE_FOLDER) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = decisionTreeService.updateFolder(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + +} diff --git a/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeVersionController.java b/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeVersionController.java new file mode 100644 index 0000000..7f07b49 --- /dev/null +++ b/ddp-strategyx/decision-tree/src/main/java/com/fibo/ddp/strategyx/decisiontree/controller/DecisionTreeVersionController.java @@ -0,0 +1,100 @@ +package com.fibo.ddp.strategyx.decisiontree.controller; + + +import com.baomidou.mybatisplus.extension.api.ApiController; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.decisiontree.vo.DecisionTreeVersionVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.decisiontree.DecisionTreeVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (DecisionTreeVersion)表控制层 + */ +@RestController +@RequestMapping("/v3/decisionTree/version") +public class DecisionTreeVersionController extends ApiController { + /** + * 服务对象 + */ + @Resource + private DecisionTreeVersionService versionService; + + /** + * 查询指定版本下的内容 + * + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + DecisionTreeVersionVo version = versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * + * @param version + * @return + */ + @PostMapping("/addVersion") + @ArchivesLog(operationType = OpTypeConst.ADD_DECISION_TREE_VERSION) + public ResponseEntityDto addVersion(@RequestBody DecisionTreeVersionVo version) { + boolean b = versionService.addVersion(version); + if (!b) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List ruleVersionList = versionService.queryVersionListByDecisionTreeId(version.getDecisionTreeId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * + * @param version + * @return + */ + @PostMapping("/copyVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_DECISION_TREE_VERSION) + public ResponseEntityDto copyVersion(@RequestBody DecisionTreeVersionVo version) { + boolean b = versionService.copyVersion(version); + List ruleVersionList = versionService.queryVersionListByDecisionTreeId(version.getDecisionTreeId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * + * @param version + * @return + */ + @PostMapping("/updateVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TREE_VERSION) + public ResponseEntityDto updateVersion(@RequestBody DecisionTreeVersionVo version) { + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryVersionListByDecisionTreeId(version.getDecisionTreeId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_DECISION_TREE_VERSION_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List ruleVersionList = versionService.queryVersionListByDecisionTreeId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } +} diff --git a/ddp-strategyx/guide-rule/pom.xml b/ddp-strategyx/guide-rule/pom.xml new file mode 100644 index 0000000..8ba95d9 --- /dev/null +++ b/ddp-strategyx/guide-rule/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-guide-rule + + + \ No newline at end of file diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleInfoController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleInfoController.java new file mode 100644 index 0000000..dd35bf8 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleInfoController.java @@ -0,0 +1,251 @@ +package com.fibo.ddp.strategyx.guiderule.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.guiderule.request.RuleListParamV2; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; + +@Controller("ruleControllerV3") +@RequestMapping("v3/rule") +public class RuleInfoController { + + @Autowired + private RuleService ruleService; + + /** + * @api {POST} /v3/rule/getRuleInfo/{userId} 3.19. V3获取rule信息 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Long} userId : 规则id + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":666,"name":"2021_4_6测试接口","versionCode":"test2021_4_6第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":"2021-04-07T05:12:52.000+00:00","ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":15,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":666,"parentId":14,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":16,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":14,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":16,"fieldId":10000,"fieldValue":"test01","ruleId":666},{"userId":17,"fieldId":10000,"fieldValue":"test02","ruleId":666}]}} + */ + @ResponseBody + @RequestMapping(value = "getRuleInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getRuleInfo(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + RuleVo ruleVo = ruleService.queryById(id,2); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(ruleVo); + return ruleResponseEntityDto; + } + + + /** + * @api {POST} /v3/rule/getRuleList 3.20. V3规则 列表 list + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Integer} [pageNum] 第几页,有默认值1 + * @apiParam {Integer} [pageSize] 每页的数量,有默认值10 + * @apiParam {object} [ruleInfo] 查询条件rule对象(不加查询条件则返回全部,以下参数未此对象的字段) + * @apiParam (ruleInfo) {Long} [userId] rule的id + * @apiParam (ruleInfo) {String} [name] rule的名字 + * @apiParam (ruleInfo) {String} [versionCode] rule的代码 + * @apiParam (ruleInfo) {String} [description] rule的描述信息 + * @apiParam (ruleInfo) {Integer} [priority] 优先级 + * @apiParam (ruleInfo) {String} [parentId] 父节点id(文件夹id) + * @apiParam (ruleInfo) {Integer} [priority] 优先级 + * @apiParam (ruleInfo) {Long} [author] 用户id + * @apiParam (ruleInfo) {Long} [userId] 用户id + * @apiParam (ruleInfo) {Long} [organId] 组织id + * @apiParam (ruleInfo) {Integer} [engineId] 引擎id(原表内容未用到) + * @apiParam (ruleInfo) {Integer} [status] 状态id(0 :停用 ,1 : 启用,-1:删除) + * @apiParam (ruleInfo) {Integer} [type] 规则类型(0 : 系统的规则 1:组织的规则 2: 引擎的规则) + * @apiParam (ruleInfo) {Integer} [isNon] 逻辑关系“非”,0:否 ,1:是 + * @apiParam (ruleInfo) {String} [content] 规则执行内容 + * @apiParam (ruleInfo) {Integer} [ruleType] 规则类型(0硬性拒绝规则,1加减分规则) + * @apiParam (ruleInfo) {Integer} [ruleAudit] 规则审核(2 终止,5 继续) + * @apiParam (ruleInfo) {Integer} [score] 规则得分 + * @apiParam (ruleInfo) {String} [lastLogical] 最后逻辑(原表内容未用到) + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"pageNum":1,"pageSize":10,"ruleInfo":{"userId":666,"name":"2021_4_6测试接口","versionCode":"test2021_4_6第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":"2021-04-06T09:07:27.000+00:00","ruleType":0,"ruleAudit":2,"score":0,"lastLogical":""}} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":666,"name":"2021_4_6测试接口","versionCode":"test2021_4_6第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":"2021-04-07T05:12:52.000+00:00","ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":15,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":16,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":15,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":16,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},{"userId":15,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":16,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":14,"conditionType":0,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},{"userId":14,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":16,"fieldId":10000,"fieldValue":"test01","ruleId":666},{"userId":17,"fieldId":10000,"fieldValue":"test02","ruleId":666}]}} + */ + @ResponseBody + @RequestMapping(value = "getRuleList", method = RequestMethod.POST) + public ResponseEntityDto getRuleList(@RequestBody RuleListParamV2 ruleListParam) { + PageInfo pageInfo = ruleService.queryByEntity(ruleListParam); + HashMap responseMap = new HashMap<>(); + responseMap.put("pageInfo", pageInfo); + responseMap.put("klist", pageInfo.getList()); + pageInfo.setList(null); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + /** + * @api {POST} /v3/rule/addRule 3.21. V3添加规则 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {String} name rule的名字 + * @apiParam {String} versionCode rule的代码 + * @apiParam {String} description rule的描述信息 + * @apiParam {Integer} priority 优先级 + * @apiParam {String} parentId 父节点id(文件夹id) + * @apiParam {Integer} [status] 状态id(0 :停用 ,1 : 启用,-1:删除)默认启用 + * @apiParam {Integer} [type] 规则类型(0 : 系统的规则 1:组织的规则 2: 引擎的规则)默认组织规则 + * @apiParam {Integer} [isNon] 逻辑关系“非”,0:否 ,1:是 + * @apiParam {String} [content] 规则执行内容 + * @apiParam {Integer} ruleType 规则类型(0硬性拒绝规则,1加减分规则) + * @apiParam {Integer} [ruleAudit] 规则审核(2 终止,5 继续)根据ruleType推定拒绝规则为终止 + * @apiParam {Integer} [score] 规则得分 + * @apiParam {String} [lastLogical] 最后逻辑(原表内容未用到) + * @apiParam {object} [ruleConditionVo] 规则对应的一颗规则条件的树形对象 + * @apiParam (ruleConditionVo) {String} logical 逻辑符号&&、||(仅关系表达式) + * @apiParam (ruleConditionVo) {Long} fieldId 字段id(仅条件表达式) + * @apiParam (ruleConditionVo) {String} operator 操作符(仅条件表达式) + * @apiParam (ruleConditionVo) {String} fieldValue 字段值(仅条件表达式) + * @apiParam (ruleConditionVo) {Integer} conditionType 条件类型1.关系表达式,2.条件表达式 + * @apiParam (ruleConditionVo) {List} [children] 子对象列表,和所属对象相同 + * @apiParam {List} [ruleContentInfoList] 同一规则下的content对象list + * @apiParam (ruleContentInfoList) {Long} [fieldId] 字段id + * @apiParam (ruleContentInfoList) {String} [fieldValue] 字段值 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"name":"2021_4_6测试接口02","versionCode":"test2021_4_7","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"status":1,"type":1,"isNon":null,"content":"test","ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"logical":"&&","conditionType":"1","children":[{"fieldId":"0","operator":">","fieldValue":"10","conditionType":"1"},{"fieldId":"0","operator":"<","fieldValue":"100","conditionType":"1"}]},"ruleContentInfoList":[{"fieldId":"10000","fieldValue":"test1"},{"fieldId":"10000","fieldValue":"test2"}]} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":668,"name":"2021_4_6测试接口02","versionCode":"test2021_4_7","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":null,"updated":null,"ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":17,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":668,"parentId":0,"conditionType":1,"createTime":"2021-04-07T08:09:17.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":18,"logical":null,"fieldId":null,"operator":">","fieldValue":"10","ruleId":668,"parentId":17,"conditionType":1,"createTime":"2021-04-07T08:09:17.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":19,"logical":null,"fieldId":null,"operator":"<","fieldValue":"100","ruleId":668,"parentId":17,"conditionType":1,"createTime":"2021-04-07T08:09:17.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":18,"fieldId":10000,"fieldValue":"test1","ruleId":668},{"userId":19,"fieldId":10000,"fieldValue":"test2","ruleId":668}]}} + */ + @ResponseBody + @RequestMapping(value = "addRule", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_RULE) + public ResponseEntityDto addRule(@RequestBody RuleVo ruleVo) { + RuleVo insert = ruleService.insertRuleInfo(ruleVo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + /** + * @api {POST} /v3/rule/updateRule 3.22. V3修改规则 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Long} userId rule的id + * @apiParam {String} name rule的名字 + * @apiParam {String} versionCode rule的代码 + * @apiParam {String} description rule的描述信息 + * @apiParam {Integer} priority 优先级 + * @apiParam {String} parentId 父节点id(文件夹id) + * @apiParam {Long} author 用户id + * @apiParam {Long} userId 用户id + * @apiParam {Long} organId 组织id + * @apiParam {Integer} [engineId] 引擎id(原表内容未用到) + * @apiParam {Integer} status 状态id(0 :停用 ,1 : 启用,-1:删除) + * @apiParam {Integer} type 规则类型(0 : 系统的规则 1:组织的规则 2: 引擎的规则) + * @apiParam {Integer} [isNon] 逻辑关系“非”,0:否 ,1:是 + * @apiParam {String} [content] 规则执行内容 + * @apiParam {Integer} ruleType 规则类型(0硬性拒绝规则,1加减分规则) + * @apiParam {Integer} [ruleAudit] 规则审核(2 终止,5 继续)根据ruleType推定拒绝规则为终止 + * @apiParam {Integer} [score] 规则得分 + * @apiParam {String} [lastLogical] 最后逻辑(原表内容未用到) + * @apiParam {object} [ruleConditionVo] 规则对应的一颗规则条件的树形对象 + * @apiParam (ruleConditionVo) {Long} [userId] 条件id + * @apiParam (ruleConditionVo) {String} logical 逻辑符号&&、||(仅关系表达式) + * @apiParam (ruleConditionVo) {Long} fieldId 字段id(仅条件表达式) + * @apiParam (ruleConditionVo) {String} operator 操作符(仅条件表达式) + * @apiParam (ruleConditionVo) {String} fieldValue 字段值(仅条件表达式) + * @apiParam (ruleConditionVo) {Long} [ruleId] 规则id + * @apiParam (ruleConditionVo) {Long} [parentId] 条件父节点id + * @apiParam (ruleConditionVo) {Integer} conditionType 条件类型1.关系表达式,2.条件表达式 + * @apiParam (ruleConditionVo) {List} [children] 子对象列表,和所属对象相同 + * @apiParam {List} [ruleContentInfoList] 同一规则下的content对象list + * @apiParam (ruleContentInfoList) {Long} [userId] content主键id + * @apiParam (ruleContentInfoList) {Long} fieldId 字段id + * @apiParam (ruleContentInfoList) {String} fieldValue 字段值 + * @apiParam (ruleContentInfoList) {Long} [ruleId] 规则id + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":667,"name":"2021_4_7测试接口","versionCode":"test2021_4_7第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":null,"ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":5,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":666,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":6,"logical":null,"fieldId":0,"operator":">","fieldValue":"1000","ruleId":666,"parentId":5,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":7,"logical":null,"fieldId":0,"operator":"<","fieldValue":"10000","ruleId":666,"parentId":5,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":10,"fieldId":"10000","fieldValue":"test01","ruleId":666},{"userId":11,"fieldId":"10000","fieldValue":"test02","ruleId":666}]} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":667,"name":"2021_4_7测试接口","versionCode":"test2021_4_7第二次输入","description":"接口测试","priority":0,"parentId":0,"author":135,"userId":135,"organId":46,"engineId":null,"status":1,"type":1,"isNon":null,"content":"test","created":"2021-04-06T08:38:17.000+00:00","updated":null,"ruleType":0,"ruleAudit":2,"score":0,"lastLogical":"","ruleConditionVo":{"userId":20,"logical":"&&","fieldId":null,"operator":null,"fieldValue":null,"ruleId":667,"parentId":0,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[{"userId":21,"logical":null,"fieldId":null,"operator":">","fieldValue":"1000","ruleId":667,"parentId":20,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null},{"userId":22,"logical":null,"fieldId":null,"operator":"<","fieldValue":"10000","ruleId":667,"parentId":20,"conditionType":1,"createTime":"2021-04-06T08:38:26.000+00:00","updateTime":null,"insertTempId":null,"children":[],"tempParentId":null}],"tempParentId":null},"ruleContentInfoList":[{"userId":20,"fieldId":10000,"fieldValue":"test01","ruleId":667},{"userId":21,"fieldId":10000,"fieldValue":"test02","ruleId":667}]}} + */ + @ResponseBody + @RequestMapping(value = "updateRule", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE) + public ResponseEntityDto updateRule(@RequestBody RuleVo rule) { + RuleVo update = ruleService.updateRuleInfo(rule); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + /** + * @api {POST} /v3/rule/updateRuleStatus 3.23. V3修改状态 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {LongArray} ids 规则id数组 + * @apiParam {Integer} status 目标状态:0未启用,1启用,2删除 + * @apiSuccess {String} status 状态:1成功,0失败 + * @apiParamExample {json} 请求示例: + * {"ids":[666,667],"status":"1"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @ResponseBody + @RequestMapping(value = "updateRuleStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_STATUS) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = ruleService.updateStatus(param.getList(), param.getStatus()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + + } + + @ResponseBody + @RequestMapping(value = "updateRuleParent", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_STATUS) + public ResponseEntityDto updateParent(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = ruleService.updateParent(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + // 查询简单规则 + @ResponseBody + @RequestMapping(value = "getSimpleRule/{id}", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SELECT_SAMPLE_RULE) + public ResponseEntityDto getSimpleRule(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + RuleVo ruleVo = ruleService.queryById(id,1); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(ruleVo); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "getScriptRule/{id}", method = RequestMethod.POST) + public ResponseEntityDto getScriptRule(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + RuleVo ruleVo = ruleService.queryById(id,3); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(ruleVo); + return ruleResponseEntityDto; + } +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleVersionController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleVersionController.java new file mode 100644 index 0000000..5378963 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/RuleVersionController.java @@ -0,0 +1,90 @@ +package com.fibo.ddp.strategyx.guiderule.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@ResponseBody +@RequestMapping("/v3/ruleVersion") +public class RuleVersionController { + + @Autowired + private RuleVersionService versionService; + /** + * 查询指定版本下的内容 + * @param versionId + * @return + */ + @PostMapping("/getRuleVersionInfo/{versionId}") + public ResponseEntityDto getRuleVersionInfo(@PathVariable Long versionId) { + RuleVersionVo version =versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * @param version + * @return + */ + @PostMapping("/addRuleVersion") + @ArchivesLog(operationType = OpTypeConst.SAVE_RULE_VERSION) + public ResponseEntityDto addRuleVersion(@RequestBody RuleVersionVo version){ + boolean b = versionService.addVersion(version); + if (!b){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List< RuleVersionVo> ruleVersionList = versionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * @param version + * @return + */ + @PostMapping("/copyRuleVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_RULE_VERSION) + public ResponseEntityDto copyRuleVersion(@RequestBody RuleVersionVo version){ + boolean b = versionService.copyVersion(version); + List< RuleVersionVo> ruleVersionList = versionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * @param version + * @return + */ + @PostMapping("/updateRuleVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_VERSION) + public ResponseEntityDto updateRuleVersion(@RequestBody RuleVersionVo version){ + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateRuleVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_VERSION_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List ruleVersionList = versionService.queryVersionListByRuleId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalConfigController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalConfigController.java new file mode 100644 index 0000000..604d765 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalConfigController.java @@ -0,0 +1,47 @@ +package com.fibo.ddp.strategyx.guiderule.controller.approval; + +import com.fibo.ddp.common.model.approval.ApprovalConfig; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.service.approval.ApprovalConfigService; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * (ApprovalConfig)表控制层 + */ +@RestController +@RequestMapping("/v3/approvalConfig") +public class ApprovalConfigController { + /** + * 服务对象 + */ + @Resource + private ApprovalConfigService approvalConfigService; + + + + @PostMapping("/getApprovalList") + public ResponseEntityDto getApprovalList(@RequestBody QueryListParam param) { + PageInfo pageInfo = approvalConfigService.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + @PostMapping("/updateApprovalStatus") + public ResponseEntityDto updateApprovalStatus(@RequestBody StatusParam statusParam) { + boolean result = approvalConfigService.updateApprovalStatus(statusParam); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + + } +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalController.java new file mode 100644 index 0000000..4640a99 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/approval/ApprovalController.java @@ -0,0 +1,50 @@ +package com.fibo.ddp.strategyx.guiderule.controller.approval; + +import com.fibo.ddp.common.model.approval.Approval; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.service.approval.ApprovalService; +import com.github.pagehelper.PageInfo; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + + +@RestController +@RequestMapping("/v3/approval") +public class ApprovalController { + /** + * 服务对象 + */ + @Resource + private ApprovalService approvalService; + + @PostMapping("/getApprovalList") + public ResponseEntityDto getApprovalList(@RequestBody QueryListParam param) { + PageInfo pageInfo = approvalService.queryList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + @PostMapping("/updateApplyStatus") + public ResponseEntityDto updateApplyStatus(@RequestBody StatusParam statusParam) { + boolean result = approvalService.updateApplyStatus(statusParam); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + @PostMapping("/updateStatus") + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + boolean result = approvalService.updateStatus(statusParam); + if (result){ + return ResponseEntityBuilder.buildNormalResponse(); + } + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + + } +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/CignaCmbController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/CignaCmbController.java new file mode 100644 index 0000000..f5cd9d1 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/CignaCmbController.java @@ -0,0 +1,89 @@ +package com.fibo.ddp.strategyx.guiderule.controller.cignacmb; + +import com.fibo.ddp.common.model.cignacmb.request.EventLogDetailParam; +import com.fibo.ddp.common.model.cignacmb.request.EventLogParam; +import com.fibo.ddp.common.model.cignacmb.request.RuleLogParam; +import com.fibo.ddp.common.model.cignacmb.response.EventLogDetailResponse; +import com.fibo.ddp.common.model.cignacmb.response.EventLogResponse; +import com.fibo.ddp.common.model.cignacmb.response.RuleLogResponse; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.service.cignacmb.BusinessEventLogService; +import com.fibo.ddp.common.service.cignacmb.BusinessRuleLogService; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; + +/** + * 招商信诺报表接口 + */ + +@RestController +@RequestMapping("/cignacmb") +public class CignaCmbController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private BusinessRuleLogService ruleLogService; + @Autowired + private BusinessEventLogService eventLogService; + + /** + * 规则报表查询 + * @param param + * @return + */ + @RequestMapping(value = "getRuleLogList", method = RequestMethod.POST) + public ResponseEntityDto getRuleLogList(@RequestBody RuleLogParam param){ + // “规则编号、规则名称、规则执行时间段” 不能同时为空 + if(StringUtils.isBlank(param.getRuleCode()) && StringUtils.isBlank(param.getRuleName()) + && (param.getStartTime() == null || param.getEndTime() == null)){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + PageInfo pageInfo = ruleLogService.getRuleLogList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 事件报表查询 + * @param param + * @return + */ + @RequestMapping(value = "getEventLogList", method = RequestMethod.POST) + public ResponseEntityDto getEventLogList(@RequestBody EventLogParam param){ + // “事件流水号、执行时间段”不能同时为空 + if(StringUtils.isBlank(param.getEventRequestId()) + && (param.getStartTime() == null || param.getEndTime() == null)){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + PageInfo pageInfo = eventLogService.getEventLogList(param); + return ResponseEntityBuilder.buildNormalResponse(pageInfo); + } + + /** + * 事件对应规则输出详情 + * @param param + * @return + */ + @RequestMapping(value = "getEventLogDetails", method = RequestMethod.POST) + public ResponseEntityDto getEventLogDetails(@RequestBody EventLogDetailParam param){ + String ruleLogIds = param.getRuleLogIds(); + if(StringUtils.isBlank(ruleLogIds)){ + return ResponseEntityBuilder.buildNormalResponse(); + } + List ids = Arrays.asList(ruleLogIds.split(",")); + List eventLogDetailResponses = ruleLogService.queryByIds(ids); + return ResponseEntityBuilder.buildNormalResponse(eventLogDetailResponses); + } + +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/TBusinessRuleRelController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/TBusinessRuleRelController.java new file mode 100644 index 0000000..06d1a4c --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/cignacmb/TBusinessRuleRelController.java @@ -0,0 +1,81 @@ +package com.fibo.ddp.strategyx.guiderule.controller.cignacmb; + + +import com.fibo.ddp.common.model.cignacmb.req.BusinessRuleRelReq; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.service.cignacmb.ITBusinessRuleRelService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

      + * 业务类型与规则关联表 前端控制器 + *

      + * + * @author oldRose + * @since 2021-11-10 + */ +@RestController +@RequestMapping("/businessRuleRel") +public class TBusinessRuleRelController { + + @Autowired + private ITBusinessRuleRelService businessRuleRelService; + + /** + * 新增业务类型和规则关联 + */ + @PostMapping("/add") + @ArchivesLog(operationType = OpTypeConst.BUSINESS_RULE_REL_ADD) + public ResponseEntityDto addBusinessRuleRel(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.addBusinessRuleRel(param); + } + + /** + * 编辑业务类型和规则关联 + */ + @PostMapping("/edit") + @ArchivesLog(operationType = OpTypeConst.BUSINESS_RULE_REL_EDIT) + public ResponseEntityDto editBusinessRuleRel(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.editBusinessRuleRel(param); + } + + /** + * 查看详情业务类型和规则关联 + */ + @PostMapping("/detail") + @ArchivesLog(operationType = OpTypeConst.BUSINESS_RULE_REL_DETAIL) + public ResponseEntityDto detailBusinessRuleRel(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.detailBusinessRuleRel(param); + } + /** + * 删除详情业务类型和规则关联 + */ + @PostMapping("/delete") + @ArchivesLog(operationType = OpTypeConst.BUSINESS_RULE_REL_DELETE) + public ResponseEntityDto deleteBusinessRuleRel(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.deleteBusinessRuleRel(param); + } + + /** + * 获取投放计划列表分页(按修改时间,创建时间降序排列) + */ + @PostMapping("/list") + @ArchivesLog(operationType = OpTypeConst.BUSINESS_RULE_REL_PAGE) + public ResponseEntityDto pageList(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.pageList(param); + } + /** + * 根据业务类型查询对应规则 + */ + @PostMapping("/queryByBusinessType") + @ArchivesLog(operationType = OpTypeConst.QUERY_BY_BUSINESSTYPE) + public ResponseEntityDto queryByBusinessType(@RequestBody BusinessRuleRelReq param) { + return businessRuleRelService.queryByBusinessType(param); + } +} diff --git a/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/knowledge/KnowledgeTreeController.java b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/knowledge/KnowledgeTreeController.java new file mode 100644 index 0000000..6df77f2 --- /dev/null +++ b/ddp-strategyx/guide-rule/src/main/java/com/fibo/ddp/strategyx/guiderule/controller/knowledge/KnowledgeTreeController.java @@ -0,0 +1,230 @@ +package com.fibo.ddp.strategyx.guiderule.controller.knowledge; + +import com.fibo.ddp.common.model.authx.system.SysUser; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.strategyx.knowledge.KnowledgeTree; +import com.fibo.ddp.common.model.strategyx.knowledge.Rule; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.decisiontable.DecisionTablesService; +import com.fibo.ddp.common.service.strategyx.guiderule.RuleService; +import com.fibo.ddp.common.service.strategyx.knowledge.KnowledgeTreeService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.constant.strategyx.Status; +import com.fibo.ddp.common.utils.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 提供 knowledge 相关接口 + * + * @apiName knowledge + * @apiDefine knowledge 3.规则管理 + */ +@Controller("KnowledgeTreeControllerV2") +@RequestMapping("/v2/knowledge/tree") +@ResponseBody +public class KnowledgeTreeController { + + @Autowired + private ScorecardService scorecardService; + @Autowired + private RuleService ruleService; + @Autowired + private KnowledgeTreeService knowledgeTreeService; + @Autowired + private com.fibo.ddp.common.service.strategyx.knowledge.RuleService ruleService2; + + /** + * @api {POST} /v2/knowledge/tree/list 3.01. 节点 获取目录 list:规则集、物流、银行、回收站等 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Integer} parentId parentId + * @apiParam {String} tree_type 树形分类(默认为0) 0:规则树,1:评分卡的树,2:回收站的树。(多个逗号分割) + * @apiParam {Integer} [type] 目录类型(默认为1) 0:系统的目录、1:组织的目录、2:引擎的目录 + * @apiSuccess {String} status 状态:1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"parentId":0,"tree_type":"0,2","type":1} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"parentId":1155,"tree_type":[0,2],"engineId":null,"type":1,"userId":135,"organId":46,"sort":true,"kArray":[{"userId":1038,"name":"规则集","parentId":0,"userId":1,"organId":46,"engineId":null,"created":1498722046000,"type":1,"treeType":0,"status":1,"updated":1610332377000,"children":[{"userId":1052,"name":"准入规则","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1498725927000,"type":1,"treeType":0,"status":1,"updated":1498725963000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1055,"name":"首贷反欺诈1","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1498725941000,"type":1,"treeType":0,"status":1,"updated":1505019204000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1056,"name":"反欺诈2","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1498725943000,"type":1,"treeType":0,"status":1,"updated":1498725975000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1057,"name":"反欺诈3","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1498725945000,"type":1,"treeType":0,"status":1,"updated":1498725980000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1058,"name":"复贷反欺诈1","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1505021066000,"type":1,"treeType":0,"status":1,"updated":1505021076000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1070,"name":"储蓄卡","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1520228395000,"type":1,"treeType":0,"status":1,"updated":1520228402000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1079,"name":"有盾","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1523523861000,"type":1,"treeType":0,"status":1,"updated":1523523866000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1080,"name":"同盾","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1526268525000,"type":1,"treeType":0,"status":1,"updated":1526268530000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1081,"name":"富数","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1526537754000,"type":1,"treeType":0,"status":1,"updated":1526537758000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1082,"name":"通讯录","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1527823577000,"type":1,"treeType":0,"status":1,"updated":1527823583000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1083,"name":"规则集MS","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1527823577000,"type":1,"treeType":0,"status":1,"updated":1527823583000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1084,"name":"规则集MX","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1559825319000,"type":1,"treeType":0,"status":1,"updated":1559825347000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1087,"name":"规则集TZ","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1559825352000,"type":1,"treeType":0,"status":1,"updated":1559825370000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1088,"name":"规则集YD","parentId":1038,"userId":135,"organId":46,"engineId":null,"created":1559825373000,"type":1,"treeType":0,"status":1,"updated":1559825378000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1122,"name":"规则集DY","parentId":1038,"userId":136,"organId":46,"engineId":null,"created":1610701146000,"type":1,"treeType":0,"status":1,"updated":1610703786000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1103,"name":"物流","parentId":0,"userId":141,"organId":46,"engineId":null,"created":1609742341000,"type":1,"treeType":0,"status":1,"updated":1611304985000,"children":[{"userId":1104,"name":"网点余额不足风险","parentId":1103,"userId":141,"organId":46,"engineId":null,"created":1610332019000,"type":1,"treeType":0,"status":1,"updated":1610332055000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1109,"name":"银行","parentId":0,"userId":142,"organId":46,"engineId":null,"created":1610503557000,"type":1,"treeType":0,"status":1,"updated":1610503562000,"children":[{"userId":1110,"name":"信用卡","parentId":1109,"userId":142,"organId":46,"engineId":null,"created":1610503567000,"type":1,"treeType":0,"status":1,"updated":1610503576000,"children":[{"userId":1111,"name":"客服智能营销服务","parentId":1110,"userId":142,"organId":46,"engineId":null,"created":1610503699000,"type":1,"treeType":0,"status":1,"updated":1610503702000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1112,"name":"智能短信服务","parentId":1110,"userId":142,"organId":46,"engineId":null,"created":1610503750000,"type":1,"treeType":0,"status":1,"updated":1610503752000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1113,"name":"信用卡新户礼客户准入","parentId":1110,"userId":142,"organId":46,"engineId":null,"created":1610503758000,"type":1,"treeType":0,"status":1,"updated":1610503760000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1039,"name":"回收站","parentId":0,"userId":1,"organId":46,"engineId":null,"created":1498722046000,"type":1,"treeType":2,"status":1,"updated":1498722046000,"children":[{"userId":1123,"name":"新建文件夹","parentId":1039,"userId":136,"organId":46,"engineId":null,"created":1610701170000,"type":1,"treeType":0,"status":-1,"updated":1611643120000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1129,"name":"新建文件夹","parentId":1039,"userId":143,"organId":46,"engineId":null,"created":1611545787000,"type":1,"treeType":0,"status":-1,"updated":1611643122000,"children":[{"userId":1130,"name":"新建文件夹","parentId":1129,"userId":143,"organId":46,"engineId":null,"created":1611545828000,"type":1,"treeType":0,"status":1,"updated":1611545828000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1131,"name":"新建文件夹","parentId":1039,"userId":144,"organId":46,"engineId":null,"created":1611573817000,"type":1,"treeType":0,"status":-1,"updated":1611643123000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1132,"name":"新建文件夹","parentId":1039,"userId":144,"organId":46,"engineId":null,"created":1611575638000,"type":1,"treeType":0,"status":-1,"updated":1612409450000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1},{"userId":1155,"name":"新建文件夹","parentId":1039,"userId":145,"organId":46,"engineId":null,"created":1612494472000,"type":1,"treeType":0,"status":-1,"updated":1612494477000,"children":[],"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}],"isParent":"true","icon":"../resource/images/datamanage/cabage.png","isLastNode":"true","directoryType":1}]}} + */ + @RequestMapping(value = "/list", method = RequestMethod.POST) + public ResponseEntityDto list(@RequestBody Map param) { + List list = knowledgeTreeService.getTreeList(param); + return ResponseEntityBuilder.buildNormalResponse(list); + } + /** + * save:(保存新增节点) + * @param inputParam 请求参数集合 + * @return + * + */ + /** + * @api {POST} /v2/knowledge/tree/save 3.02. 节点 新增 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Integer} name 节点名字 + * @apiParam {Integer} parentId parentId + * @apiParam {Integer} treeType 树形分类 0:规则树、1:评分卡的树、2:回收站的树 + * @apiParam {Integer} [type] 默认值为1,表示组织的目录 + * @apiParam {Integer} engineId null + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"name":"我是文件夹1047","parentId":"0","treeType":"0","type":"1","engineId":""} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"name":"我是文件夹1047","parentId":"0","treeType":"0","type":"1","engineId":"","userId":135,"organId":46,"result":1,"node":{"userId":1162,"name":"我是文件夹1047","parentId":0,"userId":135,"organId":46,"engineId":null,"created":null,"type":1,"treeType":0,"status":1,"updated":null,"children":null,"isParent":"true","icon":"../resource/images/authority/folder.png","isLastNode":"","directoryType":1}}} + */ + @RequestMapping(value = "/save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_KNOWLEDGE_TREE) + public ResponseEntityDto save(@RequestBody Map param) { + KnowledgeTree k = new KnowledgeTree(); + Map paramMap = getParam(param); + k.setName((String) param.get("name")); + if (param.containsKey("treeType") + && !StringUtil.isBlank(param.get("treeType").toString())) { + k.setTreeType(Integer.parseInt(param.get("treeType").toString())); + } + // 加 + if (null == paramMap.get("type") || "".equals(paramMap.get("type"))) { + paramMap.put("type", 1); + } + if (paramMap.containsKey("type") + && !StringUtil.isBlank(param.get("type").toString())) { + k.setType(Integer.parseInt(paramMap.get("type").toString())); + } + if (paramMap.containsKey("organId") + && !StringUtil.isBlank(param.get("organId").toString())) { + k.setOrganId(Long.parseLong(paramMap.get("organId").toString())); + } + if (paramMap.containsKey("engineId") + && !StringUtil.isBlank(param.get("engineId").toString())) { + k.setEngineId(Long.parseLong(paramMap.get("engineId").toString())); + } + if (param.containsKey("parentId") + && !StringUtil.isBlank(param.get("parentId").toString())) { + k.setParentId(Long.parseLong(param.get("parentId").toString())); + } + if (paramMap.containsKey("userId") + && !StringUtil.isBlank(param.get("userId").toString())) { + k.setUserId(Long.parseLong(paramMap.get("userId").toString())); + } + k.setStatus(Status.ENABLED); + boolean flag = knowledgeTreeService.insertTree(k); + if (flag) { + param.put("result", 1); + } else { + param.put("result", -1); + } + param.put("node", k); + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * @api {POST} /v2/knowledge/tree/update 3.03. 节点 修改/删除 + * @apiGroup knowledge + * @apiVersion 2.0.0 + * @apiParam {Integer} userId 节点id + * @apiParam {String} name 节点名称 + * @apiParam {Integer} engineId engineId + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * 修改: + * {"userId":1162,"name":"文件夹1127","engineId":""} + * 删除: + * {"userId":1162,"status":"-1","type":"1","engineId":"","parentId":0} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"userId":1162,"name":"文件夹1127","engineId":"","userId":135,"organId":46,"result":1}} + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_KNOWLEDGE_TREE) + public ResponseEntityDto update(@RequestBody Map param) { + if (null == param.get("type") || "".equals(param.get("type"))) { + param.put("type", 1); + } + Long id = Long.parseLong(param.get("id").toString()); + KnowledgeTree k = knowledgeTreeService.findById(id); + param.putAll(getParam(param)); + if (param.containsKey("name")) { + k.setName((String) param.get("name")); + } + if (param.containsKey("status")) { + int status = Integer.parseInt(param.get("status").toString()); + k.setStatus(status); + List idList = new ArrayList(); + Map map = new HashMap(); + map.put("parentIds", StringUtil.toLongList(k.getId().toString())); + map.put("type", param.get("type")); + map.put("engineId", param.get("engineId")); + map.put("organId", k.getOrganId()); + if (status == -1) { + map.put("status", StringUtil.toLongList("0,1")); + } + if (status == 1) { + map.put("status", StringUtil.toLongList("-1")); + } + if (k.getTreeType() == 0) { + List rlist = ruleService2.getRuleList(map); + if (rlist != null && rlist.size() > 0) { + for (Rule r : rlist) { + idList.add(r.getId()); + } + map.put("status", status); + map.put("idList", idList); +// s.ruleService.updateRuleStatus(map); + ruleService.updateStatus(idList, status); + } + } + if (k.getTreeType() == 1) { + List slist = scorecardService.getScorecardList(map); + if (slist != null && slist.size() > 0) { + for (Scorecard s : slist) { + idList.add(s.getId()); + } + map.put("status", status); + map.put("idList", idList); + + scorecardService.updateScorecardStatus(idList, status); + } + } + if (k.getTreeType() == 3) { +// decisionTablesService.updateStatus(idList.toArray(new Long[idList.size()]),status); + } + } + if (param.containsKey("parentId")) { + k.setParentId(Long.parseLong(param.get("parentId").toString())); + } + boolean flag = knowledgeTreeService.updateTree(k); + if (flag) { + param.put("result", 1); + } else { + param.put("result", -1); + } + return ResponseEntityBuilder.buildNormalResponse(param); + } + + /** + * getInputParam:(根据用户角色或权限,获取所需参数集合) + * + * @return paramMap + */ + private Map getParam(Map paramMap) { + SysUser sysUser = SessionManager.getLoginAccount(); + paramMap.put("userId", sysUser.getUserId()); + paramMap.put("organId", sysUser.getOrganId()); + return paramMap; + } + + +} diff --git a/ddp-strategyx/list-library/pom.xml b/ddp-strategyx/list-library/pom.xml new file mode 100644 index 0000000..ccf45f8 --- /dev/null +++ b/ddp-strategyx/list-library/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-list-library + + + \ No newline at end of file diff --git a/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbController.java b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbController.java new file mode 100644 index 0000000..75db01c --- /dev/null +++ b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbController.java @@ -0,0 +1,362 @@ +package com.fibo.ddp.strategyx.listlibrary.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.datax.datamanage.Field; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; +import com.fibo.ddp.common.service.common.SessionManager; +import com.fibo.ddp.common.service.datax.datamanage.FieldService; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.StringUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @apiDefine listDb 4.黑白名单库管理 + */ +@Controller("listDbControllerV2") +@RequestMapping("v2/datamanage/listmanage") +@ResponseBody +public class ListDbController { + + @Autowired + private ListDbService listDbService; + @Autowired + private FieldService fieldService; + + /** + * @api {POST} /v2/datamanage/listmanage/list 4.01. 获取黑、白名单列表 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} listType 名单库区分,b表示黑名单,w表示白名单 + * @apiParam {Integer} pageNo 第几页 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSONArray} listDbs 名单库列表 + * @apiSuccess (listDbs) {Long} userId 名单库Id + * @apiSuccess (listDbs) {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiSuccess (listDbs) {String} listName 名单库名称 + * @apiSuccess (listDbs) {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiSuccess (listDbs) {String} listAttr 名单库属性,用户输入 + * @apiSuccess (listDbs) {String} listDesc 名单库描述 + * @apiSuccess (listDbs) {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiSuccess (listDbs) {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiSuccess (listDbs) {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiSuccess (listDbs) {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess (listDbs) {Integer} status 名单库状态 启用(1),停用(0),删除(-1) + * @apiSuccess (listDbs) {String} nickName 创建人 + * @apiSuccess (listDbs) {Long} created 创建时间 + * @apiSuccess {JSON} pager 分页信息 + * @apiParamExample {json} 请求示例: + * {"listType":"b","pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":5,"pages":3,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3],"navigateFirstPage":1,"navigateLastPage":3,"lastPage":3,"firstPage":1},"listDbs":[{"page":0,"rows":0,"total":null,"userId":116,"listType":"b","listName":"测试-黑名单3","dataSource":2,"listAttr":"666","listDesc":"测试-黑名单333","tableColumn":"587","matchType":1,"queryType":1,"queryField":"587","queryFieldCn":null,"organId":46,"status":0,"userId":135,"created":1615952361000,"nickName":"管理员"},{"page":0,"rows":0,"total":null,"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589","queryFieldCn":null,"organId":46,"status":0,"userId":135,"created":1615952361000,"nickName":"管理员"}]}} + */ + @RequestMapping(value = "list", method = RequestMethod.POST) + public ResponseEntityDto list(@RequestBody HashMap paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + Integer pageNo = paramMap.containsKey("pageNo") ? (Integer)paramMap.get("pageNo") : 1; + Integer pageSize = paramMap.containsKey("pageSize") ? (Integer)paramMap.get("pageSize") : 10; + PageHelper.startPage(pageNo,pageSize); + List listDbList = listDbService.findByUser(paramMap); + + PageInfo pageInfo = new PageInfo(listDbList); + pageInfo.setList(null); + + List listDbs = new ArrayList<>(); + for (ListDb listDb : listDbList) { + Map map= new HashMap<>(); + try { + map = BeanUtils.describe(listDb); + } catch (IllegalAccessException|InvocationTargetException|NoSuchMethodException e) { + e.printStackTrace(); + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + listDbs.add(listDbService.findById(map)); + } + HashMap modelMap = new HashMap<>(); + modelMap.put("pager", pageInfo); + modelMap.put("listDbs", listDbs); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/listmanage/save 4.02. 添加黑、白名单库 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam {String} listName 名单库名称 + * @apiParam {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam {String} listAttr 名单库属性,用户输入 + * @apiParam {String} listDesc 名单库描述 + * @apiParam {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"listType":"b","listName":"测试-黑名单5","dataSource":2,"listAttr":"666","listDesc":"测试-黑名单555","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto save(@RequestBody ListDb listDb) { + + HashMap validateMap = new HashMap<>(); + validateMap.put("listType", listDb.getListType()); + validateMap.put("listName", listDb.getListName()); + validateMap.put("listDbId", listDb.getId()); + int listDbNum = listNameAjaxValidate(validateMap); + if(listDbNum > 0){ + throw new ApiException(ErrorCodeEnum.LIST_DB_NAME_REPEAT.getCode(), ErrorCodeEnum.LIST_DB_NAME_REPEAT.getMessage()); + } + + Map param = JSONObject.parseObject(JSONObject.toJSONString(listDb)); + + Long userId = SessionManager.getLoginAccount().getUserId(); + Long organId = SessionManager.getLoginAccount().getOrganId(); + param.put("userId", userId); + param.put("organId", organId); + + listDb.setUserId(userId); + listDb.setOrganId(organId); + listDb.setStatus(1); + + boolean result = listDbService.createListDb(listDb, param); + +// model.addAttribute("listType", inputParam.get("listType")); + + return ResponseEntityBuilder.buildNormalResponse(result); + } + + private int listNameAjaxValidate(HashMap paramMap) { + if("".equals(paramMap.get("listDbId"))){ + paramMap.put("listDbId", null); + } + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + return listDbService.isExists(paramMap); + } + + /** + * @api {POST} /v2/datamanage/listmanage/getListDbInfo/{userId} 4.03. 获取黑、白名单库详情 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {JSON} listDbInfo 名单库基础信息 + * @apiParam (listDbInfo) {Long} userId 名单库Id + * @apiParam (listDbInfo) {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam (listDbInfo) {String} listName 名单库名称 + * @apiParam (listDbInfo) {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam (listDbInfo) {String} listAttr 名单库属性,用户输入 + * @apiParam (listDbInfo) {String} listDesc 名单库描述 + * @apiParam (listDbInfo) {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam (listDbInfo) {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam (listDbInfo) {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam (listDbInfo) {String} queryField 查询主键,字段编号逗号分割 + * @apiParam {JSONArray} tableColumnList 名单库表中列字段集合 + * @apiParam (tableColumnList) {Long} userId 指标Id + * @apiParam (tableColumnList) {Long} fieldEn 指标英文名 + * @apiParam (tableColumnList) {Long} fieldCn 指标中文名 + * @apiParam {JSONArray} queryFieldList 查询主键字段集合 + * @apiParam (queryFieldList) {Long} userId 指标Id + * @apiParam (queryFieldList) {Long} fieldEn 指标英文名 + * @apiParam (queryFieldList) {Long} fieldCn 指标中文名 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"listType":"b"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"listDbInfo":{"page":0,"rows":0,"total":null,"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589","queryFieldCn":null,"organId":46,"status":1,"userId":135,"created":1615897180000,"nickName":null},"queryFieldList":[{"page":0,"rows":0,"total":null,"userId":589,"fieldEn":"f_td_finalScore","fieldCn":"同盾_评分","fieldTypeId":271,"fieldType":"反欺诈1","valueType":1,"valueTypeName":null,"valueScope":"(0,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false}],"tableColumnList":[{"page":0,"rows":0,"total":null,"userId":587,"fieldEn":"f_hr_age","fieldCn":"年龄准入","fieldTypeId":270,"fieldType":"准入","valueType":1,"valueTypeName":null,"valueScope":"(-1,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false},{"page":0,"rows":0,"total":null,"userId":589,"fieldEn":"f_td_finalScore","fieldCn":"同盾_评分","fieldTypeId":271,"fieldType":"反欺诈1","valueType":1,"valueTypeName":null,"valueScope":"(0,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false}]}} + */ + @RequestMapping(value = "getListDbInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getListDbInfo(@PathVariable long id, @RequestBody Map param) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + param.put("userId", userId); + param.put("id", id); + + ListDb listDb = listDbService.findById(param); + + List fieldList = new ArrayList(); + List Ids = StringUtil.toLongList(listDb.getTableColumn()); + for(Long fieldId :Ids){ + HashMap tableColumnMap = new HashMap(); + tableColumnMap.put("userId", userId); + tableColumnMap.put("userId", fieldId); + + Field field = new Field(); + field = fieldService.findByFieldId(tableColumnMap); + + fieldList.add(field); + } + + List queryFieldList = new ArrayList(); + List queryFieldIds = StringUtil.toLongList(listDb.getQueryField()); + for(Long queryFieldId : queryFieldIds){ + HashMap queryFieldMap = new HashMap(); + queryFieldMap.put("userId", userId); + queryFieldMap.put("userId", queryFieldId); + + Field queryField = new Field(); + queryField = fieldService.findByFieldId(queryFieldMap); + + queryFieldList.add(queryField); + + } + + HashMap modelMap = new HashMap<>(); + modelMap.put("listDbInfo", listDb); + modelMap.put("tableColumnList", fieldList); + modelMap.put("queryFieldList", queryFieldList); + + return ResponseEntityBuilder.buildNormalResponse(modelMap); + } + + /** + * @api {POST} /v2/datamanage/listmanage/update 4.04. 修改黑、白名单库 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {Long} userId 名单库Id + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam {String} listName 名单库名称 + * @apiParam {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam {String} listAttr 名单库属性,用户输入 + * @apiParam {String} listDesc 名单库描述 + * @apiParam {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto update(@RequestBody ListDb listDb) { + + HashMap validateMap = new HashMap<>(); + validateMap.put("listType", listDb.getListType()); + validateMap.put("listName", listDb.getListName()); + validateMap.put("listDbId", listDb.getId()); + int listDbNum = listNameAjaxValidate(validateMap); + if(listDbNum > 0){ + throw new ApiException(ErrorCodeEnum.LIST_DB_NAME_REPEAT.getCode(), ErrorCodeEnum.LIST_DB_NAME_REPEAT.getMessage()); + } + + Map paramMap = JSONObject.parseObject(JSONObject.toJSONString(listDb)); + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + + boolean result = listDbService.updateListDb(paramMap); + +// model.addAttribute("listType", paramMap.get("listType")); + + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/datamanage/listmanage/updateStatus 4.05. 名单库停用、启用、删除 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} ids 名单库Id,多个用逗号分隔 + * @apiParam {Integer} status 名单库状态 启用(1),停用(0),删除(-1) + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"ids":"116,117","status":0,"listType":"b"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto updateStatus(@RequestBody Map paramMap) { + + Long userId = SessionManager.getLoginAccount().getUserId(); + paramMap.put("userId", userId); + String idsStr =(String) paramMap.get("ids"); + List Ids = StringUtil.toLongList(idsStr); + paramMap.put("Ids", Ids); + + boolean result = listDbService.updateStatus(paramMap); + +// model.addAttribute("listType", paramMap.get("listType")); + + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/datamanage/listmanage/downTemplate 4.06. 名单库导入模板下载 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "downTemplate") + public ResponseEntity downExcelTemplate() throws IOException { + ClassPathResource classPathResource = new ClassPathResource("excleTemplate/listDb.xlsx"); + InputStream inputStream = classPathResource.getInputStream(); + HttpHeaders headers = new HttpHeaders(); + String fileName = new String("名单库导入模板.xlsx".getBytes("UTF-8"), "iso-8859-1");//为了解决中文名称乱码问题 + headers.setContentDispositionFormData("attachment", fileName); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity(IOUtils.toByteArray(inputStream), headers, HttpStatus.CREATED); + } + + /** + * @api {POST} /v2/datamanage/listmanage/upload/{userId} 4.07. 名单库导入 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "upload/{id}", method = RequestMethod.POST) + public ResponseEntityDto upload(HttpServletRequest request, @PathVariable Long id) throws Exception { + //将当前上下文初始化给CommonsMutipartResolver(多部分解析器) + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); + if (!multipartResolver.isMultipart(request)) { + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + String result = listDbService.upload(request, id); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/datamanage/listmanage/getListDbData 4.08. 查询名单库数据 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "getListDbData", method = RequestMethod.POST) + public ResponseEntityDto getListDbData(@RequestBody ListDbDataParam param) { + Map result = listDbService.getListDbData(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + +} diff --git a/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbV3Controller.java b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbV3Controller.java new file mode 100644 index 0000000..c4cfff1 --- /dev/null +++ b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbV3Controller.java @@ -0,0 +1,240 @@ +package com.fibo.ddp.strategyx.listlibrary.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDb; +import com.fibo.ddp.common.model.strategyx.listlibrary.request.ListDbDataParam; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbV3Service; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * @apiDefine listDb 4.黑白名单库管理 + */ +@RestController("listDbController") +@RequestMapping("v3/listDb") +public class ListDbV3Controller { + @Autowired + private ListDbV3Service listDbService; + /** + * @api {POST} /v2/datamanage/listmanage/list 4.01. 获取黑、白名单列表 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} listType 名单库区分,b表示黑名单,w表示白名单 + * @apiParam {Integer} pageNo 第几页 + * @apiParam {Integer} pageSize 每页的条数 + * @apiSuccess {JSONArray} listDbs 名单库列表 + * @apiSuccess (listDbs) {Long} userId 名单库Id + * @apiSuccess (listDbs) {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiSuccess (listDbs) {String} listName 名单库名称 + * @apiSuccess (listDbs) {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiSuccess (listDbs) {String} listAttr 名单库属性,用户输入 + * @apiSuccess (listDbs) {String} listDesc 名单库描述 + * @apiSuccess (listDbs) {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiSuccess (listDbs) {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiSuccess (listDbs) {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiSuccess (listDbs) {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess (listDbs) {Integer} status 名单库状态 启用(1),停用(0),删除(-1) + * @apiSuccess (listDbs) {String} nickName 创建人 + * @apiSuccess (listDbs) {Long} created 创建时间 + * @apiSuccess {JSON} pager 分页信息 + * @apiParamExample {json} 请求示例: + * {"listType":"b","pageNo":1,"pageSize":2} + * @apiSuccessExample {json} Success-Response: + * {"status":"1","error":"00000000","msg":null,"data":{"pager":{"pageNum":1,"pageSize":2,"size":2,"startRow":1,"endRow":2,"total":5,"pages":3,"list":null,"prePage":0,"nextPage":2,"isFirstPage":true,"isLastPage":false,"hasPreviousPage":false,"hasNextPage":true,"navigatePages":8,"navigatepageNums":[1,2,3],"navigateFirstPage":1,"navigateLastPage":3,"lastPage":3,"firstPage":1},"listDbs":[{"page":0,"rows":0,"total":null,"userId":116,"listType":"b","listName":"测试-黑名单3","dataSource":2,"listAttr":"666","listDesc":"测试-黑名单333","tableColumn":"587","matchType":1,"queryType":1,"queryField":"587","queryFieldCn":null,"organId":46,"status":0,"userId":135,"created":1615952361000,"nickName":"管理员"},{"page":0,"rows":0,"total":null,"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589","queryFieldCn":null,"organId":46,"status":0,"userId":135,"created":1615952361000,"nickName":"管理员"}]}} + */ + @RequestMapping(value = "/list", method = RequestMethod.POST) + public ResponseEntityDto list(@RequestBody QueryListParam param) { + PageInfo pageInfo = listDbService.queryByEntity(param); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + return ResponseEntityBuilder.buildNormalResponse(responseMap); + } + /** + * @api {POST} /v2/datamanage/listmanage/save 4.02. 添加黑、白名单库 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam {String} listName 名单库名称 + * @apiParam {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam {String} listAttr 名单库属性,用户输入 + * @apiParam {String} listDesc 名单库描述 + * @apiParam {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"listType":"b","listName":"测试-黑名单5","dataSource":2,"listAttr":"666","listDesc":"测试-黑名单555","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "/save", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto save(@RequestBody ListDb listDb) { + boolean result = listDbService.addListDb(listDb); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + + /** + * @api {POST} /v2/datamanage/listmanage/getListDbInfo/{userId} 4.03. 获取黑、白名单库详情 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {JSON} listDbInfo 名单库基础信息 + * @apiParam (listDbInfo) {Long} userId 名单库Id + * @apiParam (listDbInfo) {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam (listDbInfo) {String} listName 名单库名称 + * @apiParam (listDbInfo) {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam (listDbInfo) {String} listAttr 名单库属性,用户输入 + * @apiParam (listDbInfo) {String} listDesc 名单库描述 + * @apiParam (listDbInfo) {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam (listDbInfo) {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam (listDbInfo) {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam (listDbInfo) {String} queryField 查询主键,字段编号逗号分割 + * @apiParam {JSONArray} tableColumnList 名单库表中列字段集合 + * @apiParam (tableColumnList) {Long} userId 指标Id + * @apiParam (tableColumnList) {Long} fieldEn 指标英文名 + * @apiParam (tableColumnList) {Long} fieldCn 指标中文名 + * @apiParam {JSONArray} queryFieldList 查询主键字段集合 + * @apiParam (queryFieldList) {Long} userId 指标Id + * @apiParam (queryFieldList) {Long} fieldEn 指标英文名 + * @apiParam (queryFieldList) {Long} fieldCn 指标中文名 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"listType":"b"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"listDbInfo":{"page":0,"rows":0,"total":null,"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589","queryFieldCn":null,"organId":46,"status":1,"userId":135,"created":1615897180000,"nickName":null},"queryFieldList":[{"page":0,"rows":0,"total":null,"userId":589,"fieldEn":"f_td_finalScore","fieldCn":"同盾_评分","fieldTypeId":271,"fieldType":"反欺诈1","valueType":1,"valueTypeName":null,"valueScope":"(0,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false}],"tableColumnList":[{"page":0,"rows":0,"total":null,"userId":587,"fieldEn":"f_hr_age","fieldCn":"年龄准入","fieldTypeId":270,"fieldType":"准入","valueType":1,"valueTypeName":null,"valueScope":"(-1,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false},{"page":0,"rows":0,"total":null,"userId":589,"fieldEn":"f_td_finalScore","fieldCn":"同盾_评分","fieldTypeId":271,"fieldType":"反欺诈1","valueType":1,"valueTypeName":null,"valueScope":"(0,999999]","isDerivative":0,"isDerivativeName":null,"isOutput":0,"isOutputName":null,"isCommon":1,"formula":"","formulaShow":"","usedFieldId":null,"origFieldId":null,"author":null,"nickName":null,"created":null,"engineId":null,"engineName":null,"status":null,"fieldCondList":[],"fieldRelId":null,"dataSourceId":null,"sqlStatement":null,"useSql":false}]}} + */ + @RequestMapping(value = "/getListDbInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getListDbInfo(@PathVariable Long id) { + if (id==null){ + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(),ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + ListDb listDb = listDbService.queryById(id); + return ResponseEntityBuilder.buildNormalResponse(listDb); + } + + /** + * @api {POST} /v2/datamanage/listmanage/update 4.04. 修改黑、白名单库 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {Long} userId 名单库Id + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiParam {String} listName 名单库名称 + * @apiParam {Integer} dataSource 数据来源:外部黑(白)名单(1)、内部黑(白)名单(2)、待选(0) + * @apiParam {String} listAttr 名单库属性,用户输入 + * @apiParam {String} listDesc 名单库描述 + * @apiParam {String} tableColumn 名单库表中列字段,字段id逗号分隔 + * @apiParam {Integer} matchType 检索匹配类型,精确匹配(1),模糊匹配(0) + * @apiParam {Integer} queryType 查询字段间逻辑,and(1),or(0) + * @apiParam {String} queryField 查询主键,字段编号逗号分割 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"userId":117,"listType":"b","listName":"测试-黑名单5","dataSource":1,"listAttr":"666","listDesc":"测试-黑名单555hh","tableColumn":"587,589","matchType":1,"queryType":1,"queryField":"589"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto update(@RequestBody ListDb listDb) { + boolean result = listDbService.updateListDb(listDb); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/datamanage/listmanage/updateStatus 4.05. 名单库停用、启用、删除 + * @apiGroup listDb + * @apiVersion 2.0.0 + * @apiParam {String} ids 名单库Id,多个用逗号分隔 + * @apiParam {Integer} status 名单库状态 启用(1),停用(0),删除(-1) + * @apiParam {String} listType 名单库区分,用b表示黑名单,w表示白名单 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiParamExample {json} 请求示例: + * {"ids":"116,117","status":0,"listType":"b"} + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":true} + */ + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + listDbService.updateStatus(param.getList(),param.getStatus()); + return ResponseEntityBuilder.buildNormalResponse(); + } + @ResponseBody + @RequestMapping(value = "/updateFolder", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_BLACK_OR_WHITE_LIST_DB_FOLDER) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = listDbService.updateFolder(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + /** + * @api {POST} /v2/datamanage/listmanage/downTemplate 4.06. 名单库导入模板下载 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "/downTemplate") + public ResponseEntity downExcelTemplate() throws IOException { + ClassPathResource classPathResource = new ClassPathResource("excleTemplate/listDb.xlsx"); + InputStream inputStream = classPathResource.getInputStream(); + HttpHeaders headers = new HttpHeaders(); + String fileName = new String("名单库导入模板.xlsx".getBytes("UTF-8"), "iso-8859-1");//为了解决中文名称乱码问题 + headers.setContentDispositionFormData("attachment", fileName); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity(IOUtils.toByteArray(inputStream), headers, HttpStatus.CREATED); + } + + /** + * @api {POST} /v2/datamanage/listmanage/upload/{userId} 4.07. 名单库导入 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "/upload/{id}", method = RequestMethod.POST) + public ResponseEntityDto upload(HttpServletRequest request, @PathVariable Long id) throws Exception { + //将当前上下文初始化给CommonsMutipartResolver(多部分解析器) + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); + if (!multipartResolver.isMultipart(request)) { + throw new ApiException(ErrorCodeEnum.FILE_UPLOAD_ERROR.getCode(), ErrorCodeEnum.FILE_UPLOAD_ERROR.getMessage()); + } + String result = listDbService.upload(request, id); + return ResponseEntityBuilder.buildNormalResponse(result); + } + + /** + * @api {POST} /v2/datamanage/listmanage/getListDbData 4.08. 查询名单库数据 + * @apiGroup listDb + * @apiVersion 2.0.0 + */ + @RequestMapping(value = "/getListDbData", method = RequestMethod.POST) + public ResponseEntityDto getListDbData(@RequestBody ListDbDataParam param) { + Map result = listDbService.getListDbData(param); + return ResponseEntityBuilder.buildNormalResponse(result); + } + +} diff --git a/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbVersionController.java b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbVersionController.java new file mode 100644 index 0000000..6f50223 --- /dev/null +++ b/ddp-strategyx/list-library/src/main/java/com/fibo/ddp/strategyx/listlibrary/controller/ListDbVersionController.java @@ -0,0 +1,98 @@ +package com.fibo.ddp.strategyx.listlibrary.controller; + + +import com.baomidou.mybatisplus.extension.api.ApiController; +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.listlibrary.ListDbVersion; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.listlibrary.ListDbVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (ListDbVersion)表控制层 + */ +@RestController +@RequestMapping("v3/listDb/version") +public class ListDbVersionController extends ApiController { + /** + * 服务对象 + */ + @Resource + private ListDbVersionService versionService; + + /** + * 查询指定版本下的内容 + * + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + ListDbVersion version = versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * + * @param version + * @return + */ + @PostMapping("/addVersion") + @ArchivesLog(operationType = OpTypeConst.ADD_BLACK_OR_WHITE_LIST_DB_VERSION) + public ResponseEntityDto addVersion(@RequestBody ListDbVersion version) { + boolean b = versionService.addVersion(version); + if (!b) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List ruleVersionList = versionService.queryVersionListByListDbId(version.getListDbId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * + * @param version + * @return + */ + @PostMapping("/copyVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_BLACK_OR_WHITE_LIST_DB_VERSION) + public ResponseEntityDto copyVersion(@RequestBody ListDbVersion version) { + boolean b = versionService.copyVersion(version); + List ruleVersionList = versionService.queryVersionListByListDbId(version.getListDbId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * + * @param version + * @return + */ + @PostMapping("/updateVersion") + public ResponseEntityDto updateVersion(@RequestBody ListDbVersion version) { + boolean b = versionService.updateVersion(version); + List ruleVersionList = versionService.queryVersionListByListDbId(version.getListDbId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * + * @param StatusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + public ResponseEntityDto updateStatus(@RequestBody StatusParam StatusParam) { + versionService.updateStatus(StatusParam); + List ruleVersionList = versionService.queryVersionListByListDbId(StatusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } +} diff --git a/ddp-strategyx/pom.xml b/ddp-strategyx/pom.xml new file mode 100644 index 0000000..51012bd --- /dev/null +++ b/ddp-strategyx/pom.xml @@ -0,0 +1,36 @@ + + + + ddp + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx + pom + + guide-rule + script-rule + score-card + list-library + ai-model + decision-table + decision-tree + collection-rule + tag + data-clean + + + + + com.fibo.ddp + ddp-common-service + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/ddp-strategyx/score-card/pom.xml b/ddp-strategyx/score-card/pom.xml new file mode 100644 index 0000000..f364794 --- /dev/null +++ b/ddp-strategyx/score-card/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-score-card + + + \ No newline at end of file diff --git a/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardController.java b/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardController.java new file mode 100644 index 0000000..395a68a --- /dev/null +++ b/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardController.java @@ -0,0 +1,137 @@ +package com.fibo.ddp.strategyx.scorecard.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.scorecard.Scorecard; +import com.fibo.ddp.common.model.strategyx.scorecard.request.ListParam; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardService; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.util.strategyx.SectionUtils; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 评分卡(Scorecard) Controller + */ +@Controller("ScorecardControllerV3") +@RequestMapping("/v3/scorecard") +@ResponseBody +public class ScorecardController { + + @Autowired + private ScorecardService scorecardService; + @Resource + private ScorecardVersionService versionService; + + /** + * 查询指定版本下的内容 + * @param versionId + * @return + */ + @PostMapping("/getScorecardVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + ScorecardVersionVo version =versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 查询评分卡基本信息 + * @param scorecardId + * @return + */ + @PostMapping("/getScorecardInfo/{scorecardId}") + public ResponseEntityDto getScorecardInfo(@PathVariable Long scorecardId) { + ScorecardVo scorecardVo = scorecardService.getScorecardInfo(scorecardId); + return ResponseEntityBuilder.buildNormalResponse(scorecardVo); + } + + // 新增 + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.SAVE_SCORECARD) + public ResponseEntityDto add(@RequestBody ScorecardVo scorecardVo) { + Scorecard scorecard = scorecardService.addScorecard(scorecardVo); + return ResponseEntityBuilder.buildNormalResponse(scorecard); + } + + // 获取列表(分页信息) + @RequestMapping(value = "/list", method = RequestMethod.POST) + public ResponseEntityDto list(@RequestBody ListParam listParam) { + if (listParam.getValue() != null) { + listParam.setValue(listParam.getValue().trim()); // 去除 前后空格 + } + PageInfo pageInfo = scorecardService.getScorecardList(listParam); + + Map bodyMap = new HashMap<>(); + bodyMap.put("scorecardList", pageInfo.getList()); + pageInfo.setList(null); + bodyMap.put("pageInfo", pageInfo); + return ResponseEntityBuilder.buildNormalResponse(bodyMap); + } + + // 修改 + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SCORECARD) + public ResponseEntityDto update(@RequestBody ScorecardVo scorecardVo) { + Scorecard scorecard = scorecardService.updateScorecard(scorecardVo); + return ResponseEntityBuilder.buildNormalResponse(scorecard); + } + + // 修改状态(ids,status) + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SCORECARD_STATUS) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + List ids = new ArrayList<>(); + for (String s : param.getIds().split(",")) { + ids.add(Long.valueOf(s)); + } + Integer status = param.getStatus(); + scorecardService.updateScorecardStatus(ids, status); + return ResponseEntityBuilder.buildNormalResponse(null); + } + + /** + * @api {POST} /v2/knowledge/scorecard/section 5.07. 区间校验 + * @apiGroup scorecard + * @apiVersion 2.0.0 + * @apiSuccess {String} status 状态: 1成功, 0失败 + * @apiSuccess {String} data.result 1:区间有效、-1:区间不完整或有重叠 + * @apiParamExample {json} 请求示例: + * ["(,1]","(1,6]","(6,15]","(15,20]","(20,)"] + * @apiSuccessExample {json} 成功返回数据示例: + * {"status":"1","error":"00000000","msg":null,"data":{"result":"1","msg":"区间有效!"}} + */ + @RequestMapping(value = "/section", method = RequestMethod.POST) + public ResponseEntityDto saveEngineNode(@RequestBody List sections) { + + // @RequestParam("sections[]") List sections + Map resultMap = new HashMap(); + // 验证区间完整性 + if (SectionUtils.checkSectionValid(sections)) { + if (SectionUtils.checkSectionCoincide(sections)) { + resultMap.put("result", "-1"); + resultMap.put("msg", "区间有重叠,请核准!"); + } else { + resultMap.put("result", "1"); + resultMap.put("msg", "区间有效!"); + } + } else { + resultMap.put("result", "-1"); + resultMap.put("msg", "区间不完整,请核准!"); + } + return ResponseEntityBuilder.buildNormalResponse(resultMap); + } + +} diff --git a/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardVersionController.java b/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardVersionController.java new file mode 100644 index 0000000..a6d32ec --- /dev/null +++ b/ddp-strategyx/score-card/src/main/java/com/fibo/ddp/strategyx/scorecard/controller/ScorecardVersionController.java @@ -0,0 +1,88 @@ +package com.fibo.ddp.strategyx.scorecard.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.scorecard.vo.ScorecardVersionVo; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.scorecard.ScorecardVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +@Controller("ScorecardVersionController") +@RequestMapping("/v3/scorecardVersion") +@ResponseBody +public class ScorecardVersionController { + @Resource + private ScorecardVersionService versionService; + + /** + * 查询指定版本下的内容 + * @param versionId + * @return + */ + @PostMapping("/getScorecardVersionInfo/{versionId}") + public ResponseEntityDto getScorecardVersionInfo(@PathVariable Long versionId) { + ScorecardVersionVo version =versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * @param version + * @return + */ + @PostMapping("/addScorecardVersion") + @ArchivesLog(operationType = OpTypeConst.ADD_SCORECARD_VERSION) + public ResponseEntityDto addScorecardVersion(@RequestBody ScorecardVersionVo version){ + boolean b = versionService.addVersion(version); + List scorecardVersionList = versionService.queryVersionListByScorecardId(version.getScorecardId()); + return ResponseEntityBuilder.buildNormalResponse(scorecardVersionList); + } + + /** + * 复制版本 + * @param version + * @return + */ + @PostMapping("/copyScorecardVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_SCORECARD_VERSION) + public ResponseEntityDto copyScorecardVersion(@RequestBody ScorecardVersionVo version){ + boolean b = versionService.copyVersion(version); + List scorecardVersionList = versionService.queryVersionListByScorecardId(version.getScorecardId()); + return ResponseEntityBuilder.buildNormalResponse(scorecardVersionList); + } + + /** + * 修改版本 + * @param version + * @return + */ + @PostMapping("/updateScorecardVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_SCORECARD_VERSION) + public ResponseEntityDto updateScorecardVersion(@RequestBody ScorecardVersionVo version){ + boolean b = versionService.updateVersion(version); + List scorecardVersionList = versionService.queryVersionListByScorecardId(version.getScorecardId()); + return ResponseEntityBuilder.buildNormalResponse(scorecardVersionList); + } + + /** + * 修改状态 + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateScorecardVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_SCORECARD_VERSION_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List scorecardVersionList = versionService.queryVersionListByScorecardId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(scorecardVersionList); + } + + +} diff --git a/ddp-strategyx/script-rule/pom.xml b/ddp-strategyx/script-rule/pom.xml new file mode 100644 index 0000000..91f621d --- /dev/null +++ b/ddp-strategyx/script-rule/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-script-rule + + + \ No newline at end of file diff --git a/ddp-strategyx/script-rule/src/main/java/com/fibo/ddp/strategyx/scriptrule/controller/RuleScriptVersionController.java b/ddp-strategyx/script-rule/src/main/java/com/fibo/ddp/strategyx/scriptrule/controller/RuleScriptVersionController.java new file mode 100644 index 0000000..f5926d6 --- /dev/null +++ b/ddp-strategyx/script-rule/src/main/java/com/fibo/ddp/strategyx/scriptrule/controller/RuleScriptVersionController.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.strategyx.scriptrule.controller; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.scriptrule.RuleScriptVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (RuleScriptVersion)表控制层 + */ +@RestController +@RequestMapping("/v3/ruleScriptVersion") +public class RuleScriptVersionController { + /** + * 服务对象 + */ + @Resource + private RuleScriptVersionService ruleScriptVersionService; + + /** + * 查询指定版本下的内容 + * @param versionId + * @return + */ + @PostMapping("/getRuleScriptVersion/{versionId}") + public ResponseEntityDto getRuleVersionInfo(@PathVariable Long versionId) { + RuleScriptVersion version = ruleScriptVersionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * @param version + * @return + */ + @PostMapping("/addRuleScriptVersion") + @ArchivesLog(operationType = OpTypeConst.SAVE_RULE_SCRIPT_VERSION) + public ResponseEntityDto addRuleVersion(@RequestBody RuleScriptVersion version){ + boolean b = ruleScriptVersionService.addVersion(version); + if (!b){ + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List< RuleScriptVersion> ruleVersionList = ruleScriptVersionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 复制版本 + * @param version + * @return + */ + @PostMapping("/copyRuleScriptVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_RULE_SCRIPT_VERSION) + public ResponseEntityDto copyRuleVersion(@RequestBody RuleScriptVersion version){ + boolean b = ruleScriptVersionService.copyVersion(version); + List< RuleScriptVersion> ruleVersionList = ruleScriptVersionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改版本 + * @param version + * @return + */ + @PostMapping("/updateRuleScriptVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_SCRIPT_VERSION) + public ResponseEntityDto updateRuleVersion(@RequestBody RuleScriptVersion version){ + boolean b = ruleScriptVersionService.updateVersion(version); + List ruleVersionList = ruleScriptVersionService.queryVersionListByRuleId(version.getRuleId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + + /** + * 修改状态 + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateRuleScriptVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_RULE_VERSION_SCRIPT_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + ruleScriptVersionService.updateStatus(statusParam); + List ruleVersionList = ruleScriptVersionService.queryVersionListByRuleId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(ruleVersionList); + } + +} diff --git a/ddp-strategyx/tag/pom.xml b/ddp-strategyx/tag/pom.xml new file mode 100644 index 0000000..0fba495 --- /dev/null +++ b/ddp-strategyx/tag/pom.xml @@ -0,0 +1,15 @@ + + + + ddp-strategyx + com.fibo.ddp + 1.0-SNAPSHOT + + 4.0.0 + + ddp-strategyx-tag + + + \ No newline at end of file diff --git a/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagController.java b/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagController.java new file mode 100644 index 0000000..afed4cb --- /dev/null +++ b/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagController.java @@ -0,0 +1,94 @@ +package com.fibo.ddp.strategyx.tag; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.QueryListParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam; +import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam; +import com.fibo.ddp.common.model.strategyx.tag.Tag; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.tag.TagService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import com.fibo.ddp.common.utils.exception.ApiException; +import com.fibo.ddp.common.utils.util.ResponseUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +@RestController +@RequestMapping("/v3/strategyx/tag") +public class TagController { + @Autowired + private TagService tagService; + + @ResponseBody + @RequestMapping(value = "getTagInfo/{id}", method = RequestMethod.POST) + public ResponseEntityDto getTagInfo(@PathVariable Long id) { + if (id == null) { + throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage()); + } + Tag tag = tagService.queryById(id); + ResponseEntityDto result = ResponseEntityBuilder.buildNormalResponse(tag); + return result; + } + + @ResponseBody + @RequestMapping(value = "getTagList", method = RequestMethod.POST) + public ResponseEntityDto getTagList(@RequestBody QueryListParam listParam) { + PageInfo pageInfo = tagService.queryByEntity(listParam); + Map responseMap = ResponseUtil.getResponseMap(pageInfo); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "addTag", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.ADD_TAG) + public ResponseEntityDto addTag(@RequestBody Tag tag) { + Tag insert = tagService.insertTag(tag); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateTag", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_TAG) + public ResponseEntityDto updateTag(@RequestBody Tag tag) { + Tag update = tagService.updateTag(tag); + ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update); + return ruleResponseEntityDto; + } + + @ResponseBody + @RequestMapping(value = "updateTagStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_TAG_STATUS) + public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) { + UpdateStatusParam.checkParam(param); + boolean updateResult = tagService.updateStatus(param.getList(), param.getStatus()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.TAG_UPDATE_ERROR); + } + + } + + @ResponseBody + @RequestMapping(value = "updateTagFolder", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_TAG_FOLDER) + public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) { + UpdateFolderParam.checkNotNull(param); + boolean updateResult = tagService.updateFolder(param.getIds(), param.getFolderId()); + if (updateResult) { + return ResponseEntityBuilder.buildNormalResponse(updateResult); + } else { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR); + } + } + + +} diff --git a/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagVersionController.java b/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagVersionController.java new file mode 100644 index 0000000..6abd1ed --- /dev/null +++ b/ddp-strategyx/tag/src/main/java/com/fibo/ddp/strategyx/tag/TagVersionController.java @@ -0,0 +1,95 @@ +package com.fibo.ddp.strategyx.tag; + +import com.fibo.ddp.common.model.common.ResponseEntityBuilder; +import com.fibo.ddp.common.model.common.ResponseEntityDto; +import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum; +import com.fibo.ddp.common.model.common.requestParam.StatusParam; +import com.fibo.ddp.common.model.strategyx.tag.TagVersion; +import com.fibo.ddp.common.service.monitor.logger.ArchivesLog; +import com.fibo.ddp.common.service.strategyx.tag.TagVersionService; +import com.fibo.ddp.common.utils.constant.OpTypeConst; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/v3/strategyx/tagVersion") +public class TagVersionController { + /** + * 服务对象 + */ + @Resource + private TagVersionService versionService; + + /** + * 查询指定版本下的内容 + * + * @param versionId + * @return + */ + @PostMapping("/getVersionInfo/{versionId}") + public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) { + TagVersion version = versionService.queryById(versionId); + return ResponseEntityBuilder.buildNormalResponse(version); + } + + /** + * 新增一个版本 + * + * @param version + * @return + */ + @PostMapping("/addVersion") + @ArchivesLog(operationType = OpTypeConst.ADD_TAG_VERSION) + public ResponseEntityDto addVersion(@RequestBody TagVersion version) { + boolean b = versionService.addVersion(version); + if (!b) { + return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION); + } + List versionList = versionService.queryVersionListByTagId(version.getTagId()); + return ResponseEntityBuilder.buildNormalResponse(versionList); + } + + /** + * 复制版本 + * + * @param version + * @return + */ + @PostMapping("/copyVersion") + @ArchivesLog(operationType = OpTypeConst.COPY_TAG_VERSION) + public ResponseEntityDto copyVersion(@RequestBody TagVersion version) { + boolean b = versionService.copyVersion(version); + List versionList = versionService.queryVersionListByTagId(version.getTagId()); + return ResponseEntityBuilder.buildNormalResponse(versionList); + } + + /** + * 修改版本 + * + * @param version + * @return + */ + @PostMapping("/updateVersion") + @ArchivesLog(operationType = OpTypeConst.UPDATE_TAG_VERSION) + public ResponseEntityDto updateVersion(@RequestBody TagVersion version) { + boolean b = versionService.updateVersion(version); + List versionList = versionService.queryVersionListByTagId(version.getTagId()); + return ResponseEntityBuilder.buildNormalResponse(versionList); + } + + /** + * 修改状态 + * + * @param statusParam + * @return + */ + @RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST) + @ArchivesLog(operationType = OpTypeConst.UPDATE_TAG_VERSION_STATUS) + public ResponseEntityDto updateStatus(@RequestBody StatusParam statusParam) { + versionService.updateStatus(statusParam); + List versionList = versionService.queryVersionListByTagId(statusParam.getStrategyId()); + return ResponseEntityBuilder.buildNormalResponse(versionList); + } +}