Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vehicle-quality-review
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
王飞
vehicle-quality-review
Commits
27992083
Commit
27992083
authored
Mar 08, 2024
by
wdy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
审查任务
parent
8b04eabc
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
193 additions
and
24 deletions
+193
-24
ReviewDetails.java
...-review/src/main/java/com/ruoyi/domain/ReviewDetails.java
+2
-0
ReviewKeyPoint.java
...review/src/main/java/com/ruoyi/domain/ReviewKeyPoint.java
+2
-0
ReviewSceneChangeTask.java
...src/main/java/com/ruoyi/domain/ReviewSceneChangeTask.java
+2
-2
CarReviewTaskMapper.java
...w/src/main/java/com/ruoyi/mapper/CarReviewTaskMapper.java
+2
-0
SystemReviewTaskMapper.java
...rc/main/java/com/ruoyi/mapper/SystemReviewTaskMapper.java
+2
-0
ReviewSceneChangeTaskServiceImpl.java
.../ruoyi/service/impl/ReviewSceneChangeTaskServiceImpl.java
+7
-2
ReviewTaskInboxServiceImpl.java
...va/com/ruoyi/service/impl/ReviewTaskInboxServiceImpl.java
+24
-7
StrategyReviewSceneChangeAdd.java
.../com/ruoyi/service/impl/StrategyReviewSceneChangeAdd.java
+50
-8
StrategyReviewSceneChangeDelete.java
...m/ruoyi/service/impl/StrategyReviewSceneChangeDelete.java
+74
-1
ReviewSceneChangeTaskCreateRequest.java
...ruoyi/web/request/ReviewSceneChangeTaskCreateRequest.java
+6
-0
ReviewSceneChangeTaskResponse.java
...com/ruoyi/web/response/ReviewSceneChangeTaskResponse.java
+2
-2
CarReviewTaskMapper.xml
...-review/src/main/resources/mapper/CarReviewTaskMapper.xml
+9
-0
ReviewSceneChangeTaskMapper.xml
...src/main/resources/mapper/ReviewSceneChangeTaskMapper.xml
+2
-2
SystemReviewTaskMapper.xml
...view/src/main/resources/mapper/SystemReviewTaskMapper.xml
+9
-0
No files found.
quality-review/src/main/java/com/ruoyi/domain/ReviewDetails.java
View file @
27992083
...
...
@@ -11,6 +11,7 @@ import lombok.AllArgsConstructor;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.experimental.Accessors
;
import
java.util.List
;
...
...
@@ -19,6 +20,7 @@ import java.util.List;
*/
@ApiModel
@TableName
(
value
=
"t_review_details"
)
@Accessors
(
chain
=
true
)
@Data
@Builder
@NoArgsConstructor
...
...
quality-review/src/main/java/com/ruoyi/domain/ReviewKeyPoint.java
View file @
27992083
...
...
@@ -11,6 +11,7 @@ import lombok.AllArgsConstructor;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.experimental.Accessors
;
import
java.util.List
;
...
...
@@ -19,6 +20,7 @@ import java.util.List;
*/
@ApiModel
@TableName
(
value
=
"t_review_keypoint"
)
@Accessors
(
chain
=
true
)
@Data
@Builder
@NoArgsConstructor
...
...
quality-review/src/main/java/com/ruoyi/domain/ReviewSceneChangeTask.java
View file @
27992083
...
...
@@ -77,8 +77,8 @@ public class ReviewSceneChangeTask {
@ApiModelProperty
(
"检验标准id"
)
private
String
inspectStandardId
;
@ApiModelProperty
(
"检验标准
名称
"
)
private
String
inspectStandardN
ame
;
@ApiModelProperty
(
"检验标准
号
"
)
private
String
inspectStandardN
o
;
/**
* 章节
...
...
quality-review/src/main/java/com/ruoyi/mapper/CarReviewTaskMapper.java
View file @
27992083
...
...
@@ -19,6 +19,8 @@ public interface CarReviewTaskMapper extends BaseMapper<CarReviewTask> {
List
<
CarReviewTask
>
findListByReviewStatus
(
@Param
(
"reviewStatus"
)
String
reviewStatus
);
List
<
CarReviewTask
>
findListByTaskStatus
(
@Param
(
"taskStatus"
)
String
taskStatus
);
List
<
CarReviewTask
>
findByDetailsResult
(
@Param
(
"detailId"
)
Long
detailId
);
}
...
...
quality-review/src/main/java/com/ruoyi/mapper/SystemReviewTaskMapper.java
View file @
27992083
...
...
@@ -13,4 +13,6 @@ public interface SystemReviewTaskMapper extends BaseMapper<SystemReviewTask> {
// 查询处理中的任务
List
<
SystemReviewTask
>
findListInProcess
();
List
<
SystemReviewTask
>
findByDetailsResult
(
@Param
(
"detailId"
)
Long
detailId
);
}
quality-review/src/main/java/com/ruoyi/service/impl/ReviewSceneChangeTaskServiceImpl.java
View file @
27992083
...
...
@@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Objects
;
/**
* @author wangfei
...
...
@@ -145,8 +146,12 @@ public class ReviewSceneChangeTaskServiceImpl extends ServiceImpl<ReviewSceneCha
// 更新审核标准
reviewSceneService
.
change
(
task
);
// 通知受影响的问卷
reviewTaskInboxService
.
saveNotify
(
taskId
,
task
.
getType
());
//场景变更时发送信息
if
(
Objects
.
equals
(
task
.
getOperationSort
(),
"ADD_SCENE"
)
||
Objects
.
equals
(
task
.
getOperationSort
(),
"DELETE_SCENE"
))
{
// 通知受影响的问卷
reviewTaskInboxService
.
saveNotify
(
taskId
,
task
.
getType
());
}
}
}
...
...
quality-review/src/main/java/com/ruoyi/service/impl/ReviewTaskInboxServiceImpl.java
View file @
27992083
...
...
@@ -3,11 +3,11 @@ package com.ruoyi.service.impl;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.ruoyi.common.constant.HttpStatus
;
import
com.ruoyi.common.exception.ServiceException
;
import
com.ruoyi.domain.CarReviewTask
;
import
com.ruoyi.domain.ReviewStandard
;
import
com.ruoyi.domain.SystemReviewTask
;
import
com.ruoyi.domain.ReviewTaskInbox
;
import
com.ruoyi.domain.*
;
import
com.ruoyi.mapper.CarReviewTaskMapper
;
import
com.ruoyi.mapper.SystemReviewTaskMapper
;
import
com.ruoyi.service.CarReviewTaskService
;
import
com.ruoyi.service.ReviewSceneChangeTaskService
;
import
com.ruoyi.service.ReviewTaskInboxService
;
import
com.ruoyi.mapper.ReviewTaskInboxMapper
;
import
com.ruoyi.service.SystemReviewTaskService
;
...
...
@@ -37,6 +37,15 @@ public class ReviewTaskInboxServiceImpl extends ServiceImpl<ReviewTaskInboxMappe
@Autowired
private
ReviewTaskInboxMapper
reviewTaskInboxMapper
;
@Autowired
private
ReviewSceneChangeTaskService
reviewSceneChangeTaskService
;
@Autowired
private
SystemReviewTaskMapper
systemReviewTaskMapper
;
@Autowired
private
CarReviewTaskMapper
carReviewTaskMapper
;
/**
* 保存场景变更对进行中的问卷产生的影响,用于提醒问卷使用者场景发生了变更。
* 体系审查任务、侧性审查任务分别查询不同的表
...
...
@@ -72,7 +81,11 @@ public class ReviewTaskInboxServiceImpl extends ServiceImpl<ReviewTaskInboxMappe
public
void
doSaveNotifyByCarReview
(
Long
reviewSceneChangeTaskId
)
{
// 查找所有受变更影响的体系审查任务(所有PENDING状态的任务)
List
<
CarReviewTask
>
pendingTasks
=
carReviewTaskService
.
findListByStatus
(
CarReviewTask
.
TASK_STATUS_PENDING
);
// List<CarReviewTask> pendingTasks = carReviewTaskService.findListByStatus(CarReviewTask.TASK_STATUS_PENDING);
ReviewSceneChangeTask
reviewSceneChangeTask
=
reviewSceneChangeTaskService
.
getById
(
reviewSceneChangeTaskId
);
List
<
CarReviewTask
>
pendingTasks
=
carReviewTaskMapper
.
findByDetailsResult
(
reviewSceneChangeTask
.
getDetailsId
());
// 构建并保存提醒消息
List
<
ReviewTaskInbox
>
inboxes
=
new
ArrayList
();
...
...
@@ -89,8 +102,12 @@ public class ReviewTaskInboxServiceImpl extends ServiceImpl<ReviewTaskInboxMappe
public
void
doSaveNotifyBySystemReview
(
Long
reviewSceneChangeTaskId
)
{
// 查找所有受变更影响的体系审查任务(所有PENDING状态的任务)
List
<
SystemReviewTask
>
pendingTasks
=
systemReviewTaskService
.
findListByStatus
(
SystemReviewTask
.
STATUS_PENDING
);
// 查找所有受变更影响的体系审查任务(所有PENDING状态的任务 且回答过的)
// List<SystemReviewTask> pendingTasks = systemReviewTaskService.findListByStatus(SystemReviewTask.STATUS_PENDING);
ReviewSceneChangeTask
reviewSceneChangeTask
=
reviewSceneChangeTaskService
.
getById
(
reviewSceneChangeTaskId
);
List
<
SystemReviewTask
>
pendingTasks
=
systemReviewTaskMapper
.
findByDetailsResult
(
reviewSceneChangeTask
.
getDetailsId
());
// 构建并保存提醒消息
List
<
ReviewTaskInbox
>
inboxes
=
new
ArrayList
();
...
...
quality-review/src/main/java/com/ruoyi/service/impl/StrategyReviewSceneChangeAdd.java
View file @
27992083
package
com
.
ruoyi
.
service
.
impl
;
import
com.ruoyi.domain.ReviewDetails
;
import
com.ruoyi.domain.ReviewKeyPoint
;
import
com.ruoyi.domain.ReviewScene
;
import
com.ruoyi.domain.ReviewSceneChangeTask
;
import
com.ruoyi.mapper.ReviewDetailsMapper
;
import
com.ruoyi.mapper.ReviewKeyPointMapper
;
import
com.ruoyi.mapper.ReviewSceneMapper
;
import
com.ruoyi.service.StrategyReviewSceneChange
;
import
com.ruoyi.service.ReviewSceneChangeTaskService
;
...
...
@@ -11,6 +15,8 @@ import org.springframework.context.ApplicationContext;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.Objects
;
@Transactional
@Service
public
class
StrategyReviewSceneChangeAdd
implements
StrategyReviewSceneChange
,
InitializingBean
{
...
...
@@ -26,6 +32,12 @@ public class StrategyReviewSceneChangeAdd implements StrategyReviewSceneChange,
@Autowired
private
ReviewSceneChangeTaskService
reviewSceneChangeTaskService
;
@Autowired
private
ReviewKeyPointMapper
reviewKeyPointMapper
;
@Autowired
private
ReviewDetailsMapper
reviewDetailsMapper
;
/**
* 新增审查场景
* @param reviewSceneChangeTask
...
...
@@ -33,15 +45,45 @@ public class StrategyReviewSceneChangeAdd implements StrategyReviewSceneChange,
@Override
public
void
doChange
(
ReviewSceneChangeTask
reviewSceneChangeTask
)
{
// 保存新增的场景
ReviewScene
reviewScene
=
new
ReviewScene
()
.
setText
(
reviewSceneChangeTask
.
getNewText
())
.
setReviewDetailsId
(
reviewSceneChangeTask
.
getDetailsId
());
reviewSceneMapper
.
insert
(
reviewScene
);
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"ADD_SCENE"
))
{
// 保存新增的场景
ReviewScene
reviewScene
=
new
ReviewScene
()
.
setText
(
reviewSceneChangeTask
.
getNewText
())
.
setReviewDetailsId
(
reviewSceneChangeTask
.
getDetailsId
());
reviewSceneMapper
.
insert
(
reviewScene
);
// 为场景变更任务的 场景关联id字段赋值
reviewSceneChangeTask
.
setReviewSceneId
(
reviewScene
.
getId
());
reviewSceneChangeTaskService
.
updateById
(
reviewSceneChangeTask
);
}
// 保存新增的要点
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"ADD_KEYPOINT"
))
{
// 要点
ReviewKeyPoint
reviewKeyPoint
=
new
ReviewKeyPoint
()
.
setText
(
reviewSceneChangeTask
.
getKeypoint
())
.
setReviewStandardId
(
reviewSceneChangeTask
.
getStandardId
());
reviewKeyPointMapper
.
insert
(
reviewKeyPoint
);
// 细则
ReviewDetails
reviewDetails
=
new
ReviewDetails
()
.
setText
(
reviewSceneChangeTask
.
getDetails
())
.
setReviewKeypointId
(
reviewKeyPoint
.
getId
());
reviewDetailsMapper
.
insert
(
reviewDetails
);
}
// 保存新增的细则
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"ADD_DETAILS"
))
{
// 细则
ReviewDetails
reviewDetails
=
new
ReviewDetails
()
.
setText
(
reviewSceneChangeTask
.
getDetails
())
.
setReviewKeypointId
(
reviewSceneChangeTask
.
getKeypointId
());
reviewDetailsMapper
.
insert
(
reviewDetails
);
}
// 为场景变更任务的 场景关联id字段赋值
reviewSceneChangeTask
.
setReviewSceneId
(
reviewScene
.
getId
());
reviewSceneChangeTaskService
.
updateById
(
reviewSceneChangeTask
);
}
...
...
quality-review/src/main/java/com/ruoyi/service/impl/StrategyReviewSceneChangeDelete.java
View file @
27992083
package
com
.
ruoyi
.
service
.
impl
;
import
com.ruoyi.domain.ReviewDetails
;
import
com.ruoyi.domain.ReviewDetailsResult
;
import
com.ruoyi.domain.ReviewScene
;
import
com.ruoyi.domain.ReviewSceneChangeTask
;
import
com.ruoyi.mapper.ReviewDetailsMapper
;
import
com.ruoyi.mapper.ReviewDetailsResultMapper
;
import
com.ruoyi.mapper.ReviewKeyPointMapper
;
import
com.ruoyi.mapper.ReviewSceneMapper
;
import
com.ruoyi.service.ReviewDetailsService
;
import
com.ruoyi.service.ReviewKeyPointService
;
import
com.ruoyi.service.StrategyReviewSceneChange
;
import
com.ruoyi.service.ReviewSceneService
;
import
org.springframework.beans.factory.InitializingBean
;
...
...
@@ -9,6 +18,9 @@ import org.springframework.context.ApplicationContext;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
import
java.util.Objects
;
@Transactional
@Service
public
class
StrategyReviewSceneChangeDelete
implements
StrategyReviewSceneChange
,
InitializingBean
{
...
...
@@ -21,9 +33,70 @@ public class StrategyReviewSceneChangeDelete implements StrategyReviewSceneChang
@Autowired
private
ReviewSceneService
reviewSceneService
;
@Autowired
private
ReviewKeyPointService
reviewKeyPointService
;
@Autowired
private
ReviewDetailsService
reviewDetailsService
;
@Autowired
private
ReviewDetailsMapper
reviewDetailsMapper
;
@Autowired
private
ReviewSceneMapper
reviewSceneMapper
;
@Autowired
private
ReviewDetailsResultMapper
reviewDetailsResultMapper
;
@Override
public
void
doChange
(
ReviewSceneChangeTask
reviewSceneChangeTask
)
{
reviewSceneService
.
removeById
(
reviewSceneChangeTask
.
getReviewSceneId
());
// 删除场景
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"DELETE_SCENE"
))
{
reviewSceneService
.
removeById
(
reviewSceneChangeTask
.
getReviewSceneId
());
}
// 删除要点
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"DELETE_KEYPOINT"
))
{
// 删除要点
reviewKeyPointService
.
removeById
(
reviewSceneChangeTask
.
getKeypointId
());
// 删除包含的细则
List
<
ReviewDetails
>
reviewDetailsList
=
reviewDetailsMapper
.
findByKeyPointId
(
reviewSceneChangeTask
.
getKeypointId
());
if
(
reviewDetailsList
!=
null
&&
reviewDetailsList
.
size
()
!=
0
)
{
reviewDetailsService
.
removeBatchByIds
(
reviewDetailsList
);
}
// 删除细则对应的结果
List
<
ReviewDetailsResult
>
resultList
=
reviewDetailsResultMapper
.
findByDetailsList
(
reviewDetailsList
);
if
(
resultList
!=
null
&&
resultList
.
size
()
!=
0
)
{
reviewDetailsResultMapper
.
deleteBatchIds
(
resultList
);
}
// 删除包含的场景
List
<
ReviewScene
>
reviewScenesList
=
reviewSceneService
.
findByDetailsList
(
reviewDetailsList
);
if
(
reviewScenesList
!=
null
&&
reviewScenesList
.
size
()
!=
0
)
{
reviewSceneService
.
removeBatchByIds
(
reviewScenesList
);
}
}
// 删除细则
if
(
Objects
.
equals
(
reviewSceneChangeTask
.
getOperationSort
(),
"DELETE_DETAILS"
))
{
// 删除细则
reviewDetailsService
.
removeById
(
reviewSceneChangeTask
.
getDetailsId
());
// 删除细则对应的结果
List
<
ReviewDetailsResult
>
resultList
=
reviewDetailsResultMapper
.
findByDetailsId
(
reviewSceneChangeTask
.
getDetailsId
());
if
(
resultList
!=
null
&&
resultList
.
size
()
!=
0
)
{
reviewDetailsResultMapper
.
deleteBatchIds
(
resultList
);
}
// 删除包含的场景
List
<
ReviewScene
>
reviewScenesList
=
reviewSceneMapper
.
findByDetailId
(
reviewSceneChangeTask
.
getDetailsId
());
if
(
reviewScenesList
!=
null
&&
reviewScenesList
.
size
()
!=
0
)
{
reviewSceneService
.
removeBatchByIds
(
reviewScenesList
);
}
}
}
@Override
...
...
quality-review/src/main/java/com/ruoyi/web/request/ReviewSceneChangeTaskCreateRequest.java
View file @
27992083
...
...
@@ -8,6 +8,12 @@ import lombok.Data;
@Data
public
class
ReviewSceneChangeTaskCreateRequest
{
@ApiModelProperty
(
"检验标准id"
)
private
String
inspectStandardId
;
@ApiModelProperty
(
"检验标准名称"
)
private
String
inspectStandardNo
;
/**
* 章节
*/
...
...
quality-review/src/main/java/com/ruoyi/web/response/ReviewSceneChangeTaskResponse.java
View file @
27992083
...
...
@@ -25,8 +25,8 @@ public class ReviewSceneChangeTaskResponse {
@ApiModelProperty
(
"检验标准id"
)
private
String
inspectStandardId
;
@ApiModelProperty
(
"检验标准
名称
"
)
private
String
inspectStandardN
ame
;
@ApiModelProperty
(
"检验标准
号
"
)
private
String
inspectStandardN
o
;
/**
* 章节
...
...
quality-review/src/main/resources/mapper/CarReviewTaskMapper.xml
View file @
27992083
...
...
@@ -45,4 +45,13 @@
SELECT id,task_no,task_status,task_initiator,task_initiator_dept,task_result,task_begin_time,task_end_time,standard,create_time,leader_id,leader,standard_id,name,standard_no,file,submit_id,submit_name,images_url
FROM t_car_review_task WHERE task_status = #{taskStatus}
</select>
<select
id=
"findByDetailsResult"
resultType=
"com.ruoyi.domain.CarReviewTask"
>
SELECT tr.id,tr.task_no,tr.task_status,tr.task_initiator,tr.task_initiator_dept,
tr.task_result,tr.task_begin_time,tr.task_end_time,tr.standard,tr.create_time,
tr.leader_id,tr.leader,tr.standard_id,tr.name,tr.standard_no,tr.file,tr.submit_id,
tr.submit_name,tr.images_url
FROM t_car_review_task tr
LEFT JOIN t_review_details_result trdr ON tr.id = trdr.task_id
WHERE trdr.review_details_id = #{detailId} and tr.task_status = 'PENDING'
</select>
</mapper>
quality-review/src/main/resources/mapper/ReviewSceneChangeTaskMapper.xml
View file @
27992083
...
...
@@ -23,7 +23,7 @@
<result
property=
"taskBeginTime"
column=
"task_begin_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"taskEndTime"
column=
"task_end_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"inspectStandardId"
column=
"inspect_standard_id"
jdbcType=
"BIGINT"
/>
<result
property=
"inspectStandardN
ame"
column=
"inspect_standard_name
"
jdbcType=
"VARCHAR"
/>
<result
property=
"inspectStandardN
o"
column=
"inspect_standard_no
"
jdbcType=
"VARCHAR"
/>
</resultMap>
<resultMap
id=
"ResponseResultMap"
type=
"com.ruoyi.web.response.ReviewSceneChangeTaskResponse"
>
...
...
@@ -46,7 +46,7 @@
<result
property=
"taskEndTime"
column=
"task_end_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"decision"
column=
"decision"
jdbcType=
"VARCHAR"
/>
<result
property=
"inspectStandardId"
column=
"inspect_standard_id"
jdbcType=
"BIGINT"
/>
<result
property=
"inspectStandardN
ame"
column=
"inspect_standard_name
"
jdbcType=
"VARCHAR"
/>
<result
property=
"inspectStandardN
o"
column=
"inspect_standard_no
"
jdbcType=
"VARCHAR"
/>
</resultMap>
<select
id=
"findLastChangeByTaskId"
resultType=
"com.ruoyi.domain.ReviewSceneChangeTask"
>
...
...
quality-review/src/main/resources/mapper/SystemReviewTaskMapper.xml
View file @
27992083
...
...
@@ -37,5 +37,14 @@
FROM t_system_review_task WHERE task_status IN ('NEW','PENDING')
ORDER BY create_time DESC
</select>
<select
id=
"findByDetailsResult"
resultType=
"com.ruoyi.domain.SystemReviewTask"
>
SELECT ts.id, ts.task_no, ts.task_status, ts.task_initiator, ts.task_initiator_dept,
ts.task_result, ts.task_begin_time, ts.task_end_time, ts.standard, ts.create_time,
ts.leader,ts.leader_id, ts.standard_id, ts.name, ts.standard_no, ts.file, ts.submit_by_id,
ts.submit_by_name,ts.images_url
FROM t_system_review_task ts
LEFT JOIN t_review_details_result trdr ON ts.id = trdr.task_id
WHERE trdr.review_details_id = #{detailId} and ts.task_status = 'PENDING'
</select>
</mapper>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment