diff --git a/backend/src/main/java/io/metersphere/api/dto/ApiSyncRuleRelationRequest.java b/backend/src/main/java/io/metersphere/api/dto/ApiSyncRuleRelationRequest.java new file mode 100644 index 0000000000..83e10bdcf3 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/ApiSyncRuleRelationRequest.java @@ -0,0 +1,22 @@ +package io.metersphere.api.dto; + +import lombok.Getter; + +@Getter +public class ApiSyncRuleRelationRequest { + private String resourceId; + + private String resourceType; + + private Boolean showUpdateRule; + + private boolean caseCreator; + + private boolean scenarioCreator; + + private boolean syncCase; + + private boolean sendNotice; + + private String apiSyncCaseRequest; +} diff --git a/backend/src/main/java/io/metersphere/api/service/ApiCaseBatchSyncService.java b/backend/src/main/java/io/metersphere/api/service/ApiCaseBatchSyncService.java index 22259e23da..4ed1157499 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiCaseBatchSyncService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiCaseBatchSyncService.java @@ -1,8 +1,14 @@ package io.metersphere.api.service; -import io.metersphere.api.dto.definition.ApiSyncCaseRequest; import io.metersphere.base.domain.ApiDefinitionWithBLOBs; +import io.metersphere.base.domain.ApiTestCase; +import io.metersphere.base.domain.ApiTestCaseWithBLOBs; +import io.metersphere.base.mapper.ApiTestCaseMapper; public interface ApiCaseBatchSyncService { - void oneClickSyncCase(ApiSyncCaseRequest apiSyncCaseRequest, ApiDefinitionWithBLOBs apiDefinitionWithBLOBs); + void oneClickSyncCase(String apiUpdateRule, ApiDefinitionWithBLOBs apiDefinitionWithBLOBs, ApiTestCaseMapper apiTestCaseMapper, ApiTestCaseWithBLOBs testCases); + + void sendApiNotice(ApiDefinitionWithBLOBs apiDefinitionWithBLOBs); + + void sendCaseNotice(ApiTestCase apiTestCase); } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index 8145afd141..cfec03c6eb 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -161,9 +161,11 @@ public class ApiDefinitionService { @Resource private ProjectService projectService; @Resource - private ApiScenarioReferenceIdMapper apiScenarioReferenceIdMapper; + private ApiDefinitionSyncService apiDefinitionSyncService; @Resource - private ApiScenarioMapper apiScenarioMapper; + private ApiCaseBatchSyncService apiCaseSyncService; + + @Lazy @Resource private ApiAutomationService apiAutomationService; @@ -398,86 +400,25 @@ public class ApiDefinitionService { if (StringUtils.equals(request.getProtocol(), "DUBBO")) { request.setMethod("dubbo://"); } - if (StringUtils.isBlank(request.getTriggerUpdate())) { - // 设置是否需要进入待更新列表 - ApiDefinitionSyncService apiDefinitionSyncService = CommonBeanFactory.getBean(ApiDefinitionSyncService.class); - if (apiDefinitionSyncService != null) { - apiDefinitionSyncService.syncApi(request); - } + + // 设置是否需要进入待更新列表 + if (apiDefinitionSyncService != null) { + apiDefinitionSyncService.syncApi(request); } ApiDefinitionWithBLOBs returnModel = updateTest(request); - if (StringUtils.isNotBlank(request.getTriggerUpdate())) { - //一键同步case - ApiSyncCaseRequest apiSyncCaseRequest = JSONObject.parseObject(request.getTriggerUpdate(), ApiSyncCaseRequest.class); - ApiCaseBatchSyncService apiCaseSyncService = CommonBeanFactory.getBean(ApiCaseBatchSyncService.class); - if (apiCaseSyncService != null) { - apiCaseSyncService.oneClickSyncCase(apiSyncCaseRequest, returnModel); - } - } MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class); mockConfigService.updateMockReturnMsgByApi(returnModel); FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles); - // 发送通知 - String context = SessionUtils.getUserId() + "更新了接口定义:" + returnModel.getName(); - Map paramMap = new HashMap<>(); - paramMap.put("projectId", request.getProjectId()); - paramMap.put("operator", SessionUtils.getUserId()); - paramMap.put("id", returnModel.getId()); - paramMap.put("name", returnModel.getName()); - paramMap.put("createUser", returnModel.getCreateUser()); - paramMap.put("userId", returnModel.getUserId()); - Set specialReceiversSet = new HashSet<>(); - this.getReceivers(request, returnModel, specialReceiversSet); - List specialReceivers = new ArrayList<>(specialReceiversSet); - if (request.getSendSpecialMessage() != null && request.getSendSpecialMessage()) { - paramMap.put("specialReceivers", JSON.toJSONString(specialReceivers)); - paramMap.put("apiSpecialType", "API_SPECIAL"); + // 发送通知 + if (apiCaseSyncService != null) { + apiCaseSyncService.sendApiNotice(returnModel); } - NoticeModel noticeModel = NoticeModel.builder() - .operator(SessionUtils.getUserId()) - .context(context) - .testId(returnModel.getId()) - .subject("接口更新通知") - .paramMap(paramMap) - .event(NoticeConstants.Event.UPDATE) - .build(); - noticeSendService.send(NoticeConstants.TaskType.API_DEFINITION_TASK, noticeModel); return getById(returnModel.getId()); } - private void getReceivers(SaveApiDefinitionRequest request, ApiDefinitionWithBLOBs returnModel, Set specialReceivers) { - if (request.getSendSpecialMessage() != null && request.getSendSpecialMessage()) { - if (request.getCaseCreator() != null && request.getCaseCreator()) { - ApiTestCaseExample apiTestCaseExample = new ApiTestCaseExample(); - apiTestCaseExample.createCriteria().andApiDefinitionIdEqualTo(returnModel.getId()); - List apiTestCases = apiTestCaseMapper.selectByExample(apiTestCaseExample); - if (CollectionUtils.isNotEmpty(apiTestCases)) { - for (ApiTestCase apiTestCase : apiTestCases) { - specialReceivers.add(apiTestCase.getCreateUserId()); - } - } - } - if (request.getScenarioCreator() != null && request.getScenarioCreator()) { - ApiScenarioReferenceIdExample apiScenarioReferenceIdExample = new ApiScenarioReferenceIdExample(); - apiScenarioReferenceIdExample.createCriteria().andDataTypeEqualTo("API").andReferenceIdEqualTo(returnModel.getId()); - List apiScenarioReferenceIds = apiScenarioReferenceIdMapper.selectByExample(apiScenarioReferenceIdExample); - if (CollectionUtils.isNotEmpty(apiScenarioReferenceIds)) { - List scenarioIds = apiScenarioReferenceIds.stream().map(ApiScenarioReferenceId::getApiScenarioId).collect(Collectors.toList()); - ApiScenarioExample apiScenarioExample = new ApiScenarioExample(); - apiScenarioExample.createCriteria().andIdIn(scenarioIds); - List apiScenarios = apiScenarioMapper.selectByExample(apiScenarioExample); - if (CollectionUtils.isNotEmpty(apiScenarios)) { - for (ApiScenario apiScenario : apiScenarios) { - specialReceivers.add(apiScenario.getCreateUser()); - } - } - } - } - } - } public void checkQuota(String projectId) { QuotaService quotaService = CommonBeanFactory.getBean(QuotaService.class); @@ -773,23 +714,12 @@ public class ApiDefinitionService { apiDefinitionMapper.insertSelective(test); } - // 同步修改用例路径 if (StringUtils.equals(test.getProtocol(), "HTTP")) { List ids = new ArrayList<>(); ids.add(request.getId()); - Boolean toBeUpdated = null; - if (request.getToBeUpdated() != null) { - toBeUpdated = request.getToBeUpdated(); - } - ApiSyncCaseRequest apiSyncCaseRequest = new ApiSyncCaseRequest(); - ApiDefinitionSyncService apiDefinitionSyncService = CommonBeanFactory.getBean(ApiDefinitionSyncService.class); - if (apiDefinitionSyncService != null) { - apiSyncCaseRequest = apiDefinitionSyncService.getApiSyncCaseRequest(request.getProjectId()); - } - apiTestCaseService.updateByApiDefinitionId(ids, test.getPath(), test.getMethod(), test.getProtocol(), toBeUpdated, apiSyncCaseRequest); + apiTestCaseService.updateByApiDefinitionId(ids, test, request.getTriggerUpdate()); } - // ApiDefinitionWithBLOBs result = apiDefinitionMapper.selectByPrimaryKey(test.getId()); checkAndSetLatestVersion(result.getRefId()); return result; @@ -1208,7 +1138,6 @@ public class ApiDefinitionService { e.printStackTrace(); } ApiSyncCaseRequest apiSyncCaseRequest = new ApiSyncCaseRequest(); - ApiDefinitionSyncService apiDefinitionSyncService = CommonBeanFactory.getBean(ApiDefinitionSyncService.class); if (apiDefinitionSyncService != null) { apiSyncCaseRequest = apiDefinitionSyncService.getApiSyncCaseRequest(existApi.getProjectId()); } @@ -1238,7 +1167,6 @@ public class ApiDefinitionService { } return true; } - } JsonNode exApiRequest = null; diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java index fb7a3b3f4c..2b8d88692d 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java @@ -118,6 +118,8 @@ public class ApiTestCaseService { private ExtApiDefinitionMapper extApiDefinitionMapper; @Resource private ProjectApplicationMapper projectApplicationMapper; + @Resource + private ApiCaseBatchSyncService apiCaseSyncService; private static final String BODY_FILE_DIR = FileUtils.BODY_FILE_DIR; @@ -325,6 +327,10 @@ public class ApiTestCaseService { } else { FileUtils.createBodyFiles(request.getId(), bodyFiles); } + // 发送通知 + if (apiCaseSyncService != null) { + apiCaseSyncService.sendCaseNotice(test); + } return test; } @@ -834,7 +840,10 @@ public class ApiTestCaseService { } } - public void updateByApiDefinitionId(List ids, String path, String method, String protocol, Boolean toBeUpdated, ApiSyncCaseRequest apiSyncCaseRequest) { + public void updateByApiDefinitionId(List ids, ApiDefinitionWithBLOBs test, String apiUpdateRule) { + String method = test.getMethod(); + String path = test.getPath(); + String protocol = test.getProtocol(); if ((StringUtils.isNotEmpty(method) || StringUtils.isNotEmpty(path) && RequestType.HTTP.equals(protocol))) { ApiTestCaseExample apiDefinitionExample = new ApiTestCaseExample(); apiDefinitionExample.createCriteria().andApiDefinitionIdIn(ids); @@ -864,11 +873,9 @@ public class ApiTestCaseService { } String requestStr = JSON.toJSONString(req); apiTestCase.setRequest(requestStr); - if (toBeUpdated != null) { - apiTestCase.setToBeUpdated(toBeUpdated); - if (toBeUpdated) { - apiTestCase.setToBeUpdateTime(System.currentTimeMillis()); - } + // sync case + if (apiCaseSyncService != null) { + apiCaseSyncService.oneClickSyncCase(apiUpdateRule, test, batchMapper, apiTestCase); } batchMapper.updateByPrimaryKeySelective(apiTestCase); }); diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelation.java b/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelation.java new file mode 100644 index 0000000000..d0e61e4eff --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelation.java @@ -0,0 +1,27 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class ApiSyncRuleRelation implements Serializable { + private String id; + + private String resourceId; + + private String resourceType; + + private Boolean showUpdateRule; + + private Boolean caseCreator; + + private Boolean scenarioCreator; + + private Boolean syncCase; + + private Boolean sendNotice; + + private String apiSyncCaseRequest; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelationExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelationExample.java new file mode 100644 index 0000000000..f3dd3befb7 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/ApiSyncRuleRelationExample.java @@ -0,0 +1,710 @@ +package io.metersphere.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class ApiSyncRuleRelationExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public ApiSyncRuleRelationExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("id like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("id not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNull() { + addCriterion("resource_id is null"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNotNull() { + addCriterion("resource_id is not null"); + return (Criteria) this; + } + + public Criteria andResourceIdEqualTo(String value) { + addCriterion("resource_id =", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotEqualTo(String value) { + addCriterion("resource_id <>", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThan(String value) { + addCriterion("resource_id >", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThanOrEqualTo(String value) { + addCriterion("resource_id >=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThan(String value) { + addCriterion("resource_id <", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThanOrEqualTo(String value) { + addCriterion("resource_id <=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLike(String value) { + addCriterion("resource_id like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotLike(String value) { + addCriterion("resource_id not like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdIn(List values) { + addCriterion("resource_id in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotIn(List values) { + addCriterion("resource_id not in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdBetween(String value1, String value2) { + addCriterion("resource_id between", value1, value2, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotBetween(String value1, String value2) { + addCriterion("resource_id not between", value1, value2, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceTypeIsNull() { + addCriterion("resource_type is null"); + return (Criteria) this; + } + + public Criteria andResourceTypeIsNotNull() { + addCriterion("resource_type is not null"); + return (Criteria) this; + } + + public Criteria andResourceTypeEqualTo(String value) { + addCriterion("resource_type =", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotEqualTo(String value) { + addCriterion("resource_type <>", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeGreaterThan(String value) { + addCriterion("resource_type >", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeGreaterThanOrEqualTo(String value) { + addCriterion("resource_type >=", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLessThan(String value) { + addCriterion("resource_type <", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLessThanOrEqualTo(String value) { + addCriterion("resource_type <=", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLike(String value) { + addCriterion("resource_type like", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotLike(String value) { + addCriterion("resource_type not like", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeIn(List values) { + addCriterion("resource_type in", values, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotIn(List values) { + addCriterion("resource_type not in", values, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeBetween(String value1, String value2) { + addCriterion("resource_type between", value1, value2, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotBetween(String value1, String value2) { + addCriterion("resource_type not between", value1, value2, "resourceType"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleIsNull() { + addCriterion("show_update_rule is null"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleIsNotNull() { + addCriterion("show_update_rule is not null"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleEqualTo(Boolean value) { + addCriterion("show_update_rule =", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleNotEqualTo(Boolean value) { + addCriterion("show_update_rule <>", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleGreaterThan(Boolean value) { + addCriterion("show_update_rule >", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleGreaterThanOrEqualTo(Boolean value) { + addCriterion("show_update_rule >=", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleLessThan(Boolean value) { + addCriterion("show_update_rule <", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleLessThanOrEqualTo(Boolean value) { + addCriterion("show_update_rule <=", value, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleIn(List values) { + addCriterion("show_update_rule in", values, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleNotIn(List values) { + addCriterion("show_update_rule not in", values, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleBetween(Boolean value1, Boolean value2) { + addCriterion("show_update_rule between", value1, value2, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andShowUpdateRuleNotBetween(Boolean value1, Boolean value2) { + addCriterion("show_update_rule not between", value1, value2, "showUpdateRule"); + return (Criteria) this; + } + + public Criteria andCaseCreatorIsNull() { + addCriterion("case_creator is null"); + return (Criteria) this; + } + + public Criteria andCaseCreatorIsNotNull() { + addCriterion("case_creator is not null"); + return (Criteria) this; + } + + public Criteria andCaseCreatorEqualTo(Boolean value) { + addCriterion("case_creator =", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorNotEqualTo(Boolean value) { + addCriterion("case_creator <>", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorGreaterThan(Boolean value) { + addCriterion("case_creator >", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorGreaterThanOrEqualTo(Boolean value) { + addCriterion("case_creator >=", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorLessThan(Boolean value) { + addCriterion("case_creator <", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorLessThanOrEqualTo(Boolean value) { + addCriterion("case_creator <=", value, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorIn(List values) { + addCriterion("case_creator in", values, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorNotIn(List values) { + addCriterion("case_creator not in", values, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorBetween(Boolean value1, Boolean value2) { + addCriterion("case_creator between", value1, value2, "caseCreator"); + return (Criteria) this; + } + + public Criteria andCaseCreatorNotBetween(Boolean value1, Boolean value2) { + addCriterion("case_creator not between", value1, value2, "caseCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorIsNull() { + addCriterion("scenario_creator is null"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorIsNotNull() { + addCriterion("scenario_creator is not null"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorEqualTo(Boolean value) { + addCriterion("scenario_creator =", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorNotEqualTo(Boolean value) { + addCriterion("scenario_creator <>", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorGreaterThan(Boolean value) { + addCriterion("scenario_creator >", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorGreaterThanOrEqualTo(Boolean value) { + addCriterion("scenario_creator >=", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorLessThan(Boolean value) { + addCriterion("scenario_creator <", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorLessThanOrEqualTo(Boolean value) { + addCriterion("scenario_creator <=", value, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorIn(List values) { + addCriterion("scenario_creator in", values, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorNotIn(List values) { + addCriterion("scenario_creator not in", values, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorBetween(Boolean value1, Boolean value2) { + addCriterion("scenario_creator between", value1, value2, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andScenarioCreatorNotBetween(Boolean value1, Boolean value2) { + addCriterion("scenario_creator not between", value1, value2, "scenarioCreator"); + return (Criteria) this; + } + + public Criteria andSyncCaseIsNull() { + addCriterion("sync_case is null"); + return (Criteria) this; + } + + public Criteria andSyncCaseIsNotNull() { + addCriterion("sync_case is not null"); + return (Criteria) this; + } + + public Criteria andSyncCaseEqualTo(Boolean value) { + addCriterion("sync_case =", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseNotEqualTo(Boolean value) { + addCriterion("sync_case <>", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseGreaterThan(Boolean value) { + addCriterion("sync_case >", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseGreaterThanOrEqualTo(Boolean value) { + addCriterion("sync_case >=", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseLessThan(Boolean value) { + addCriterion("sync_case <", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseLessThanOrEqualTo(Boolean value) { + addCriterion("sync_case <=", value, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseIn(List values) { + addCriterion("sync_case in", values, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseNotIn(List values) { + addCriterion("sync_case not in", values, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseBetween(Boolean value1, Boolean value2) { + addCriterion("sync_case between", value1, value2, "syncCase"); + return (Criteria) this; + } + + public Criteria andSyncCaseNotBetween(Boolean value1, Boolean value2) { + addCriterion("sync_case not between", value1, value2, "syncCase"); + return (Criteria) this; + } + + public Criteria andSendNoticeIsNull() { + addCriterion("send_notice is null"); + return (Criteria) this; + } + + public Criteria andSendNoticeIsNotNull() { + addCriterion("send_notice is not null"); + return (Criteria) this; + } + + public Criteria andSendNoticeEqualTo(Boolean value) { + addCriterion("send_notice =", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeNotEqualTo(Boolean value) { + addCriterion("send_notice <>", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeGreaterThan(Boolean value) { + addCriterion("send_notice >", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeGreaterThanOrEqualTo(Boolean value) { + addCriterion("send_notice >=", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeLessThan(Boolean value) { + addCriterion("send_notice <", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeLessThanOrEqualTo(Boolean value) { + addCriterion("send_notice <=", value, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeIn(List values) { + addCriterion("send_notice in", values, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeNotIn(List values) { + addCriterion("send_notice not in", values, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeBetween(Boolean value1, Boolean value2) { + addCriterion("send_notice between", value1, value2, "sendNotice"); + return (Criteria) this; + } + + public Criteria andSendNoticeNotBetween(Boolean value1, Boolean value2) { + addCriterion("send_notice not between", value1, value2, "sendNotice"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.java new file mode 100644 index 0000000000..3dc2eec997 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.java @@ -0,0 +1,36 @@ +package io.metersphere.base.mapper; + +import io.metersphere.base.domain.ApiSyncRuleRelation; +import io.metersphere.base.domain.ApiSyncRuleRelationExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface ApiSyncRuleRelationMapper { + long countByExample(ApiSyncRuleRelationExample example); + + int deleteByExample(ApiSyncRuleRelationExample example); + + int deleteByPrimaryKey(String id); + + int insert(ApiSyncRuleRelation record); + + int insertSelective(ApiSyncRuleRelation record); + + List selectByExampleWithBLOBs(ApiSyncRuleRelationExample example); + + List selectByExample(ApiSyncRuleRelationExample example); + + ApiSyncRuleRelation selectByPrimaryKey(String id); + + int updateByExampleSelective(@Param("record") ApiSyncRuleRelation record, @Param("example") ApiSyncRuleRelationExample example); + + int updateByExampleWithBLOBs(@Param("record") ApiSyncRuleRelation record, @Param("example") ApiSyncRuleRelationExample example); + + int updateByExample(@Param("record") ApiSyncRuleRelation record, @Param("example") ApiSyncRuleRelationExample example); + + int updateByPrimaryKeySelective(ApiSyncRuleRelation record); + + int updateByPrimaryKeyWithBLOBs(ApiSyncRuleRelation record); + + int updateByPrimaryKey(ApiSyncRuleRelation record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.xml new file mode 100644 index 0000000000..e5f2e6b252 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiSyncRuleRelationMapper.xml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, resource_id, resource_type, show_update_rule, case_creator, scenario_creator, + sync_case, send_notice + + + api_sync_case_request + + + + + + delete from api_sync_rule_relation + where id = #{id,jdbcType=VARCHAR} + + + delete from api_sync_rule_relation + + + + + + insert into api_sync_rule_relation (id, resource_id, resource_type, + show_update_rule, case_creator, scenario_creator, + sync_case, send_notice, api_sync_case_request + ) + values (#{id,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR}, #{resourceType,jdbcType=VARCHAR}, + #{showUpdateRule,jdbcType=BIT}, #{caseCreator,jdbcType=BIT}, #{scenarioCreator,jdbcType=BIT}, + #{syncCase,jdbcType=BIT}, #{sendNotice,jdbcType=BIT}, #{apiSyncCaseRequest,jdbcType=LONGVARCHAR} + ) + + + insert into api_sync_rule_relation + + + id, + + + resource_id, + + + resource_type, + + + show_update_rule, + + + case_creator, + + + scenario_creator, + + + sync_case, + + + send_notice, + + + api_sync_case_request, + + + + + #{id,jdbcType=VARCHAR}, + + + #{resourceId,jdbcType=VARCHAR}, + + + #{resourceType,jdbcType=VARCHAR}, + + + #{showUpdateRule,jdbcType=BIT}, + + + #{caseCreator,jdbcType=BIT}, + + + #{scenarioCreator,jdbcType=BIT}, + + + #{syncCase,jdbcType=BIT}, + + + #{sendNotice,jdbcType=BIT}, + + + #{apiSyncCaseRequest,jdbcType=LONGVARCHAR}, + + + + + + update api_sync_rule_relation + + + id = #{record.id,jdbcType=VARCHAR}, + + + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + + + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + + + show_update_rule = #{record.showUpdateRule,jdbcType=BIT}, + + + case_creator = #{record.caseCreator,jdbcType=BIT}, + + + scenario_creator = #{record.scenarioCreator,jdbcType=BIT}, + + + sync_case = #{record.syncCase,jdbcType=BIT}, + + + send_notice = #{record.sendNotice,jdbcType=BIT}, + + + api_sync_case_request = #{record.apiSyncCaseRequest,jdbcType=LONGVARCHAR}, + + + + + + + + update api_sync_rule_relation + set id = #{record.id,jdbcType=VARCHAR}, + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + show_update_rule = #{record.showUpdateRule,jdbcType=BIT}, + case_creator = #{record.caseCreator,jdbcType=BIT}, + scenario_creator = #{record.scenarioCreator,jdbcType=BIT}, + sync_case = #{record.syncCase,jdbcType=BIT}, + send_notice = #{record.sendNotice,jdbcType=BIT}, + api_sync_case_request = #{record.apiSyncCaseRequest,jdbcType=LONGVARCHAR} + + + + + + update api_sync_rule_relation + set id = #{record.id,jdbcType=VARCHAR}, + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + show_update_rule = #{record.showUpdateRule,jdbcType=BIT}, + case_creator = #{record.caseCreator,jdbcType=BIT}, + scenario_creator = #{record.scenarioCreator,jdbcType=BIT}, + sync_case = #{record.syncCase,jdbcType=BIT}, + send_notice = #{record.sendNotice,jdbcType=BIT} + + + + + + update api_sync_rule_relation + + + resource_id = #{resourceId,jdbcType=VARCHAR}, + + + resource_type = #{resourceType,jdbcType=VARCHAR}, + + + show_update_rule = #{showUpdateRule,jdbcType=BIT}, + + + case_creator = #{caseCreator,jdbcType=BIT}, + + + scenario_creator = #{scenarioCreator,jdbcType=BIT}, + + + sync_case = #{syncCase,jdbcType=BIT}, + + + send_notice = #{sendNotice,jdbcType=BIT}, + + + api_sync_case_request = #{apiSyncCaseRequest,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + + + update api_sync_rule_relation + set resource_id = #{resourceId,jdbcType=VARCHAR}, + resource_type = #{resourceType,jdbcType=VARCHAR}, + show_update_rule = #{showUpdateRule,jdbcType=BIT}, + case_creator = #{caseCreator,jdbcType=BIT}, + scenario_creator = #{scenarioCreator,jdbcType=BIT}, + sync_case = #{syncCase,jdbcType=BIT}, + send_notice = #{sendNotice,jdbcType=BIT}, + api_sync_case_request = #{apiSyncCaseRequest,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=VARCHAR} + + + update api_sync_rule_relation + set resource_id = #{resourceId,jdbcType=VARCHAR}, + resource_type = #{resourceType,jdbcType=VARCHAR}, + show_update_rule = #{showUpdateRule,jdbcType=BIT}, + case_creator = #{caseCreator,jdbcType=BIT}, + scenario_creator = #{scenarioCreator,jdbcType=BIT}, + sync_case = #{syncCase,jdbcType=BIT}, + send_notice = #{sendNotice,jdbcType=BIT} + where id = #{id,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/commons/constants/ProjectApplicationType.java b/backend/src/main/java/io/metersphere/commons/constants/ProjectApplicationType.java index 6f9e4b3057..f7a6594e2c 100644 --- a/backend/src/main/java/io/metersphere/commons/constants/ProjectApplicationType.java +++ b/backend/src/main/java/io/metersphere/commons/constants/ProjectApplicationType.java @@ -82,5 +82,9 @@ public enum ProjectApplicationType { /** * 我的工作台-触发待更新规则 */ - TRIGGER_UPDATE + TRIGGER_UPDATE, + /** + * 我的工作台-开启待更新规则 + */ + OPEN_UPDATE_RULE } diff --git a/backend/src/main/java/io/metersphere/dto/ProjectConfig.java b/backend/src/main/java/io/metersphere/dto/ProjectConfig.java index 6982777dfc..d38c18fd57 100644 --- a/backend/src/main/java/io/metersphere/dto/ProjectConfig.java +++ b/backend/src/main/java/io/metersphere/dto/ProjectConfig.java @@ -29,4 +29,5 @@ public class ProjectConfig { private String triggerUpdate; private Boolean openUpdateTime = false; private String openUpdateRuleTime; + private Boolean openUpdateRule = false; } diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index e62ecc34ad..8060d82bc5 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -63,52 +63,12 @@ + - - - - - - - - - - - - - - - - - - - - - -
- - - - + - - - - - - - - diff --git a/frontend/src/business/components/api/definition/components/case/ApiCaseHeader.vue b/frontend/src/business/components/api/definition/components/case/ApiCaseHeader.vue index 2e7fcaab70..04187ed9dc 100644 --- a/frontend/src/business/components/api/definition/components/case/ApiCaseHeader.vue +++ b/frontend/src/business/components/api/definition/components/case/ApiCaseHeader.vue @@ -20,15 +20,30 @@ :project-id="projectId" :is-read-only="isReadOnly" :useEnvironment='useEnvironment' - @setEnvironment="setEnvironment" ref="environmentSelect" v-if="api.protocol==='HTTP' || api.protocol ==='TCP'"/> + @setEnvironment="setEnvironment" ref="environmentSelect" + v-if="api.protocol==='HTTP' || api.protocol ==='TCP'"/> - {{ saveButtonText }} + + {{ $t('commons.save') }} + + {{ + $t('commons.save') + '&' + $t('workstation.sync_setting') + }} + + + @@ -43,7 +58,7 @@ import MsTag from "../../../../common/components/MsTag"; import MsEnvironmentSelect from "./MsEnvironmentSelect"; import {API_METHOD_COLOUR} from "../../model/JsonData"; import ApiCaseItem from "@/business/components/api/definition/components/case/ApiCaseItem"; -import {hasPermission} from "@/common/js/utils"; +import {hasLicense, hasPermission} from "@/common/js/utils"; export default { name: "ApiCaseHeader", @@ -52,6 +67,8 @@ export default { return { methodColorMap: new Map(API_METHOD_COLOUR), saveButtonText: this.$t('commons.save'), + isXpack: false, + showUpdateRule: false } }, props: { @@ -80,8 +97,15 @@ export default { }, beforeDestroy() { window.removeEventListener('keydown', this.keyDown) // 在页面销毁的时候记得解除 + this.$EventBus.$off('showXpackCaseBtn'); }, created() { + this.isXpack = !!hasLicense(); + if (this.isXpack) { + this.$EventBus.$on('showXpackCaseBtn', showUpdateRule => { + this.handleXpackCaseBtnChange(showUpdateRule); + }); + } if (this.buttonText) { this.saveButtonText = this.buttonText; } @@ -104,7 +128,6 @@ export default { this.$emit('setEnvironment', data.id); } }, - open() { this.$refs.searchBar.open(); }, @@ -119,6 +142,15 @@ export default { }, saveTestCase() { this.$emit("saveCase") + }, + handleCommand(command) { + if (command === 'openSyncRule') { + this.$EventBus.$emit('showXpackCaseSet', false); + this.saveTestCase(); + } + }, + handleXpackCaseBtnChange(showUpdateRule) { + this.showUpdateRule = showUpdateRule; } } } diff --git a/frontend/src/business/components/api/definition/components/case/ApiCaseItem.vue b/frontend/src/business/components/api/definition/components/case/ApiCaseItem.vue index 1e010ecd4a..ec5b743436 100644 --- a/frontend/src/business/components/api/definition/components/case/ApiCaseItem.vue +++ b/frontend/src/business/components/api/definition/components/case/ApiCaseItem.vue @@ -176,13 +176,59 @@ + + + + + {{ $t('project_application.workstation.update_case_tip') }} + + + + +

+ {{ $t('project_application.workstation.go_to_case_message') }} +

+ + {{ $t('api_test.definition.recipient') + ":" }} + + + + {{ $t('commons.scenario') + $t('api_test.creator') }} + + + +
+ + {{ + $t('project_application.workstation.no_show_setting') + }} + + + + {{ $t('commons.cancel') }} + {{ $t('commons.confirm') }} + +
diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index ee1700683b..bf8de8efd9 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -491,6 +491,8 @@ export default { }, workstation: { sync: 'Synchronize', + sync_setting: 'Sync settings', + custom_update_list_rule: 'Customize to-be-updated list rules', ignore: 'Ignore', past: 'past', api_change: 'Api Change', @@ -3391,7 +3393,14 @@ export default { rule_tip: 'Set the to-be-updated rule, if it meets the selected conditions, it will enter the to-be-updated list', api_tip: 'Both the interface definition and the affected interface use cases will enter the to-be-updated list', case_tip: 'If the interface use case meets the conditions, it will enter the to-be-updated list', - update_rule_title: 'Enter the to-be-updated list rule settings' + update_rule_title: 'Enter the to-be-updated list rule settings', + no_show_setting: 'No popup settings popup', + api_receiver_tip: "Note: Please confirm that \"API update\" in the API test task notification has been set \"Intra-site message\" message, otherwise, you will not receive message reminders", + case_receiver_tip: "Note: Please confirm that \"CASE update\" in the API test task notification has been set \"Intra-site message\" message, otherwise, you will not receive message reminders", + no_show_setting_tip: "After checking, the pop-up window will no longer pop up, and the synchronization and change notification will be performed according to the setting content by default: If you need to change the setting, you can open the setting item in the drop-down option next to the save button。", + go_to_api_message: 'Interface API update message notification', + go_to_case_message: 'CASE update message notification', + update_case_tip: 'When the CASE changes, the creator of the automation scene referring to the CASE recycles the message reminder in the station' } } }; diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index 273198568a..b62120a956 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -494,6 +494,8 @@ export default { }, workstation: { sync: '同步', + sync_setting: '同步设置', + custom_update_list_rule: '自定义待更新列表规则', ignore: '忽略', past: '过去', api_change: '接口变更', @@ -3402,7 +3404,14 @@ export default { rule_tip: '设置待更新规则,符合选择的条件,会进入待更新列表中', api_tip: '接口定义和受影响的接口用例都会进入待更新列表', case_tip: '接口用例符合条件就会进入待更新列表', - update_rule_title: '进入待更新列表规则设置' + update_rule_title: '进入待更新列表规则设置', + no_show_setting: '不在弹出设置弹窗', + api_receiver_tip: "注意:请确认接口测试任务通知中的\"API更新\"已设置\"站内信\"消息,否则,将接收不到消息提醒。", + case_receiver_tip: "注意:请确认接口测试任务通知中的\"CASE更新\"已设置\"站内信\"消息,否则,将接收不到消息提醒。", + no_show_setting_tip: "勾选后,不再弹出弹窗,会默认按照设置的内容执行同步和变更通知:如果需要更改设置,可以在保存按钮旁的下拉选项中,打开设置项。", + go_to_api_message: '接口API更新消息通知', + go_to_case_message: 'CASE更新消息通知', + update_case_tip: '当CASE发生变化时,引用CASE的自动化场景创建人回收到站内消息提醒' } } }; diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index 835fa62f81..53064e8e78 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -494,6 +494,8 @@ export default { }, workstation: { sync: '同步', + sync_setting: '同步設置', + custom_update_list_rule: '自定義待更新列表規則', ignore: '忽略', past: '過去', api_change: '接口變更', @@ -3378,7 +3380,14 @@ export default { rule_tip: '設置待更新規則,符合選擇的條件,會進入待更新列表中', api_tip: '接口定義和受影響的接口用例都會進入待更新列表', case_tip: '接口用例符合條件就會進入待更新列表', - update_rule_title: '進入待更新列表規則設置' + update_rule_title: '進入待更新列表規則設置', + no_show_setting: '不在彈出設置彈窗', + api_receiver_tip: "注意:請確認接口測試任務通知中的\"API更新\"已設置\"站內信\"消息,否則,將接收不到消息提醒", + case_receiver_tip: "注意:請確認接口測試任務通知中的\"CASE更新\"已設置\"站內信\"消息,否則,將接收不到消息提醒。", + no_show_setting_tip: "勾選後,不再彈出彈窗,會默認按照設置的內容執行同步和變更通知:如果需要更改設置,可以在保存按鈕旁的下拉選項中,打開設置項。", + go_to_api_message: '接口API更新消息通知', + go_to_case_message: 'CASE更新消息通知', + update_case_tip: '當CASE發生變化時,引用CASE的自動化場景創建人回收到站內消息提醒' } } };