Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-backend
Overview
Overview
Details
Activity
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
AutogeneralShanghai
yd-backend
Commits
c3d605d2
Commit
c3d605d2
authored
May 26, 2020
by
yao.xiao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加-队员销售活动量列表
parent
fdba8154
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
190 additions
and
8 deletions
+190
-8
yd-api/src/main/java/com/yd/api/practitioner/PractitionerController.java
+16
-0
yd-api/src/main/java/com/yd/api/practitioner/service/PractitionerService.java
+7
-0
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerServiceImpl.java
+41
-6
yd-api/src/main/java/com/yd/api/practitioner/vo/opportunity/PlayerSalesActivityQueryRequestVO.java
+8
-0
yd-api/src/main/java/com/yd/api/practitioner/vo/opportunity/PlayerSalesActivityQueryResponseVO.java
+13
-0
yd-api/src/main/java/com/yd/dal/entity/practitioner/opportunity/PlayerSalesActivityInfo.java
+16
-0
yd-api/src/main/java/com/yd/dal/mapper/customer/AclPractitionerMapper.java
+4
-0
yd-api/src/main/java/com/yd/dal/mapper/marketing/MktLeadsGoalsActionsMapper.java
+3
-0
yd-api/src/main/java/com/yd/dal/mapper/meta/MdDropOptionsMapper.java
+3
-0
yd-api/src/main/java/com/yd/dal/service/customer/AclPractitionerDALService.java
+8
-1
yd-api/src/main/java/com/yd/dal/service/customer/impl/AclPractitionerDALServiceImpl.java
+6
-1
yd-api/src/main/java/com/yd/dal/service/marketing/Impl/MktLeadsGoalsActionsDALServiceImpl.java
+5
-0
yd-api/src/main/java/com/yd/dal/service/marketing/MktLeadsGoalsActionsDALService.java
+2
-0
yd-api/src/main/java/com/yd/dal/service/meta/MdDropOptionsDALService.java
+2
-0
yd-api/src/main/java/com/yd/dal/service/meta/impl/MdDropOptionsDALServiceImpl.java
+5
-0
yd-api/src/main/resources/mapper/customer/AclPractitionerMapper.xml
+32
-0
yd-api/src/main/resources/mapper/marketing/MktLeadsGoalsActionsMapper.xml
+11
-0
yd-api/src/main/resources/mapper/meta/MdDropOptionsMapper.xml
+8
-0
No files found.
yd-api/src/main/java/com/yd/api/practitioner/PractitionerController.java
View file @
c3d605d2
...
...
@@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
@Controller
@RestController
@RequestMapping
(
"/practitioner"
)
...
...
@@ -287,4 +289,18 @@ public class PractitionerController {
result
.
setData
(
responseVO
);
return
result
;
}
/**
* 队员销售活动量
* @param requestVO 请求数据
* @return 响应数据
*/
@RequestMapping
(
"/playerSalesActivityQuery"
)
public
Object
playerSalesActivityQuery
(
@RequestBody
PlayerSalesActivityQueryRequestVO
requestVO
){
JsonResult
result
=
new
JsonResult
();
PlayerSalesActivityQueryResponseVO
responseVO
=
practitionerService
.
playerSalesActivityQuery
(
requestVO
);
result
.
addResult
(
responseVO
);
result
.
setData
(
responseVO
);
return
result
;
}
}
yd-api/src/main/java/com/yd/api/practitioner/service/PractitionerService.java
View file @
c3d605d2
...
...
@@ -145,4 +145,11 @@ public interface PractitionerService {
* @return
*/
TeamActionsAverageQueryResponseVO
teamScoreAverageQuery
(
TeamActionsAverageQueryRequestVO
requestVO
);
/**
* 队员销售活动量
* @param requestVO
* @return
*/
PlayerSalesActivityQueryResponseVO
playerSalesActivityQuery
(
PlayerSalesActivityQueryRequestVO
requestVO
);
}
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerServiceImpl.java
View file @
c3d605d2
...
...
@@ -23,6 +23,7 @@ import com.yd.dal.entity.marketing.*;
import
com.yd.dal.entity.meta.*
;
import
com.yd.dal.entity.practitioner.opportunity.OwnOpportunityInfo
;
import
com.yd.dal.entity.order.PoOrder
;
import
com.yd.dal.entity.practitioner.opportunity.PlayerSalesActivityInfo
;
import
com.yd.dal.entity.survey.SurveyCustomerAnswers
;
import
com.yd.dal.service.customer.*
;
import
com.yd.dal.service.marketing.*
;
...
...
@@ -1578,14 +1579,14 @@ public class PractitionerServiceImpl implements com.yd.api.practitioner.service.
responseVO
.
setScoreWeekAverage
(
scoreWeekAverage
);
responseVO
.
setScoreMonthAverage
(
scoreMonthAverage
);
responseVO
.
setOpportunitiesNum
(
opportunitiesNum
);
responseVO
.
setPremiumMonth
(
performanceForecast
.
get
(
"totalFY
C
Month"
).
doubleValue
());
responseVO
.
setCommissionMonth
(
performanceForecast
.
get
(
"totalFY
P
Month"
).
doubleValue
());
responseVO
.
setPremiumMonth
(
performanceForecast
.
get
(
"totalFY
P
Month"
).
doubleValue
());
responseVO
.
setCommissionMonth
(
performanceForecast
.
get
(
"totalFY
C
Month"
).
doubleValue
());
responseVO
.
setPiecesMonth
(
performanceForecast
.
get
(
"totalPiecesMonth"
).
doubleValue
());
responseVO
.
setPremiumQuarter
(
performanceForecast
.
get
(
"totalFY
C
Quarter"
).
doubleValue
());
responseVO
.
setCommissionQuarter
(
performanceForecast
.
get
(
"totalFY
P
Quarter"
).
doubleValue
());
responseVO
.
setPremiumQuarter
(
performanceForecast
.
get
(
"totalFY
P
Quarter"
).
doubleValue
());
responseVO
.
setCommissionQuarter
(
performanceForecast
.
get
(
"totalFY
C
Quarter"
).
doubleValue
());
responseVO
.
setPiecesQuarter
(
performanceForecast
.
get
(
"totalPiecesQuarter"
).
doubleValue
());
responseVO
.
setPremiumYear
(
performanceForecast
.
get
(
"totalFY
C
Year"
).
doubleValue
());
responseVO
.
setCommissionYear
(
performanceForecast
.
get
(
"totalFY
P
Year"
).
doubleValue
());
responseVO
.
setPremiumYear
(
performanceForecast
.
get
(
"totalFY
P
Year"
).
doubleValue
());
responseVO
.
setCommissionYear
(
performanceForecast
.
get
(
"totalFY
C
Year"
).
doubleValue
());
responseVO
.
setPiecesYear
(
performanceForecast
.
get
(
"totalPiecesYear"
).
doubleValue
());
responseVO
.
setAchievementRateYear
(
achievementRateMap
.
get
(
"achievementRateYear"
));
responseVO
.
setAchievementRateQuarter
(
achievementRateMap
.
get
(
"achievementRateQuarter"
));
...
...
@@ -1594,6 +1595,40 @@ public class PractitionerServiceImpl implements com.yd.api.practitioner.service.
return
responseVO
;
}
@Override
public
PlayerSalesActivityQueryResponseVO
playerSalesActivityQuery
(
PlayerSalesActivityQueryRequestVO
requestVO
)
{
PlayerSalesActivityQueryResponseVO
responseVO
=
new
PlayerSalesActivityQueryResponseVO
();
Long
practitionerId
=
requestVO
.
getPractitionerId
();
MdDropOptions
mdDropOptions
=
mdDropOptionsDALService
.
findByMasterCodeAndOptionsCode
(
"bizchance_promotion_action"
,
"refused"
);
List
<
PlayerSalesActivityInfo
>
playerSalesActivityInfos
=
aclPractitionerDALService
.
playerSalesActivityQuery
(
practitionerId
,
mdDropOptions
.
getId
());
//计算完成率
Calendar
cal
=
Calendar
.
getInstance
();
int
year
=
cal
.
get
(
Calendar
.
YEAR
);
//通过团队长经纪人id查询出团队所有人设置的目标
List
<
MktLeadsGoalsActions
>
mktLeadsGoalsActions
=
mktLeadsGoalsActionsDALService
.
findTeamGoalsMonth
(
practitionerId
,
year
);
List
<
MdDropOptions
>
mdDropOptionsList
=
mdDropOptionsDALService
.
findByDropMasterCode
(
"bizchance_promotion_action"
);
ConcurrentHashMap
<
Long
,
Integer
>
optionsIdToScore
=
new
ConcurrentHashMap
<>();
for
(
MdDropOptions
info
:
mdDropOptionsList
){
optionsIdToScore
.
put
(
info
.
getId
(),
info
.
getDropOptionScore
());
}
for
(
PlayerSalesActivityInfo
info
:
playerSalesActivityInfos
){
//总分数
Integer
predictionScore
=
0
;
for
(
MktLeadsGoalsActions
actions
:
mktLeadsGoalsActions
){
if
(
info
.
getPractitionerId
()
==
actions
.
getPractitionerId
()){
predictionScore
+=
actions
.
getActionStandards
()
*
optionsIdToScore
.
get
(
actions
.
getLeadsActionId
());
}
}
if
(!
CommonUtil
.
isNullOrZero
(
predictionScore
)){
BigDecimal
achievementRateMonth
=
info
.
getScoreMonth
().
divide
(
BigDecimal
.
valueOf
(
predictionScore
),
4
,
BigDecimal
.
ROUND_HALF_UP
);
info
.
setAchievementRateMonth
(
achievementRateMonth
.
doubleValue
());
}
}
responseVO
.
setPlayerSalesActivityInfo
(
playerSalesActivityInfos
);
responseVO
.
setCommonResult
(
new
CommonResult
(
true
,
ZHBErrorConfig
.
getErrorInfo
(
"800000"
)));
return
responseVO
;
}
private
ConcurrentHashMap
<
String
,
Double
>
getAchievementRate
(
List
<
MktLeadsGoals
>
leadsGoals
,
HashMap
<
String
,
BigDecimal
>
performanceForecast
)
{
ConcurrentHashMap
<
String
,
Double
>
achievementRateMap
=
new
ConcurrentHashMap
<>();
//获取当前月份
...
...
yd-api/src/main/java/com/yd/api/practitioner/vo/opportunity/PlayerSalesActivityQueryRequestVO.java
0 → 100644
View file @
c3d605d2
package
com
.
yd
.
api
.
practitioner
.
vo
.
opportunity
;
import
lombok.Data
;
@Data
public
class
PlayerSalesActivityQueryRequestVO
{
private
Long
practitionerId
;
}
yd-api/src/main/java/com/yd/api/practitioner/vo/opportunity/PlayerSalesActivityQueryResponseVO.java
0 → 100644
View file @
c3d605d2
package
com
.
yd
.
api
.
practitioner
.
vo
.
opportunity
;
import
com.yd.api.result.CommonResult
;
import
com.yd.dal.entity.practitioner.opportunity.PlayerSalesActivityInfo
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
PlayerSalesActivityQueryResponseVO
{
private
List
<
PlayerSalesActivityInfo
>
playerSalesActivityInfo
;
private
CommonResult
commonResult
;
}
yd-api/src/main/java/com/yd/dal/entity/practitioner/opportunity/PlayerSalesActivityInfo.java
0 → 100644
View file @
c3d605d2
package
com
.
yd
.
dal
.
entity
.
practitioner
.
opportunity
;
import
lombok.Data
;
import
java.math.BigDecimal
;
@Data
public
class
PlayerSalesActivityInfo
{
private
String
name
;
private
Long
practitionerId
;
private
BigDecimal
scoreDay
;
private
BigDecimal
scoreWeek
;
private
BigDecimal
scoreMonth
;
private
Integer
addOpportunityNum
;
private
Double
achievementRateMonth
;
}
yd-api/src/main/java/com/yd/dal/mapper/customer/AclPractitionerMapper.java
View file @
c3d605d2
package
com
.
yd
.
dal
.
mapper
.
customer
;
import
com.yd.dal.entity.practitioner.opportunity.PlayerSalesActivityInfo
;
import
com.yd.dal.entity.customer.AclPractitioner
;
import
com.yd.dal.entity.customer.practitioner.PractitionerBasicInfo
;
import
com.yd.dal.entity.customer.practitioner.PractitionerInfo
;
...
...
@@ -41,4 +42,6 @@ public interface AclPractitionerMapper {
List
<
AclPractitioner
>
findByIds
(
@Param
(
"practitionerIdList"
)
List
<
Long
>
practitionerIdList
);
List
<
AclPractitioner
>
findForSubordinateIdByPractitionerId
(
Long
practitionerId
);
List
<
PlayerSalesActivityInfo
>
playerSalesActivityQuery
(
@Param
(
"practitionerId"
)
Long
practitionerId
,
@Param
(
"optionsId"
)
Long
optionsId
);
}
\ No newline at end of file
yd-api/src/main/java/com/yd/dal/mapper/marketing/MktLeadsGoalsActionsMapper.java
View file @
c3d605d2
...
...
@@ -18,4 +18,6 @@ public interface MktLeadsGoalsActionsMapper {
void
updateIsActiveIsNull
(
@Param
(
"practitionerId"
)
Long
practitionerId
,
@Param
(
"year"
)
Integer
year
,
@Param
(
"goalsType"
)
Integer
goalsType
);
List
<
MktLeadsGoalsActions
>
findByMktLeadsGoalsActions
(
MktLeadsGoalsActions
mktLeadsGoalsActions
);
List
<
MktLeadsGoalsActions
>
findTeamGoalsMonth
(
@Param
(
"practitionerId"
)
Long
practitionerId
,
@Param
(
"year"
)
Integer
year
);
}
\ No newline at end of file
yd-api/src/main/java/com/yd/dal/mapper/meta/MdDropOptionsMapper.java
View file @
c3d605d2
...
...
@@ -24,4 +24,6 @@ public interface MdDropOptionsMapper {
List
<
MdDropOptions
>
findByMasterCode
(
@Param
(
"masterCode"
)
String
masterCode
);
List
<
MdDropOptions
>
findByMasterCodeAndOrderId
(
@Param
(
"masterCode"
)
String
masterCode
,
@Param
(
"orderId"
)
int
orderId
);
MdDropOptions
findByMasterCodeAndOptionsCode
(
@Param
(
"masterCode"
)
String
masterCode
,
@Param
(
"optionsCode"
)
String
optionsCode
);
}
\ No newline at end of file
yd-api/src/main/java/com/yd/dal/service/customer/AclPractitionerDALService.java
View file @
c3d605d2
package
com
.
yd
.
dal
.
service
.
customer
;
import
com.yd.dal.entity.practitioner.opportunity.PlayerSalesActivityInfo
;
import
com.yd.dal.entity.practitioner.opportunity.OwnOpportunityInfo
;
import
com.yd.dal.entity.customer.AclPractitioner
;
import
com.yd.dal.entity.customer.practitioner.AclPractitionerInfo
;
import
com.yd.dal.entity.customer.practitioner.PractitionerBasicInfo
;
import
com.yd.dal.entity.customer.practitioner.PractitionerInfo
;
import
com.yd.dal.entity.customer.practitioner.PractitionerRankInfo
;
...
...
@@ -89,4 +89,11 @@ public interface AclPractitionerDALService {
* @return
*/
List
<
AclPractitioner
>
findForSubordinateIdByPractitionerId
(
Long
practitionerId
);
/**
* 通过团队长经纪人id查询团队中组员的销售活动量(跟进分数,除去以失败的跟进)
* @param practitionerId
* @return
*/
List
<
PlayerSalesActivityInfo
>
playerSalesActivityQuery
(
Long
practitionerId
,
Long
optionsId
);
}
yd-api/src/main/java/com/yd/dal/service/customer/impl/AclPractitionerDALServiceImpl.java
View file @
c3d605d2
package
com
.
yd
.
dal
.
service
.
customer
.
impl
;
import
com.google.common.base.Strings
;
import
com.yd.dal.entity.
customer.practitioner.AclPractitioner
Info
;
import
com.yd.dal.entity.
practitioner.opportunity.PlayerSalesActivity
Info
;
import
com.yd.dal.entity.practitioner.opportunity.OwnOpportunityInfo
;
import
com.yd.dal.entity.customer.AclPractitioner
;
import
com.yd.dal.entity.customer.practitioner.PractitionerBasicInfo
;
...
...
@@ -93,4 +93,9 @@ public class AclPractitionerDALServiceImpl implements AclPractitionerDALService
public
List
<
AclPractitioner
>
findForSubordinateIdByPractitionerId
(
Long
practitionerId
)
{
return
aclPractitionerMapper
.
findForSubordinateIdByPractitionerId
(
practitionerId
)
;
}
@Override
public
List
<
PlayerSalesActivityInfo
>
playerSalesActivityQuery
(
Long
practitionerId
,
Long
optionsId
)
{
return
aclPractitionerMapper
.
playerSalesActivityQuery
(
practitionerId
,
optionsId
);
}
}
yd-api/src/main/java/com/yd/dal/service/marketing/Impl/MktLeadsGoalsActionsDALServiceImpl.java
View file @
c3d605d2
...
...
@@ -28,4 +28,9 @@ public class MktLeadsGoalsActionsDALServiceImpl implements MktLeadsGoalsActionsD
public
List
<
MktLeadsGoalsActions
>
findByMktLeadsGoalsActions
(
MktLeadsGoalsActions
mktLeadsGoalsActions
)
{
return
mktLeadsGoalsActionsMapper
.
findByMktLeadsGoalsActions
(
mktLeadsGoalsActions
);
}
@Override
public
List
<
MktLeadsGoalsActions
>
findTeamGoalsMonth
(
Long
practitionerId
,
int
year
)
{
return
mktLeadsGoalsActionsMapper
.
findTeamGoalsMonth
(
practitionerId
,
year
);
}
}
yd-api/src/main/java/com/yd/dal/service/marketing/MktLeadsGoalsActionsDALService.java
View file @
c3d605d2
...
...
@@ -10,4 +10,6 @@ public interface MktLeadsGoalsActionsDALService {
void
updateIsActiveIsNull
(
Long
practitionerId
,
int
year
,
Integer
goalsType
);
List
<
MktLeadsGoalsActions
>
findByMktLeadsGoalsActions
(
MktLeadsGoalsActions
mktLeadsGoalsActions
);
List
<
MktLeadsGoalsActions
>
findTeamGoalsMonth
(
Long
practitionerId
,
int
year
);
}
yd-api/src/main/java/com/yd/dal/service/meta/MdDropOptionsDALService.java
View file @
c3d605d2
...
...
@@ -14,4 +14,6 @@ public interface MdDropOptionsDALService {
List
<
MdDropOptions
>
findByMasterCode
(
String
masterCode
);
List
<
MdDropOptions
>
findByMasterCodeAndOrderId
(
String
masterCode
,
int
orderId
);
MdDropOptions
findByMasterCodeAndOptionsCode
(
String
masterCode
,
String
optionsCode
);
}
yd-api/src/main/java/com/yd/dal/service/meta/impl/MdDropOptionsDALServiceImpl.java
View file @
c3d605d2
...
...
@@ -43,4 +43,9 @@ public class MdDropOptionsDALServiceImpl implements MdDropOptionsDALService {
public
List
<
MdDropOptions
>
findByMasterCodeAndOrderId
(
String
masterCode
,
int
orderId
)
{
return
mdDropOptionsMapper
.
findByMasterCodeAndOrderId
(
masterCode
,
orderId
);
}
@Override
public
MdDropOptions
findByMasterCodeAndOptionsCode
(
String
masterCode
,
String
optionsCode
)
{
return
mdDropOptionsMapper
.
findByMasterCodeAndOptionsCode
(
masterCode
,
optionsCode
);
}
}
yd-api/src/main/resources/mapper/customer/AclPractitionerMapper.xml
View file @
c3d605d2
...
...
@@ -727,4 +727,35 @@
and p.is_active = 1
and s.is_active = 1
</select>
<resultMap
id=
"playerSalesActivityQuery"
type=
"com.yd.dal.entity.practitioner.opportunity.PlayerSalesActivityInfo"
>
<result
column=
"practitionerId"
property=
"practitionerId"
/>
<result
column=
"name"
property=
"name"
/>
<result
column=
"scoreDay"
property=
"scoreDay"
/>
<result
column=
"scoreWeek"
property=
"scoreWeek"
/>
<result
column=
"scoreMonth"
property=
"scoreMonth"
/>
<result
column=
"addOpportunityNum"
property=
"addOpportunityNum"
/>
</resultMap>
<select
id=
"playerSalesActivityQuery"
resultMap=
"playerSalesActivityQuery"
>
select
p.id practitionerId,
p.name name ,
sum(case when to_days(t.track_time)=to_days(now()) then t.track_score end) scoreDay,
sum(case when YEARWEEK(date_format(t.track_time,'%Y-%m-%d')) = YEARWEEK(now()) then t.track_score end) scoreWeek,
sum(case when date_format(t.track_time,'%Y-%m')=date_format(now(),'%Y-%m') then t.track_score end) scoreMonth,
count(case when YEARWEEK(date_format(a.created_at,'%Y-%m-%d')) = YEARWEEK(now()) then t.id end) addOpportunityNum
from ag_acl_practitioner p
left join ag_mkt_leads_assigned_track t on p.id = t.practitioner_id
left join ag_mkt_leads_assigneds a on a.id = t.leads_assigned_id
left join ag_acl_practitioner_subordinate_system s on s.id = p.subordinate_system_id
where
s.owner_practitioner_id = #{practitionerId,jdbcType=BIGINT}
and s.is_active=1
and not EXISTS (select t.leads_assigned_id
from ag_mkt_leads_assigned_track t
where t.md_drop_option_id = #{optionsId,jdbcType=BIGINT}
and t.practitioner_id = p.id
and a.id = t.leads_assigned_id)
group by p.id
order by scoreDay desc ,scoreWeek desc ,scoreMonth desc ,addOpportunityNum desc
</select>
</mapper>
\ No newline at end of file
yd-api/src/main/resources/mapper/marketing/MktLeadsGoalsActionsMapper.xml
View file @
c3d605d2
...
...
@@ -259,4 +259,14 @@
</if>
</where>
</select>
<select
id=
"findTeamGoalsMonth"
resultMap=
"BaseResultMap"
>
select a.*
from ag_mkt_leads_goals_actions a
left join ag_acl_practitioner p left join ag_acl_practitioner_subordinate_system s on p.subordinate_system_id = s.id on a.practitioner_id = p.id
where owner_practitioner_id = #{practitionerId,jdbcType=BIGINT}
and a.current_year= #{year,jdbcType=INTEGER}
and a.is_active = 1
and a.goals_type = 1
and a.statistic_time_unit = 3
</select>
</mapper>
\ No newline at end of file
yd-api/src/main/resources/mapper/meta/MdDropOptionsMapper.xml
View file @
c3d605d2
...
...
@@ -218,4 +218,11 @@
from ag_md_drop_master m left join ag_md_drop_options o on m.id = o.drop_master_id and o.is_active = 1 and o.drop_option_order = #{orderId,jdbcType=INTEGER}
where m.scenario_code = #{masterCode,jdbcType=BIGINT}
</select>
<select
id=
"findByMasterCodeAndOptionsCode"
resultMap=
"BaseResultMap"
>
SELECT o.*
FROM ag_md_drop_options o
LEFT JOIN ag_md_drop_master m ON m.id = o.drop_master_id
WHERE m.scenario_code = #{masterCode,jdbcType=VARCHAR,jdbcType=VARCHAR}
and o.drop_option_code = #{optionsCode,jdbcType=VARCHAR}
</select>
</mapper>
\ No newline at end of file
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