From cbf4a9e118e4dfef90e10eef033d1ebe36892ec1 Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Tue, 9 Dec 2025 17:36:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=B8=B8=E7=94=A8?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=85=E5=AE=B9=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/UserPermissionGetter.java | 40 ++ .../controller/DeleteController.java | 10 + .../form/ModelCommonParameterInsertForm.java | 2 +- .../form/ModelCommonParameterUpdateForm.java | 2 +- .../pojo/ModelCommonParameters.java | 10 +- .../xdap/self_development/pojo/Parameter.java | 2 +- .../pojo/view/ParametersView.java | 1 + .../impl/CommonParameterServiceImpl.java | 41 +- .../service/impl/ParameterServiceImpl.java | 15 +- .../impl/TemplateApprovalServiceImpl.java | 7 + src/main/resources/application.properties | 423 ++++++++++-------- src/main/resources/sql.sql | 1 - 12 files changed, 326 insertions(+), 228 deletions(-) create mode 100644 src/main/java/com/xdap/self_development/common/UserPermissionGetter.java diff --git a/src/main/java/com/xdap/self_development/common/UserPermissionGetter.java b/src/main/java/com/xdap/self_development/common/UserPermissionGetter.java new file mode 100644 index 0000000..b49a64c --- /dev/null +++ b/src/main/java/com/xdap/self_development/common/UserPermissionGetter.java @@ -0,0 +1,40 @@ +package com.xdap.self_development.common; + +import com.xdap.jobworker.moudle.department.pojo.entity.XdapDeptUsers; +import com.xdap.runtime.service.RuntimeAppContextService; +import com.xdap.self_development.config.BusinessDatabase; +import com.xdap.self_development.pojo.view.MenuParamView; +import com.xdap.self_development.service.ModelRoleService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class UserPermissionGetter { + @Resource + private BusinessDatabase businessDatabase; + @Resource + private ModelRoleService modelRoleService; + @Resource + private RuntimeAppContextService runtimeAppContextService; + + // 获取子系统权限 + public Set getSubsystemPermissions() { + String currentUserId = runtimeAppContextService.getCurrentUserId(); + // 获取用户权限 + Set result = modelRoleService.selectPersByUser(currentUserId) + .stream().map(MenuParamView::getSubsystem).collect(Collectors.toSet()); + // 获取用户所在部门权限 + List deptIds = businessDatabase.getBusinessDatabase() + .eq("user_id", currentUserId).doQuery(XdapDeptUsers.class) + .stream().map(XdapDeptUsers::getDepartmentId).collect(Collectors.toList()); + for (String deptId : deptIds) { + Set deptPermissions = modelRoleService.selectPersByUser(deptId) + .stream().map(MenuParamView::getSubsystem).collect(Collectors.toSet()); + result.addAll(deptPermissions); + } + return result; + } +} diff --git a/src/main/java/com/xdap/self_development/controller/DeleteController.java b/src/main/java/com/xdap/self_development/controller/DeleteController.java index 950717a..a0fd46e 100644 --- a/src/main/java/com/xdap/self_development/controller/DeleteController.java +++ b/src/main/java/com/xdap/self_development/controller/DeleteController.java @@ -1,6 +1,7 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; +import com.xdap.self_development.common.UserPermissionGetter; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.pojo.*; import lombok.extern.slf4j.Slf4j; @@ -14,6 +15,7 @@ import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -22,6 +24,14 @@ import java.util.stream.Collectors; public class DeleteController { @Resource private BusinessDatabase bd; + @Resource + private UserPermissionGetter getter; + + @GetMapping("/test") + public Response test() { + Set subsystemPermissions = getter.getSubsystemPermissions(); + return Response.ok().data(subsystemPermissions); + } @GetMapping("getAll") public Response getAll() { diff --git a/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterInsertForm.java b/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterInsertForm.java index d78c34c..2efe95d 100644 --- a/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterInsertForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterInsertForm.java @@ -14,5 +14,5 @@ public class ModelCommonParameterInsertForm { @NotBlank(message = "常用名不能为空") private String commonName; @NotEmpty(message = "参数不能为空") - private List subsystems; + private List parameters; } diff --git a/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterUpdateForm.java b/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterUpdateForm.java index a6391ab..6e09d67 100644 --- a/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterUpdateForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/ModelCommonParameterUpdateForm.java @@ -14,5 +14,5 @@ public class ModelCommonParameterUpdateForm { @NotBlank(message = "常用不能为空") private String commonId; @NotEmpty(message = "参数不能为空") - private List subsystems; + private List parameters; } diff --git a/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java b/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java index 0e9c891..bb49a53 100644 --- a/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java +++ b/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java @@ -6,8 +6,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; @SQLQuery(value = { + @SQL(view = "getCommonAndParameters", + sql = "SELECT ymcp.*, ymp.parameter_name AS \"parameterName\", ymp.parameter_type AS \"parameterType\", ymp.subsystem_name AS \"subsystemName\" FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.common_id IN (#ids)"), @SQL(view = "getCommonById", - sql = "SELECT ymcp.*, ymp.parameter_name as 'parameterName' FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.user_id = #userId") + sql = "SELECT ymcp.*, ymp.parameter_name as 'parameterName', ymp.parameter_type as 'parameterType', ymp.subsystem_name as 'subsystemName' FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.user_id = #userId") }) @EqualsAndHashCode(callSuper = true) @Data @@ -15,11 +17,13 @@ import lombok.EqualsAndHashCode; public class ModelCommonParameters extends MpaasBasePojo { @RowID(sequence = "model_common_parameters_s", type = RowIDType.UUID) private String id; - private String subsystem; private String parameterId; - private String commonId; @Column(type = ColumnType.CALCULATE) private String parameterName; + @Column(type = ColumnType.CALCULATE) + private String parameterType; + @Column(type = ColumnType.CALCULATE) + private String subsystemName; } diff --git a/src/main/java/com/xdap/self_development/pojo/Parameter.java b/src/main/java/com/xdap/self_development/pojo/Parameter.java index 3df8706..05fe39e 100644 --- a/src/main/java/com/xdap/self_development/pojo/Parameter.java +++ b/src/main/java/com/xdap/self_development/pojo/Parameter.java @@ -10,7 +10,7 @@ import lombok.NoArgsConstructor; @SQLQuery(value = { @SQL(view = "getAllSubsystemAndPara", - sql = "SELECT DISTINCT mp.subsystem_name, mp.parameter_name, mp.id FROM yfsjglpt_model_parameter mp INNER JOIN yfsjglpt_model_parameter_and_template mpat ON mp.id = mpat.parameter_id INNER JOIN yfsjglpt_model_template mt ON mpat.template_id = mt.id INNER JOIN ( SELECT template_name, MAX(version) AS max_version FROM yfsjglpt_model_template WHERE status = 'COMPLETE' GROUP BY template_name ) latest ON mt.template_name = latest.template_name AND mt.version = latest.max_version WHERE mt.status = 'COMPLETE' ORDER BY mp.subsystem_name, mp.parameter_name, mp.id"), + sql = "SELECT DISTINCT mp.subsystem_name, mp.parameter_name, mp.id, mp.parameter_type FROM yfsjglpt_model_parameter mp INNER JOIN yfsjglpt_model_parameter_and_template mpat ON mp.id = mpat.parameter_id INNER JOIN yfsjglpt_model_template mt ON mpat.template_id = mt.id INNER JOIN ( SELECT template_name, MAX(version) AS max_version FROM yfsjglpt_model_template WHERE status = 'COMPLETE' GROUP BY template_name ) latest ON mt.template_name = latest.template_name AND mt.version = latest.max_version WHERE mt.status = 'COMPLETE' ORDER BY mp.subsystem_name, mp.parameter_name, mp.id, mp.parameter_type"), @SQL(view = "getAllSubsystem", sql = "SELECT DISTINCT mp.subsystem_name FROM yfsjglpt_model_parameter mp INNER JOIN yfsjglpt_model_parameter_and_template mpat ON mp.id = mpat.parameter_id INNER JOIN yfsjglpt_model_template mt ON mpat.template_id = mt.id INNER JOIN ( SELECT template_name, MAX(version) AS max_version FROM yfsjglpt_model_template WHERE status = 'COMPLETE' GROUP BY template_name ) latest ON mt.template_name = latest.template_name AND mt.version = latest.max_version WHERE mt.status = 'COMPLETE' ORDER BY mp.subsystem_name"), @SQL(view = "selectParametersByTemplateId", diff --git a/src/main/java/com/xdap/self_development/pojo/view/ParametersView.java b/src/main/java/com/xdap/self_development/pojo/view/ParametersView.java index 8fbe4df..f8c2ba1 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/ParametersView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/ParametersView.java @@ -16,4 +16,5 @@ import lombok.NoArgsConstructor; public class ParametersView { private String parameterId; private String parameterName; + private String parameterType; } diff --git a/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java index 56bcfe3..3a42381 100644 --- a/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java @@ -41,14 +41,17 @@ public class CommonParameterServiceImpl implements CommonParameterService { .eq("create_by", userId) .eq("common_type", 1) .doQuery(CommonParameter.class); - List ids = commonParameters.stream().map(CommonParameter::getId).collect(Collectors.toList()); + + List ids = commonParameters.stream().map(CommonParameter::getId) + .collect(Collectors.toList()); if (ids.isEmpty()) { return Collections.emptyList(); } // 数据处理 List modelCommonParameters = bd.getBusinessDatabase() - .in("common_id", ids).doQuery(ModelCommonParameters.class); + .viewQueryMode(true).view("getCommonAndParameters") + .setVar("ids", ids).doQuery(ModelCommonParameters.class); return convertToModelCommonList(modelCommonParameters, commonParameters); } @@ -70,7 +73,7 @@ public class CommonParameterServiceImpl implements CommonParameterService { // 关联常用参数 List modelCommonParameters = - convertToModelCommonParameters(form.getSubsystems(), commonParameter.getId()); + convertToModelCommonParameters(form.getParameters(), commonParameter.getId()); bd.getBusinessDatabase().doBatchInsert(modelCommonParameters); } @@ -85,7 +88,7 @@ public class CommonParameterServiceImpl implements CommonParameterService { bd.getBusinessDatabase().eq("common_id", form.getCommonId()) .doDelete(ModelCommonParameters.class); List modelCommonParameters = - convertToModelCommonParameters(form.getSubsystems(), form.getCommonId()); + convertToModelCommonParameters(form.getParameters(), form.getCommonId()); bd.getBusinessDatabase().doBatchInsert(modelCommonParameters); } @@ -158,7 +161,8 @@ public class CommonParameterServiceImpl implements CommonParameterService { ModelCommonItem item = new ModelCommonItem(); item.setSubsystem(entry.getKey()); List parameters = entry.getValue().stream() - .map(param -> new ParametersView(param.getId(), param.getParameterName())) + .map(param -> new + ParametersView(param.getId(), param.getParameterName(), param.getParameterType())) .collect(Collectors.toList()); item.setParameters(parameters); result.add(item); @@ -185,13 +189,14 @@ public class CommonParameterServiceImpl implements CommonParameterService { Map> groupedBySubsystem = groupedByCommonId.get(modelCommon.getCommonId()).stream() - .collect(Collectors.groupingBy(ModelCommonParameters::getSubsystem)); + .collect(Collectors.groupingBy(ModelCommonParameters::getSubsystemName)); + List items = new ArrayList<>(); for (Map.Entry> subsystemEntry : groupedBySubsystem.entrySet()) { ModelCommonItem item = new ModelCommonItem(); item.setSubsystem(subsystemEntry.getKey()); List parameters = subsystemEntry.getValue().stream() - .map(param -> new ParametersView(param.getParameterId(), param.getParameterName())) + .map(param -> new ParametersView(param.getParameterId(), param.getParameterName(), param.getSubsystemName())) .collect(Collectors.toList()); item.setParameters(parameters); items.add(item); @@ -203,23 +208,17 @@ public class CommonParameterServiceImpl implements CommonParameterService { } /** - * 将ModelCommon 转换为 ModelCommonParameters 列表 + * 将List 转换为 ModelCommonParameters 列表 */ private List convertToModelCommonParameters( - List commonItems, String commonId) { + List parameters, String commonId) { List result = new ArrayList<>(); - if (commonItems != null) { - for (ModelCommonItem item : commonItems) { - String subsystem = item.getSubsystem(); - if (item.getParameters() != null) { - for (ParametersView paramView : item.getParameters()) { - ModelCommonParameters param = new ModelCommonParameters(); - param.setSubsystem(subsystem); - param.setParameterId(paramView.getParameterId()); - param.setCommonId(commonId); - result.add(param); - } - } + if (parameters != null) { + for (String parameterId : parameters) { + ModelCommonParameters param = new ModelCommonParameters(); + param.setParameterId(parameterId); + param.setCommonId(commonId); + result.add(param); } } return result; diff --git a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java index d8d4000..24c32e8 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java @@ -36,10 +36,7 @@ import java.util.stream.Collectors; public class ParameterServiceImpl implements ParameterService { @Resource private BusinessDatabase bd; - @Resource - private ModelRoleService modelRoleService; - @Resource - private RuntimeAppContextService runtimeAppContextService; + @Override public PageQueryResult getParameterByCondition(ParameterPageForm form) { @@ -52,16 +49,6 @@ public class ParameterServiceImpl implements ParameterService { } //todo 假定子系统名和模板名一致 -// String currentUserId = runtimeAppContextService.getCurrentUserId(); -// List ids = modelRoleService.selectPersByUser(currentUserId).stream() -// .filter(view -> Objects.equals(view.getSubsystem(), template.getTemplateName())) -// .map(MenuParamView::getParameterId) -// .collect(Collectors.toList()); -// -// if (ids.isEmpty()) { -// ids = new ArrayList<>(); -// } - return bd.getBusinessDatabase() .viewQueryMode(true) .view("selectParametersByTemplateId") diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java index a6bcf2c..b50278b 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java @@ -11,6 +11,7 @@ import com.xdap.self_development.pojo.view.ApprovalFlowView; import com.xdap.self_development.pojo.view.ApprovalNodeView; import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TodoAndTemplateView; +import com.xdap.self_development.service.DataEntryEngineModelService; import com.xdap.self_development.service.TemplateApprovalService; import com.xdap.self_development.utils.RedisLockUtil; import lombok.extern.slf4j.Slf4j; @@ -38,6 +39,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { private RuntimeDatasourceService runtimeDatasourceService; @Resource private RedisLockUtil redisLockUtil; + @Resource + private DataEntryEngineModelService dataEntryEngineModelService; // 待办标志: userId -> flowId集合 private static final String TODO_PREFIX = "approval:todo:"; @@ -335,6 +338,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .update("status", template.getStatus()) .update("published_time", Timestamp.valueOf(LocalDateTime.now())) .doUpdate(Template.class); + + // 更新机型版本 + dataEntryEngineModelService.updateModelForNewVersion(); + clearProcessed(flow); } else { flow.setCurrentNode(nextNode); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6b64cae..c6072a0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,48 +1,70 @@ +# ====================== APAAS ???? ====================== apaas.token.url=http://apaas-meim.app.yuchai.com/apaas/backend/a5e8e08/ycgf-yf-rddata apaas.token.clientId=2b5b3de8-e7fd-406a-a59a-d5568457b1f4 apaas.token.clientSecred=94bddc6a-27a4-4204-885b-b075812ec535 +apaas.single.tenantId=223770822127386625 +apaas.single.appId=771297120740179968 +apaas.single.app-group-app-ids=2b5b3de8-e7fd-406a-a59a-d5568457b1f4 +apaas.single.private=true +apaas.oauth.app.appOauthTokenUrl=http://mpaas.app.yuchai.com/oauth2/oauth/token +apaas.oauth.app.appOauthUserSchemaJsonPath=$.userName +apaas.oauth.app.appOauthOAuthUserUrl=http://mpaas.app.yuchai.com/oauth2/oauth/user +apaas.tenant.init.db.initial-pool-size=30 +apaas.tenant.init.db.max-pool-size=1000 +apaas.tenant.initDataModel=true +apaas.hikariConfig.maxLifetimeMs=28800000 +apaas.cache.usemq=true +apaas.bizevent.async=false +apaas.deploy.type=null -feign.hystrix.enabled=false +# APAAS ??????MySQL? +apaas.admin.datasource.type=mysql +apaas.admin.datasource.username=root +apaas.admin.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 +apaas.admin.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +apaas.admin.datasource.password=qwer12 + +# APAAS ??????MongoDB? +apaas.single.datasource.mongoDbName=xdap_app_223770822127386625 +apaas.single.datasource.mongoUrl=mongodb://localhost:27017/xdap_app_223770822127386625 +apaas.single.datasource.mongoPoolConfig.minSize=0 +apaas.single.datasource.mongoPoolConfig.maxSize=100 +apaas.single.datasource.mongoPoolConfig.maxConnectionLifeTime=3600 +apaas.single.datasource.mongoPoolConfig.maxConnectionIdleTime=3600 +apaas.single.datasource.mongoPoolConfig.maintenanceFrequency=600 +apaas.single.datasource.mongoPoolConfig.maintenanceInitialDelay=240 +apaas.single.datasource.mongoPoolConfig.maxWaitQueueSize=500 +apaas.single.datasource.mongoPoolConfig.maxWaitTime=120 + +# ====================== ?????? ====================== deploy.backend.platform.port=30607 -deploy.rabbit.host=127.0.0.1 -deploy.redis.password=xdapredis -deploy.redis.host=127.0.0.1 +deploy.backend.platform.host=10.20.52.11 +deploy.backend.singleapp.host=apaas-meim.app.yuchai.com deploy.front.workbench.port=443 -deploy.front.singleapp.app.prefix=app/a5e8e08/ycgf-yf-rddata +deploy.front.workbench.host=apaas-meim.app.yuchai.com deploy.front.platform.port=443 deploy.front.platform.host=apaas-meim.app.yuchai.com -deploy.rabbit.password=guest -deploy.front.singleapp.m.prefix=m/a5e8e08/ycgf-yf-rddata deploy.front.singleapp.host=apaas-meim.app.yuchai.com -deploy.redis.port=6379 -deploy.front.workbench.host=apaas-meim.app.yuchai.com -deploy.backend.platform.host=10.20.52.11 -deploy.powerjob.address=127.0.0.1:7700 -deploy.backend.singleapp.host=apaas-meim.app.yuchai.com -deploy.rabbit.username=guest +deploy.front.singleapp.app.prefix=app/a5e8e08/ycgf-yf-rddata +deploy.front.singleapp.m.prefix=m/a5e8e08/ycgf-yf-rddata +deploy.rabbit.host=127.0.0.1 deploy.rabbit.port=5672 +deploy.rabbit.username=guest +deploy.rabbit.password=guest +deploy.redis.host=127.0.0.1 +deploy.redis.port=6379 +deploy.redis.password=xdapredis +deploy.powerjob.address=127.0.0.1:7700 + +# ====================== ??????MPAAS? ====================== mpaas.datasource[0].name=xdap_app_223770822127386625 -mpaas.datasource[0].password=qwer12 -activiti.datasource.driverClassName=com.mysql.cj.jdbc.Driver -apaas.single.datasource.mongoPoolConfig.minSize=0 -apaas.admin.datasource.type=mysql -apaas.single.datasource.mongoDbName=xdap_app_223770822127386625 -apaas.tenant.init.db.initial-pool-size=30 -activiti.datasource.username=root -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -activiti.datasource.maxActive=50 -apaas.single.datasource.mongoUrl=mongodb://localhost:27017/xdap_app_223770822127386625 -apaas.single.datasource.mongoPoolConfig.maxConnectionLifeTime=3600 -apaas.single.datasource.mongoPoolConfig.maintenanceFrequency=600 -mpaas.datasource[0].minPoolSize=50 +mpaas.datasource[0].type=mysql mpaas.datasource[0].url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 mpaas.datasource[0].driver-class-name=com.mysql.cj.jdbc.Driver -apaas.single.datasource.mongoPoolConfig.maxWaitQueueSize=500 -apaas.admin.datasource.username=root mpaas.datasource[0].username=root -apaas.admin.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 +mpaas.datasource[0].password=qwer12 +mpaas.datasource[0].minPoolSize=50 mpaas.datasource[0].maxPoolSize=1000 -mpaas.datasource[0].type=mysql mpaas.datasource[1].url=jdbc:mysql://127.0.0.1:3306/test_demo?serverTimezone=GMT%2B8&characterEncoding=utf-8 mpaas.datasource[1].username=root @@ -56,179 +78,149 @@ mpaas.datasource[2].password=qwer12 mpaas.datasource[2].type=mysql mpaas.datasource[2].name=template_db2 -apaas.tenant.init.db.max-pool-size=1000 -apaas.hikariConfig.maxLifetimeMs=28800000 +mpaas.security=false +mpaas.query.dbadatper=mysql +mpaas.query.security.mode=custom +mpaas.query.dbvendor=mysql +mpaas.query.bigdatathresholdvalue=100000 + +# ====================== Activiti ????? ====================== +activiti.datasource.driverClassName=com.mysql.cj.jdbc.Driver +activiti.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti_demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 +activiti.datasource.username=root +activiti.datasource.password=qwer12 +activiti.datasource.maxActive=50 activiti.datasource.inIdle=5 activiti.datasource.initialSize=5 -activiti.datasource.password=qwer12 -spring.datasource.password=qwer12 -apaas.admin.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -apaas.admin.datasource.password=qwer12 -spring.datasource.username=root -apaas.single.datasource.mongoPoolConfig.maxSize=100 -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 -apaas.single.datasource.mongoPoolConfig.maxConnectionIdleTime=3600 -apaas.single.datasource.mongoPoolConfig.maintenanceInitialDelay=240 -activiti.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti_demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 -apaas.single.datasource.mongoPoolConfig.maxWaitTime=120 spring.activiti.process-definition-location-prefix=classpath:/processes/ spring.activiti.check-process-definitions=true spring.activiti.database-schema-update=true spring.activiti.deployment-mode=default -server.compression.enabled=true -server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css -token.refreshTtlMillis=1209600000 -token.openTokenRefreshTtlMillis=1209600000 -token.openTokenTtlMillis=7200000 -apaas.single.tenantId=223770822127386625 -server.compression.min-response-size=2048 -apaas.single.appId=771297120740179968 -apaas.single.app-group-app-ids=2b5b3de8-e7fd-406a-a59a-d5568457b1f4 -token.ttlMillis=7200000 -apaas.oauth.app.appOauthTokenUrl=http://mpaas.app.yuchai.com/oauth2/oauth/token -apaas.oauth.app.appOauthUserSchemaJsonPath=$.userName -apaas.oauth.app.appOauthOAuthUserUrl=http://mpaas.app.yuchai.com/oauth2/oauth/user -license.path=/data/resources/license.lic -license.publicKeyStorePath=/data/resources/publicCerts.keystore -xdap.apaas.dbselectPriv=false -spring.application.name=a5e8e08-ycgf-yf-rddata -baidu.ocr.vatInvoiceUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice -dingding.redirectUri=redirect_uri=https%3A%2F%2Fapaas-meim.app.yuchai.com%2Fapp%2Fa5e8e08%2Fycgf-yf-rddata%2Fcallback%2Fdingding%2Findex.html&response_type=code&prompt=consent&scope=openid -baidu.ocr.appId=23499932 -dingding.pageLink=null -dingding.userIdByMobileUrl=https://oapi.dingtalk.com/topapi/v2/user/getbymobile -baidu.ocr.apiKey=HHRFL3VPtnj7Nle60ytbGMls -baidu.ocr.basicGeneralUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic -dingding.userAccessTokenUrl=https://api.dingtalk.com/v1.0/oauth2/userAccessToken -dingding.sendMessageUrl=https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend -feishu.feiShuUrlPre=https://open.feishu.cn/open-apis/authen/v1/index? -dingding.authUrlPre=https://login.dingtalk.com/oauth2/auth? -aliyun.oss.accessKeyId=LTAI4GEC6ssfFDuVDUL3TbLp -dingding.userInfoUrl=https://api.dingtalk.com/v1.0/contact/users/me -aliyun.oss.endpoint=http://oss-cn-shanghai.aliyuncs.com -feishu.getOpenIdUrl=https://open.feishu.cn/open-apis/user/v1/batch_get_id?mobiles= -apaasworkwechat.message.wxOAuth2url=https://open.weixin.qq.com/connect/oauth2/authorize?appid=${CORPID!""}&redirect_uri=${URL!""}callback%2Fwe-com%2Findex.html&response_type=code&scope=snsapi_privateinfo&state=${STATE!""}&agentid=${AGENTID!""}#wechat_redirect -baidu.ocr.secretKey=VTvrrMjZZC1xtYfu82cfUhjeYgNTRIHe -baidu.ocr.accessTokenUrl=https://aip.baidubce.com/oauth/2.0/token? -aliyun.oss.accessKeySecret=ZpbgWTt2qfK68lQILqj0H3EdIun1Qf -feishu.getTokenUrl=https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/ -dingding.appAccessTokenUrl=https://oapi.dingtalk.com/gettoken -apaasworkwechat.message.workWechatUrlPre=null -baidu.ocr.businessCardUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/business_card -feishu.feiShuRedirectUri=redirect_uri=https%3A%2F%2Fapaas-meim.app.yuchai.com%2Fapp%2Fa5e8e08%2Fycgf-yf-rddata%2Fcallback%2Ffeishu%2Findex.html -baidu.ocr.accessTokenKey=BAIDU_OCR_KEY -management.endpoints.web.exposure.include=* -spring.rabbitmq.password=guest + +# ====================== Spring ??????? ====================== +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 +spring.datasource.username=root +spring.datasource.password=qwer12 + +# ====================== ??/?????? ====================== +# Redis ?? spring.redis.host=127.0.0.1 -powerjob.akka-port=27777 -powerjob.worker.akka-port=27777 -spring.rabbitmq.host=127.0.0.1 -spring.redis.jedis.pool.min-idle=0 -powerjob.server-address=127.0.0.1:7700 -powerjob.worker.server-address=127.0.0.1:7700 -server.port=9091 -management.health.db.enabled=false -spring.redis.database=0 -spring.redis.jedis.pool.max-wait=-1 -spring.rabbitmq.port=5672 spring.redis.port=6379 -powerjob.app-name=49b90be5-eebe-4359-a +spring.redis.database=0 +spring.redis.timeout=10000 +spring.redis.jedis.pool.min-idle=0 +spring.redis.jedis.pool.max-idle=8 +spring.redis.jedis.pool.max-wait=-1 +spring.redis.jedis.pool.max-active=20 + +# RabbitMQ ?? +spring.rabbitmq.host=127.0.0.1 +spring.rabbitmq.port=5672 spring.rabbitmq.username=guest +spring.rabbitmq.password=guest + +# ====================== PowerJob ?????? ====================== +powerjob.akka-port=27777 +powerjob.server-address=127.0.0.1:7700 +powerjob.app-name=49b90be5-eebe-4359-a powerjob.store-strategy=disk -powerjob.worker.app-name=49b90be5-eebe-4359-a powerjob.enable-test-mode=false -management.endpoint.health.show-details=always +powerjob.worker.akka-port=27777 +powerjob.worker.server-address=127.0.0.1:7700 +powerjob.worker.app-name=49b90be5-eebe-4359-a +powerjob.worker.store-strategy=disk powerjob.worker.enabled=false powerjob.worker.enable-test-mode=true -spring.redis.jedis.pool.max-idle=8 -spring.redis.timeout=10000 -powerjob.worker.store-strategy=disk -spring.redis.jedis.pool.max-active=20 + +# ====================== ????? ====================== +server.port=9091 +server.compression.enabled=true +server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css +server.compression.min-response-size=2048 +spring.servlet.multipart.max-file-size=150MB +spring.servlet.multipart.max-request-size=200MB +spring.jackson.default-property-inclusion=non_null + +# ====================== ??/???? ====================== +token.ttlMillis=7200000 +token.refreshTtlMillis=1209600000 +token.openTokenTtlMillis=7200000 +token.openTokenRefreshTtlMillis=1209600000 +standard.plan.appTtlMillis=3600000 +standard.plan.userTtlMillis=7200000 + +# ====================== ???? ====================== +logging.file=log/xdap-app.log +logging.config=classpath:logback-spring.xml + +# ====================== ??????? ====================== +# ??OCR?? +baidu.ocr.vatInvoiceUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice +baidu.ocr.basicGeneralUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic +baidu.ocr.businessCardUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/business_card +baidu.ocr.accessTokenUrl=https://aip.baidubce.com/oauth/2.0/token? +baidu.ocr.accessTokenKey=BAIDU_OCR_KEY +baidu.ocr.appId=23499932 +baidu.ocr.apiKey=HHRFL3VPtnj7Nle60ytbGMls +baidu.ocr.secretKey=VTvrrMjZZC1xtYfu82cfUhjeYgNTRIHe + +# ???OSS?? +aliyun.oss.accessKeyId=LTAI4GEC6ssfFDuVDUL3TbLp +aliyun.oss.accessKeySecret=ZpbgWTt2qfK68lQILqj0H3EdIun1Qf +aliyun.oss.endpoint=http://oss-cn-shanghai.aliyuncs.com + +# ???? +dingding.redirectUri=redirect_uri=https%3A%2F%2Fapaas-meim.app.yuchai.com%2Fapp%2Fa5e8e08%2Fycgf-yf-rddata%2Fcallback%2Fdingding%2Findex.html&response_type=code&prompt=consent&scope=openid +dingding.pageLink=null +dingding.userIdByMobileUrl=https://oapi.dingtalk.com/topapi/v2/user/getbymobile +dingding.userAccessTokenUrl=https://api.dingtalk.com/v1.0/oauth2/userAccessToken +dingding.sendMessageUrl=https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend +dingding.authUrlPre=https://login.dingtalk.com/oauth2/auth? +dingding.userInfoUrl=https://api.dingtalk.com/v1.0/contact/users/me +dingding.appAccessTokenUrl=https://oapi.dingtalk.com/gettoken + +# ???? +feishu.feiShuUrlPre=https://open.feishu.cn/open-apis/authen/v1/index? +feishu.getOpenIdUrl=https://open.feishu.cn/open-apis/user/v1/batch_get_id?mobiles= +feishu.getTokenUrl=https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/ +feishu.feiShuRedirectUri=redirect_uri=https%3A%2F%2Fapaas-meim.app.yuchai.com%2Fapp%2Fa5e8e08%2Fycgf-yf-rddata%2Fcallback%2Ffeishu%2Findex.html + +# ?????? +apaasworkwechat.message.wxOAuth2url=https://open.weixin.qq.com/connect/oauth2/authorize?appid=${CORPID!""}&redirect_uri=${URL!""}callback%2Fwe-com%2Findex.html&response_type=code&scope=snsapi_privateinfo&state=${STATE!""}&agentid=${AGENTID!""}#wechat_redirect +apaasworkwechat.message.workWechatUrlPre=null + +# ====================== XDAP ???? ====================== xdap.jobServerUrl=http://localhost:7700 xdap.adminUrl=gateway.yctp.yuchaidev.com/apaas/xdap-admin -feign.client.config.default.read-timeout=50000 xdap.gatewayUrl=gateway.yctp.yuchaidev.com/apaas/gateway xdap.jobUrl=http://127.0.0.1:${server.port:9091}/xdap-job xdap.openappUrl=http://127.0.0.1:${server.port:9091}/xdap-app xdap.appUrl=http://127.0.0.1:${server.port:9091}/xdap-app -feign.client.config.default.connect-timeout=20000 #xdap.singleAdminAppUrl=http://10.20.52.58:30607/xdap-app xdap.snow.data-center-id=0 xdap.snow.workId=192 -mpaas.security=false xdap.avatar.prefix=/xdap-app/attachments/downloadFile?file= -xdap.share.frontSingleAppHost=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/ xdap.avatar.path=/resource/head_portrait/ -xdap.skipDetailurl=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/%s/app/app-page?appId=%s&formId=%s&title=%s¤tMenu=%s&documentId=%s -xdap.share.pcSkipUrl=blank/public-form?shareId= -xdap.share.frontSingleMobileHost=https://apaas-meim.app.yuchai.com/m/a5e8e08/ycgf-yf-rddata/ xdap.avatar.adminBucketName=xdap-admin-dev -apaas.single.private=true -xdap.avatar.enableDynamicsPrefix=false -spring.jackson.default-property-inclusion=non_null xdap.avatar.bucketName=xdap-app-dev -xdap.share.editAfterShareUrl=/xdap-app/formShareSkip/skip/shareUrl?shareId= -xdap.todourl=https://apaas-meim.app.yuchai.com/workbench/app/%s/todoCenter/myTodo/?formId=%s&documentId=%s&processId=%s -logging.file=log/xdap-app.log -xdap.skipurl=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/%s/app/app-page?appId=%s&formId=%s&title=%s¤tMenu=%s xdap.avatar.localPath=/data/resources/attachments/ -spring.servlet.multipart.max-file-size=150MB -logging.config=classpath:logback-spring.xml -xdap.apaas.private=true -xdap.todocenter=https://apaas-meim.app.yuchai.com/workbench/app/%s/todoCenter/myTodo -mpaas.query.dbadatper=mysql -mpaas.query.security.mode=custom +xdap.avatar.enableDynamicsPrefix=false xdap.avatar.adminPrefix=https://apaas-meim.app.yuchai.com/apaas/platform/xdap-admin/attachments/downloadFile?file= -xdap.invitation.prefix=http://k8s.definesys.com:31005/x-project-app/blank/invite?inviteCode= -mpaas.query.dbvendor=mysql +xdap.share.frontSingleAppHost=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/ +xdap.share.frontSingleMobileHost=https://apaas-meim.app.yuchai.com/m/a5e8e08/ycgf-yf-rddata/ +xdap.share.pcSkipUrl=blank/public-form?shareId= xdap.share.mobileSkipUrl=blank/public-form?shareId= -spring.servlet.multipart.max-request-size=200MB +xdap.share.editAfterShareUrl=/xdap-app/formShareSkip/skip/shareUrl?shareId= +xdap.invitation.prefix=http://k8s.definesys.com:31005/x-project-app/blank/invite?inviteCode= +xdap.skipurl=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/%s/app/app-page?appId=%s&formId=%s&title=%s¤tMenu=%s +xdap.skipDetailurl=https://apaas-meim.app.yuchai.com/app/a5e8e08/ycgf-yf-rddata/%s/app/app-page?appId=%s&formId=%s&title=%s¤tMenu=%s&documentId=%s +xdap.todourl=https://apaas-meim.app.yuchai.com/workbench/app/%s/todoCenter/myTodo/?formId=%s&documentId=%s&processId=%s +xdap.todocenter=https://apaas-meim.app.yuchai.com/workbench/app/%s/todoCenter/myTodo xdap.resource.path=i18n/platform/platform_en_US.properties,i18n/platform/platform_zh_CN.properties,i18n/workbench/workbench_en_US.properties,i18n/workbench/workbench_zh_CN.properties,i18n/app/app_en_US.properties,i18n/app/app_zh_CN.properties,i18n/app/app_ja_JP.properties -fileformat.whiteList[8]=.ppt -fileformat.whiteList[29]=.xlsm -fileformat.whiteList[6]=.doc -fileformat.whiteList[19]=.md -fileformat.whiteList[23]=.gz -fileformat.whiteList[0]=.jpg -fileformat.whiteList[13]=.zip -fileformat.whiteList[35]=.dfyx -fileformat.whiteList[21]=.7z -fileformat.whiteList[11]=.pdf -fileformat.whiteList[33]=.xml -fileformat.whiteList[27]=.log -fileformat.whiteList[4]=.xls -fileformat.whiteList[17]=.avi -fileformat.whiteList[25]=.xml -fileformat.whiteList[2]=.jfif -fileformat.whiteList[15]=.mp3 -fileformat.whiteList[37]=.hex -fileformat.whiteList[31]=.yaml -fileformat.whiteList[7]=.docx -fileformat.whiteList[5]=.xlsx -fileformat.whiteList[18]=.mov -fileformat.whiteList[9]=.pptx -fileformat.whiteList[12]=.txt -fileformat.whiteList[34]=.dfy -fileformat.whiteList[24]=.csv -fileformat.whiteList[10]=.gif -fileformat.whiteList[32]=.properties -fileformat.whiteList[22]=.tar -fileformat.whiteList[3]=.png -fileformat.whiteList[16]=.mp4 -fileformat.whiteList[28]=.keystore -fileformat.whiteList[1]=.jpeg -fileformat.whiteList[14]=.rar -fileformat.whiteList[36]=.svg -fileformat.whiteList[26]=.jar -fileformat.whiteList[30]=.yml -fileformat.whiteList[20]=.json -spring.cloud.nacos.discovery.enabled=false -spring.cloud.nacos.config.refresh-enabled=false -spring.cloud.nacos.discovery.instance-enabled=false -apaas.deploy.type=null -spring.cloud.nacos.config.enabled=false -standard.plan.appTtlMillis=3600000 -standard.plan.userTtlMillis=7200000 +xdap.apaas.dbselectPriv=false +xdap.apaas.private=true +xdap.apaas.cache.run.init=true xdap.apaas.interface.encrypt.appEncryptionForceOpen=DISABLE xdap.apaas.interface.encrypt.appEncryptionType=SM2 xdap.apaas.interface.encrypt.appEncryptionStatus=DISABLE @@ -242,28 +234,87 @@ xdap.password.forceModify=DISABLE xdap.password.passwordValidateMessage=\u5bc6\u7801\u9700\u5305\u542b\u6570\u5b57\u3001\u5b57\u6bcd\u5927\u5c0f\u5199\u548c\u7279\u6b8a\u5b57\u7b26\uff0c\u4e0d\u5c11\u4e8e8\u4f4d xdap.password.passwordValidateRule=^.*(?=.{8,32})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?.() +-_~,=]).*$ xdap.header.accessControlAllowOrigin[0]=* -apaas.cache.usemq=true -apaas.bizevent.async=false -xdap.apaas.cache.run.init=true -mpaas.query.bigdatathresholdvalue=100000 xdap.process.suspendTimeFlag=ENABLE xdap.process.batchOption=20 -apaas.tenant.initDataModel=true + +# ====================== ????? ====================== +license.path=/data/resources/license.lic +license.publicKeyStorePath=/data/resources/publicCerts.keystore + +# ====================== Feign ?????? ====================== +feign.hystrix.enabled=false +feign.client.config.default.read-timeout=50000 +feign.client.config.default.connect-timeout=20000 + +# ====================== Nacos ?? ====================== +spring.cloud.nacos.discovery.enabled=false +spring.cloud.nacos.config.refresh-enabled=false +spring.cloud.nacos.discovery.instance-enabled=false +spring.cloud.nacos.config.enabled=false + +# ====================== ????????? ====================== +fileformat.whiteList[0]=.jpg +fileformat.whiteList[1]=.jpeg +fileformat.whiteList[2]=.jfif +fileformat.whiteList[3]=.png +fileformat.whiteList[4]=.xls +fileformat.whiteList[5]=.xlsx +fileformat.whiteList[6]=.doc +fileformat.whiteList[7]=.docx +fileformat.whiteList[8]=.ppt +fileformat.whiteList[9]=.pptx +fileformat.whiteList[10]=.gif +fileformat.whiteList[11]=.pdf +fileformat.whiteList[12]=.txt +fileformat.whiteList[13]=.zip +fileformat.whiteList[14]=.rar +fileformat.whiteList[15]=.mp3 +fileformat.whiteList[16]=.mp4 +fileformat.whiteList[17]=.avi +fileformat.whiteList[18]=.mov +fileformat.whiteList[19]=.md +fileformat.whiteList[20]=.json +fileformat.whiteList[21]=.7z +fileformat.whiteList[22]=.tar +fileformat.whiteList[23]=.gz +fileformat.whiteList[24]=.csv +fileformat.whiteList[25]=.xml +fileformat.whiteList[26]=.jar +fileformat.whiteList[27]=.log +fileformat.whiteList[28]=.keystore +fileformat.whiteList[29]=.xlsm +fileformat.whiteList[30]=.yml +fileformat.whiteList[31]=.yaml +fileformat.whiteList[32]=.properties +fileformat.whiteList[33]=.xml +fileformat.whiteList[34]=.dfy +fileformat.whiteList[35]=.dfyx +fileformat.whiteList[36]=.svg +fileformat.whiteList[37]=.hex + +# ====================== ???? ====================== download.config.downloadType=PERMANENT download.config.effectiveTime=168 download.config.publicKeyHex=04919f2130b035e29f079b4dace907e3cad716556f93574f1f2d61685f6a5ac251cba81822062353a07fd69f2c544f2263f217e04b3af327453c1f9157a434e0de download.config.privateKeyHex=4b6b9fa1be0757bf4977344c634c4ac2b0c907cd3b225ea16b674b8348ffdcde -i18n.frontProjects[8]=x-dcloud-page-mobile -i18n.frontProjects[9]=x-dcloud-page-web -i18n.frontProjects[6]=x-dcloud-business-event -i18n.frontProjects[7]=x-dcloud-page-engine -i18n.frontProjects[10]=xui + +# ====================== ????? ====================== i18n.backendProjects[0]=app -i18n.backendProjects[2]=workbench i18n.backendProjects[1]=platform +i18n.backendProjects[2]=workbench i18n.frontProjects[0]=app i18n.frontProjects[1]=app-h5 +i18n.frontProjects[2]=common +i18n.frontProjects[3]=platform-admin i18n.frontProjects[4]=workbench i18n.frontProjects[5]=workbench-h5 -i18n.frontProjects[2]=common -i18n.frontProjects[3]=platform-admin \ No newline at end of file +i18n.frontProjects[6]=x-dcloud-business-event +i18n.frontProjects[7]=x-dcloud-page-engine +i18n.frontProjects[8]=x-dcloud-page-mobile +i18n.frontProjects[9]=x-dcloud-page-web +i18n.frontProjects[10]=xui + +# ====================== ???? ====================== +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always +management.health.db.enabled=false \ No newline at end of file diff --git a/src/main/resources/sql.sql b/src/main/resources/sql.sql index 9445b09..90c0e0e 100644 --- a/src/main/resources/sql.sql +++ b/src/main/resources/sql.sql @@ -11,7 +11,6 @@ DROP TABLE IF EXISTS yfsjglpt_model_common_parameters; -- 新增机型参数常用参数表 CREATE TABLE yfsjglpt_model_common_parameters ( `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ID', - `subsystem` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '子系统', `parameter_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数ID', `common_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '常用id', PRIMARY KEY (`id`)