Commit 26afb2ba authored by licc's avatar licc

修改注册、充值、方案接口

parent dc063b1d
......@@ -14,5 +14,12 @@ public interface SchemeMapper extends BaseMapper<SchemeInfo> {
List<SchemeInfo> getList(Map<String,Object> map);
/**
* 编辑
* @param schemeInfo 编辑信息
* @return 结果
*/
int edit(SchemeInfo schemeInfo);
int count();
}
......@@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
* @author 86187
*/
public interface UserLimitMapper extends BaseMapper<UserLimit> {
UserLimit add(UserLimit userLimit);
int add(UserLimit userLimit);
int edit(UserLimit userLimit);
......
......@@ -70,6 +70,17 @@
</where>
</select>
<update id="edit" parameterType="cn.wisenergy.model.app.SchemeInfo">
UPDATE
<include refid="table"/>
<set>
<include refid="updateCondition"/>
</set>
<where>
id = #{id}
</where>
</update>
<select id="count" resultType="java.lang.Integer">
select count(1)
from
......
......@@ -113,7 +113,7 @@
<if test="downGrade != null">
and lowest_mark >#{downGrade}
</if>
<if test="volunteerIds != null ">
<if test="volunteerIds != null and volunteerIds.size > 0 ">
and id NOT IN
<foreach collection="volunteerIds" index="index" item="id" separator="," open="(" close=")">
#{id}
......
......@@ -11,7 +11,8 @@ import java.util.Date;
*@ Description: 充值记录展示Vo
*@ Author : 86187
*@ Date : 2021/1/13 17:14
*/
* @author 86187
*/
@Data
@ApiModel(value = "PayRecordShowVo")
public class PayRecordShowVo implements Serializable {
......
......@@ -11,7 +11,8 @@ import com.github.pagehelper.PageInfo;
*@ Description: 充值记录接口定义
*@ Author : 86187
*@ Date : 2021/1/13 17:13
*/
* @author 86187
*/
public interface PayRecordService {
/**
* 获取用户充值列表
......
......@@ -161,13 +161,16 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
//判断考生是否有报取资格
//专科类比分 = 本年录取分 -去年录取分 + 考生分数
double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
if (secondMajor < secondRule.getProfessionMin()) {
double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
Double.parseDouble(queryVo.getMajorGrade());
double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
Double.parseDouble(queryVo.getMajorGrade());
if (secondCulture < secondRule.getCultureMin() && secondMajor < secondRule.getProfessionMin()) {
return R.error("很抱歉,您的成绩不满足报考条件,无法查询!");
}
totalResult = firstRule.getNumber();
list = getArtsList(scoreInfo, firstRule, secondRule, className, professionName);
list = getArtsList(queryVo, firstRule, secondRule, className, professionName);
}
//(3)文学编导考生
......@@ -186,13 +189,16 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
//判断考生是否有报取资格
//专科类比分 = 本年录取分 -去年录取分 + 考生分数
double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
if (secondMajor < secondRule.getProfessionMin()) {
double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
Double.parseDouble(queryVo.getMajorGrade());
double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
Double.parseDouble(queryVo.getMajorGrade());
if (secondCulture < secondRule.getCultureMin() || secondMajor < secondRule.getProfessionMin()) {
return R.error("很抱歉,您的专业成绩不满足报考条件,无法查询!");
}
totalResult = firstRule.getNumber();
list = getLiteratureList(scoreInfo, firstRule, secondRule, className, professionName);
list = getLiteratureList(queryVo, firstRule, secondRule, className, professionName);
}
//(4)体育考生
......@@ -264,13 +270,8 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
return R.error("方案信息不存在!");
}
//todo 关联删除,需要加事务
//更新方案状态为 :1 删除
schemeInfo.setIsDelete(1);
int sum = baseMapper.updateById(schemeInfo);
if (sum == 0) {
return R.ok(1, false);
}
//根据方案id,获取志愿信息
QueryWrapper<Volunteer> queryWrapper = new QueryWrapper<>();
......@@ -278,14 +279,11 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
queryWrapper.eq("is_delete", 0);
List<Volunteer> list = volunteerMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(list)) {
return R.ok(0, true);
return R.ok(1, true);
}
int count = volunteerMapper.updateBySchemeId(schemeId);
if (list.size() != count) {
return R.ok(1, false);
}
return R.ok(0, true);
boolean bool = volunteerManager.deleteSchemeAndVolunteer(schemeInfo, schemeId, list.size());
return R.ok(bool);
}
@Override
......@@ -310,8 +308,6 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
}
/**
* 获取文化生志愿列表
*
......@@ -347,9 +343,7 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
list = volunteerMapper.getVolunteerList(map);
//如果数据不满足最大数量,取不限专业重最低分补充
if (list.size() < firstRule.getNumber()) {
List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
int total = firstRule.getNumber() - list.size();
List<Volunteer> fillList = fillUpVolunteer(volunteerIds, total, upGrade, downGrade);
List<Volunteer> fillList = fillUpVolunteer(list, firstRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
} else {
......@@ -357,9 +351,7 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
map.put("downGrade", downGrade);
list = volunteerMapper.getVolunteerList(map);
if (list.size() < firstRule.getNumber()) {
List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
int total = firstRule.getNumber() - list.size();
List<Volunteer> fillList = fillUpVolunteer(volunteerIds, total, upGrade, downGrade);
List<Volunteer> fillList = fillUpVolunteer(list, firstRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
}
......@@ -384,9 +376,7 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
int total = secondRule.getNumber() - list.size();
List<Volunteer> fillList = fillUpVolunteer(volunteerIds, total, upGrade, downGrade);
List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
} else {
......@@ -396,9 +386,7 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
int total = secondRule.getNumber() - list.size();
List<Volunteer> fillList = fillUpVolunteer(volunteerIds, total, upGrade, downGrade);
List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
}
......@@ -409,18 +397,18 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
/**
* 获取美术生志愿方案
*
* @param scoreInfo 考生成绩
* @param queryVo 考生成绩
* @param firstRule 本科规则
* @param secondRule 专科规则
* @param classNames 副科名称
* @param professionNames 专业名称
* @return 志愿方案列表
*/
private List<Volunteer> getArtsList(ScoreInfo scoreInfo, AdmissionRule firstRule, AdmissionRule secondRule,
private List<Volunteer> getArtsList(SchemeVo queryVo, AdmissionRule firstRule, AdmissionRule secondRule,
List<String> classNames, List<String> professionNames) {
//本科类比分 = 本年录取分 -去年录取分 + 考生分数
double culture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + scoreInfo.getCultureGrade();
double major = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + scoreInfo.getMajorGrade();
double culture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
double major = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
//计算综合成绩
double total = major * 750 / 300 * 0.7 + culture * 0.3;
......@@ -434,49 +422,66 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
if (culture >= firstRule.getCultureMin() && major >= firstRule.getProfessionMin()) {
//浮动分数
double upGrade = total + firstRule.getUpMark();
double downGrade = total + firstRule.getDownMark();
double downGrade = total - firstRule.getDownMark();
map.put("upGrade", upGrade);
map.put("downGrade", downGrade);
map.put("type", SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode());
list = volunteerMapper.getVolunteerList(map);
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Volunteer> fillList = fillUpVolunteer(list, firstRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
return list;
}
//专科科类比分 = 本年录取分 -去年录取分 + 考生分数
double secondRuleCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() + scoreInfo.getCultureGrade();
double secondRuleMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() + scoreInfo.getMajorGrade();
double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
Double.parseDouble(queryVo.getCultureGrade());
double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
Double.parseDouble(queryVo.getMajorGrade());
//计算综合成绩
double secondRuleTotal = secondRuleMajor * 750 / 300 * 0.7 + secondRuleCulture * 0.3;
double secondRuleTotal = secondMajor * 750 / 300 * 0.7 + secondCulture * 0.3;
//2、考生是否能报取美术专科
if (culture >= secondRule.getCultureMin() && major >= secondRule.getProfessionMin()) {
if (secondCulture >= secondRule.getCultureMin() && secondMajor >= secondRule.getProfessionMin()) {
//浮动分数
double upGrade = secondRuleTotal + secondRule.getUpMark();
double downGrade = secondRuleTotal + secondRule.getDownMark();
double downGrade = secondRuleTotal - secondRule.getDownMark();
map.put("upGrade", upGrade);
map.put("downGrade", downGrade);
map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_ARTS.getCode());
list = volunteerMapper.getVolunteerList(map);
}
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
}
return list;
}
/**
* 获取文学编导生志愿方案
*
* @param scoreInfo 考生成绩
* @param queryVo 考生成绩
* @param firstRule 本科规则
* @param secondRule 专科规则
* @param classNames 副科名称
* @param professionNames 专业名称
* @return 志愿方案列表
*/
private List<Volunteer> getLiteratureList(ScoreInfo scoreInfo, AdmissionRule firstRule, AdmissionRule secondRule,
private List<Volunteer> getLiteratureList(SchemeVo queryVo, AdmissionRule firstRule, AdmissionRule secondRule,
List<String> classNames, List<String> professionNames) {
double culture = scoreInfo.getCultureGrade();
double major = scoreInfo.getMajorGrade();
//本科类比分 = 本年录取分 -去年录取分 + 考生分数
double culture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
double major = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
//计算综合成绩
double total = major * 750 / 300 * 0.7 + culture * 0.3;
double total = major * 750 / 300 * 0.3 + culture * 0.7;
Map<String, Object> map = new HashMap<>(16);
map.put("number", firstRule.getNumber());
......@@ -488,23 +493,41 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
if (culture >= firstRule.getCultureMin() && major >= firstRule.getProfessionMin()) {
//浮动分数
double upGrade = total + firstRule.getUpMark();
double downGrade = total + firstRule.getDownMark();
double downGrade = total - firstRule.getDownMark();
map.put("upGrade", upGrade);
map.put("downGrade", downGrade);
map.put("type", SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode());
list = volunteerMapper.getVolunteerList(map);
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
return list;
}
//本科类比分 = 本年录取分 -去年录取分 + 考生分数
double cultureSecond = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
double majorSecond = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
//计算综合成绩
double totalSecond = majorSecond * 750 / 300 * 0.3 + cultureSecond * 0.7;
//2、考生是否能报取美术专科
if (culture >= secondRule.getCultureMin() && major >= secondRule.getProfessionMin()) {
if (cultureSecond >= secondRule.getCultureMin() && majorSecond >= secondRule.getProfessionMin()) {
//浮动分数
double upGrade = total + secondRule.getUpMark();
double downGrade = total + secondRule.getDownMark();
double upGrade = totalSecond + secondRule.getUpMark();
double downGrade = totalSecond - secondRule.getDownMark();
map.put("upGrade", upGrade);
map.put("downGrade", downGrade);
map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_LITERATURE.getCode());
list = volunteerMapper.getVolunteerList(map);
//如果数据不满足最大数量,取不限专业最低分补充
if (list.size() < secondRule.getNumber()) {
List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade);
list.addAll(fillList);
}
}
return list;
......@@ -605,16 +628,22 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
/**
* 补充不足数量的志愿数
*
* @param ids 已有志愿ids
* @param list 志愿ids
* @param number 差的数量
* @param max 最高分
* @param min 最低分
* @return 集合
*/
private List<Volunteer> fillUpVolunteer(List<Integer> ids, Integer number, double max, double min) {
private List<Volunteer> fillUpVolunteer(List<Volunteer> list, Integer number, double max, double min) {
//已存在的志愿ids
List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
//需要补充的志愿条数
int totalNumber = number - list.size();
Map<String, Object> map = new HashMap<>(16);
map.put("volunteerIds", ids);
map.put("number", number);
map.put("volunteerIds", volunteerIds);
map.put("number", totalNumber);
map.put("upGrade", max);
map.put("downGrade", min);
return volunteerMapper.getFillList(map);
......
......@@ -62,6 +62,12 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit
}
Integer userId = addLimitVo.getUserId();
//判断用户查询次数信息是否存在
UserLimit userLimit = userLimitMapper.getByUserId(userId);
if (null == userLimit) {
return R.error("用户查询信息不存在!");
}
//1、充值卡
if (PayType.REFILL_CARD.getCode().equals(addLimitVo.getPayType())) {
if (StringUtils.isBlank(addLimitVo.getPassword())) {
......@@ -74,9 +80,6 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit
return R.error("充值卡信息不存在!");
}
//获取用户查询次数信息
UserLimit userLimit = userLimitMapper.getByUserId(userId);
//增加用户可用查询次数
Integer usableNumber = userLimit.getUsableLimit() + cardInfo.getLimit();
......@@ -98,9 +101,6 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit
//根据支付的金额,查询用户新增查询次数
Price price = priceMapper.getByMoney(addLimitVo.getPayMoney());
//获取用户查询次数信息
UserLimit userLimit = userLimitMapper.getByUserId(userId);
//增加用户可用查询次数
Integer usableNumber = userLimit.getUsableLimit() + price.getUseLimit();
......
......@@ -3,9 +3,11 @@ package cn.wisenergy.service.app.impl;
import cn.wisenergy.common.utils.Md5Util;
import cn.wisenergy.common.utils.R;
import cn.wisenergy.mapper.LoginRecordMapper;
import cn.wisenergy.mapper.UserLimitMapper;
import cn.wisenergy.mapper.UsersMapper;
import cn.wisenergy.model.app.LoginRecord;
import cn.wisenergy.model.app.User;
import cn.wisenergy.model.app.UserLimit;
import cn.wisenergy.model.enums.OperationTypeEnum;
import cn.wisenergy.model.vo.UpdatePasswordVo;
import cn.wisenergy.model.vo.UserInfoVo;
......@@ -21,6 +23,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author 86187
......@@ -40,8 +43,12 @@ public class UserLoginServiceImpl extends ServiceImpl<UsersMapper, User> impleme
@Autowired
private SendSmsSerVice sendSmsSerVice;
@Autowired
private UserLimitMapper userLimitMapper;
private static final int ERROR_CODE = 500;
@Transactional(rollbackFor = Exception.class)
@Override
public R<UserInfoVo> register(UserRegisterVo userVo) {
log.info("volunteer-service[]UserLoginServiceImpl[]register[]input.param.userVo:" + userVo);
......@@ -69,7 +76,7 @@ public class UserLoginServiceImpl extends ServiceImpl<UsersMapper, User> impleme
//3、给密码加密 加密规则,电话号码+明文密码
String secret = Md5Util.digestMD5(password + phone);
//3、添加用户信息
//4、添加用户信息
User userInfo = new User();
userInfo.setPhone(phone);
userInfo.setPassword(secret);
......@@ -80,20 +87,32 @@ public class UserLoginServiceImpl extends ServiceImpl<UsersMapper, User> impleme
return R.error("考生注册失败!");
}
//4、保存操作记录
User user = usersMapper.getByPhone(userVo.getPhone());
//5、保存用户查询信息
UserLimit addLimit = new UserLimit();
addLimit.setUserId(userId);
addLimit.setUseLimit(0);
addLimit.setUsableLimit(0);
addLimit.setTotalLimit(0);
int limit = userLimitMapper.add(addLimit);
if (limit == 0) {
return R.error("注册添加用户查询信息失败!");
}
//6、保存操作记录
LoginRecord loginRecord = new LoginRecord();
loginRecord.setType(OperationTypeEnum.USER_REGISTER.getCode());
loginRecord.setUserId(user.getId());
loginRecord.setUserId(userInfo.getId());
String name = OperationTypeEnum.getByCode(OperationTypeEnum.USER_REGISTER.getCode());
loginRecord.setOperationName(name);
loginRecordMapper.add(loginRecord);
int record = loginRecordMapper.add(loginRecord);
if (record == 0) {
return R.error("注册保存记录失败!");
}
//5、封装返回参数
//7、封装返回参数
UserInfoVo userInfoVo = new UserInfoVo();
userInfoVo.setUserId(user.getId());
userInfoVo.setUserName(user.getUserName());
userInfoVo.setPhone(user.getPhone());
userInfoVo.setUserId(userInfo.getId());
userInfoVo.setPhone(userInfo.getPhone());
return R.ok(userInfoVo);
}
......
package cn.wisenergy.service.common;
import cn.wisenergy.common.utils.R;
import cn.wisenergy.mapper.*;
import cn.wisenergy.model.app.*;
import cn.wisenergy.model.enums.CardStatus;
......@@ -7,10 +8,12 @@ import cn.wisenergy.model.enums.PayType;
import cn.wisenergy.model.vo.AddLimitVo;
import cn.wisenergy.service.app.UserVolunteerService;
import cn.wisenergy.service.app.VolunteerService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -56,6 +59,9 @@ public class VolunteerManager {
@Autowired
private VolunteerService volunteerService;
@Autowired
private VolunteerMapper volunteerMapper;
/**
* 更新用户查询信息并保存扣减记录
*
......@@ -216,7 +222,7 @@ public class VolunteerManager {
* @param scoreInfo 成绩信息
* @return true or false
*/
@Transactional()
@Transactional(rollbackFor = Exception.class)
public boolean updateAndUserInfo(User user, ScoreInfo scoreInfo) {
//1、更新用户信息
int count = usersMapper.edit(user);
......@@ -257,4 +263,20 @@ public class VolunteerManager {
throw new RuntimeException("保存志愿信息失败!");
}
}
@Transactional(rollbackFor = Exception.class)
public boolean deleteSchemeAndVolunteer(SchemeInfo schemeInfo, Integer schemeId, Integer size) {
//更行方案状态为删除
int sum = schemeMapper.edit(schemeInfo);
if (sum == 0) {
return false;
}
//更行志愿状态为删除
int count = volunteerMapper.updateBySchemeId(schemeId);
if (size != count) {
return false;
}
return true;
}
}
......@@ -88,4 +88,16 @@ public class SchemeController {
return schemeService.getSchemeList(queryVo);
}
@ApiOperation(value = "获取方案列表", notes = "获取方案列表", httpMethod = "DELETE")
@ApiImplicitParam(name = "schemeId", value = "方案id", dataType = "schemeId")
@DeleteMapping("/delete")
public R<Boolean> delete(Integer schemeId) {
log.info("volunteer-service[]SchemeController[]getSchemeList[]input.param.schemeId:" + schemeId);
if (null == schemeId) {
return R.error("入参为空!");
}
return schemeService.deleteById(schemeId);
}
}
......@@ -2,7 +2,6 @@ package cn.wisenergy.web.admin.controller.app;
import cn.wisenergy.common.utils.R;
import cn.wisenergy.model.app.Banner;
import cn.wisenergy.model.vo.*;
import cn.wisenergy.service.app.UserLoginService;
import io.swagger.annotations.Api;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment