记得上下班打卡 | git大法好,push需谨慎

Commit bc3803c1 authored by jiangxiulong's avatar jiangxiulong

Merge remote-tracking branch 'origin/master' into jxl_1018_active

parents c6368e27 5f17bfdc
......@@ -81,4 +81,6 @@ public class KylinTableStatusConst {
public static final Integer ORDER_EXPRESS_STATUS1 = 1; // 申请 顺丰返回失败 未下单 未发快递
public static final Integer ORDER_EXPRESS_STATUS2 = 2; // 申请 顺丰返回成功 或 通过主动再查询更新
public static final Integer ORDER_EXPRESS_STATUS3 = 3; // 取消
public static final Integer ORDER_EXPRESS_STATUS80 = 80; // 签收
public static final Integer ORDER_EXPRESS_STATUS8000 = 8000; // 签收结单
}
......@@ -2,15 +2,19 @@ package com.liquidnet.client.admin.web.controller.zhengzai.tools;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.utils.poi.ExcelUtil;
import com.liquidnet.client.admin.zhengzai.kylin.dto.OrderExportVo;
import com.liquidnet.client.admin.zhengzai.kylin.dto.OrderOutLineVo;
import com.liquidnet.client.admin.zhengzai.kylin.service.IExportService;
import com.liquidnet.client.admin.zhengzai.kylin.service.IToolService;
import com.liquidnet.service.kylin.entity.KylinOrderTicketEntities;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Controller
......@@ -20,22 +24,42 @@ public class ToolsBaseController extends BaseController {
private String prefix = "zhengzai/tools";
@Autowired
private IExportService exportService;
@Autowired
private IToolService toolService;
@GetMapping()
public String tools() {
return prefix + "/tools";
}
/**
* 路径跳转
*
* @param id
* @param mmap
* @return
*/
@GetMapping(value = "/details/{id}")
public String detailsRoadShow(@PathVariable("id") Integer id, ModelMap mmap) {
if (id == 1) {
mmap.put("url", "/tools/export/mobile");
return prefix + "/fun1";
return prefix + "/fun1";//导出手机号
} else if (id == 2) {
mmap.put("url_info", "/tools/order/enter");
mmap.put("url_single", "/tools/order/getSingleEnter");
return prefix + "/fun2";//订单修改入场人
} else {
return prefix + "/edit";
}
}
/**
* 导出手机号
*
* @param mobileType
* @param performanceId
* @return
*/
@PostMapping("/export/mobile")
@ResponseBody
public AjaxResult exportMobile(Integer mobileType, String performanceId) {
......@@ -57,4 +81,52 @@ public class ToolsBaseController extends BaseController {
ExcelUtil<OrderExportVo> util = new ExcelUtil(OrderExportVo.class);
return util.exportExcel(list, list.get(0).getPerformanceTitle() + "-" + mobileType);
}
/**
* 根据订单号获取入场人信息
*
* @param orderCode
* @return
*/
@PostMapping("/order/enter")
@ResponseBody
public TableDataInfo getOrderTicketEnterByOrderCode(String orderCode, ModelMap mmap) {
List<KylinOrderTicketEntities> data = toolService.getOrderTicketEnterByOrderCode(orderCode);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(0);
if (data != null) {
rspData.setRows(data);
rspData.setTotal(data.size());
} else {
rspData.setRows(new ArrayList<>());
rspData.setTotal(0);
}
return rspData;
}
/**
* 根据票单id查询票单入场人
*
* @param orderTicketEntitiesId
* @return
*/
@GetMapping("/order/getSingleEnter/{orderTicketEntitiesId}")
public String getSingleEnter(@PathVariable("orderTicketEntitiesId") String orderTicketEntitiesId, ModelMap mmap) {
KylinOrderTicketEntities data = toolService.getSingleEnter(orderTicketEntitiesId);
mmap.put("dataInfo", data);
mmap.put("url_change", "/tools/order/enterChange");
return prefix + "/fun2Details";
}
/**
* 根据订单号获取入场人信息
*
* @param orderId
* @return
*/
@PostMapping("/order/enterChange")
@ResponseBody
public AjaxResult getOrderTicketEnterByOrderCode(String orderTicketEntitiesId, String enterName, String enterMobile, String enterIdCode, Integer enterType, String orderId) {
return AjaxResult.success(toolService.supplementEnter(orderTicketEntitiesId, enterName, enterMobile, enterIdCode, enterType, orderId));
}
}
......@@ -459,6 +459,9 @@
case 80:
expressStatusName = '已签收';
break;
case 8000:
expressStatusName = '已签收';
break;
default:
expressStatusName = '运输中';
break;
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('工具库')"/>
</head>
<body class="white-bg">
<div class="form-horizontal m wrapper wrapper-content animated fadeInRight ibox-content">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<label>订单号:</label>
<input type="text" name="orderCode"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i
class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
class="fa fa-refresh"></i>重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="form-group">
<table id="bootstrap-table"></table>
</div>
</div>
<th:block th:include="include :: footer"/>
<script th:inline="javascript">
var certificateType = [[${@dict.getType('zhengzai_certificate_type')}]];
var options = {
url: [[${url_info}]],
modalName: "入场人信息",
orderSc: "desc",
orderItem: "created_at",
updateUrl: [[${url_single}]] + "/{id}",
columns: [
{
field: 'orderTicketEntitiesId',
title: '票单id'
}, {
field: 'enterName',
title: '入场人姓名'
}, {
field: 'enterMobile',
title: '入场人手机号'
}, {
field: 'enterIdCode',
title: '入场人证件号'
}, {
field: 'enterType',
title: '证件类型',
formatter: function(value, row, index) {
return $.table.selectDictLabel(certificateType, value);
}
},
{
title: '操作',
align: 'center',
formatter: function (value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="$.operate.edit(\'' + row.orderTicketEntitiesId + '\')"><i class="fa fa-edit"></i>修改</a> ');
return actions.join('');
}
}]
};
$.table.init(options);
// }
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('工具库')"/>
</head>
<body class="white-bg">
<div class="form-horizontal m wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-fun2Details-edit"
th:object="${dataInfo}">
<div class="form-group">
<label class="col-sm-3 control-label is-required">入场人姓名:</label>
<div class="col-sm-8">
<input name="enterName" th:field="*{enterName}" class="form-control" type="text" ly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">入场人电话:</label>
<div class="col-sm-8">
<input name="enterMobile" th:field="*{enterMobile}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">入场人证件号:</label>
<div class="col-sm-8">
<input name="enterIdCode" th:field="*{enterIdCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">入场人证件类型:</label>
<div class="col-sm-8">
<!-- <input name="enterType" th:value="${@dict.getLabel('zhengzai_certificate_type',dataInfo.enterType)}"-->
<!-- class="form-control" type="text" required>-->
<select name="enterType" th:with="type=${@dict.getType('zhengzai_certificate_type')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:selected="${dict.dictValue} == ${dataInfo.enterType}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">入场人票单id:</label>
<div class="col-sm-8">
<input name="orderTicketEntitiesId" th:field="*{orderTicketEntitiesId}" class="form-control" type="text"
required readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">订单id:</label>
<div class="col-sm-8">
<input name="orderId" th:field="*{orderId}" class="form-control" type="text"
required readonly>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer"/>
<script th:inline="javascript">
$("#form-fun2Details-edit").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save([[${url_change}]], $('#form-fun2Details-edit').serialize());
}
}
</script>
</body>
</html>
......@@ -23,6 +23,11 @@
导出演出订单手机号
</button>
<button id="fun2" type="button" class="btn btn-w-m btn-success" href="javascript:void(0)"
onclick="$.operate.detail(2)">
修改订单入场人
</button>
</div>
</form>
</div>
......@@ -32,13 +37,18 @@
var options = {
url: prefix,
modalName: "",
updateUrl: prefix + "details/{id}"
updateUrl: prefix + "details/{id}",
detailUrl: prefix + "details/{id}"
};
$.table.init(options);
var fun1Flag = [[${@permission.hasPermi('tools:fun1')}]];
var fun2Flag = [[${@permission.hasPermi('tools:fun2')}]];
if (fun1Flag == "hidden") {
document.getElementById("fun1").style.display = "none";
}
if (fun2Flag == "hidden") {
document.getElementById("fun2").style.display = "none";
}
</script>
</body>
</html>
package com.liquidnet.client.admin.zhengzai.kylin.dto;
import lombok.Data;
import java.util.List;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @class: PerformanceCalendarReq
* @Package com.liquidnet.client.admin.zhengzai.kylin.dto
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/6/1 15:47
*/
@Data
public class ChangeOrderEnterResp {
private String orderTicketEntitiesId;
private Integer enterType;
private String enterName;
private String enterMobile;
private String enterIdCard;
}
package com.liquidnet.client.admin.zhengzai.kylin.service;
import com.liquidnet.service.kylin.entity.KylinOrderTicketEntities;
import java.util.List;
public interface IToolService {
/**
* 修改订单入场人
*
* @param enterIdCard
* @param enterMobile
* @param enterName
* @param enterType
* @param orderTicketEntitiesId
* @return
*/
Boolean supplementEnter(String orderTicketEntitiesId, String enterName, String enterMobile, String enterIdCard, Integer enterType,String orderId);
/**
* 根据入场人id
*
* @param orderTicketEntitiesId
* @return
*/
KylinOrderTicketEntities getSingleEnter(String orderTicketEntitiesId);
/**
* 根据订单号查询 订单入场人信息
*
* @param orderCode
* @return
*/
List<KylinOrderTicketEntities> getOrderTicketEnterByOrderCode(String orderCode);
}
......@@ -164,7 +164,8 @@ public class KylinDamaiServiceImpl extends ServiceImpl<KylinRoadShowsMapper, Kyl
obj1.setProjectId(performancesmId);
obj1.setVenueId(venueId);
obj1.setStartTime(StringUtils.parseDateTime(timesData.getUseStart().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
obj1.setEndTime(StringUtils.parseDateTime(timesData.getUseEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
obj1.setEndTime(StringUtils.parseDateTime(timesData.getUseEnd().plusDays(1).minusSeconds(1L).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
// obj1.setEndTime(StringUtils.parseDateTime(timesData.getUseEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
obj1.setSupplierSecret(taobaoTicketUtils.getSupplierSecret());
obj1.setSystemId(taobaoTicketUtils.getSystemId());
req.setPushPerformParam(obj1);
......@@ -309,4 +310,9 @@ public class KylinDamaiServiceImpl extends ServiceImpl<KylinRoadShowsMapper, Kyl
return null;
}
}
public static void main(String[] args) {
Long a=IDGenerator.getDamaiCode("397341627879178278349754");
System.out.println(a);
}
}
......@@ -132,12 +132,14 @@ public class PerformancesExpressServiceImpl extends ServiceImpl<KylinOrderExpres
// 运输中
Integer total2 = kylinOrderExpressMapper.selectCount(
Wrappers.lambdaQuery(KylinOrderExpress.class).gt(KylinOrderExpress::getExpressStatus, 3)
.ne(KylinOrderExpress::getExpressStatus, 80)
.ne(KylinOrderExpress::getExpressStatus, KylinTableStatusConst.ORDER_EXPRESS_STATUS80)
.ne(KylinOrderExpress::getExpressStatus, KylinTableStatusConst.ORDER_EXPRESS_STATUS8000)
.eq(KylinOrderExpress::getPerformancesId, info.getPerformancesId())
);
// 已签收
Integer[] statusList = new Integer[]{KylinTableStatusConst.ORDER_EXPRESS_STATUS80, KylinTableStatusConst.ORDER_EXPRESS_STATUS8000};
Integer total3 = kylinOrderExpressMapper.selectCount(
Wrappers.lambdaQuery(KylinOrderExpress.class).eq(KylinOrderExpress::getExpressStatus, 80)
Wrappers.lambdaQuery(KylinOrderExpress.class).in(KylinOrderExpress::getExpressStatus, statusList)
.eq(KylinOrderExpress::getPerformancesId, info.getPerformancesId())
);
info.setTotal1(total1);
......
package com.liquidnet.client.admin.zhengzai.kylin.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.client.admin.zhengzai.kylin.dto.ChangeOrderEnterResp;
import com.liquidnet.client.admin.zhengzai.kylin.service.IToolService;
import com.liquidnet.client.admin.zhengzai.kylin.utils.DataUtils;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.entity.KylinOrderTicketEntities;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketEntitiesMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketsMapper;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
@Service
@Slf4j
public class ToolServiceImpl implements IToolService {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private DataUtils dataUtils;
@Autowired
private KylinOrderTicketEntitiesMapper kylinOrderTicketEntitiesMapper;
@Autowired
private KylinOrderTicketsMapper kylinOrderTicketsMapper;
@Override
public Boolean supplementEnter(String orderTicketEntitiesId, String enterName, String enterMobile, String enterIdCode, Integer enterType, String orderId) {
mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketEntitiesId").is(orderTicketEntitiesId)).getQueryObject(),
new Document("$set", new Document("enterType", enterType)
.append("enterName", enterName)
.append("enterMobile", enterMobile)
.append("enterIdCode", enterIdCode)
.append("updatedAt", DateUtil.Formatter.yyyyMMddHHmmss.format(LocalDateTime.now())))
);
KylinOrderTicketEntities orderTicketEntities = KylinOrderTicketEntities.getNew();
orderTicketEntities.setEnterType(enterType);
orderTicketEntities.setEnterName(enterName);
orderTicketEntities.setEnterMobile(enterMobile);
orderTicketEntities.setEnterIdCode(enterIdCode);
orderTicketEntities.setUpdatedAt(LocalDateTime.now());
kylinOrderTicketEntitiesMapper.update(orderTicketEntities, Wrappers.lambdaUpdate(KylinOrderTicketEntities.class).eq(KylinOrderTicketEntities::getOrderTicketEntitiesId, orderTicketEntitiesId));
dataUtils.delOrderTicketRedis(orderId);
return true;
}
@Override
public KylinOrderTicketEntities getSingleEnter(String orderTicketEntitiesId) {
KylinOrderTicketEntities entitiesList = kylinOrderTicketEntitiesMapper.selectOne(Wrappers.lambdaUpdate(KylinOrderTicketEntities.class).eq(KylinOrderTicketEntities::getOrderTicketEntitiesId, orderTicketEntitiesId));
return entitiesList;
}
@Override
public List<KylinOrderTicketEntities> getOrderTicketEnterByOrderCode(String orderCode) {
KylinOrderTickets orderTickets = kylinOrderTicketsMapper.selectOne(Wrappers.lambdaUpdate(KylinOrderTickets.class).eq(KylinOrderTickets::getOrderCode, orderCode));
if (orderTickets == null) {
return null;
}
String orderId = orderTickets.getOrderTicketsId();
List<KylinOrderTicketEntities> entitiesList = kylinOrderTicketEntitiesMapper.selectList(Wrappers.lambdaUpdate(KylinOrderTicketEntities.class).eq(KylinOrderTicketEntities::getOrderId, orderId));
return entitiesList;
}
}
......@@ -339,7 +339,8 @@
${expressStatus}
</if>
<if test="expressStatus == 1">AND (oe.express_status IS NULL OR oe.express_status = ${expressStatus})</if>
<if test="expressStatus == 70">AND (oe.express_status > 3 AND oe.express_status != 80)</if>
<if test="expressStatus == 70">AND (oe.express_status > 3 AND oe.express_status != 80 AND oe.express_status != 8000)</if>
<if test="expressStatus == 80">AND (oe.express_status = 80 OR oe.express_status = 8000)</if>
<if test="mailno != ''">AND oe.mailno LIKE concat('%', #{mailno}, '%')</if>
</where>
......
......@@ -186,7 +186,7 @@ public class CandyCouponServiceImpl implements ICandyCouponService {
int canUse = 0;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getPerformanceCouponUserVo(dtoItem, priceTotal, performanceId, timeId, ticketId);
if (baseVo.getCouType().equals(101)) {
if (baseVo.getCouType().equals(101) || baseVo.getBusiType() == 2) {
continue;
}
if (baseVo.getState().equals(1)) { //可用
......@@ -255,7 +255,7 @@ public class CandyCouponServiceImpl implements ICandyCouponService {
int canUse = 0;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getGoodCouponUserVo(dtoItem, priceTotal, goodId, dtoList.size());
if (baseVo.getCouType().equals(101)) {
if (baseVo.getCouType().equals(101) || baseVo.getBusiType() == 1 || baseVo.getBusiType() == 3) {
continue;
}
if (baseVo.getState().equals(1)) { //可用
......
......@@ -91,6 +91,8 @@ public class CouponBaseUtil {
//适用范围 规则
if (dtoItem.getBusiType().equals(0)) {
isTarget = true;
} else if (dtoItem.getBusiType().equals(2)) {
isTarget = false;
} else {
for (CandyCouponRuleDto ruleItem : dtoItem.getUseRules()) {
CandyCouponRulesVo voRules = CandyCouponRulesVo.getNew();
......@@ -109,7 +111,15 @@ public class CouponBaseUtil {
isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), ticketId, priceTotal, dtoItem.getValOver());
break;
case 100://全场
if (dtoItem.getCouType().equals(2)) {
if (priceTotal.compareTo(dtoItem.getValOver()) >= 0) {
isTarget = true;
} else {
isTarget = false;
}
} else {
isTarget = true;
}
break;
default:
isTarget = false;
......@@ -170,6 +180,8 @@ public class CouponBaseUtil {
//适用范围 规则
if (dtoItem.getBusiType().equals(0)) {
isTarget = true;
} else if (dtoItem.getBusiType().equals(1) || dtoItem.getBusiType().equals(3)) {
isTarget = false;
} else {
for (CandyCouponRuleDto ruleItem : dtoItem.getUseRules()) {
CandyCouponRulesVo voRules = CandyCouponRulesVo.getNew();
......@@ -185,15 +197,20 @@ public class CouponBaseUtil {
// isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), produceId, priceTotal, dtoItem.getValOver());
break;
case 100://全场
if (dtoItem.getCouType().equals(2)) {
if (priceTotal.compareTo(dtoItem.getValOver()) >= 0) {
isTarget = true;
} else {
isTarget = false;
}
} else {
isTarget = true;
}
break;
default:
isTarget = false;
break;
}
if (size > 1 && dtoItem.getCouType().equals(4)) {
isTarget = false;
}
}
if (dtoItem.getUseRules().size() == 0 && !dtoItem.getBusiType().equals(0)) {
......
# -- 使用券 --
candy_coupon.use=UPDATE candy_user_coupon SET state = 3 ,used_at = ? , used_for = ? WHERE uid = ? AND ucoupon_id = ?
candy_coupon.use=UPDATE candy_user_coupon SET state = 5 ,used_at = ? , used_for = ? WHERE uid = ? AND ucoupon_id = ?
#candy_coupon.use_insert=INSERT INTO candy_user_coupon (ucoupon_id , uid , state , coupon_id , used_at , used_for ) VALUE ( ? , ? , 3 , ? , ? ,? )
candy_coupon.use_insert=INSERT INTO candy_user_coupon (ucoupon_id , uid , state , coupon_id , bind_at, dued_at, used_at , used_for, created_at) VALUE ( ? , ? , 3 , ? , ? , ?, ?, ?, ?)
candy_coupon.use_insert=INSERT INTO candy_user_coupon (ucoupon_id , uid , state , coupon_id , bind_at, dued_at, used_at , used_for, created_at) VALUE ( ? , ? , 5 , ? , ? , ?, ?, ?, ?)
# -- 回退券 --
candy_coupon.back=UPDATE candy_user_coupon SET state = 1 WHERE uid = ? AND ucoupon_id = ?
# -- 领取券 --
......
......@@ -97,11 +97,11 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
boolean isPay = true;
List<AdamEntersVo> entersVoList = ObjectUtil.cloneArrayListObject();
String uid = CurrentUtil.getCurrentUid();
HashMap<String, Object> advanceMap = null;
try {
if (payOrderParam.getVoucherType() != null && payOrderParam.getVoucherType().equals(3)) {
isPay = false;
}
HashMap<String, Object> advanceMap = null;
try {
KylinPerformanceVo performanceData = dataUtils.getPerformanceVo(payOrderParam.getPerformanceId());
KylinTicketTimesVo ticketTimesData = null;
KylinTicketVo ticketData = null;
......
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