Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
S
shop-Mall
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
licc
shop-Mall
Commits
c2d734ca
Commit
c2d734ca
authored
Mar 04, 2021
by
licc
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
b93b9eca
bfd921ab
Show whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
602 additions
and
56 deletions
+602
-56
OrderMapper.java
...mapper/src/main/java/cn/wisenergy/mapper/OrderMapper.java
+7
-0
RecommendUserMapper.java
...rc/main/java/cn/wisenergy/mapper/RecommendUserMapper.java
+12
-0
TeamPerformanceMapper.java
.../main/java/cn/wisenergy/mapper/TeamPerformanceMapper.java
+15
-0
TeamUserInfoMapper.java
...src/main/java/cn/wisenergy/mapper/TeamUserInfoMapper.java
+14
-1
UsersMapper.java
...mapper/src/main/java/cn/wisenergy/mapper/UsersMapper.java
+7
-0
OrderMapper.xml
wisenergy-mapper/src/main/resources/mapper/OrderMapper.xml
+10
-0
RecommendUserMapper.xml
...-mapper/src/main/resources/mapper/RecommendUserMapper.xml
+19
-2
TeamPerformanceMapper.xml
...apper/src/main/resources/mapper/TeamPerformanceMapper.xml
+18
-0
TeamUserInfoMapper.xml
...y-mapper/src/main/resources/mapper/TeamUserInfoMapper.xml
+10
-0
UsersMapper.xml
wisenergy-mapper/src/main/resources/mapper/UsersMapper.xml
+12
-0
RecommendUser.java
...l/src/main/java/cn/wisenergy/model/app/RecommendUser.java
+13
-0
UserAndRecommendVo.java
...c/main/java/cn/wisenergy/model/vo/UserAndRecommendVo.java
+27
-0
pom.xml
wisenergy-service/pom.xml
+5
-0
OrderService.java
.../src/main/java/cn/wisenergy/service/app/OrderService.java
+9
-0
RecommendUserService.java
...n/java/cn/wisenergy/service/app/RecommendUserService.java
+15
-0
TeamUserInfoService.java
...in/java/cn/wisenergy/service/app/TeamUserInfoService.java
+14
-0
UserForestStatusService.java
...ava/cn/wisenergy/service/app/UserForestStatusService.java
+12
-0
OrderServiceImpl.java
.../java/cn/wisenergy/service/app/impl/OrderServiceImpl.java
+2
-4
RecommendUserServiceImpl.java
.../wisenergy/service/app/impl/RecommendUserServiceImpl.java
+57
-0
TeamUserInfoServiceImpl.java
...n/wisenergy/service/app/impl/TeamUserInfoServiceImpl.java
+39
-0
UserForestStatusServiceImpl.java
...senergy/service/app/impl/UserForestStatusServiceImpl.java
+168
-0
UserLevelServiceImlp.java
...a/cn/wisenergy/service/app/impl/UserLevelServiceImlp.java
+2
-0
UserServiceImpl.java
...n/java/cn/wisenergy/service/app/impl/UserServiceImpl.java
+1
-1
UserController.java
...cn/wisenergy/web/admin/controller/app/UserController.java
+69
-4
application-test.yml
wisenergy-web-admin/src/main/resources/application-test.yml
+19
-5
application.yml
wisenergy-web-admin/src/main/resources/application.yml
+3
-3
application.properties
...b/xxl-job-admin/src/main/resources/application.properties
+6
-6
message_en.properties
...l-job-admin/src/main/resources/i18n/message_en.properties
+1
-1
message_zh_CN.properties
...ob-admin/src/main/resources/i18n/message_zh_CN.properties
+1
-1
message_zh_TC.properties
...ob-admin/src/main/resources/i18n/message_zh_TC.properties
+1
-1
logback.xml
xxl-job/xxl-job-admin/src/main/resources/logback.xml
+1
-1
common.macro.ftl
...dmin/src/main/resources/templates/common/common.macro.ftl
+2
-11
help.ftl
xxl-job/xxl-job-admin/src/main/resources/templates/help.ftl
+0
-4
jobinfo.index.ftl
...in/src/main/resources/templates/jobinfo/jobinfo.index.ftl
+9
-9
login.ftl
xxl-job/xxl-job-admin/src/main/resources/templates/login.ftl
+1
-1
XxlJobFileAppender.java
...rc/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
+1
-1
No files found.
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/OrderMapper.java
View file @
c2d734ca
...
...
@@ -4,6 +4,7 @@ import cn.wisenergy.model.app.OrderInfo;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.math.BigDecimal
;
import
java.util.List
;
/**
...
...
@@ -31,4 +32,10 @@ public interface OrderMapper extends BaseMapper<OrderInfo> {
*/
OrderInfo
getByTid
(
@Param
(
"tid"
)
String
tid
);
/**
* 获取当前用户的业绩
* @param userId
* @return
*/
BigDecimal
getPerformanceByUserid
(
String
userId
);
}
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/RecommendUserMapper.java
View file @
c2d734ca
...
...
@@ -8,9 +8,21 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public
interface
RecommendUserMapper
extends
BaseMapper
<
RecommendUser
>
{
/**
* 获取用户直推信息
* @param userId 用户Id
* @return 用户直推信息
*/
RecommendUser
getByUserId
(
String
userId
);
//根据用户推荐人的userid,查询数据库用户直推表,看推荐人用户是否存在
Integer
zcByUserId
(
String
userid
);
/**
* 获取用户的直推用户总人数
* @param userId 用户Id
* @return 直推用户总人数
*/
Integer
getRecommendUserCountByUserId
(
String
userId
);
}
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/TeamPerformanceMapper.java
View file @
c2d734ca
...
...
@@ -60,4 +60,19 @@ public interface TeamPerformanceMapper extends BaseMapper<TeamPerformance> {
Double
countTwenty
(
@Param
(
"yearMonth"
)
String
yearMonth
);
List
<
TeamPerformance
>
userTwenty
(
@Param
(
"yearMonth"
)
String
yearMonth
);
/**
* 当前用户的团队总业绩
* @param userId 当前用户id
* @return 当前用户的团队累计总业绩金额
*/
Double
countUserTeamByUserId
(
@Param
(
"userId"
)
String
userId
);
/**
* 当前用户本月团队新增业绩
* @param userId 用户Id
* @return 当前用户本月团队新增业绩
*/
Double
monthUserTeamByuserId
(
@Param
(
"userid"
)
String
userId
,
@Param
(
"yearMonth"
)
String
yearMonth
);
}
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/TeamUserInfoMapper.java
View file @
c2d734ca
...
...
@@ -10,7 +10,20 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public
interface
TeamUserInfoMapper
extends
BaseMapper
<
TeamUserInfo
>
{
TeamUserInfo
getByUserId
(
String
userid
);
//
TeamUserInfo getByUserId(String userid);
//根据userId查询用户是否存在
Integer
czByUserId
(
String
userId
);
/**
* 获取用户的团队信息
* @param userId 用户Id
* @return 用户的团队信息
*/
TeamUserInfo
getByUserId
(
String
userId
);
/**
* 获取用户的团队总人数
* @param userId 用户Id
* @return 团队总人数
*/
Integer
getTeamUserCount
(
String
userId
);
}
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UsersMapper.java
View file @
c2d734ca
...
...
@@ -106,4 +106,11 @@ public interface UsersMapper extends BaseMapper<User> {
Integer
insertbyint
(
@Param
(
"userId"
)
String
userId
,
@Param
(
"beInvitedCode"
)
String
beInvitedCode
);
Integer
edit1
(
@Param
(
"userId"
)
String
userId
);
Integer
getuserIdById
(
@Param
(
"userId"
)
String
userId
);
/**
* 根据userid获取获取所有的直接推荐人
* @param inviteCode 用户本人的邀请码
* @return 所有填写此人的邀请码的用户
*/
List
<
User
>
getByInviteCode
(
@Param
(
"inviteCode"
)
String
inviteCode
,
@Param
(
"userlevel"
)
int
userLevel
);
}
wisenergy-mapper/src/main/resources/mapper/OrderMapper.xml
View file @
c2d734ca
...
...
@@ -113,4 +113,14 @@
</where>
</select>
<select
id=
"getPerformanceByUserid"
resultType=
"java.math.BigDecimal"
>
select
sum(payment)
from
<include
refid=
"table"
/>
<where>
buyer_id=#{userid}
</where>
</select>
</mapper>
\ No newline at end of file
wisenergy-mapper/src/main/resources/mapper/RecommendUserMapper.xml
View file @
c2d734ca
...
...
@@ -15,6 +15,8 @@
<result
column=
"partner_num"
property=
"partnerNum"
/>
<result
column=
"create_time"
property=
"createTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
<result
column=
"monthy_count"
property=
"monthyCount"
/>
<result
column=
"history_count"
property=
"historyCount"
/>
</resultMap>
<sql
id=
"table"
>
...
...
@@ -28,12 +30,12 @@
<sql
id=
"cols_exclude_id"
>
user_id,normal_user_num,seedling_num,bronze_tree_num,silver_tree_num,
gold_tree_num,farmer_num,forest_start_num,partner_num,create_time,update_time
gold_tree_num,farmer_num,forest_start_num,partner_num,create_time,update_time
,monthy_count,history_count
</sql>
<sql
id=
"vals"
>
#{userId},#{normalUserNum},#{seedlingNum},#{bronzeTreeNum},#{silverTreeNum},
#{goldTreeNum},#{farmerNum},#{forestStartNum},#{partnerNum},now(),now()
#{goldTreeNum},#{farmerNum},#{forestStartNum},#{partnerNum},now(),now()
,#{monthy_count},#{history_count}
</sql>
<sql
id=
"updateCondition"
>
...
...
@@ -45,6 +47,8 @@
<if
test=
"farmerNum != null"
>
referrer_num =#{farmerNum},
</if>
<if
test=
"forestStartNum != null"
>
referrer_num =#{forestStartNum},
</if>
<if
test=
"partnerNum != null"
>
referrer_num =#{partnerNum},
</if>
<if
test=
"monthyCount != null"
>
referrer_num =#{monthyCount},
</if>
<if
test=
"historyCount != null"
>
referrer_num =#{historyCount},
</if>
update_time =now()
</sql>
...
...
@@ -60,6 +64,8 @@
<if
test=
"partnerNum != null"
>
and referrer_num =#{partnerNum},
</if>
<if
test=
"createTime != null"
>
and create_time
>
= #{createTime}
</if>
<if
test=
"updateTime != null"
>
and #{updateTime}
>
= update_time
</if>
<if
test=
"monthyCount != null"
>
and #{monthyCount}
>
= monthyCount
</if>
<if
test=
"historyCount != null"
>
and #{historyCount}
>
= historyCount
</if>
</sql>
<select
id=
"getByUserId"
resultType=
"cn.wisenergy.model.app.RecommendUser"
>
...
...
@@ -83,4 +89,15 @@
</select>
<!--用户信息插入用户直推表-->
<select
id=
"getRecommendUserCountByUserId"
resultType=
"java.lang.Integer"
>
select
(normal_user_num+seedling_num+bronze_tree_num+silver_tree_num+
gold_tree_num+farmer_num+forest_start_num+partner_num) AS RecommendUserCount
from
<include
refid=
"table"
/>
<where>
user_id=#{userId}
</where>
</select>
</mapper>
\ No newline at end of file
wisenergy-mapper/src/main/resources/mapper/TeamPerformanceMapper.xml
View file @
c2d734ca
...
...
@@ -164,4 +164,22 @@
</where>
</select>
<select
id=
"countUserTeamByUserId"
resultType=
"double"
>
select sum(month_team_performance)
from
<include
refid=
"table"
/>
<where>
user_id=#{userId}
</where>
</select>
<select
id=
"monthUserTeamByuserId"
resultType=
"double"
>
select month_team_performance
from
<include
refid=
"table"
/>
<where>
user_id=#{userid}
and `year_month` = #{yearMonth}
</where>
</select>
</mapper>
\ No newline at end of file
wisenergy-mapper/src/main/resources/mapper/TeamUserInfoMapper.xml
View file @
c2d734ca
...
...
@@ -83,4 +83,14 @@
</select>
<select
id=
"getTeamUserCount"
resultType=
"java.lang.Integer"
>
select
(normal_user_num+seedling_num+bronze_tree_num+silver_tree_num+
gold_tree_num+farmer_num+forest_start_num+partner_num) AS teamUserCount
from
<include
refid=
"table"
/>
<where>
user_id=#{userId}
</where>
</select>
</mapper>
\ No newline at end of file
wisenergy-mapper/src/main/resources/mapper/UsersMapper.xml
View file @
c2d734ca
...
...
@@ -268,5 +268,17 @@
</if>
</select>
<!-- 获取当前用户的所有直接推荐人-->
<select
id=
"getByInviteCode"
resultType=
"cn.wisenergy.model.app.User"
parameterType=
"string"
>
select
<include
refid=
"cols_all"
/>
from
<include
refid=
"table"
/>
<where>
be_invited_code=#{inviteCode}
</where>
and user_level=#{userlevel}
</select>
</mapper>
wisenergy-model/src/main/java/cn/wisenergy/model/app/RecommendUser.java
View file @
c2d734ca
...
...
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
import
java.util.Date
;
/**
...
...
@@ -91,4 +92,16 @@ public class RecommendUser implements Serializable {
*/
@ApiModelProperty
(
name
=
"updateTime"
,
value
=
"更新时间"
)
private
Date
updateTime
;
/**
* 用户当月消费金额
*/
@ApiModelProperty
(
name
=
"monthyCount"
,
value
=
"用户当月消费金额"
)
private
BigDecimal
monthyCount
;
/**
* 用户当月消费金额
*/
@ApiModelProperty
(
name
=
"history_count"
,
value
=
"用户累计消费金额"
)
private
BigDecimal
historyCount
;
}
wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserAndRecommendVo.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
model
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
lombok.Data
;
import
java.math.BigDecimal
;
@Data
@ApiModel
(
"UserAndRecommendVo"
)
public
class
UserAndRecommendVo
{
/**
* 用户id
*/
private
String
userId
;
/**
* 当月消费金额
*/
private
BigDecimal
monthyCount
;
/**
* 累计消费金额
*/
private
BigDecimal
historyCount
;
}
wisenergy-service/pom.xml
View file @
c2d734ca
...
...
@@ -95,6 +95,11 @@
<artifactId>
open-sdk-common
</artifactId>
<version>
1.0.7-RELEASE
</version>
</dependency>
<dependency>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-core
</artifactId>
<version>
1.9.2
</version>
</dependency>
</dependencies>
<!-- MAVEN构建 -->
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/OrderService.java
View file @
c2d734ca
...
...
@@ -10,7 +10,16 @@ import com.youzan.cloud.open.sdk.gen.v4_0_0.model.YouzanTradesSoldGetResult;
* @author 86187
*/
public
interface
OrderService
{
/**
* 根据有赞的订单创建时间获取订单数据
* @throws SDKException
*/
void
getYouZanOrdersForCreateTime
()
throws
SDKException
;
/**
* 根据有赞的订单修改时间获取订单数据
* @throws SDKException
*/
void
getYouZanOrdersForUpdateTime
()
throws
SDKException
;
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/RecommendUserService.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.model.app.RecommendUser
;
import
cn.wisenergy.model.app.User
;
import
cn.wisenergy.model.vo.UserAndRecommendVo
;
import
java.util.List
;
public
interface
RecommendUserService
{
RecommendUser
getMyRecommed
(
String
userId
);
List
<
UserAndRecommendVo
>
getMyRecommendInfo
(
String
userId
,
Integer
userLevel
);
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/TeamUserInfoService.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
;
import
cn.wisenergy.model.app.TeamUserInfo
;
public
interface
TeamUserInfoService
{
TeamUserInfo
getOneById
(
String
userId
);
/**
* 获取团队总人数
* @param userId 用户Id
* @return 用户团队总人数
*/
int
getTeamUserCount
(
String
userId
);
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/UserForestStatusService.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
;
import
java.util.Map
;
public
interface
UserForestStatusService
{
/**
* 用户森林状态
* @param userId
* @return
*/
Map
getUserForestStatus
(
String
userId
);
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/OrderServiceImpl.java
View file @
c2d734ca
...
...
@@ -143,9 +143,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
try
{
// startUpdateDate = sdf.parse("2021-02-28 11:04:01");
// endUpdateDate = sdf.parse("2021-03-2 16:39:59");
start
Created
Date
=
sdf
.
parse
(
sdf
.
format
(
new
Date
(
date
.
getTime
()-(
long
)
80
*
24
*
60
*
60
*
1000
)));
start
Update
Date
=
sdf
.
parse
(
sdf
.
format
(
new
Date
(
date
.
getTime
()-(
long
)
80
*
24
*
60
*
60
*
1000
)));
log
.
info
(
"订单修改开始时间"
+
sdf
.
format
(
startUpdateDate
));
start
UpdateDate
=
sdf
.
parse
(
sdf
.
format
(
date
));
end
UpdateDate
=
sdf
.
parse
(
sdf
.
format
(
date
));
log
.
info
(
"订单修改结束时间"
+
sdf
.
format
(
endUpdateDate
));
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
...
...
@@ -162,8 +162,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
YouzanTradesSoldGetResult
.
YouzanTradesSoldGetResultOrderinfo
youzanOrderInfo
=
youzanTradesSoldGetResultFullorderinfolist
.
getFullOrderInfo
().
getOrderInfo
();
YouzanTradesSoldGetResult
.
YouzanTradesSoldGetResultPayinfo
payInfo
=
youzanTradesSoldGetResultFullorderinfolist
.
getFullOrderInfo
().
getPayInfo
();
log
.
info
(
youzanTradesSoldGetResultFullorderinfolist
.
toString
());
//根据修改时间获取到的有赞订单数据的Tid
String
tid
=
youzanOrderInfo
.
getTid
();
OrderInfo
orderByTid
=
orderMapper
.
getByTid
(
tid
);
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/RecommendUserServiceImpl.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
.
impl
;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.mapper.RecommendUserMapper
;
import
cn.wisenergy.mapper.UsersMapper
;
import
cn.wisenergy.model.app.RecommendUser
;
import
cn.wisenergy.model.app.User
;
import
cn.wisenergy.model.vo.UserAndRecommendVo
;
import
cn.wisenergy.service.app.RecommendUserService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@Service
@Slf4j
public
class
RecommendUserServiceImpl
implements
RecommendUserService
{
@Autowired
RecommendUserMapper
recommendUserMapper
;
@Autowired
UsersMapper
usersMapper
;
/**
* 获取用户的直推信息表数据
* @param userId
* @return
*/
@Override
public
RecommendUser
getMyRecommed
(
String
userId
)
{
return
recommendUserMapper
.
getByUserId
(
userId
);
}
public
List
<
UserAndRecommendVo
>
getMyRecommendInfo
(
String
userId
,
Integer
userLevel
){
//当前用户的邀请码
String
userIntiveCode
=
usersMapper
.
getByUserId
(
userId
).
getInviteCode
();
//通过用户的邀请码获取各个等级的直推用户信息
List
<
User
>
byInviteCode
=
usersMapper
.
getByInviteCode
(
userIntiveCode
,
userLevel
);
List
<
UserAndRecommendVo
>
userAndRecommendVos
=
new
ArrayList
<>();
for
(
User
user
:
byInviteCode
)
{
UserAndRecommendVo
userAndRecommendVo
=
new
UserAndRecommendVo
();
userAndRecommendVo
.
setUserId
(
user
.
getUserId
());
userAndRecommendVo
.
setMonthyCount
(
recommendUserMapper
.
getByUserId
(
userId
).
getMonthyCount
());
userAndRecommendVo
.
setHistoryCount
(
recommendUserMapper
.
getByUserId
(
userId
).
getHistoryCount
());
userAndRecommendVos
.
add
(
userAndRecommendVo
);
}
return
userAndRecommendVos
;
}
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/TeamUserInfoServiceImpl.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
.
impl
;
import
cn.wisenergy.mapper.TeamUserInfoMapper
;
import
cn.wisenergy.model.app.TeamUserInfo
;
import
cn.wisenergy.service.app.TeamUserInfoService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
@Service
@Slf4j
public
class
TeamUserInfoServiceImpl
implements
TeamUserInfoService
{
@Autowired
TeamUserInfoMapper
teamUserInfoMapper
;
/**
* 根据用户id获取用户的团队信息
* @param userId
* @return
*/
@Override
public
TeamUserInfo
getOneById
(
String
userId
)
{
TeamUserInfo
byUserId
=
teamUserInfoMapper
.
getByUserId
(
userId
);
return
byUserId
;
}
/**
* 获取团队总人数
* @param userId 用户Id
* @return 用户团队总人数
*/
@Override
public
int
getTeamUserCount
(
String
userId
){
int
teamUserCount
=
teamUserInfoMapper
.
getTeamUserCount
(
userId
);
return
teamUserCount
;
}
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserForestStatusServiceImpl.java
0 → 100644
View file @
c2d734ca
package
cn
.
wisenergy
.
service
.
app
.
impl
;
import
cn.wisenergy.common.utils.DateUtil
;
import
cn.wisenergy.mapper.*
;
import
cn.wisenergy.model.app.RecommendUser
;
import
cn.wisenergy.model.app.TeamPerformance
;
import
cn.wisenergy.model.app.TeamUserInfo
;
import
cn.wisenergy.service.app.UserForestStatusService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.xml.ws.soap.Addressing
;
import
java.math.BigDecimal
;
import
java.sql.Time
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 用户森林状态
* @author 86187
*/
@Service
@Slf4j
public
class
UserForestStatusServiceImpl
implements
UserForestStatusService
{
@Autowired
UsersMapper
usersMapper
;
@Autowired
RecommendUserMapper
recommendUserMapper
;
@Autowired
TeamUserInfoMapper
teamUserInfoMapper
;
@Autowired
TeamPerformanceMapper
teamPerformanceMapper
;
@Autowired
OrderMapper
orderMapper
;
/**
* 根据用户id获取用户森林状态
* @param userId
* @return
*/
//todo:团队当月新增业绩
@Override
public
Map
getUserForestStatus
(
String
userId
)
{
//用户升级条件
BigDecimal
levelTerm
=
new
BigDecimal
(
3980
);
HashMap
<
Object
,
Object
>
userForestStatusMap
=
new
HashMap
<>();
String
date
=
DateUtil
.
convertDateToStr
(
new
Date
(),
"yyyy-MM"
);
//1.获取当前用户的等级
Integer
userLevel
=
usersMapper
.
getByUserId
(
userId
).
getUserLevel
();
//2.获取当前用户的直推总人数
Integer
recommendUserCountByUserId
=
recommendUserMapper
.
getRecommendUserCountByUserId
(
userId
);
//3.获取当前用户的团队总人数
Integer
teamUserCount
=
teamUserInfoMapper
.
getTeamUserCount
(
userId
);
//4.团队累计总业绩
Double
teamCountDouble
=
teamPerformanceMapper
.
countUserTeamByUserId
(
userId
);
//5.团队当月新增业绩
Double
teamNowCount
=
teamPerformanceMapper
.
monthUserTeamByuserId
(
userId
,
date
);
//用户直推表信息
RecommendUser
recommendUserMapperByUserId
=
recommendUserMapper
.
getByUserId
(
userId
);
//用户团队表信息
TeamUserInfo
teamUserInfobyUserId
=
teamUserInfoMapper
.
getByUserId
(
userId
);
//距离下级直推用户还需增加的数量
int
recommend
=
0
;
//距离下级团队用户还需增加的数量
int
team
=
0
;
//6.距离下级升级条件
if
(
userLevel
<
2
){
//用户等级 < 幼苗 显示业绩缺少额度
//获取当前用户的业绩
BigDecimal
performanceByUserid
=
orderMapper
.
getPerformanceByUserid
(
userId
);
//距离升级还差多少额度
BigDecimal
difference
=
levelTerm
.
subtract
(
performanceByUserid
);
userForestStatusMap
.
put
(
"difference"
,
difference
);
}
else
if
(
userLevel
==
2
){
//用户等级为青铜树
int
levelTerm1
=
20
;
Integer
seedlingNum
=
recommendUserMapperByUserId
.
getSeedlingNum
();
recommend
=
levelTerm1
-
seedlingNum
;
userForestStatusMap
.
put
(
"recommend"
,
recommend
);
}
else
if
(
userLevel
==
3
){
//用户等级为白银树
int
goldLevelRecommend
=
54
;
int
goldLevelteam
=
20
;
//直推用户之和
Integer
countRecommend
=
recommendUserMapperByUserId
.
getSeedlingNum
()+
recommendUserMapperByUserId
.
getSilverTreeNum
();
//所差直推用户的数量
recommend
=
goldLevelRecommend
-
countRecommend
;
//所差团队用户的数量
team
=
goldLevelteam
-
teamUserInfobyUserId
.
getBronzeTreeNum
();
userForestStatusMap
.
put
(
"recommend"
,
recommend
);
userForestStatusMap
.
put
(
"team"
,
team
);
}
else
if
(
userLevel
==
4
){
//用户等级为黄金树
int
farmerLevelRecommend
=
73
;
int
fammerLevelTeam
=
40
;
//用户直推之和
Integer
countRecommend
=
recommendUserMapperByUserId
.
getSeedlingNum
()+
recommendUserMapperByUserId
.
getGoldTreeNum
();
//用户团队之和
Integer
countTeam
=
teamUserInfobyUserId
.
getSilverTreeNum
();
//所差直推用户的数量
recommend
=
farmerLevelRecommend
-
countRecommend
;
//所差团队用户的数量
team
=
fammerLevelTeam
-
teamUserInfobyUserId
.
getBronzeTreeNum
();
userForestStatusMap
.
put
(
"recommend"
,
recommend
);
userForestStatusMap
.
put
(
"team"
,
team
);
}
else
if
(
userLevel
==
5
){
//用户等级为农场主
int
farmerLevelRecommend
=
73
;
int
fammerLevelTeam
=
40
;
//用户直推之和
Integer
countRecommend
=
recommendUserMapperByUserId
.
getSeedlingNum
()+
recommendUserMapperByUserId
.
getGoldTreeNum
();
//用户团队之和
Integer
countTeam
=
teamUserInfobyUserId
.
getSilverTreeNum
();
//所差直推用户的数量
recommend
=
farmerLevelRecommend
-
countRecommend
;
//所差团队用户的数量
team
=
fammerLevelTeam
-
teamUserInfobyUserId
.
getBronzeTreeNum
();
userForestStatusMap
.
put
(
"recommend"
,
recommend
);
userForestStatusMap
.
put
(
"team"
,
team
);
}
else
if
(
userLevel
==
6
){
//用户等级为森林之星
int
forestStartNumLevelRecommend
=
101
;
int
forestStartNumLevelTeam
=
170
;
//用户直推之和
Integer
countRecommend
=
recommendUserMapperByUserId
.
getSeedlingNum
()+
recommendUserMapperByUserId
.
getForestStartNum
();
//用户团队之和
Integer
countTeam
=
teamUserInfobyUserId
.
getSilverTreeNum
()+
teamUserInfobyUserId
.
getGoldTreeNum
()+
teamUserInfobyUserId
.
getFarmerNum
();
//所差直推用户的数量
recommend
=
forestStartNumLevelRecommend
-
countRecommend
;
//所差团队用户的数量
team
=
forestStartNumLevelTeam
-
countTeam
;
userForestStatusMap
.
put
(
"recommend"
,
recommend
);
userForestStatusMap
.
put
(
"team"
,
team
);
}
userForestStatusMap
.
put
(
"userLevel"
,
userLevel
);
userForestStatusMap
.
put
(
"recommendUserCount"
,
recommendUserCountByUserId
);
userForestStatusMap
.
put
(
"teamUserCount"
,
teamUserCount
);
if
(
teamCountDouble
==
null
){
userForestStatusMap
.
put
(
"teamCountDouble"
,
0
);
}
else
{
userForestStatusMap
.
put
(
"teamCountDouble"
,
teamCountDouble
);
}
if
(
teamNowCount
==
null
){
userForestStatusMap
.
put
(
"teamNowCount"
,
0
);
}
else
{
userForestStatusMap
.
put
(
"teamNowCount"
,
teamNowCount
);
}
return
userForestStatusMap
;
}
// public
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLevelServiceImlp.java
View file @
c2d734ca
...
...
@@ -56,6 +56,7 @@ public class UserLevelServiceImlp extends ServiceImpl<UsersMapper,User> implemen
//用户等级升级为幼苗 1
//若当前用户等级为0(普通用户)且跨境额度(业绩消费金额)>= 3980 进行升级0-->1
//todo:根据业绩去计算 查一次表获取业绩
if
(
userLevel
==
0
&&
crossBorderLine
.
intValue
()
>=
3980
){
user
.
setUserLevel
(
1
);
usersMapper
.
updateById
(
user
);
...
...
@@ -435,6 +436,7 @@ public class UserLevelServiceImlp extends ServiceImpl<UsersMapper,User> implemen
teamNumInfoBuyId
.
setNormalUserNum
(
teamNumInfoBuyId
.
getNormalUserNum
()-
1
);
}
//邀请人的团队用户信息表中幼苗数量 + 1
//第一波用户是谁邀请的
teamNumInfoBuyId
.
setSeedlingNum
(
teamNumInfoBuyId
.
getSeedlingNum
()
+
1
);
teamUserInfoMapper
.
updateById
(
teamNumInfoBuyId
);
if
(
"1"
.
equals
(
intiveUserByUserId
.
getBeInvitedCode
())){
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserServiceImpl.java
View file @
c2d734ca
...
...
@@ -54,7 +54,7 @@ public class UserServiceImpl extends ServiceImpl<UsersMapper, User> implements U
@Override
public
User
getByUserId
(
String
userId
)
{
return
null
;
return
usersMapper
.
getByUserId
(
userId
)
;
}
...
...
wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserController.java
View file @
c2d734ca
...
...
@@ -3,21 +3,36 @@ package cn.wisenergy.web.admin.controller.app;
import
cn.wisenergy.common.constant.RedisConsts
;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.common.utils.RedisUtils
;
import
cn.wisenergy.common.utils.StringUtil
;
import
cn.wisenergy.mapper.RecommendUserMapper
;
import
cn.wisenergy.mapper.TeamUserInfoMapper
;
import
cn.wisenergy.model.app.RecommendUser
;
import
cn.wisenergy.model.app.TeamUserInfo
;
import
cn.wisenergy.model.app.User
;
import
cn.wisenergy.model.app.UsersDto
;
import
cn.wisenergy.model.vo.UserAndRecommendVo
;
import
cn.wisenergy.service.app.RecommendUserService
;
import
cn.wisenergy.service.app.TeamUserInfoService
;
import
cn.wisenergy.service.app.UserForestStatusService
;
import
cn.wisenergy.service.app.UserService
;
import
cn.wisenergy.web.common.BaseController
;
import
cn.wisenergy.web.config.JwtConfig
;
import
cn.wisenergy.web.shiro.JwtUtil
;
import
cn.wisenergy.web.sms.*
;
import
com.alibaba.druid.sql.ast.statement.SQLIfStatement
;
import
com.alibaba.fastjson.JSONObject
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.*
;
import
java.time.Month
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
...
...
@@ -32,6 +47,15 @@ public class UserController extends BaseController {
@Autowired
private
UserService
userService
;
@Autowired
private
UserForestStatusService
userForestStatusService
;
@Autowired
RecommendUserService
recommendUserService
;
@Autowired
TeamUserInfoService
teamUserInfoService
;
@Autowired
private
JwtUtil
jwtUtil
;
...
...
@@ -73,4 +97,45 @@ public class UserController extends BaseController {
return
R
.
ok
(
token
);
}
@ApiOperation
(
value
=
"获取用户森林状态接口"
,
notes
=
"获取用户森林状态接口"
,
httpMethod
=
"GET"
)
@GetMapping
(
"/forestStatus"
)
public
R
<
Map
>
forestStatus
(
String
userId
){
if
(
null
==
userId
){
return
R
.
error
(
"入参为空"
);
}
try
{
Map
userForestStatus
=
userForestStatusService
.
getUserForestStatus
(
userId
);
return
R
.
ok
(
userForestStatus
);
}
catch
(
Exception
e
)
{
return
R
.
error
(
1
,
"请重新尝试"
);
}
}
@ApiOperation
(
value
=
"获取用户我的直推信息"
,
notes
=
"获取用户我的直推信息"
,
httpMethod
=
"GET"
)
@GetMapping
(
"/myRecommend"
)
public
R
<
Map
>
getMyRecommend
(
String
userId
){
int
userLevel
=
userService
.
getByUserId
(
userId
).
getUserLevel
();
RecommendUser
myRecommed
=
recommendUserService
.
getMyRecommed
(
userId
);
Map
myRecommedMap
=
new
HashMap
();
myRecommedMap
.
put
(
"userlevel"
,
userLevel
);
myRecommedMap
.
put
(
"myRecommed"
,
myRecommed
);
return
R
.
ok
(
myRecommedMap
);
}
@ApiOperation
(
value
=
"获取用户我的团队信息"
,
notes
=
"获取用户我的团队推信息"
,
httpMethod
=
"GET"
)
@GetMapping
(
"/myTeam"
)
public
R
<
TeamUserInfo
>
getMyTeam
(
String
userId
){
TeamUserInfo
myTeam
=
teamUserInfoService
.
getOneById
(
userId
);
return
R
.
ok
(
myTeam
);
}
@ApiOperation
(
value
=
"获取用户我的直推信息详情"
,
notes
=
"获取用户我的直推信息详情"
,
httpMethod
=
"GET"
)
@GetMapping
(
"/myRecommendInfo"
)
public
R
<
List
<
UserAndRecommendVo
>>
getMyRecommendInfo
(
@RequestParam
(
"userid"
)
String
userid
,
@RequestParam
(
"userlevel"
)
int
userlevel
){
List
<
UserAndRecommendVo
>
myRecommendInfo
=
recommendUserService
.
getMyRecommendInfo
(
userid
,
userlevel
);
return
R
.
ok
(
myRecommendInfo
);
}
}
wisenergy-web-admin/src/main/resources/application-test.yml
View file @
c2d734ca
...
...
@@ -32,21 +32,35 @@ spring:
wall
:
config
:
multi-statement-allow
:
true
#/www/server/redis/src/redis-server
redis
:
open
:
false
# 是否开启redis缓存 true开启 false关闭
database
:
0
host
:
39.97.107.31
port
:
6379
password
:
1qaz@WSX
# 密码(默认为空)
timeout
:
6000ms
# 连接超时时长(毫秒)
password
:
timeout
:
6000ms
jedis
:
pool
:
max-active
:
1000
# 连接池最大连接数(使用负值表示没有限制)
max-wait
:
-1ms
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle
:
10
# 连接池中的最大空闲连接
min-idle
:
5
# 连接池中的最小空闲连接
#jwt:
#jwt:
## # 加密秘钥
## secret: f4e2e52034348f86b67cde581c0f9eb5
## # token有效时长,单位秒
## expire: 14400
xxl
:
job
:
accessToken
:
admin
:
addresses
:
http://127.0.0.1:8090/job-admin
executor
:
address
:
appname
:
shop-mall
ip
:
127.0.0.1
logpath
:
/home/meepo/logs/xxl-job/jobhandler
logretentiondays
:
30
port
:
9999
wisenergy-web-admin/src/main/resources/application.yml
View file @
c2d734ca
server
:
tomcat
:
uri-encoding
:
UTF-8
max-threads
:
1000
min-spare-threads
:
30
threads
:
max
:
1000
min-spare
:
30
port
:
8997
connection-timeout
:
5000ms
spring
:
main
:
...
...
xxl-job/xxl-job-admin/src/main/resources/application.properties
View file @
c2d734ca
### web
server.port
=
80
8
0
server.servlet.context-path
=
/
xxl-
job-admin
server.port
=
80
9
0
server.servlet.context-path
=
/job-admin
### actuator
management.server.servlet.context-path
=
/actuator
...
...
@@ -24,14 +24,14 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### xxl-job, datasource
spring.datasource.url
=
jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username
=
root
spring.datasource.password
=
root_pw
d
spring.datasource.username
=
xxl_job
spring.datasource.password
=
6EmAWkCtwc5SjKx
d
spring.datasource.driver-class-name
=
com.mysql.cj.jdbc.Driver
### datasource-pool
spring.datasource.type
=
com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle
=
10
spring.datasource.hikari.maximum-pool-size
=
3
0
spring.datasource.hikari.minimum-idle
=
5
spring.datasource.hikari.maximum-pool-size
=
1
0
spring.datasource.hikari.auto-commit
=
true
spring.datasource.hikari.idle-timeout
=
30000
spring.datasource.hikari.pool-name
=
HikariCP
...
...
xxl-job/xxl-job-admin/src/main/resources/i18n/message_en.properties
View file @
c2d734ca
admin_name
=
Scheduling Center
admin_name_full
=
Distributed Task Scheduling Platform
XXL-JOB
admin_name_full
=
Distributed Task Scheduling Platform
admin_version
=
2.3.0
admin_i18n
=
en
...
...
xxl-job/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties
View file @
c2d734ca
admin_name
=
任务调度中心
admin_name_full
=
分布式任务调度平台
XXL-JOB
admin_name_full
=
分布式任务调度平台
admin_version
=
2.3.0
admin_i18n
=
...
...
xxl-job/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties
View file @
c2d734ca
admin_name
=
任務調度中心
admin_name_full
=
分布式任務調度平臺
XXL-JOB
admin_name_full
=
分布式任務調度平臺
admin_version
=
2.3.0
admin_i18n
=
...
...
xxl-job/xxl-job-admin/src/main/resources/logback.xml
View file @
c2d734ca
...
...
@@ -2,7 +2,7 @@
<configuration
debug=
"false"
scan=
"true"
scanPeriod=
"1 seconds"
>
<contextName>
logback
</contextName>
<property
name=
"log.path"
value=
"/
data/app
logs/xxl-job/xxl-job-admin.log"
/>
<property
name=
"log.path"
value=
"/
home/meepo/
logs/xxl-job/xxl-job-admin.log"
/>
<appender
name=
"console"
class=
"ch.qos.logback.core.ConsoleAppender"
>
<encoder>
...
...
xxl-job/xxl-job-admin/src/main/resources/templates/common/common.macro.ftl
View file @
c2d734ca
...
...
@@ -67,7 +67,7 @@
<#macro commonHeader>
<header class="main-header">
<a href="${request.contextPath}/" class="logo">
<span class="logo-mini"><b>
XXL
</b></span>
<span class="logo-mini"><b>
任务调度系统
</b></span>
<span class="logo-lg"><b>${I18n.admin_name}</b></span>
</a>
<nav class="navbar navbar-static-top" role="navigation">
...
...
@@ -226,14 +226,5 @@
</#macro>
<#macro commonFooter >
<footer class="main-footer">
Powered by <b>XXL-JOB</b> ${I18n.admin_version}
<div class="pull-right hidden-xs">
<strong>Copyright © 2015-${.now?string('yyyy')}
<a href="https://www.xuxueli.com/" target="_blank" >xuxueli</a>
<a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>
</strong><!-- All rights reserved. -->
</div>
</footer>
<footer class="main-footer"></footer>
</#macro>
\ No newline at end of file
xxl-job/xxl-job-admin/src/main/resources/templates/help.ftl
View file @
c2d734ca
...
...
@@ -25,12 +25,8 @@
<h4>
${I18n.admin_name_full}
</h4>
<br>
<p>
<a
target=
"_blank"
href=
"https://github.com/xuxueli/xxl-job"
>
Github
</a>
<iframe
src=
"https://ghbtns.com/github-btn.html?user=xuxueli&repo=xxl-job&type=star&count=true"
frameborder=
"0"
scrolling=
"0"
width=
"170px"
height=
"20px"
style=
"margin-bottom:-5px;"
></iframe>
<br><br>
<a
target=
"_blank"
href=
"https://www.xuxueli.com/xxl-job/"
>
${I18n.job_help_document}
</a>
<br><br>
</p>
<p></p>
</div>
...
...
xxl-job/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl
View file @
c2d734ca
...
...
@@ -243,23 +243,23 @@
<input
type=
"hidden"
name=
"glueRemark"
value=
"GLUE代码初始化"
>
<textarea
name=
"glueSource"
style=
"display:none;"
></textarea>
<textarea
class=
"glueSource_java"
style=
"display:none;"
>
package c
om.xxl
.job.service.handler;
package c
n.wisenergy
.job.service.handler;
import c
om.xxl
.job.core.context.XxlJobHelper;
import c
om.xxl
.job.core.handler.IJobHandler;
import c
n.wisenergy
.job.core.context.XxlJobHelper;
import c
n.wisenergy
.job.core.handler.IJobHandler;
public class DemoGlueJobHandler extends IJobHandler {
@Override
public void execute() throws Exception {
XxlJobHelper.log("XXL-JOB,
Hello World.");
JobHelper.log("
Hello World.");
}
}
</textarea>
<textarea
class=
"glueSource_shell"
style=
"display:none;"
>
#!/bin/bash
echo "
xxl-job:
hello shell"
echo "hello shell"
echo "${I18n.jobinfo_script_location}:$0"
echo "${I18n.jobinfo_field_executorparam}:$1"
...
...
@@ -281,7 +281,7 @@ exit 0
import time
import sys
print "
xxl-job:
hello python"
print "hello python"
print "${I18n.jobinfo_script_location}:", sys.argv[0]
print "${I18n.jobinfo_field_executorparam}:", sys.argv[1]
...
...
@@ -303,7 +303,7 @@ logging.info("脚本文件:" + sys.argv[0])
<textarea
class=
"glueSource_php"
style=
"display:none;"
>
<?php
echo "
xxl-job:
hello php \n";
echo "hello php \n";
echo "${I18n.jobinfo_script_location}:$argv[0] \n";
echo "${I18n.jobinfo_field_executorparam}:$argv[1] \n";
...
...
@@ -317,7 +317,7 @@ logging.info("脚本文件:" + sys.argv[0])
</textarea>
<textarea
class=
"glueSource_nodejs"
style=
"display:none;"
>
#!/usr/bin/env node
console.log("
xxl-job:
hello nodejs")
console.log("hello nodejs")
var arguments = process.argv
...
...
@@ -333,7 +333,7 @@ console.log("Good bye!")
process.exit(0)
</textarea>
<textarea
class=
"glueSource_powershell"
style=
"display:none;"
>
Write-Host "
xxl-job:
hello powershell"
Write-Host "hello powershell"
Write-Host "${I18n.jobinfo_script_location}: " $MyInvocation.MyCommand.Definition
Write-Host "${I18n.jobinfo_field_executorparam}: "
...
...
xxl-job/xxl-job-admin/src/main/resources/templates/login.ftl
View file @
c2d734ca
...
...
@@ -9,7 +9,7 @@
<body
class=
"hold-transition login-page"
>
<div
class=
"login-box"
>
<div
class=
"login-logo"
>
<a><b>
XXL
</b>
JOB
</a>
<a><b>
任务调度系统
</b>
</a>
</div>
<form
id=
"loginForm"
method=
"post"
>
<div
class=
"login-box-body"
>
...
...
xxl-job/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
View file @
c2d734ca
...
...
@@ -28,7 +28,7 @@ public class XxlJobFileAppender {
* ---/2017-12-25/821.log
*
*/
private
static
String
logBasePath
=
"/
data/app
logs/xxl-job/jobhandler"
;
private
static
String
logBasePath
=
"/
home/meepo/
logs/xxl-job/jobhandler"
;
private
static
String
glueSrcPath
=
logBasePath
.
concat
(
"/gluesource"
);
public
static
void
initLogPath
(
String
logPath
){
// init
...
...
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