Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
b1baa5d4
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 大约 3 年
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
b1baa5d4
编写于
10月 22, 2020
作者:
C
chenjianxing
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'v1.4' of
https://github.com/metersphere/server
into v1.4
上级
ee56ab27
5d789ce2
变更
32
展开全部
隐藏空白更改
内联
并排
Showing
32 changed file
with
1416 addition
and
432 deletion
+1416
-432
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
...a/io/metersphere/api/jmeter/APIBackendListenerClient.java
+74
-2
backend/src/main/java/io/metersphere/base/domain/MessageTaskExample.java
...n/java/io/metersphere/base/domain/MessageTaskExample.java
+12
-12
backend/src/main/java/io/metersphere/base/domain/TestPlan.java
...nd/src/main/java/io/metersphere/base/domain/TestPlan.java
+9
-6
backend/src/main/java/io/metersphere/base/domain/TestPlanExample.java
...main/java/io/metersphere/base/domain/TestPlanExample.java
+310
-0
backend/src/main/java/io/metersphere/base/mapper/MessageTaskMapper.xml
...ain/java/io/metersphere/base/mapper/MessageTaskMapper.xml
+25
-25
backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml
...c/main/java/io/metersphere/base/mapper/TestPlanMapper.xml
+245
-213
backend/src/main/java/io/metersphere/commons/constants/NoticeConstants.java
...ava/io/metersphere/commons/constants/NoticeConstants.java
+7
-4
backend/src/main/java/io/metersphere/notice/service/DingTaskService.java
...n/java/io/metersphere/notice/service/DingTaskService.java
+29
-16
backend/src/main/java/io/metersphere/notice/service/MailService.java
.../main/java/io/metersphere/notice/service/MailService.java
+172
-18
backend/src/main/java/io/metersphere/notice/service/NoticeService.java
...ain/java/io/metersphere/notice/service/NoticeService.java
+7
-3
backend/src/main/java/io/metersphere/notice/service/WxChatTaskService.java
...java/io/metersphere/notice/service/WxChatTaskService.java
+29
-15
backend/src/main/java/io/metersphere/service/SystemParameterService.java
...n/java/io/metersphere/service/SystemParameterService.java
+6
-3
backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java
...etersphere/track/controller/TestCaseReviewController.java
+2
-1
backend/src/main/java/io/metersphere/track/service/IssuesService.java
...main/java/io/metersphere/track/service/IssuesService.java
+53
-4
backend/src/main/java/io/metersphere/track/service/TestCaseCommentService.java
.../io/metersphere/track/service/TestCaseCommentService.java
+34
-14
backend/src/main/java/io/metersphere/track/service/TestCaseReviewService.java
...a/io/metersphere/track/service/TestCaseReviewService.java
+70
-39
backend/src/main/java/io/metersphere/track/service/TestPlanService.java
...in/java/io/metersphere/track/service/TestPlanService.java
+146
-8
backend/src/main/resources/db/migration/V35__modify_test_plan.sql
...src/main/resources/db/migration/V35__modify_test_plan.sql
+2
-0
backend/src/main/resources/generatorConfig.xml
backend/src/main/resources/generatorConfig.xml
+1
-0
backend/src/main/resources/i18n/messages_en_US.properties
backend/src/main/resources/i18n/messages_en_US.properties
+7
-1
backend/src/main/resources/i18n/messages_zh_CN.properties
backend/src/main/resources/i18n/messages_zh_CN.properties
+4
-1
backend/src/main/resources/i18n/messages_zh_TW.properties
backend/src/main/resources/i18n/messages_zh_TW.properties
+5
-1
backend/src/main/resources/mail/deleteReview.html
backend/src/main/resources/mail/deleteReview.html
+16
-0
backend/src/main/resources/mail/issuesCreate.html
backend/src/main/resources/mail/issuesCreate.html
+12
-0
backend/src/main/resources/mail/testPlanDelete.html
backend/src/main/resources/mail/testPlanDelete.html
+17
-0
backend/src/main/resources/mail/testPlanEnd.html
backend/src/main/resources/mail/testPlanEnd.html
+18
-0
backend/src/main/resources/mail/testPlanStart.html
backend/src/main/resources/mail/testPlanStart.html
+18
-0
frontend/src/business/components/settings/organization/TaskNotification.vue
...ess/components/settings/organization/TaskNotification.vue
+80
-43
frontend/src/business/components/settings/router.js
frontend/src/business/components/settings/router.js
+2
-2
frontend/src/i18n/en-US.js
frontend/src/i18n/en-US.js
+1
-0
frontend/src/i18n/zh-CN.js
frontend/src/i18n/zh-CN.js
+2
-1
frontend/src/i18n/zh-TW.js
frontend/src/i18n/zh-TW.js
+1
-0
未找到文件。
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
浏览文件 @
b1baa5d4
...
...
@@ -5,12 +5,17 @@ import io.metersphere.api.service.APITestService;
import
io.metersphere.base.domain.ApiTestReport
;
import
io.metersphere.commons.constants.APITestStatus
;
import
io.metersphere.commons.constants.ApiRunMode
;
import
io.metersphere.commons.constants.NoticeConstants
;
import
io.metersphere.commons.constants.TestPlanTestCaseStatus
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.notice.domain.MessageDetail
;
import
io.metersphere.notice.domain.MessageSettingDetail
;
import
io.metersphere.notice.domain.NoticeDetail
;
import
io.metersphere.notice.service.DingTaskService
;
import
io.metersphere.notice.service.MailService
;
import
io.metersphere.notice.service.NoticeService
;
import
io.metersphere.notice.service.WxChatTaskService
;
import
io.metersphere.track.service.TestPlanTestCaseService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.jmeter.assertions.AssertionResult
;
...
...
@@ -19,6 +24,7 @@ import org.apache.jmeter.visualizers.backend.AbstractBackendListenerClient;
import
org.apache.jmeter.visualizers.backend.BackendListenerContext
;
import
org.springframework.http.HttpMethod
;
import
javax.mail.MessagingException
;
import
java.io.Serializable
;
import
java.util.*
;
...
...
@@ -79,6 +85,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
super
.
setupTest
(
context
);
}
@Override
public
void
handleSampleResults
(
List
<
SampleResult
>
sampleResults
,
BackendListenerContext
context
)
{
queue
.
addAll
(
sampleResults
);
...
...
@@ -139,6 +146,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
queue
.
clear
();
super
.
teardownTest
(
context
);
TestPlanTestCaseService
testPlanTestCaseService
=
CommonBeanFactory
.
getBean
(
TestPlanTestCaseService
.
class
);
List
<
String
>
ids
=
testPlanTestCaseService
.
getTestPlanTestCaseIds
(
testResult
.
getTestId
());
if
(
ids
.
size
()
>
0
)
{
try
{
...
...
@@ -152,15 +160,79 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
}
}
try
{
List
<
NoticeDetail
>
noticeList
=
noticeService
.
queryNotice
(
testResult
.
getTestId
());
mailService
.
sendApiNotification
(
report
,
noticeList
);
sendTask
(
report
,
testResult
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
private
static
void
sendTask
(
ApiTestReport
report
,
TestResult
testResult
)
{
NoticeService
noticeService
=
CommonBeanFactory
.
getBean
(
NoticeService
.
class
);
MailService
mailService
=
CommonBeanFactory
.
getBean
(
MailService
.
class
);
DingTaskService
dingTaskService
=
CommonBeanFactory
.
getBean
(
DingTaskService
.
class
);
WxChatTaskService
wxChatTaskService
=
CommonBeanFactory
.
getBean
(
WxChatTaskService
.
class
);
if
(
StringUtils
.
equals
(
NoticeConstants
.
SCHEDULE
,
report
.
getTriggerMode
()))
{
List
<
NoticeDetail
>
noticeList
=
noticeService
.
queryNotice
(
testResult
.
getTestId
());
mailService
.
sendApiNotification
(
report
,
noticeList
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
API
,
report
.
getTriggerMode
()))
{
List
<
String
>
userIds
=
new
ArrayList
<>();
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getJenkinsTask
();
if
(
StringUtils
.
equals
(
report
.
getStatus
(),
"Success"
))
{
}
String
contextSuccess
=
report
.
getName
()
+
"执行成功"
;
;
String
contextFailed
=
report
.
getName
()
+
"执行失败"
;
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
r
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_SUCCESSFUL
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Success"
))
{
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
contextSuccess
,
NoticeConstants
.
EXECUTE_SUCCESSFUL
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_FAILED
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Error"
))
{
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
contextFailed
,
NoticeConstants
.
EXECUTE_FAILED
);
}
});
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
r
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_SUCCESSFUL
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Success"
))
{
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
contextSuccess
,
NoticeConstants
.
EXECUTE_SUCCESSFUL
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_FAILED
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Error"
))
{
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
contextFailed
,
NoticeConstants
.
EXECUTE_FAILED
);
}
});
break
;
case
NoticeConstants
.
EMAIL
:
r
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_SUCCESSFUL
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Success"
))
{
try
{
mailService
.
sendApiJenkinsNotification
(
contextSuccess
,
r
);
}
catch
(
MessagingException
messagingException
)
{
messagingException
.
printStackTrace
();
}
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
EXECUTE_FAILED
,
e
)
&&
StringUtils
.
equals
(
report
.
getStatus
(),
"Error"
))
{
try
{
mailService
.
sendApiJenkinsNotification
(
contextFailed
,
r
);
}
catch
(
MessagingException
messagingException
)
{
messagingException
.
printStackTrace
();
}
}
});
break
;
}
});
}
}
private
RequestResult
getRequestResult
(
SampleResult
result
)
{
RequestResult
requestResult
=
new
RequestResult
();
requestResult
.
setName
(
result
.
getSampleLabel
());
...
...
backend/src/main/java/io/metersphere/base/domain/MessageTaskExample.java
浏览文件 @
b1baa5d4
...
...
@@ -595,62 +595,62 @@ public class MessageTaskExample {
}
public
Criteria
andIsSetIsNull
()
{
addCriterion
(
"is_
S
et is null"
);
addCriterion
(
"is_
s
et is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetIsNotNull
()
{
addCriterion
(
"is_
S
et is not null"
);
addCriterion
(
"is_
s
et is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetEqualTo
(
Boolean
value
)
{
addCriterion
(
"is_
S
et ="
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et ="
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetNotEqualTo
(
Boolean
value
)
{
addCriterion
(
"is_
S
et <>"
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et <>"
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetGreaterThan
(
Boolean
value
)
{
addCriterion
(
"is_
S
et >"
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et >"
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetGreaterThanOrEqualTo
(
Boolean
value
)
{
addCriterion
(
"is_
S
et >="
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et >="
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetLessThan
(
Boolean
value
)
{
addCriterion
(
"is_
S
et <"
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et <"
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetLessThanOrEqualTo
(
Boolean
value
)
{
addCriterion
(
"is_
S
et <="
,
value
,
"isSet"
);
addCriterion
(
"is_
s
et <="
,
value
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetIn
(
List
<
Boolean
>
values
)
{
addCriterion
(
"is_
S
et in"
,
values
,
"isSet"
);
addCriterion
(
"is_
s
et in"
,
values
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetNotIn
(
List
<
Boolean
>
values
)
{
addCriterion
(
"is_
S
et not in"
,
values
,
"isSet"
);
addCriterion
(
"is_
s
et not in"
,
values
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetBetween
(
Boolean
value1
,
Boolean
value2
)
{
addCriterion
(
"is_
S
et between"
,
value1
,
value2
,
"isSet"
);
addCriterion
(
"is_
s
et between"
,
value1
,
value2
,
"isSet"
);
return
(
Criteria
)
this
;
}
public
Criteria
andIsSetNotBetween
(
Boolean
value1
,
Boolean
value2
)
{
addCriterion
(
"is_
S
et not between"
,
value1
,
value2
,
"isSet"
);
addCriterion
(
"is_
s
et not between"
,
value1
,
value2
,
"isSet"
);
return
(
Criteria
)
this
;
}
}
...
...
backend/src/main/java/io/metersphere/base/domain/TestPlan.java
浏览文件 @
b1baa5d4
package
io.metersphere.base.domain
;
import
java.io.Serializable
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
TestPlan
implements
Serializable
{
private
String
id
;
...
...
@@ -25,17 +26,19 @@ public class TestPlan implements Serializable {
private
String
executorMatchRule
;
private
Long
createTime
;
private
Long
updateTime
;
private
Long
actualEndTime
;
private
Long
plannedStartTime
;
private
Long
plannedEndTime
;
private
Long
actualStartTime
;
private
Long
actualEndTime
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creator
;
private
String
tags
;
...
...
backend/src/main/java/io/metersphere/base/domain/TestPlanExample.java
浏览文件 @
b1baa5d4
...
...
@@ -923,6 +923,316 @@ public class TestPlanExample {
addCriterion
(
"update_time not between"
,
value1
,
value2
,
"updateTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeIsNull
()
{
addCriterion
(
"actual_end_time is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeIsNotNull
()
{
addCriterion
(
"actual_end_time is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeEqualTo
(
Long
value
)
{
addCriterion
(
"actual_end_time ="
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeNotEqualTo
(
Long
value
)
{
addCriterion
(
"actual_end_time <>"
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeGreaterThan
(
Long
value
)
{
addCriterion
(
"actual_end_time >"
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeGreaterThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"actual_end_time >="
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeLessThan
(
Long
value
)
{
addCriterion
(
"actual_end_time <"
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeLessThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"actual_end_time <="
,
value
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeIn
(
List
<
Long
>
values
)
{
addCriterion
(
"actual_end_time in"
,
values
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeNotIn
(
List
<
Long
>
values
)
{
addCriterion
(
"actual_end_time not in"
,
values
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"actual_end_time between"
,
value1
,
value2
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualEndTimeNotBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"actual_end_time not between"
,
value1
,
value2
,
"actualEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeIsNull
()
{
addCriterion
(
"planned_start_time is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeIsNotNull
()
{
addCriterion
(
"planned_start_time is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeEqualTo
(
Long
value
)
{
addCriterion
(
"planned_start_time ="
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeNotEqualTo
(
Long
value
)
{
addCriterion
(
"planned_start_time <>"
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeGreaterThan
(
Long
value
)
{
addCriterion
(
"planned_start_time >"
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeGreaterThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"planned_start_time >="
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeLessThan
(
Long
value
)
{
addCriterion
(
"planned_start_time <"
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeLessThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"planned_start_time <="
,
value
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeIn
(
List
<
Long
>
values
)
{
addCriterion
(
"planned_start_time in"
,
values
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeNotIn
(
List
<
Long
>
values
)
{
addCriterion
(
"planned_start_time not in"
,
values
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"planned_start_time between"
,
value1
,
value2
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedStartTimeNotBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"planned_start_time not between"
,
value1
,
value2
,
"plannedStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeIsNull
()
{
addCriterion
(
"planned_end_time is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeIsNotNull
()
{
addCriterion
(
"planned_end_time is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeEqualTo
(
Long
value
)
{
addCriterion
(
"planned_end_time ="
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeNotEqualTo
(
Long
value
)
{
addCriterion
(
"planned_end_time <>"
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeGreaterThan
(
Long
value
)
{
addCriterion
(
"planned_end_time >"
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeGreaterThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"planned_end_time >="
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeLessThan
(
Long
value
)
{
addCriterion
(
"planned_end_time <"
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeLessThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"planned_end_time <="
,
value
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeIn
(
List
<
Long
>
values
)
{
addCriterion
(
"planned_end_time in"
,
values
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeNotIn
(
List
<
Long
>
values
)
{
addCriterion
(
"planned_end_time not in"
,
values
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"planned_end_time between"
,
value1
,
value2
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andPlannedEndTimeNotBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"planned_end_time not between"
,
value1
,
value2
,
"plannedEndTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeIsNull
()
{
addCriterion
(
"actual_start_time is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeIsNotNull
()
{
addCriterion
(
"actual_start_time is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeEqualTo
(
Long
value
)
{
addCriterion
(
"actual_start_time ="
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeNotEqualTo
(
Long
value
)
{
addCriterion
(
"actual_start_time <>"
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeGreaterThan
(
Long
value
)
{
addCriterion
(
"actual_start_time >"
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeGreaterThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"actual_start_time >="
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeLessThan
(
Long
value
)
{
addCriterion
(
"actual_start_time <"
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeLessThanOrEqualTo
(
Long
value
)
{
addCriterion
(
"actual_start_time <="
,
value
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeIn
(
List
<
Long
>
values
)
{
addCriterion
(
"actual_start_time in"
,
values
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeNotIn
(
List
<
Long
>
values
)
{
addCriterion
(
"actual_start_time not in"
,
values
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"actual_start_time between"
,
value1
,
value2
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andActualStartTimeNotBetween
(
Long
value1
,
Long
value2
)
{
addCriterion
(
"actual_start_time not between"
,
value1
,
value2
,
"actualStartTime"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorIsNull
()
{
addCriterion
(
"creator is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorIsNotNull
()
{
addCriterion
(
"creator is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorEqualTo
(
String
value
)
{
addCriterion
(
"creator ="
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorNotEqualTo
(
String
value
)
{
addCriterion
(
"creator <>"
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorGreaterThan
(
String
value
)
{
addCriterion
(
"creator >"
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorGreaterThanOrEqualTo
(
String
value
)
{
addCriterion
(
"creator >="
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorLessThan
(
String
value
)
{
addCriterion
(
"creator <"
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorLessThanOrEqualTo
(
String
value
)
{
addCriterion
(
"creator <="
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorLike
(
String
value
)
{
addCriterion
(
"creator like"
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorNotLike
(
String
value
)
{
addCriterion
(
"creator not like"
,
value
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorIn
(
List
<
String
>
values
)
{
addCriterion
(
"creator in"
,
values
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorNotIn
(
List
<
String
>
values
)
{
addCriterion
(
"creator not in"
,
values
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorBetween
(
String
value1
,
String
value2
)
{
addCriterion
(
"creator between"
,
value1
,
value2
,
"creator"
);
return
(
Criteria
)
this
;
}
public
Criteria
andCreatorNotBetween
(
String
value1
,
String
value2
)
{
addCriterion
(
"creator not between"
,
value1
,
value2
,
"creator"
);
return
(
Criteria
)
this
;
}
}
public
static
class
Criteria
extends
GeneratedCriteria
{
...
...
backend/src/main/java/io/metersphere/base/mapper/MessageTaskMapper.xml
浏览文件 @
b1baa5d4
...
...
@@ -9,7 +9,7 @@
<result
column=
"task_type"
jdbcType=
"VARCHAR"
property=
"taskType"
/>
<result
column=
"webhook"
jdbcType=
"VARCHAR"
property=
"webhook"
/>
<result
column=
"identification"
jdbcType=
"VARCHAR"
property=
"identification"
/>
<result
column=
"is_
Set"
jdbcType=
"BIT"
property=
"isSet"
/>
<result
column=
"is_
set"
jdbcType=
"BIT"
property=
"isSet"
/>
</resultMap>
<sql
id=
"Example_Where_Clause"
>
<where>
...
...
@@ -70,7 +70,7 @@
</where>
</sql>
<sql
id=
"Base_Column_List"
>
id, `type`, event, user_id, task_type, webhook, identification, is_
S
et
id, `type`, event, user_id, task_type, webhook, identification, is_
s
et
</sql>
<select
id=
"selectByExample"
parameterType=
"io.metersphere.base.domain.MessageTaskExample"
resultMap=
"BaseResultMap"
>
select
...
...
@@ -103,12 +103,12 @@
</if>
</delete>
<insert
id=
"insert"
parameterType=
"io.metersphere.base.domain.MessageTask"
>
insert into message_task (id, `type`, event,
user_id, task_type, webhook,
identification, is_S
et)
values (#{id,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, #{event,jdbcType=VARCHAR},
#{userId,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{webhook,jdbcType=VARCHAR},
#{identification,jdbcType=VARCHAR}, #{isSet,jdbcType=BIT})
insert into message_task (id, `type`, event,
user_id, task_type, webhook,
identification, is_s
et)
values (#{id,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, #{event,jdbcType=VARCHAR},
#{userId,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{webhook,jdbcType=VARCHAR},
#{identification,jdbcType=VARCHAR}, #{isSet,jdbcType=BIT})
</insert>
<insert
id=
"insertSelective"
parameterType=
"io.metersphere.base.domain.MessageTask"
>
insert into message_task
...
...
@@ -135,7 +135,7 @@
identification,
</if>
<if
test=
"isSet != null"
>
is_
S
et,
is_
s
et,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
...
...
@@ -196,7 +196,7 @@
identification = #{record.identification,jdbcType=VARCHAR},
</if>
<if
test=
"record.isSet != null"
>
is_
S
et = #{record.isSet,jdbcType=BIT},
is_
s
et = #{record.isSet,jdbcType=BIT},
</if>
</set>
<if
test=
"_parameter != null"
>
...
...
@@ -206,13 +206,13 @@
<update
id=
"updateByExample"
parameterType=
"map"
>
update message_task
set id = #{record.id,jdbcType=VARCHAR},
`type` = #{record.type,jdbcType=VARCHAR},
event = #{record.event,jdbcType=VARCHAR},
user_id = #{record.userId,jdbcType=VARCHAR},
task_type = #{record.taskType,jdbcType=VARCHAR},
webhook = #{record.webhook,jdbcType=VARCHAR},
identification = #{record.identification,jdbcType=VARCHAR},
is_S
et = #{record.isSet,jdbcType=BIT}
`type` = #{record.type,jdbcType=VARCHAR},
event = #{record.event,jdbcType=VARCHAR},
user_id = #{record.userId,jdbcType=VARCHAR},
task_type = #{record.taskType,jdbcType=VARCHAR},
webhook = #{record.webhook,jdbcType=VARCHAR},
identification = #{record.identification,jdbcType=VARCHAR},
is_s
et = #{record.isSet,jdbcType=BIT}
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
...
...
@@ -239,20 +239,20 @@
identification = #{identification,jdbcType=VARCHAR},
</if>
<if
test=
"isSet != null"
>
is_
S
et = #{isSet,jdbcType=BIT},
is_
s
et = #{isSet,jdbcType=BIT},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update
id=
"updateByPrimaryKey"
parameterType=
"io.metersphere.base.domain.MessageTask"
>
update message_task
set `type` = #{type,jdbcType=VARCHAR},
event
= #{event,jdbcType=VARCHAR},
user_id
= #{userId,jdbcType=VARCHAR},
task_type
= #{taskType,jdbcType=VARCHAR},
webhook
= #{webhook,jdbcType=VARCHAR},
identification = #{identification,jdbcType=VARCHAR},
is_Set
= #{isSet,jdbcType=BIT}
set `type`
= #{type,jdbcType=VARCHAR},
event
= #{event,jdbcType=VARCHAR},
user_id
= #{userId,jdbcType=VARCHAR},
task_type
= #{taskType,jdbcType=VARCHAR},
webhook
= #{webhook,jdbcType=VARCHAR},
identification = #{identification,jdbcType=VARCHAR},
is_set
= #{isSet,jdbcType=BIT}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>
\ No newline at end of file
backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml
浏览文件 @
b1baa5d4
此差异已折叠。
点击以展开。
backend/src/main/java/io/metersphere/commons/constants/NoticeConstants.java
浏览文件 @
b1baa5d4
...
...
@@ -7,15 +7,18 @@ public interface NoticeConstants {
String
NAIL_ROBOT
=
"NAIL_ROBOT"
;
String
WECHAT_ROBOT
=
"WECHAT_ROBOT"
;
String
CREATE
=
"CREATE"
;
String
UPDATE
=
"
CRE
ATE"
;
String
UPDATE
=
"
UPD
ATE"
;
String
DELETE
=
"DELETE"
;
String
JENKINS_TASK
=
"JENKINS_TASK"
;
String
TEST_PLAN_TASK
=
"TEST_PLAN_TASK"
;
String
REVIEW_TASK
=
"REVIEW_TASK"
;
String
DEFECT_TASK
=
"DEFECT_TASK"
;
String
FOUNDER
=
"FOUNDER"
;
String
EXECUTOR
=
"EXECUTOR"
;
String
MAINTAINER
=
"MAINTAINER"
;
String
FOUNDER
=
"FOUNDER"
;
String
EXECUTOR
=
"EXECUTOR"
;
String
MAINTAINER
=
"MAINTAINER"
;
String
COMMENT
=
"COMMENT"
;
String
API
=
"API"
;
String
SCHEDULE
=
"SCHEDULE"
;
}
backend/src/main/java/io/metersphere/notice/service/DingTaskService.java
浏览文件 @
b1baa5d4
...
...
@@ -11,33 +11,47 @@ import io.metersphere.notice.domain.UserDetail;
import
io.metersphere.service.UserService
;
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.Arrays
;
import
java.util.List
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
class
DingTaskService
{
@Resource
private
UserService
userService
;
public
void
sendNailRobot
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
String
context
,
String
eventType
){
List
<
String
>
addresseeIdList
=
new
ArrayList
<>();
messageDetail
.
getEvents
().
forEach
(
e
->{
if
(
StringUtils
.
equals
(
eventType
,
e
)){
messageDetail
.
getUserIds
().
forEach
(
u
->{
if
(
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
)){
addresseeIdList
.
addAll
(
userIds
);
}
else
{
public
void
sendNailRobot
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
String
context
,
String
eventType
)
{
List
<
String
>
addresseeIdList
=
new
ArrayList
<>();
messageDetail
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
eventType
,
e
))
{
messageDetail
.
getUserIds
().
forEach
(
u
->
{
if
(!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
add
(
u
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
UPDATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
DELETE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
COMMENT
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
});
sendDingTask
(
context
,
addresseeIdList
,
messageDetail
.
getWebhook
());
sendDingTask
(
context
,
addresseeIdList
,
messageDetail
.
getWebhook
());
}
});
}
public
void
sendDingTask
(
String
context
,
List
<
String
>
userIds
,
String
Webhook
)
{
public
void
sendDingTask
(
String
context
,
List
<
String
>
userIds
,
String
Webhook
)
{
DingTalkClient
client
=
new
DefaultDingTalkClient
(
Webhook
);
OapiRobotSendRequest
request
=
new
OapiRobotSendRequest
();
request
.
setMsgtype
(
"text"
);
...
...
@@ -45,13 +59,12 @@ public class DingTaskService {
text
.
setContent
(
context
);
request
.
setText
(
text
);
OapiRobotSendRequest
.
At
at
=
new
OapiRobotSendRequest
.
At
();
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
List
<
String
>
phoneList
=
new
ArrayList
<>();
list
.
forEach
(
u
->
{
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
List
<
String
>
phoneList
=
new
ArrayList
<>();
list
.
forEach
(
u
->
{
phoneList
.
add
(
u
.
getPhone
());
});
/* at.setAtMobiles(phoneList);*/
at
.
setAtMobiles
(
Arrays
.
asList
(
"15135125273"
,
"13718506428"
));
at
.
setAtMobiles
(
phoneList
);
request
.
setAt
(
at
);
OapiRobotSendResponse
response
=
null
;
try
{
...
...
backend/src/main/java/io/metersphere/notice/service/MailService.java
浏览文件 @
b1baa5d4
...
...
@@ -8,6 +8,7 @@ import io.metersphere.commons.constants.APITestStatus;
import
io.metersphere.commons.constants.NoticeConstants
;
import
io.metersphere.commons.constants.ParamConstants
;
import
io.metersphere.commons.constants.PerformanceTestStatus
;
import
io.metersphere.commons.user.SessionUser
;
import
io.metersphere.commons.utils.EncryptUtils
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.dto.BaseSystemConfigDTO
;
...
...
@@ -17,6 +18,8 @@ import io.metersphere.notice.domain.NoticeDetail;
import
io.metersphere.notice.domain.UserDetail
;
import
io.metersphere.service.SystemParameterService
;
import
io.metersphere.service.UserService
;
import
io.metersphere.track.request.testcase.IssuesRequest
;
import
io.metersphere.track.request.testplan.AddTestPlanRequest
;
import
io.metersphere.track.request.testreview.SaveCommentRequest
;
import
io.metersphere.track.request.testreview.SaveTestCaseReviewRequest
;
import
org.apache.commons.collections4.MapUtils
;
...
...
@@ -27,6 +30,7 @@ import org.springframework.mail.MailException;
import
org.springframework.mail.javamail.JavaMailSenderImpl
;
import
org.springframework.mail.javamail.MimeMessageHelper
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
javax.mail.MessagingException
;
...
...
@@ -36,9 +40,8 @@ import java.text.SimpleDateFormat;
import
java.util.*
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
class
MailService
{
@Resource
private
ApiAndPerformanceHelper
apiAndPerformanceHelper
;
@Resource
private
UserService
userService
;
@Resource
...
...
@@ -86,6 +89,27 @@ public class MailService {
}
}
//jenkins
public
void
sendApiJenkinsNotification
(
String
context
,
MessageDetail
messageDetail
)
throws
MessagingException
{
JavaMailSenderImpl
javaMailSender
=
getMailSender
();
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
mimeMessage
,
true
);
helper
.
setFrom
(
javaMailSender
.
getUsername
());
helper
.
setSubject
(
"MeterSphere平台"
+
Translator
.
get
(
"task_notification"
));
helper
.
setText
(
context
);
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
messageDetail
.
getUserIds
());
List
<
String
>
EmailList
=
new
ArrayList
<>();
list
.
forEach
(
u
->
{
EmailList
.
add
(
u
.
getEmail
());
});
helper
.
setTo
(
EmailList
.
toArray
(
new
String
[
0
]));
try
{
javaMailSender
.
send
(
mimeMessage
);
}
catch
(
MailException
e
)
{
LogUtil
.
error
(
e
);
}
}
private
void
sendHtmlTimeTasks
(
List
<
NoticeDetail
>
noticeList
,
String
status
,
Map
<
String
,
String
>
context
,
String
template
)
throws
MessagingException
{
JavaMailSenderImpl
javaMailSender
=
getMailSender
();
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
...
...
@@ -98,15 +122,25 @@ public class MailService {
javaMailSender
.
send
(
mimeMessage
);
}
catch
(
MailException
e
)
{
LogUtil
.
error
(
e
);
LogUtil
.
error
(
"Failed to send mail"
);
}
}
//测试评审
public
void
sendEndNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
SaveTestCaseReviewRequest
reviewRequest
,
String
eventType
)
{
Map
<
String
,
String
>
context
=
getReviewContext
(
reviewRequest
);
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/end.html"
),
StandardCharsets
.
UTF_8
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
public
void
sendDeleteNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
SaveTestCaseReviewRequest
reviewRequest
,
String
eventType
)
{
Map
<
String
,
String
>
context
=
getReviewContext
(
reviewRequest
);
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/deleteReview.html"
),
StandardCharsets
.
UTF_8
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
...
...
@@ -122,7 +156,7 @@ public class MailService {
context
.
put
(
"id"
,
testCaseWithBLOBs
.
getId
());
try
{
String
commentTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/comment.html"
),
StandardCharsets
.
UTF_8
);
sendReviewNotice
(
userIds
,
context
,
commentTemplate
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
)
,
context
,
commentTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
...
...
@@ -132,7 +166,54 @@ public class MailService {
Map
<
String
,
String
>
context
=
getReviewContext
(
reviewRequest
);
try
{
String
reviewerTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/reviewer.html"
),
StandardCharsets
.
UTF_8
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
reviewerTemplate
);
sendReviewNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
reviewerTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
//测试计划
public
void
sendTestPlanStartNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
AddTestPlanRequest
testPlan
,
String
eventType
)
{
Map
<
String
,
String
>
context
=
getTestPlanContext
(
testPlan
);
context
.
put
(
"creator"
,
userIds
.
toString
());
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/testPlanStart.html"
),
StandardCharsets
.
UTF_8
);
sendTestPlanNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
public
void
sendTestPlanEndNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
AddTestPlanRequest
testPlan
,
String
eventType
)
{
Map
<
String
,
String
>
context
=
getTestPlanContext
(
testPlan
);
context
.
put
(
"creator"
,
userIds
.
toString
());
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/testPlanEnd.html"
),
StandardCharsets
.
UTF_8
);
sendTestPlanNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
public
void
sendTestPlanDeleteNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
AddTestPlanRequest
testPlan
,
String
eventType
)
{
Map
<
String
,
String
>
context
=
getTestPlanContext
(
testPlan
);
context
.
put
(
"creator"
,
userIds
.
toString
());
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/testPlanDelete.html"
),
StandardCharsets
.
UTF_8
);
sendTestPlanNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
//缺陷任务
public
void
sendIssuesNotice
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
IssuesRequest
issuesRequest
,
String
eventType
,
SessionUser
user
)
{
Map
<
String
,
String
>
context
=
new
HashMap
<>();
context
.
put
(
"issuesName"
,
issuesRequest
.
getTitle
());
context
.
put
(
"creator"
,
user
.
getName
());
try
{
String
endTemplate
=
IOUtils
.
toString
(
this
.
getClass
().
getResource
(
"/mail/issuesCreate.html"
),
StandardCharsets
.
UTF_8
);
sendIssuesNotice
(
addresseeIdList
(
messageDetail
,
userIds
,
eventType
),
context
,
endTemplate
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
...
...
@@ -164,26 +245,87 @@ public class MailService {
return
context
;
}
private
Map
<
String
,
String
>
getTestPlanContext
(
AddTestPlanRequest
testPlan
)
{
Long
startTime
=
testPlan
.
getPlannedStartTime
();
Long
endTime
=
testPlan
.
getPlannedEndTime
();
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
String
start
=
null
;
String
sTime
=
String
.
valueOf
(
startTime
);
String
eTime
=
String
.
valueOf
(
endTime
);
if
(!
sTime
.
equals
(
"null"
))
{
start
=
sdf
.
format
(
new
Date
(
Long
.
parseLong
(
sTime
)));
}
String
end
=
null
;
if
(!
eTime
.
equals
(
"null"
))
{
end
=
sdf
.
format
(
new
Date
(
Long
.
parseLong
(
eTime
)));
}
Map
<
String
,
String
>
context
=
new
HashMap
<>();
BaseSystemConfigDTO
baseSystemConfigDTO
=
systemParameterService
.
getBaseInfo
();
context
.
put
(
"url"
,
baseSystemConfigDTO
.
getUrl
());
context
.
put
(
"testPlanName"
,
testPlan
.
getName
());
context
.
put
(
"start"
,
start
);
context
.
put
(
"end"
,
end
);
context
.
put
(
"id"
,
testPlan
.
getId
());
return
context
;
}
private
void
sendReviewNotice
(
List
<
String
>
userIds
,
Map
<
String
,
String
>
context
,
String
Template
)
throws
MessagingException
{
JavaMailSenderImpl
javaMailSender
=
getMailSender
();
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
mimeMessage
,
true
);
helper
.
setFrom
(
javaMailSender
.
getUsername
());
helper
.
setSubject
(
Translator
.
get
(
"test_review_task_notice"
));
helper
.
setSubject
(
"MeterSphere平台"
+
Translator
.
get
(
"test_review_task_notice"
));
String
[]
users
;
List
<
String
>
emails
=
new
ArrayList
<>();
try
{
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
list
.
forEach
(
u
->{
emails
.
add
(
u
.
getEmail
());
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
"Recipient information is empty"
);
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
list
.
forEach
(
u
->
{
emails
.
add
(
u
.
getEmail
());
});
users
=
emails
.
toArray
(
new
String
[
0
]);
helper
.
setText
(
getContent
(
Template
,
context
),
true
);
helper
.
setTo
(
users
);
if
(
users
.
length
>
0
)
{
javaMailSender
.
send
(
mimeMessage
);
}
}
private
void
sendTestPlanNotice
(
List
<
String
>
userIds
,
Map
<
String
,
String
>
context
,
String
Template
)
throws
MessagingException
{
JavaMailSenderImpl
javaMailSender
=
getMailSender
();
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
mimeMessage
,
true
);
helper
.
setFrom
(
javaMailSender
.
getUsername
());
helper
.
setSubject
(
"MeterSphere平台"
+
Translator
.
get
(
"test_plan_notification"
));
String
[]
users
;
List
<
String
>
emails
=
new
ArrayList
<>();
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
list
.
forEach
(
u
->
{
emails
.
add
(
u
.
getEmail
());
});
users
=
emails
.
toArray
(
new
String
[
0
]);
helper
.
setText
(
getContent
(
Template
,
context
),
true
);
helper
.
setTo
(
users
);
javaMailSender
.
send
(
mimeMessage
);
}
private
void
sendIssuesNotice
(
List
<
String
>
userIds
,
Map
<
String
,
String
>
context
,
String
Template
)
throws
MessagingException
{
JavaMailSenderImpl
javaMailSender
=
getMailSender
();
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
mimeMessage
,
true
);
helper
.
setFrom
(
javaMailSender
.
getUsername
());
helper
.
setSubject
(
"MeterSphere平台"
+
Translator
.
get
(
"task_defect_notification"
));
String
[]
users
;
List
<
String
>
emails
=
new
ArrayList
<>();
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
list
.
forEach
(
u
->
{
emails
.
add
(
u
.
getEmail
());
});
users
=
emails
.
toArray
(
new
String
[
0
]);
helper
.
setText
(
getContent
(
Template
,
context
),
true
);
helper
.
setTo
(
users
);
javaMailSender
.
send
(
mimeMessage
);
}
private
JavaMailSenderImpl
getMailSender
()
{
...
...
@@ -266,15 +408,27 @@ public class MailService {
messageDetail
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
eventType
,
e
))
{
messageDetail
.
getUserIds
().
forEach
(
u
->
{
if
(
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
else
{
if
(!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
add
(
u
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
UPDATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
DELETE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
COMMENT
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
});
}
});
return
addresseeIdList
;
return
addresseeIdList
;
}
}
...
...
backend/src/main/java/io/metersphere/notice/service/NoticeService.java
浏览文件 @
b1baa5d4
package
io.metersphere.notice.service
;
import
io.metersphere.base.domain.*
;
import
io.metersphere.base.domain.MessageTask
;
import
io.metersphere.base.domain.MessageTaskExample
;
import
io.metersphere.base.domain.Notice
;
import
io.metersphere.base.domain.NoticeExample
;
import
io.metersphere.base.mapper.MessageTaskMapper
;
import
io.metersphere.base.mapper.NoticeMapper
;
import
io.metersphere.commons.constants.NoticeConstants
;
...
...
@@ -10,8 +13,8 @@ import io.metersphere.notice.domain.MessageDetail;
import
io.metersphere.notice.domain.MessageSettingDetail
;
import
io.metersphere.notice.domain.NoticeDetail
;
import
org.apache.commons.collections4.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.*
;
...
...
@@ -21,6 +24,7 @@ import static io.metersphere.commons.constants.NoticeConstants.EXECUTE_FAILED;
import
static
io
.
metersphere
.
commons
.
constants
.
NoticeConstants
.
EXECUTE_SUCCESSFUL
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
class
NoticeService
{
@Resource
private
NoticeMapper
noticeMapper
;
...
...
@@ -149,7 +153,7 @@ public class NoticeService {
return
user
.
getTaskType
()
+
"#"
+
user
.
getIdentification
();
}
public
int
delMessage
(
String
identification
){
public
int
delMessage
(
String
identification
)
{
MessageTaskExample
example
=
new
MessageTaskExample
();
example
.
createCriteria
().
andIdentificationEqualTo
(
identification
);
return
messageTaskMapper
.
deleteByExample
(
example
);
...
...
backend/src/main/java/io/metersphere/notice/service/WxChatTaskService.java
浏览文件 @
b1baa5d4
...
...
@@ -9,6 +9,7 @@ import io.metersphere.notice.util.WxChatbotClient;
import
io.metersphere.service.UserService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.io.IOException
;
...
...
@@ -16,35 +17,48 @@ import java.util.ArrayList;
import
java.util.List
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
class
WxChatTaskService
{
@Resource
private
UserService
userService
;
public
void
sendWechatRobot
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
String
context
,
String
eventType
){
List
<
String
>
addresseeIdList
=
new
ArrayList
<>();
messageDetail
.
getEvents
().
forEach
(
e
->{
if
(
StringUtils
.
equals
(
eventType
,
e
)){
messageDetail
.
getUserIds
().
forEach
(
u
->{
if
(
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
)){
addresseeIdList
.
addAll
(
userIds
);
}
else
{
public
void
sendWechatRobot
(
MessageDetail
messageDetail
,
List
<
String
>
userIds
,
String
context
,
String
eventType
)
{
List
<
String
>
addresseeIdList
=
new
ArrayList
<>();
messageDetail
.
getEvents
().
forEach
(
e
->
{
if
(
StringUtils
.
equals
(
eventType
,
e
))
{
messageDetail
.
getUserIds
().
forEach
(
u
->
{
if
(!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
)
&&
!
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
add
(
u
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
EXECUTOR
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
UPDATE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
DELETE
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
FOUNDER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
if
(
StringUtils
.
equals
(
NoticeConstants
.
COMMENT
,
eventType
)
&&
StringUtils
.
equals
(
NoticeConstants
.
MAINTAINER
,
u
))
{
addresseeIdList
.
addAll
(
userIds
);
}
});
enterpriseWechatTask
(
context
,
addresseeIdList
,
messageDetail
.
getWebhook
());
enterpriseWechatTask
(
context
,
addresseeIdList
,
messageDetail
.
getWebhook
());
}
});
}
public
void
enterpriseWechatTask
(
String
context
,
List
<
String
>
userIds
,
String
Webhook
)
{
public
void
enterpriseWechatTask
(
String
context
,
List
<
String
>
userIds
,
String
Webhook
)
{
TextMessage
message
=
new
TextMessage
(
context
);
List
<
String
>
mentionedMobileList
=
new
ArrayList
<
String
>();
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
List
<
String
>
phoneList
=
new
ArrayList
<>();
list
.
forEach
(
u
->
{
List
<
UserDetail
>
list
=
userService
.
queryTypeByIds
(
userIds
);
List
<
String
>
phoneList
=
new
ArrayList
<>();
list
.
forEach
(
u
->
{
phoneList
.
add
(
u
.
getPhone
());
});
mentionedMobileList
.
addAll
(
phoneList
);
mentionedMobileList
.
add
(
"15135125273"
);
mentionedMobileList
.
add
(
"18046109770"
);
message
.
setMentionedMobileList
(
mentionedMobileList
);
try
{
SendResult
result
=
WxChatbotClient
.
send
(
Webhook
,
message
);
...
...
backend/src/main/java/io/metersphere/service/SystemParameterService.java
浏览文件 @
b1baa5d4
...
...
@@ -15,6 +15,7 @@ import org.apache.commons.lang3.BooleanUtils;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.mail.javamail.JavaMailSenderImpl
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
javax.mail.MessagingException
;
...
...
@@ -22,6 +23,7 @@ import java.util.*;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
class
SystemParameterService
{
@Resource
...
...
@@ -29,9 +31,10 @@ public class SystemParameterService {
@Resource
private
ExtSystemParameterMapper
extSystemParameterMapper
;
public
String
searchEmail
(){
return
extSystemParameterMapper
.
email
();
}
public
String
searchEmail
()
{
return
extSystemParameterMapper
.
email
();
}
public
String
getSystemLanguage
()
{
String
result
=
StringUtils
.
EMPTY
;
SystemParameterExample
example
=
new
SystemParameterExample
();
...
...
backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java
浏览文件 @
b1baa5d4
...
...
@@ -12,8 +12,8 @@ import io.metersphere.commons.utils.SessionUtils;
import
io.metersphere.service.CheckOwnerService
;
import
io.metersphere.track.dto.TestCaseReviewDTO
;
import
io.metersphere.track.dto.TestReviewDTOWithMetric
;
import
io.metersphere.track.request.testreview.ReviewRelevanceRequest
;
import
io.metersphere.track.request.testreview.QueryCaseReviewRequest
;
import
io.metersphere.track.request.testreview.ReviewRelevanceRequest
;
import
io.metersphere.track.request.testreview.SaveTestCaseReviewRequest
;
import
io.metersphere.track.request.testreview.TestReviewRelevanceRequest
;
import
io.metersphere.track.service.TestCaseReviewService
;
...
...
@@ -21,6 +21,7 @@ import io.metersphere.track.service.TestReviewProjectService;
import
org.apache.shiro.authz.annotation.Logical
;
import
org.apache.shiro.authz.annotation.RequiresRoles
;
import
org.springframework.web.bind.annotation.*
;
import
javax.annotation.Resource
;
import
java.util.List
;
...
...
backend/src/main/java/io/metersphere/track/service/IssuesService.java
浏览文件 @
b1baa5d4
package
io.metersphere.track.service
;
import
io.metersphere.base.domain.*
;
import
io.metersphere.base.domain.Issues
;
import
io.metersphere.base.domain.Project
;
import
io.metersphere.base.domain.ServiceIntegration
;
import
io.metersphere.base.domain.TestCaseWithBLOBs
;
import
io.metersphere.base.mapper.IssuesMapper
;
import
io.metersphere.commons.constants.IssuesManagePlatform
;
import
io.metersphere.commons.constants.NoticeConstants
;
import
io.metersphere.commons.user.SessionUser
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.commons.utils.SessionUtils
;
import
io.metersphere.controller.request.IntegrationRequest
;
import
io.metersphere.notice.domain.MessageDetail
;
import
io.metersphere.notice.domain.MessageSettingDetail
;
import
io.metersphere.notice.service.DingTaskService
;
import
io.metersphere.notice.service.MailService
;
import
io.metersphere.notice.service.NoticeService
;
import
io.metersphere.notice.service.WxChatTaskService
;
import
io.metersphere.service.IntegrationService
;
import
io.metersphere.service.ProjectService
;
import
io.metersphere.track.issue.AbstractIssuePlatform
;
import
io.metersphere.track.issue.IssueFactory
;
import
io.metersphere.track.issue.PlatformUser
;
import
io.metersphere.track.request.testcase.IssuesRequest
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.apache.commons.lang3.StringUtils
;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.List
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
...
...
@@ -31,7 +43,14 @@ public class IssuesService {
private
TestCaseService
testCaseService
;
@Resource
private
IssuesMapper
issuesMapper
;
@Resource
MailService
mailService
;
@Resource
DingTaskService
dingTaskService
;
@Resource
WxChatTaskService
wxChatTaskService
;
@Resource
NoticeService
noticeService
;
public
void
testAuth
(
String
platform
)
{
AbstractIssuePlatform
abstractPlatform
=
IssueFactory
.
createPlatform
(
platform
,
new
IssuesRequest
());
...
...
@@ -71,6 +90,28 @@ public class IssuesService {
platformList
.
forEach
(
platform
->
{
platform
.
addIssue
(
issuesRequest
);
});
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
orgId
);
try
{
String
context
=
getIssuesContext
(
user
,
issuesRequest
,
NoticeConstants
.
CREATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getDefectTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendIssuesNotice
(
r
,
userIds
,
issuesRequest
,
NoticeConstants
.
CREATE
,
user
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
...
...
@@ -151,4 +192,12 @@ public class IssuesService {
public
void
deleteIssue
(
String
id
)
{
issuesMapper
.
deleteByPrimaryKey
(
id
);
}
private
static
String
getIssuesContext
(
SessionUser
user
,
IssuesRequest
issuesRequest
,
String
type
)
{
String
context
=
""
;
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
type
))
{
context
=
"缺陷任务通知:"
+
user
.
getName
()
+
"发起了一个缺陷"
+
"'"
+
issuesRequest
.
getTitle
()
+
"'"
+
"请跟进"
;
}
return
context
;
}
}
backend/src/main/java/io/metersphere/track/service/TestCaseCommentService.java
浏览文件 @
b1baa5d4
...
...
@@ -11,17 +11,20 @@ import io.metersphere.base.mapper.UserMapper;
import
io.metersphere.commons.constants.NoticeConstants
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.commons.utils.SessionUtils
;
import
io.metersphere.notice.domain.MessageDetail
;
import
io.metersphere.notice.domain.MessageSettingDetail
;
import
io.metersphere.notice.service.DingTaskService
;
import
io.metersphere.notice.service.MailService
;
import
io.metersphere.notice.service.NoticeService
;
import
io.metersphere.notice.service.WxChatTaskService
;
import
io.metersphere.track.request.testreview.SaveCommentRequest
;
import
io.metersphere.track.request.testreview.SaveTestCaseReviewRequest
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.UUID
;
...
...
@@ -43,6 +46,9 @@ public class TestCaseCommentService {
DingTaskService
dingTaskService
;
@Resource
WxChatTaskService
wxChatTaskService
;
@Resource
NoticeService
noticeService
;
public
void
saveComment
(
SaveCommentRequest
request
)
{
TestCaseComment
testCaseComment
=
new
TestCaseComment
();
...
...
@@ -55,18 +61,25 @@ public class TestCaseCommentService {
testCaseCommentMapper
.
insert
(
testCaseComment
);
TestCaseWithBLOBs
testCaseWithBLOBs
;
testCaseWithBLOBs
=
testCaseMapper
.
selectByPrimaryKey
(
request
.
getCaseId
());
SaveTestCaseReviewRequest
caseReviewRequest
=
new
SaveTestCaseReviewRequest
();
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
testCaseWithBLOBs
.
getMaintainer
());
String
context
=
getReviewContext
(
request
,
testCaseWithBLOBs
);
userIds
.
add
(
testCaseWithBLOBs
.
getMaintainer
());
//用例维护人
try
{
/* if (StringUtils.equals(NoticeConstants.NAIL_ROBOT, "NAIL_ROBOT")) {
dingTaskService.sendDingTask(context, userIds);
} else if (StringUtils.equals(NoticeConstants.WECHAT_ROBOT, "WECHAT_ROBOT")) {
wxChatTaskService.enterpriseWechatTask();
} else {
mailService.sendCommentNotice(userIds, request, testCaseWithBLOBs);
}*/
String
context
=
getReviewContext
(
testCaseComment
,
testCaseWithBLOBs
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
COMMENT
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
COMMENT
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendCommentNotice
(
r
,
userIds
,
request
,
testCaseWithBLOBs
,
NoticeConstants
.
COMMENT
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
...
...
@@ -93,9 +106,16 @@ public class TestCaseCommentService {
testCaseCommentMapper
.
deleteByExample
(
testCaseCommentExample
);
}
private
String
getReviewContext
(
SaveCommentRequest
request
,
TestCaseWithBLOBs
testCaseWithBLOBs
)
{
private
String
getReviewContext
(
TestCaseComment
testCaseComment
,
TestCaseWithBLOBs
testCaseWithBLOBs
)
{
Long
startTime
=
testCaseComment
.
getCreateTime
();
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
String
start
=
null
;
String
sTime
=
String
.
valueOf
(
startTime
);
if
(!
sTime
.
equals
(
"null"
))
{
start
=
sdf
.
format
(
new
Date
(
Long
.
parseLong
(
sTime
)));
}
String
context
=
""
;
context
=
testCaseWithBLOBs
.
getMaintainer
()
+
"发起的"
+
"'"
+
testCaseWithBLOBs
.
getName
()
+
"'"
+
"添加评论:"
+
reques
t
.
getDescription
();
context
=
"测试评审任务通知:"
+
testCaseComment
.
getAuthor
()
+
"在"
+
start
+
"为"
+
"'"
+
testCaseWithBLOBs
.
getName
()
+
"'"
+
"添加评论:"
+
testCaseCommen
t
.
getDescription
();
return
context
;
}
}
backend/src/main/java/io/metersphere/track/service/TestCaseReviewService.java
浏览文件 @
b1baa5d4
...
...
@@ -25,7 +25,6 @@ import io.metersphere.service.UserService;
import
io.metersphere.track.dto.TestCaseReviewDTO
;
import
io.metersphere.track.dto.TestReviewCaseDTO
;
import
io.metersphere.track.dto.TestReviewDTOWithMetric
;
import
io.metersphere.track.request.testcase.QueryTestCaseRequest
;
import
io.metersphere.track.request.testreview.QueryCaseReviewRequest
;
import
io.metersphere.track.request.testreview.QueryTestReviewRequest
;
import
io.metersphere.track.request.testreview.ReviewRelevanceRequest
;
...
...
@@ -86,10 +85,9 @@ public class TestCaseReviewService {
public
void
saveTestCaseReview
(
SaveTestCaseReviewRequest
reviewRequest
)
{
checkCaseReviewExist
(
reviewRequest
);
String
reviewId
=
UUID
.
randomUUID
().
toString
();
List
<
String
>
projectIds
=
reviewRequest
.
getProjectIds
();
List
<
String
>
userIds
=
reviewRequest
.
getUserIds
();
List
<
String
>
userIds
=
reviewRequest
.
getUserIds
();
//执行人
projectIds
.
forEach
(
projectId
->
{
TestCaseReviewProject
testCaseReviewProject
=
new
TestCaseReviewProject
();
testCaseReviewProject
.
setProjectId
(
projectId
);
...
...
@@ -107,23 +105,23 @@ public class TestCaseReviewService {
reviewRequest
.
setId
(
reviewId
);
reviewRequest
.
setCreateTime
(
System
.
currentTimeMillis
());
reviewRequest
.
setUpdateTime
(
System
.
currentTimeMillis
());
reviewRequest
.
setCreator
(
SessionUtils
.
getUser
().
getId
());
reviewRequest
.
setCreator
(
SessionUtils
.
getUser
().
getId
());
//创建人
reviewRequest
.
setStatus
(
TestCaseReviewStatus
.
Prepare
.
name
());
testCaseReviewMapper
.
insert
(
reviewRequest
);
try
{
String
context
=
getReviewContext
(
reviewRequest
,
NoticeConstants
.
CREATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendReviewerNotice
(
r
,
userIds
,
reviewRequest
,
NoticeConstants
.
CREATE
);
mailService
.
sendReviewerNotice
(
r
,
userIds
,
reviewRequest
,
NoticeConstants
.
CREATE
);
break
;
}
});
...
...
@@ -131,7 +129,7 @@ public class TestCaseReviewService {
LogUtil
.
error
(
e
);
}
}
}
public
List
<
TestCaseReviewDTO
>
listCaseReview
(
QueryCaseReviewRequest
request
)
{
request
.
setOrders
(
ServiceUtils
.
getDefaultOrder
(
request
.
getOrders
()));
...
...
@@ -189,17 +187,17 @@ public class TestCaseReviewService {
try
{
String
context
=
getReviewContext
(
testCaseReview
,
NoticeConstants
.
CREATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
testCaseReview
.
getUserIds
(),
context
,
NoticeConstants
.
CREATE
);
dingTaskService
.
sendNailRobot
(
r
,
testCaseReview
.
getUserIds
(),
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
testCaseReview
.
getUserIds
(),
context
,
NoticeConstants
.
CREATE
);
wxChatTaskService
.
sendWechatRobot
(
r
,
testCaseReview
.
getUserIds
(),
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendReviewerNotice
(
r
,
testCaseReview
.
getUserIds
(),
testCaseReview
,
NoticeConstants
.
CREATE
);
mailService
.
sendReviewerNotice
(
r
,
testCaseReview
.
getUserIds
(),
testCaseReview
,
NoticeConstants
.
CREATE
);
break
;
}
});
...
...
@@ -287,10 +285,36 @@ public class TestCaseReviewService {
}
public
void
deleteCaseReview
(
String
reviewId
)
{
TestCaseReview
testCaseReview
=
getTestReview
(
reviewId
);
deleteCaseReviewProject
(
reviewId
);
deleteCaseReviewUsers
(
reviewId
);
deleteCaseReviewTestCase
(
reviewId
);
testCaseReviewMapper
.
deleteByPrimaryKey
(
reviewId
);
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
SessionUtils
.
getUser
().
getId
());
SaveTestCaseReviewRequest
testCaseReviewRequest
=
new
SaveTestCaseReviewRequest
();
try
{
BeanUtils
.
copyProperties
(
testCaseReviewRequest
,
testCaseReview
);
String
context
=
getReviewContext
(
testCaseReviewRequest
,
NoticeConstants
.
DELETE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
DELETE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
DELETE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendDeleteNotice
(
r
,
userIds
,
testCaseReviewRequest
,
NoticeConstants
.
DELETE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
private
void
deleteCaseReviewProject
(
String
reviewId
)
{
...
...
@@ -405,31 +429,34 @@ public class TestCaseReviewService {
}
}
testCaseReview
.
setStatus
(
TestCaseReviewStatus
.
Completed
.
name
());
testCaseReviewMapper
.
updateByPrimaryKeySelective
(
testCaseReview
);
SaveTestCaseReviewRequest
testCaseReviewRequest
=
new
SaveTestCaseReviewRequest
();
TestCaseReview
_testCaseReview
=
testCaseReviewMapper
.
selectByPrimaryKey
(
reviewId
);
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
_testCaseReview
.
getCreator
());
testCaseReviewMapper
.
updateByPrimaryKeySelective
(
testCaseReview
);
try
{
BeanUtils
.
copyProperties
(
testCaseReviewRequest
,
_testCaseReview
);
String
context
=
getReviewContext
(
testCaseReviewRequest
,
NoticeConstants
.
UPDATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendReviewerNotice
(
r
,
userIds
,
testCaseReviewRequest
,
NoticeConstants
.
CREATE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
if
(
StringUtils
.
equals
(
TestCaseReviewStatus
.
Completed
.
name
(),
_testCaseReview
.
getStatus
()))
{
try
{
BeanUtils
.
copyProperties
(
testCaseReviewRequest
,
_testCaseReview
);
String
context
=
getReviewContext
(
testCaseReviewRequest
,
NoticeConstants
.
UPDATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
UPDATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
UPDATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendReviewerNotice
(
r
,
userIds
,
testCaseReviewRequest
,
NoticeConstants
.
UPDATE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
}
...
...
@@ -518,7 +545,8 @@ public class TestCaseReviewService {
request
.
setProjectIds
(
projectIds
);
return
extTestReviewCaseMapper
.
list
(
request
);
}
/*通知内容*/
/*编辑,新建,完成,删除通知内容*/
private
static
String
getReviewContext
(
SaveTestCaseReviewRequest
reviewRequest
,
String
type
)
{
Long
startTime
=
reviewRequest
.
getCreateTime
();
Long
endTime
=
reviewRequest
.
getEndTime
();
...
...
@@ -535,12 +563,15 @@ public class TestCaseReviewService {
}
String
context
=
""
;
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
type
))
{
context
=
reviewRequest
.
getCreator
()
+
"发起的任务通知
"
+
"'"
+
reviewRequest
.
getName
()
+
"'"
+
"待开始,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"请跟进"
;
context
=
"测试评审任务通知:"
+
reviewRequest
.
getCreator
()
+
"发起的
"
+
"'"
+
reviewRequest
.
getName
()
+
"'"
+
"待开始,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"请跟进"
;
}
else
if
(
StringUtils
.
equals
(
NoticeConstants
.
UPDATE
,
type
))
{
context
=
reviewRequest
.
getCreator
()
+
"发起的任务通知"
+
"'"
+
reviewRequest
.
getName
()
+
"'"
+
"已完成,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"已完成"
;
context
=
"测试评审任务通知:"
+
reviewRequest
.
getCreator
()
+
"发起的"
+
"'"
+
reviewRequest
.
getName
()
+
"'"
+
"已完成,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"已完成"
;
}
else
if
(
StringUtils
.
equals
(
NoticeConstants
.
DELETE
,
type
))
{
context
=
"测试评审任务通知:"
+
reviewRequest
.
getCreator
()
+
"发起的"
+
"'"
+
reviewRequest
.
getName
()
+
"'"
+
"计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"已删除"
;
}
return
context
;
}
}
backend/src/main/java/io/metersphere/track/service/TestPlanService.java
浏览文件 @
b1baa5d4
...
...
@@ -9,15 +9,19 @@ import io.metersphere.base.mapper.ext.ExtProjectMapper;
import
io.metersphere.base.mapper.ext.ExtTestCaseMapper
;
import
io.metersphere.base.mapper.ext.ExtTestPlanMapper
;
import
io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper
;
import
io.metersphere.commons.constants.NoticeConstants
;
import
io.metersphere.commons.constants.TestPlanStatus
;
import
io.metersphere.commons.constants.TestPlanTestCaseStatus
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.user.SessionUser
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.commons.utils.MathUtils
;
import
io.metersphere.commons.utils.ServiceUtils
;
import
io.metersphere.commons.utils.SessionUtils
;
import
io.metersphere.commons.utils.*
;
import
io.metersphere.i18n.Translator
;
import
io.metersphere.notice.domain.MessageDetail
;
import
io.metersphere.notice.domain.MessageSettingDetail
;
import
io.metersphere.notice.service.DingTaskService
;
import
io.metersphere.notice.service.MailService
;
import
io.metersphere.notice.service.NoticeService
;
import
io.metersphere.notice.service.WxChatTaskService
;
import
io.metersphere.track.Factory.ReportComponentFactory
;
import
io.metersphere.track.domain.ReportComponent
;
import
io.metersphere.track.dto.TestCaseReportMetricDTO
;
...
...
@@ -25,7 +29,6 @@ import io.metersphere.track.dto.TestPlanCaseDTO;
import
io.metersphere.track.dto.TestPlanDTO
;
import
io.metersphere.track.dto.TestPlanDTOWithMetric
;
import
io.metersphere.track.request.testcase.PlanCaseRelevanceRequest
;
import
io.metersphere.track.request.testcase.QueryTestCaseRequest
;
import
io.metersphere.track.request.testcase.QueryTestPlanRequest
;
import
io.metersphere.track.request.testplan.AddTestPlanRequest
;
import
io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest
;
...
...
@@ -39,7 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.stream.Collectors
;
...
...
@@ -82,6 +85,14 @@ public class TestPlanService {
ProjectMapper
projectMapper
;
@Resource
ExtTestCaseMapper
extTestCaseMapper
;
@Resource
NoticeService
noticeService
;
@Resource
MailService
mailService
;
@Resource
DingTaskService
dingTaskService
;
@Resource
WxChatTaskService
wxChatTaskService
;
public
void
addTestPlan
(
AddTestPlanRequest
testPlan
)
{
if
(
getTestPlanByName
(
testPlan
.
getName
()).
size
()
>
0
)
{
...
...
@@ -102,7 +113,31 @@ public class TestPlanService {
testPlan
.
setStatus
(
TestPlanStatus
.
Prepare
.
name
());
testPlan
.
setCreateTime
(
System
.
currentTimeMillis
());
testPlan
.
setUpdateTime
(
System
.
currentTimeMillis
());
testPlan
.
setCreator
(
SessionUtils
.
getUser
().
getId
());
testPlanMapper
.
insert
(
testPlan
);
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
testPlan
.
getPrincipal
());
try
{
String
context
=
getTestPlanContext
(
testPlan
,
NoticeConstants
.
CREATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getTestCasePlanTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
CREATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendTestPlanStartNotice
(
r
,
userIds
,
testPlan
,
NoticeConstants
.
CREATE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
public
List
<
TestPlan
>
getTestPlanByName
(
String
name
)
{
...
...
@@ -128,6 +163,30 @@ public class TestPlanService {
//已完成,写入实际完成时间
testPlan
.
setActualEndTime
(
System
.
currentTimeMillis
());
}
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
testPlan
.
getPrincipal
());
AddTestPlanRequest
testPlans
=
new
AddTestPlanRequest
();
/* try {
BeanUtils.copyBean(testPlans, testPlan);
String context = getTestPlanContext(testPlans, NoticeConstants.CREATE);
MessageSettingDetail messageSettingDetail = noticeService.searchMessage();
List<MessageDetail> taskList = messageSettingDetail.getReviewTask();
taskList.forEach(r -> {
switch (r.getType()) {
case NoticeConstants.NAIL_ROBOT:
dingTaskService.sendNailRobot(r, userIds, context, NoticeConstants.CREATE);
break;
case NoticeConstants.WECHAT_ROBOT:
wxChatTaskService.sendWechatRobot(r, userIds, context, NoticeConstants.CREATE);
break;
case NoticeConstants.EMAIL:
mailService.sendTestPlanStartNotice(r, userIds, testPlans, NoticeConstants.CREATE);
break;
}
});
} catch (Exception e) {
LogUtil.error(e);
}*/
return
testPlanMapper
.
updateByPrimaryKeySelective
(
testPlan
);
}
...
...
@@ -183,9 +242,35 @@ public class TestPlanService {
}
public
int
deleteTestPlan
(
String
planId
)
{
TestPlan
testPlan
=
getTestPlan
(
planId
);
deleteTestCaseByPlanId
(
planId
);
testPlanProjectService
.
deleteTestPlanProjectByPlanId
(
planId
);
return
testPlanMapper
.
deleteByPrimaryKey
(
planId
);
int
num
=
testPlanMapper
.
deleteByPrimaryKey
(
planId
);
List
<
String
>
userIds
=
new
ArrayList
<>();
AddTestPlanRequest
testPlans
=
new
AddTestPlanRequest
();
userIds
.
add
(
testPlan
.
getCreator
());
try
{
BeanUtils
.
copyBean
(
testPlans
,
testPlan
);
String
context
=
getTestPlanContext
(
testPlans
,
NoticeConstants
.
DELETE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
DELETE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
DELETE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendTestPlanDeleteNotice
(
r
,
userIds
,
testPlans
,
NoticeConstants
.
DELETE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
return
num
;
}
public
void
deleteTestCaseByPlanId
(
String
testPlanId
)
{
...
...
@@ -389,7 +474,6 @@ public class TestPlanService {
List
<
String
>
statusList
=
extTestPlanTestCaseMapper
.
getStatusByPlanId
(
planId
);
TestPlan
testPlan
=
new
TestPlan
();
testPlan
.
setId
(
planId
);
for
(
String
status
:
statusList
)
{
if
(
StringUtils
.
equals
(
status
,
TestPlanTestCaseStatus
.
Prepare
.
name
())
||
StringUtils
.
equals
(
status
,
TestPlanTestCaseStatus
.
Underway
.
name
()))
{
...
...
@@ -400,6 +484,34 @@ public class TestPlanService {
}
testPlan
.
setStatus
(
TestPlanStatus
.
Completed
.
name
());
testPlanMapper
.
updateByPrimaryKeySelective
(
testPlan
);
TestPlan
testPlans
=
getTestPlan
(
planId
);
List
<
String
>
userIds
=
new
ArrayList
<>();
userIds
.
add
(
testPlans
.
getCreator
());
AddTestPlanRequest
_testPlans
=
new
AddTestPlanRequest
();
if
(
StringUtils
.
equals
(
TestPlanStatus
.
Completed
.
name
(),
testPlans
.
getStatus
()))
{
try
{
BeanUtils
.
copyBean
(
_testPlans
,
testPlans
);
String
context
=
getTestPlanContext
(
_testPlans
,
NoticeConstants
.
UPDATE
);
MessageSettingDetail
messageSettingDetail
=
noticeService
.
searchMessage
();
List
<
MessageDetail
>
taskList
=
messageSettingDetail
.
getReviewTask
();
taskList
.
forEach
(
r
->
{
switch
(
r
.
getType
())
{
case
NoticeConstants
.
NAIL_ROBOT
:
dingTaskService
.
sendNailRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
UPDATE
);
break
;
case
NoticeConstants
.
WECHAT_ROBOT
:
wxChatTaskService
.
sendWechatRobot
(
r
,
userIds
,
context
,
NoticeConstants
.
UPDATE
);
break
;
case
NoticeConstants
.
EMAIL
:
mailService
.
sendTestPlanEndNotice
(
r
,
userIds
,
_testPlans
,
NoticeConstants
.
UPDATE
);
break
;
}
});
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
}
}
}
public
String
getProjectNameByPlanId
(
String
testPlanId
)
{
...
...
@@ -420,4 +532,30 @@ public class TestPlanService {
return
projectName
;
}
private
static
String
getTestPlanContext
(
AddTestPlanRequest
testPlan
,
String
type
)
{
Long
startTime
=
testPlan
.
getPlannedStartTime
();
Long
endTime
=
testPlan
.
getPlannedEndTime
();
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
String
start
=
null
;
String
sTime
=
String
.
valueOf
(
startTime
);
String
eTime
=
String
.
valueOf
(
endTime
);
if
(!
sTime
.
equals
(
"null"
))
{
start
=
sdf
.
format
(
new
Date
(
Long
.
parseLong
(
sTime
)));
}
String
end
=
null
;
if
(!
eTime
.
equals
(
"null"
))
{
end
=
sdf
.
format
(
new
Date
(
Long
.
parseLong
(
eTime
)));
}
String
context
=
""
;
if
(
StringUtils
.
equals
(
NoticeConstants
.
CREATE
,
type
))
{
context
=
"测试计划任务通知:"
+
testPlan
.
getCreator
()
+
"创建的"
+
"'"
+
testPlan
.
getName
()
+
"'"
+
"待开始,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"请跟进"
;
}
else
if
(
StringUtils
.
equals
(
NoticeConstants
.
UPDATE
,
type
))
{
context
=
"测试计划任务通知:"
+
testPlan
.
getCreator
()
+
"创建的"
+
"'"
+
testPlan
.
getName
()
+
"'"
+
"已完成,计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"已完成"
;
}
else
if
(
StringUtils
.
equals
(
NoticeConstants
.
DELETE
,
type
))
{
context
=
"测试计划任务通知:"
+
testPlan
.
getCreator
()
+
"创建的"
+
"'"
+
testPlan
.
getName
()
+
"'"
+
"计划开始时间是"
+
start
+
"计划结束时间为"
+
end
+
"已删除"
;
}
return
context
;
}
}
backend/src/main/resources/db/migration/V35__modify_test_plan.sql
0 → 100644
浏览文件 @
b1baa5d4
alter
table
test_plan
add
creator
varchar
(
255
)
not
null
;
\ No newline at end of file
backend/src/main/resources/generatorConfig.xml
浏览文件 @
b1baa5d4
...
...
@@ -67,6 +67,7 @@
<table
tableName=
"schedule"
/>
<table
tableName=
"notice"
/>
<table
tableName=
"message_task"
/>
<table
tableName=
"test_plan"
/>
</context>
</generatorConfiguration>
\ No newline at end of file
backend/src/main/resources/i18n/messages_en_US.properties
浏览文件 @
b1baa5d4
...
...
@@ -164,4 +164,10 @@ check_owner_test=The current user does not have permission to operate this test
check_owner_case
=
The current user does not have permission to operate this use case
check_owner_plan
=
The current user does not have permission to operate this plan
check_owner_review
=
The current user does not have permission to operate this review
upload_content_is_null
=
Imported content is empty
\ No newline at end of file
upload_content_is_null
=
Imported content is empty
test_plan_notification
=
Test plan notification
task_defect_notification
=
Task defect notification
task_notification
=
Jenkins Task notification
backend/src/main/resources/i18n/messages_zh_CN.properties
浏览文件 @
b1baa5d4
...
...
@@ -164,4 +164,7 @@ check_owner_test=当前用户没有操作此测试的权限
check_owner_case
=
当前用户没有操作此用例的权限
check_owner_plan
=
当前用户没有操作此计划的权限
check_owner_review
=
当前用户没有操作此评审的权限
upload_content_is_null
=
导入内容为空
\ No newline at end of file
upload_content_is_null
=
导入内容为空
test_plan_notification
=
测试计划通知
task_defect_notification
=
缺陷任务通知
task_notification
=
jenkins任务通知
\ No newline at end of file
backend/src/main/resources/i18n/messages_zh_TW.properties
浏览文件 @
b1baa5d4
...
...
@@ -165,4 +165,8 @@ check_owner_test=當前用戶沒有操作此測試的權限
check_owner_case
=
當前用戶沒有操作此用例的權限
check_owner_plan
=
當前用戶沒有操作此計劃的權限
check_owner_review
=
當前用戶沒有操作此評審的權限
upload_content_is_null
=
導入內容為空
\ No newline at end of file
upload_content_is_null
=
導入內容為空
test_plan_notification
=
測試計畫通知
task_defect_notification
=
缺陷任務通知
task_notification
=
jenkins任務通知
backend/src/main/resources/mail/deleteReview.html
0 → 100644
浏览文件 @
b1baa5d4
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
MeterSphere
</title>
</head>
<body>
<div>
<p
style=
"text-align: left"
>
${creator} 发起的:
<br>
${reviewName}
<br>
计划开始时间是:${start}
<br>
计划结束时间为:${end}
<br>
已删除
<br>
</div>
</body>
</html>
\ No newline at end of file
backend/src/main/resources/mail/issuesCreate.html
0 → 100644
浏览文件 @
b1baa5d4
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
MeterSphere
</title>
</head>
<body>
<div>
<p>
${creator}发起了一个缺陷:${issuesName},请跟进
</p>
</div>
</body>
</html>
\ No newline at end of file
backend/src/main/resources/mail/testPlanDelete.html
0 → 100644
浏览文件 @
b1baa5d4
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
MeterSphere
</title>
</head>
<body>
<div>
<p
style=
"text-align: left"
>
${creator} 创建的:
<br>
${testPlanName}
<br>
计划开始时间是:${start}
<br>
计划结束时间为:${end}
<br>
已删除!
</p>
</div>
</body>
</html>
\ No newline at end of file
backend/src/main/resources/mail/testPlanEnd.html
0 → 100644
浏览文件 @
b1baa5d4
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
MeterSphere
</title>
</head>
<body>
<div>
<p
style=
"text-align: left"
>
${creator} 创建的:
<br>
${testPlanName}已完成
<br>
计划开始时间是:${start}
<br>
计划结束时间为:${end}
<br>
已完成!
<br>
点击下面链接进入测试计划页面
</p>
<a
href=
"${url}/#/track/plan/view/${id}"
>
${url}/#/track/plan/view
</a>
</div>
</body>
</html>
\ No newline at end of file
backend/src/main/resources/mail/testPlanStart.html
0 → 100644
浏览文件 @
b1baa5d4
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
MeterSphere
</title>
</head>
<body>
<div>
<p
style=
"text-align: left"
>
${creator} 创建的:
<br>
${testPlanName}
<br>
计划开始时间是:${start}
<br>
计划结束时间为:${end}
<br>
请跟进!
<br>
点击下面链接进入测试计划页面
</p>
<a
href=
"${url}/#/track/plan/view/${id}"
>
${url}/#/track/plan/view
</a>
</div>
</body>
</html>
\ No newline at end of file
frontend/src/business/components/settings/organization/TaskNotification.vue
浏览文件 @
b1baa5d4
...
...
@@ -5,10 +5,10 @@
<el-col
:span=
"20"
>
<div
class=
"grid-content bg-purple-dark"
>
<el-row>
<el-col
:span=
"
6
"
>
<el-col
:span=
"
10
"
>
<span
style=
"font-weight:bold;"
>
{{
$t
(
'
organization.message.jenkins_task_notification
'
)
}}
</span>
</el-col>
<el-col
:span=
"1
4
"
>
<el-col
:span=
"1
0
"
>
<el-button
type=
"text"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAddTaskModel('jenkinsTask')"
>
{{
$t
(
'
organization.message.create_new_notification
'
)
}}
...
...
@@ -22,13 +22,15 @@
class=
"tb-edit"
border
size=
"mini"
:header-cell-style=
"
{background:'#ededed'}"
:cell-style=
"rowClass"
:header-cell-style=
"headClass"
>
<el-table-column
:label=
"$t('schedule.event')"
min-width=
"20%"
prop=
"events"
>
<template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.events"
multiple
<el-select
v-model=
"scope.row.events"
multiple
:placeholder=
"$t('organization.message.select_events')"
prop=
"events"
>
prop=
"events"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in jenkinsEventOptions"
:key=
"item.value"
...
...
@@ -42,7 +44,7 @@
<
template
v-slot:default=
"{row}"
>
<el-select
v-model=
"row.userIds"
filterable
multiple
:placeholder=
"$t('commons.please_select')"
@
click.native=
"userList()"
style=
"width: 100%;"
>
@
click.native=
"userList()"
style=
"width: 100%;"
:disabled=
"!row.isSet"
>
<el-option
v-for=
"item in jenkinsReceiverOptions"
:key=
"item.id"
...
...
@@ -54,7 +56,8 @@
</el-table-column>
<el-table-column
:label=
"$t('schedule.receiving_mode')"
min-width=
"20%"
prop=
"type"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
:disabled=
"!scope.row.isSet"
@
change=
"handleEdit(scope.$index, scope.row)"
>
<el-option
v-for=
"item in receiveTypeOptions"
:key=
"item.value"
...
...
@@ -66,7 +69,7 @@
</el-table-column>
<el-table-column
label=
"webhook"
min-width=
"20%"
prop=
"webhook"
>
<
template
v-slot:default=
"scope"
>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
></el-input>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
:disabled=
"!scope.row.isSet||scope.row.events === 'EMAIL'"
></el-input>
</
template
>
</el-table-column>
<el-table-column
:label=
"$t('commons.operating')"
min-width=
"20%"
prop=
"result"
>
...
...
@@ -102,10 +105,10 @@
<el-col
:span=
"20"
>
<div
class=
"grid-content bg-purple-dark"
>
<el-row>
<el-col
:span=
"
6
"
>
<el-col
:span=
"
10
"
>
<span
style=
"font-weight:bold;"
>
{{ $t('organization.message.test_plan_task_notification') }}
</span>
</el-col>
<el-col
:span=
"1
4
"
>
<el-col
:span=
"1
0
"
>
<el-button
type=
"text"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAddTaskModel('testPlanTask')"
>
{{ $t('organization.message.create_new_notification') }}
</el-button>
...
...
@@ -117,12 +120,13 @@
class=
"tb-edit"
border
size=
"mini"
:header-cell-style=
"{background:'#EDEDED'}"
:cell-style=
"rowClass"
:header-cell-style=
"headClass"
>
<el-table-column
:label=
"$t('schedule.event')"
min-width=
"20%"
prop=
"events"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.events"
multiple
:placeholder=
"$t('organization.message.select_events')"
prop=
"events"
>
prop=
"events"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in otherEventOptions"
:key=
"item.value"
...
...
@@ -136,7 +140,7 @@
<
template
v-slot:default=
"{row}"
>
<el-select
v-model=
"row.userIds"
filterable
multiple
:placeholder=
"$t('commons.please_select')"
@
click.native=
"testPlanUserList()"
style=
"width: 100%;"
>
@
click.native=
"testPlanUserList()"
style=
"width: 100%;"
:disabled=
"!row.isSet"
>
<el-option
v-for=
"item in testPlanReceiverOptions"
:key=
"item.id"
...
...
@@ -148,7 +152,7 @@
</el-table-column>
<el-table-column
:label=
"$t('schedule.receiving_mode')"
min-width=
"20%"
prop=
"type"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in receiveTypeOptions"
:key=
"item.value"
...
...
@@ -160,7 +164,7 @@
</el-table-column>
<el-table-column
label=
"webhook"
min-width=
"20%"
prop=
"webhook"
>
<
template
v-slot:default=
"scope"
>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
></el-input>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
:disabled=
"!scope.row.isSet"
></el-input>
</
template
>
</el-table-column>
<el-table-column
:label=
"$t('commons.operating')"
min-width=
"20%"
prop=
"result"
>
...
...
@@ -194,10 +198,10 @@
<el-col
:span=
"20"
>
<div
class=
"grid-content bg-purple-dark"
>
<el-row>
<el-col
:span=
"
6
"
>
<el-col
:span=
"
10
"
>
<span
style=
"font-weight:bold;"
>
{{ $t('organization.message.test_review_task_notice') }}
</span>
</el-col>
<el-col
:span=
"1
4
"
>
<el-col
:span=
"1
0
"
>
<el-button
type=
"text"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAddTaskModel('reviewTask')"
>
{{ $t('organization.message.create_new_notification') }}
</el-button>
...
...
@@ -209,14 +213,15 @@
class=
"tb-edit"
border
size=
"mini"
:header-cell-style=
"{background:'#EDEDED'}"
:cell-style=
"rowClass"
:header-cell-style=
"headClass"
>
<el-table-column
:label=
"$t('schedule.event')"
min-width=
"20%"
prop=
"events"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.events"
multiple
:placeholder=
"$t('organization.message.select_events')"
prop=
"event"
>
prop=
"event"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in
other
EventOptions"
v-for=
"item in
reviewTask
EventOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
...
...
@@ -228,7 +233,7 @@
<
template
v-slot:default=
"{row}"
>
<el-select
v-model=
"row.userIds"
filterable
multiple
:placeholder=
"$t('commons.please_select')"
@
click.native=
"reviewUerList()"
style=
"width: 100%;"
>
@
click.native=
"reviewUerList()"
style=
"width: 100%;"
:disabled=
"!row.isSet"
>
<el-option
v-for=
"item in reviewReceiverOptions"
:key=
"item.id"
...
...
@@ -240,7 +245,7 @@
</el-table-column>
<el-table-column
:label=
"$t('schedule.receiving_mode')"
min-width=
"20%"
prop=
"type"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in receiveTypeOptions"
:key=
"item.value"
...
...
@@ -252,7 +257,7 @@
</el-table-column>
<el-table-column
label=
"webhook"
min-width=
"20%"
prop=
"webhook"
>
<
template
v-slot:default=
"scope"
>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
></el-input>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
:disabled=
"!scope.row.isSet"
></el-input>
</
template
>
</el-table-column>
<el-table-column
:label=
"$t('commons.operating')"
min-width=
"20%"
prop=
"result"
>
...
...
@@ -286,10 +291,10 @@
<el-col
:span=
"20"
>
<div
class=
"grid-content bg-purple-dark"
>
<el-row>
<el-col
:span=
"
6
"
>
<el-col
:span=
"
10
"
>
<span
style=
"font-weight:bold;"
>
{{ $t('organization.message.defect_task_notification') }}
</span>
</el-col>
<el-col
:span=
"1
4
"
>
<el-col
:span=
"1
0
"
>
<el-button
type=
"text"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAddTaskModel('defectTask')"
>
{{ $t('organization.message.create_new_notification') }}
</el-button>
...
...
@@ -301,14 +306,15 @@
class=
"tb-edit"
border
size=
"mini"
:header-cell-style=
"{background:'#EDEDED'}"
:cell-style=
"rowClass"
:header-cell-style=
"headClass"
>
<el-table-column
:label=
"$t('schedule.event')"
min-width=
"20%"
prop=
"events"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.events"
multiple
:placeholder=
"$t('organization.message.select_events')"
prop=
"event"
>
prop=
"event"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in
other
EventOptions"
v-for=
"item in
defect
EventOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
...
...
@@ -320,7 +326,7 @@
<
template
v-slot:default=
"{row}"
>
<el-select
v-model=
"row.userIds"
filterable
multiple
:placeholder=
"$t('commons.please_select')"
@
click.native=
"defectUserList()"
style=
"width: 100%;"
>
@
click.native=
"defectUserList()"
style=
"width: 100%;"
:disabled=
"!row.isSet"
>
<el-option
v-for=
"item in defectReceiverOptions"
:key=
"item.id"
...
...
@@ -332,7 +338,7 @@
</el-table-column>
<el-table-column
:label=
"$t('schedule.receiving_mode')"
min-width=
"20%"
prop=
"type"
>
<
template
slot-scope=
"scope"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
>
<el-select
v-model=
"scope.row.type"
:placeholder=
"$t('organization.message.select_receiving_method')"
:disabled=
"!scope.row.isSet"
>
<el-option
v-for=
"item in receiveTypeOptions"
:key=
"item.value"
...
...
@@ -344,7 +350,7 @@
</el-table-column>
<el-table-column
label=
"webhook"
min-width=
"20%"
prop=
"webhook"
>
<
template
v-slot:default=
"scope"
>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
></el-input>
<el-input
v-model=
"scope.row.webhook"
placeholder=
"webhook地址"
:disabled=
"!scope.row.isSet"
></el-input>
</
template
>
</el-table-column>
<el-table-column
:label=
"$t('commons.operating')"
min-width=
"20%"
prop=
"result"
>
...
...
@@ -367,7 +373,7 @@
icon=
"el-icon-delete"
size=
"mini"
v-show=
"!scope.row.isSet"
@
click
.native.prevent
=
"deleteRowTask(scope.$index,scope.row)"
@
click=
"deleteRowTask(scope.$index,scope.row)"
></el-button>
</
template
>
</el-table-column>
...
...
@@ -437,6 +443,18 @@ export default {
{
value
:
'
UPDATE
'
,
label
:
this
.
$t
(
'
commons.update
'
)},
{
value
:
'
DELETE
'
,
label
:
this
.
$t
(
'
commons.delete
'
)}
],
reviewTaskEventOptions
:[
{
value
:
'
CREATE
'
,
label
:
this
.
$t
(
'
commons.create
'
)},
{
value
:
'
UPDATE
'
,
label
:
this
.
$t
(
'
commons.update
'
)},
{
value
:
'
DELETE
'
,
label
:
this
.
$t
(
'
commons.delete
'
)},
{
value
:
'
COMMENT
'
,
label
:
this
.
$t
(
'
commons.comment
'
)}
],
defectEventOptions
:[
{
value
:
'
CREATE
'
,
label
:
this
.
$t
(
'
commons.create
'
)},
/*
{value: 'UPDATE', label: this.$t('commons.update')},
*/
],
//测试计划
testPlanReceiverOptions
:
[],
//评审
...
...
@@ -445,10 +463,18 @@ export default {
defectReceiverOptions
:
[],
}
},
activated
(){
this
.
initForm
()
this
.
userList
()
this
.
testPlanUserList
()
this
.
defectUserList
()
this
.
reviewUerList
()
},
methods
:
{
handleEdit
(
index
,
data
){
},
initForm
()
{
this
.
result
=
this
.
$get
(
'
/notice/search/message
'
,
response
=>
{
this
.
form
=
response
.
data
...
...
@@ -462,18 +488,18 @@ export default {
reviewUerList
()
{
this
.
result
=
this
.
$get
(
'
user/list
'
,
response
=>
{
this
.
reviewReceiverOptions
=
response
.
data
this
.
reviewReceiverOptions
.
unshift
({
id
:
'
FOUNDER
'
,
name
:
this
.
$t
(
'
api_test.creato
r
'
)},
{
id
:
'
Executor
'
,
name
:
this
.
$t
(
'
test_track.plan_view.execu
tor
'
)},
this
.
reviewReceiverOptions
.
unshift
({
id
:
'
EXECUTOR
'
,
name
:
this
.
$t
(
'
test_track.review.reviewe
r
'
)},
{
id
:
'
FOUNDER
'
,
name
:
this
.
$t
(
'
test_track.review.review_crea
tor
'
)},
{
id
:
'
MAINTAINER
'
,
name
:
this
.
$t
(
'
test_track.case.maintainer
'
)})
})
},
defectUserList
()
{
this
.
result
=
this
.
$get
(
'
user/list
'
,
response
=>
{
this
.
defectReceiverOptions
=
response
.
data
this
.
defectReceiverOptions
.
unshift
({
id
:
'
FOUNDER
'
,
name
:
this
.
$t
(
'
api_test.creator
'
)},
{
/*
this.defectReceiverOptions.unshift({id: 'FOUNDER', name: this.$t('api_test.creator')}, {
id: 'EXECUTOR',
name: this.$t('test_track.plan_view.executor')
})
})
*/
})
},
testPlanUserList
()
{
...
...
@@ -513,23 +539,34 @@ export default {
handleAddTask
(
index
,
data
)
{
let
list
=
[]
data
.
isSet
=
false
list
.
push
(
data
)
let
param
=
{};
param
.
messageDetail
=
list
this
.
result
=
this
.
$post
(
"
/notice/save/message/task
"
,
param
,
()
=>
{
})
if
(
data
.
events
.
length
>
0
&&
data
.
userIds
.
length
>
0
&&
data
.
type
){
data
.
isSet
=
false
list
.
push
(
data
)
let
param
=
{};
param
.
messageDetail
=
list
this
.
result
=
this
.
$post
(
"
/notice/save/message/task
"
,
param
,
()
=>
{
this
.
initForm
()
this
.
$success
(
this
.
$t
(
'
commons.save_success
'
));
})
}
},
removeRowTask
(
index
,
data
)
{
//移除
data
.
splice
(
index
,
1
)
},
deleteRowTask
(
index
,
data
)
{
//删除
this
.
result
=
this
.
$get
(
"
/notice/delete/message/
"
+
data
.
identification
,
response
=>
{
this
.
$success
(
this
.
$t
(
'
commons.delete_success
'
));
this
.
initForm
()
})
/*data.splice(index, 1)*/
},
rowClass
()
{
return
"
text-align:center
"
},
headClass
()
{
return
"
text-align:center;background:'#ededed'
"
},
}
}
</
script
>
...
...
frontend/src/business/components/settings/router.js
浏览文件 @
b1baa5d4
...
...
@@ -48,11 +48,11 @@ export default {
component
:
()
=>
import
(
'
@/business/components/settings/organization/ServiceIntegration
'
),
meta
:
{
organization
:
true
,
title
:
'
organization.service_integration
'
}
},
/*
{
{
path
:
'
messagesettings
'
,
component
:
()
=>
import
(
'
@/business/components/settings/organization/MessageSettings
'
),
meta
:
{
organization
:
true
,
title
:
'
organization.message_settings
'
}
},
*/
},
{
path
:
'
member
'
,
component
:
()
=>
import
(
'
@/business/components/settings/workspace/WorkspaceMember
'
),
...
...
frontend/src/i18n/en-US.js
浏览文件 @
b1baa5d4
export
default
{
commons
:
{
comment
:
'
comment
'
,
examples
:
'
examples
'
,
help_documentation
:
'
Help documentation
'
,
delete_cancelled
:
'
Delete cancelled
'
,
...
...
frontend/src/i18n/zh-CN.js
浏览文件 @
b1baa5d4
export
default
{
commons
:
{
comment
:
'
评论
'
,
examples
:
'
示例
'
,
help_documentation
:
'
帮助文档
'
,
delete_cancelled
:
'
已取消删除
'
,
...
...
@@ -218,7 +219,7 @@ export default {
defect_manage
:
'
缺陷管理平台
'
,
message_settings
:
'
消息设置
'
,
message
:{
jenkins_task_notification
:
'
Jenkins任务通知
'
,
jenkins_task_notification
:
'
Jenkins
接口调用
任务通知
'
,
test_plan_task_notification
:
'
测试计划任务通知
'
,
test_review_task_notice
:
'
测试评审任务通知
'
,
create_new_notification
:
'
创建新通知
'
,
...
...
frontend/src/i18n/zh-TW.js
浏览文件 @
b1baa5d4
export
default
{
commons
:
{
comment
:
'
評論
'
,
examples
:
'
示例
'
,
help_documentation
:
'
幫助文檔
'
,
delete_cancelled
:
'
已取消刪除
'
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录