Commit 5b6bc62a by 蒋小洋

Merge branches 'ka-野翠山结算和支付配送校验-20211210-jxy' and 'qa' of…

Merge branches 'ka-野翠山结算和支付配送校验-20211210-jxy' and 'qa' of http://gitlab.freemud.com/order-group-application/order-group into qa

 Conflicts:
	order-application-service/src/main/java/cn/freemud/service/impl/OrderAdapterServiceImpl.java
	order-application-service/src/main/java/cn/freemud/service/thirdparty/CustomerClient.java
	shopping-cart-application-service/src/main/java/cn/freemud/service/thirdparty/CustomerClient.java
parents d8a64191 71c3114d
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: QueryReceiveAddressDistanceDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: ping.wu
* @date: 2018/6/29 16:37
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class CheckDeliveryAddressReq {
//商户号
private String partnerId;
//门店id
private String storeId;
//收货人经度
private String receiverLng;
//收货人纬度
private String receiverLat;
//收货人地址
private String receiverAddress;
//物品重量(kg)
private String depatchWeight = "1";
//是否预约单 :0 否 1 是
private Integer isPre = 0;
//用户支付方式 1、已支付 0、货到付款
private Integer payType = 1;
//是否保价,0:非保价;1:保价
private Integer isInsured = 0;
//是否是专人直送订单,0:否;1:是
private Integer isPersonDirect = 0;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: QueryReceiveAddressDistanceDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: ping.wu
* @date: 2018/6/29 16:37
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class CheckDeliveryAddressResp {
private String code;
private String msg;
private ResultBean data;
@NoArgsConstructor
@Data
public static class ResultBean {
//是否在配送范围内
private boolean isSupport;
//消息提示
private String msg;
}
}
......@@ -91,6 +91,9 @@ public enum ResponseResult {
SHOPPING_CART_SENDGOODS_NOT_EXIST("44011", "加价购商品不存在",""),
SHOPPING_CART_STOCK_NOT_HAVE("44012", "商品库存不足",""),
SHOPPING_CART_PRODUCT_NOT_EXIST("44013", "商品不存在",""),
SHOPPING_CART_IS_OVERDELIVERY_ERR("44111", "校验配送范围失败",""),
/**
* 订单状态码
......
......@@ -6,6 +6,8 @@ import cn.freemud.config.ApolloVariableConfig;
import cn.freemud.constant.RedisLockKey;
import cn.freemud.entities.bo.CreateOrderBONew;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryReceiveAddressDto;
import cn.freemud.entities.dto.QueryReceiveAddressResponseDto;
import cn.freemud.entities.dto.order.CreateCashierOrderDto;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.order.PaymentConfigVo;
......@@ -16,6 +18,8 @@ import cn.freemud.management.service.handle.SaasOrderHandle;
import cn.freemud.management.thirdparty.OrderCallbackClient;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.*;
import cn.freemud.service.thirdparty.CustomerClient;
import cn.freemud.service.thirdparty.TakeawayServiceClient;
import cn.freemud.service.universal.factory.CreateOrderServiceFactory;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil;
......@@ -38,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
......@@ -135,6 +140,12 @@ public class OrderAdapterServiceImpl {
private CashierOrderService cashierOrderService;
@Autowired
private PayServiceImpl payService;
@Value("${ycs.partnerId:2690,2702,2664}")
private String ycsPartnerId;
@Autowired
private CustomerClient customerClient;
@Resource
private TakeawayServiceClient takeawayServiceClient;
//获取下单实现对象
private OrderFactoryService getCreateOrderBean(AssortmentCustomerInfoVo assortmentCustomerInfoVo,CreateOrderVo createOrderVo){
......@@ -189,6 +200,16 @@ public class OrderAdapterServiceImpl {
if (assortmentCustomerInfoVo == null || StringUtils.isEmpty(assortmentCustomerInfoVo.getMemberId())) {
return ResponseUtil.error(ResponseResult.NOT_LOGIN);
}
//Apollo配置野翠山商户,外卖订单地址是否超出美图等配送范围 -jxy
List<String> ycsList = Arrays.asList(ycsPartnerId.split(","));
boolean ycsPartner = ycsList.contains(createOrderVo.getPartnerId());
if(ycsPartner && BusinessTypeEnum.SAAS_DELIVERY.getCode().equals(createOrderVo.getMenuType())
&& StringUtils.isNotEmpty(createOrderVo.getReceiveId())){
boolean isOverDelivery = checkYcsIsOverDelivery(createOrderVo.getReceiveId(),createOrderVo.getPartnerId(),createOrderVo.getShopId());
if(isOverDelivery){
throw new ServiceException(ResponseResult.SHOPPING_CART_IS_OVERDELIVERY_ERR);
}
}
// 扩展字段中存储 sessionKey
createOrderVo.setSessionKey(assortmentCustomerInfoVo.getSessionKey());
// 用于测试 新创建订单接口 不是围餐, 并且 商户号 门店号都在配置里面
......@@ -402,4 +423,30 @@ public class OrderAdapterServiceImpl {
}
/**
* 校验野翠山是否超配送,true超配送,false没有超出配送
* @return
*/
private boolean checkYcsIsOverDelivery(String addressId, String partnerId,String storeId){
//1、查询收件人地址信息
QueryReceiveAddressDto queryReceiveAddressDto = new QueryReceiveAddressDto(addressId,partnerId);
QueryReceiveAddressResponseDto queryReceiveAddressResponseDto = customerClient.queryReceiveAddressById(queryReceiveAddressDto);
if(!Objects.equals("100",queryReceiveAddressResponseDto.getCode()) || queryReceiveAddressResponseDto.getData() == null){
return true;
}
CheckDeliveryAddressReq checkDeliveryAddressReq = new CheckDeliveryAddressReq();
checkDeliveryAddressReq.setPartnerId(partnerId);
checkDeliveryAddressReq.setStoreId(storeId);
checkDeliveryAddressReq.setReceiverLng(queryReceiveAddressResponseDto.getData().getLongitude());
checkDeliveryAddressReq.setReceiverLat(queryReceiveAddressResponseDto.getData().getLatitude());
checkDeliveryAddressReq.setReceiverAddress(queryReceiveAddressResponseDto.getData().getReceiveAddress());
//2、查询配送信息是否超配送
CheckDeliveryAddressResp checkDeliveryAddressResp = takeawayServiceClient.checkDeliveryAddress(checkDeliveryAddressReq);
if(!Objects.equals("100",checkDeliveryAddressResp.getCode()) || checkDeliveryAddressResp.getData() == null
|| !checkDeliveryAddressResp.getData().isSupport()){
return true;
}
return false;
}
}
......@@ -14,10 +14,7 @@
package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.entities.dto.GetMemberExtendInfoRequestDto;
import cn.freemud.entities.dto.GetMemberExtendInfoResponseDto;
import cn.freemud.entities.dto.GetMemberInfoByIdRequestDto;
import cn.freemud.entities.dto.GetMemberInfoByIdResponseDto;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.member.GetMemberIdsReq;
import cn.freemud.entities.dto.member.GetMemberIdsResp;
import com.freemud.application.sdk.api.base.BaseResponse;
......@@ -48,6 +45,13 @@ public interface CustomerClient {
/**
* 查询收货地址详情
*/
@PostMapping(value = "/customerservice/address/get")
QueryReceiveAddressResponseDto queryReceiveAddressById(@RequestBody QueryReceiveAddressDto
queryReceiveAddressDto);
/**
* 查询收货地址详情
*/
@LogIgnoreFeign(logMessage = "getMemberExtendInfo")
@PostMapping(value = "/customerservice/extend/getMemberExtendInfo")
BaseResponse<GetMemberExtendInfoResponseDto>
......
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: CustomerExtendClient
* @Package cn.freemud.service.thirdparty
* @Description:
* @author: song.cai
* @date: 2019/2/20 16:42
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.ResponseCodeKeyConstant;
import cn.freemud.entities.vo.CheckDeliveryAddressReq;
import cn.freemud.entities.vo.CheckDeliveryAddressResp;
import cn.freemud.interceptor.FormSupportConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "TAKEAWAY-SERVICE", url = "${saas.takeawayclient.feign.url:}",fallback = TakeawayServiceClientFallback.class,configuration = FormSupportConfig.class)
public interface TakeawayServiceClient {
/**
* 查询门店是否开通第三方配送,是否超配送范围
*/
@PostMapping(value = "/delivery/checkDeliveryAddress",produces = {"application/json;charset=UTF-8"})
@LogIgnoreFeign(logMessage = "/delivery/checkDeliveryAddress",excludeStatusCodes = {ResponseCodeConstant.RESPONSE_SUCCESS_STR},messageFieldName=ResponseCodeKeyConstant.MSG)
CheckDeliveryAddressResp checkDeliveryAddress(@RequestBody CheckDeliveryAddressReq checkDeliveryAddressReq);
}
package cn.freemud.service.thirdparty;
import cn.freemud.entities.vo.CheckDeliveryAddressReq;
import cn.freemud.entities.vo.CheckDeliveryAddressResp;
import org.springframework.stereotype.Component;
//@IgnoreFeignLogAnnotation
@Component
public class TakeawayServiceClientFallback implements TakeawayServiceClient {
/**
* 查询配送超过4秒熔断,返回错误码,直接返回前端
* @param checkDeliveryAddressReq
* @return
*/
@Override
public CheckDeliveryAddressResp checkDeliveryAddress(CheckDeliveryAddressReq checkDeliveryAddressReq) {
CheckDeliveryAddressResp response = new CheckDeliveryAddressResp();
response.setCode("200");
return response;
}
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: QueryReceiveAddressDistanceDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: ping.wu
* @date: 2018/6/29 16:37
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class CheckDeliveryAddressReq {
//商户号
private String partnerId;
//门店id
private String storeId;
//收货人经度
private String receiverLng;
//收货人纬度
private String receiverLat;
//收货人地址
private String receiverAddress;
//物品重量(kg)
private String depatchWeight = "1";
//是否预约单 :0 否 1 是
private Integer isPre = 0;
//用户支付方式 1、已支付 0、货到付款
private Integer payType = 1;
//是否保价,0:非保价;1:保价
private Integer isInsured = 0;
//是否是专人直送订单,0:否;1:是
private Integer isPersonDirect = 0;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: QueryReceiveAddressDistanceDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: ping.wu
* @date: 2018/6/29 16:37
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class CheckDeliveryAddressResp {
private String code;
private String msg;
private ResultBean data;
@NoArgsConstructor
@Data
public static class ResultBean {
//是否在配送范围内
private boolean isSupport;
//消息提示
private String msg;
}
}
......@@ -109,6 +109,7 @@ public enum ResponseResult {
SHOPPING_CART_REPLACE_GOODS("44040", "原有购物车没有商品"),
SHOPPING_CART_REPLACE_GOODS_AND_CLEAR("44041", "因部分商品当前门店暂未售卖,将从购物车移除"),
SHOPPING_CART_COUPON_MUTUAL_EXCLUSION("44042", "代金券和折扣券互斥"),
SHOPPING_CART_IS_OVERDELIVERY_ERR("44111", "校验配送范围失败"),
/**
* 订单状态码
......
package cn.freemud.interceptor;
import feign.Request;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
......@@ -17,4 +18,10 @@ public class FormSupportConfig {
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Bean
public Request.Options options() {
// 第一个参数是连接超时,第二个参数是读取超时,默认ms
return new Request.Options(1000, 4000);
}
}
......@@ -216,6 +216,12 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
private GetActivityMsgHandle getActivityMsgHandle;
@Autowired
private GiftCacheManager giftCacheManager;
@Value("${ycs.partnerId:2690,2702,2664}")
private String ycsPartnerId;
@Autowired
private CustomerClient customerClient;
@Resource
private TakeawayServiceClient takeawayServiceClient;
/**
* 从微信卡券向购物车中添加商品
......@@ -659,6 +665,16 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
if (StringUtils.isEmpty(shoppingCartInfoRequestVo.getVersion())) {
shoppingCartInfoRequestVo.setVersion("");
}
//Apollo配置野翠山商户,外卖订单地址是否超出美图等配送范围 -jxy
List<String> ycsList = Arrays.asList(ycsPartnerId.split(","));
boolean ycsPartner = ycsList.contains(shoppingCartInfoRequestVo.getPartnerId());
if(ycsPartner && BusinessTypeEnum.SAAS_DELIVERY.getCode().equals(shoppingCartInfoRequestVo.getMenuType())
&& StringUtils.isNotEmpty(shoppingCartInfoRequestVo.getReceiveId())){
boolean isOverDelivery = checkYcsIsOverDelivery(shoppingCartInfoRequestVo.getReceiveId(),shoppingCartInfoRequestVo.getPartnerId(),shoppingCartInfoRequestVo.getShopId());
if(isOverDelivery){
throw new ServiceException(ResponseResult.SHOPPING_CART_IS_OVERDELIVERY_ERR);
}
}
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = new ShoppingCartGoodsResponseVo();
// 获取用户信息
CustomerInfoVo assortmentCustomerInfoVo = getCustomerInfoVo(shoppingCartInfoRequestVo.getSessionId());
......@@ -3559,4 +3575,30 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
return fullReplace;
}
/**
* 校验野翠山是否超配送,true超配送,false没有超出配送
* @return
*/
private boolean checkYcsIsOverDelivery(String addressId, String partnerId,String storeId){
//1、查询收件人地址信息
QueryReceiveAddressDto queryReceiveAddressDto = new QueryReceiveAddressDto(addressId,partnerId);
QueryReceiveAddressResponseDto queryReceiveAddressResponseDto = customerClient.queryReceiveAddressById(queryReceiveAddressDto);
if(!Objects.equals("100",queryReceiveAddressResponseDto.getCode()) || queryReceiveAddressResponseDto.getData() == null){
return true;
}
CheckDeliveryAddressReq checkDeliveryAddressReq = new CheckDeliveryAddressReq();
checkDeliveryAddressReq.setPartnerId(partnerId);
checkDeliveryAddressReq.setStoreId(storeId);
checkDeliveryAddressReq.setReceiverLng(queryReceiveAddressResponseDto.getData().getLongitude());
checkDeliveryAddressReq.setReceiverLat(queryReceiveAddressResponseDto.getData().getLatitude());
checkDeliveryAddressReq.setReceiverAddress(queryReceiveAddressResponseDto.getData().getReceiveAddress());
//2、查询配送信息是否超配送
CheckDeliveryAddressResp checkDeliveryAddressResp = takeawayServiceClient.checkDeliveryAddress(checkDeliveryAddressReq);
if(!Objects.equals("100",checkDeliveryAddressResp.getCode()) || checkDeliveryAddressResp.getData() == null
|| !checkDeliveryAddressResp.getData().isSupport()){
return true;
}
return false;
}
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: CustomerExtendClient
* @Package cn.freemud.service.thirdparty
* @Description:
* @author: song.cai
* @date: 2019/2/20 16:42
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.thirdparty;
import cn.freemud.annotations.IgnoreFeignLogAnnotation;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.QueryReceiveAddressDto;
import cn.freemud.entities.dto.QueryReceiveAddressResponseDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "CUSTOMER-SERVICE", url = "${saas.customerclient.feign.url:}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CustomerClient {
/*
*//**
* 根据聚道注册会员
*//*
@PostMapping(value = "/customerservice/registerByChannel")
MemberRegisterResponseDto registerByChannel(@RequestBody MemberRegisterRequestDto memberRegisterRequestDto);
*//**
* 根据渠道信息查询顾客信息
*//*
@PostMapping(value = "/customerservice/getMemberByChannel")
GetMemberInfoByChannelResponseDto getMemberInfoByChannel(@RequestBody GetMemberInfoByChannelRequestDto getMemberInfoByChannelRequestDto);
*//**
* 修改unionid
*//*
@PostMapping(value = "/customerservice/updateMemberChannel")
JSONObject updateUserUnionId(@RequestBody UpdateMemUnionIdRequestDto updateMemUnionIdRequestDto);
*//**
* 根据会员id获取会员信息
*//*
@PostMapping(value = "/customerservice/getMemberById")
GetMemberInfoByIdResponseDto getMemberInfoById(@RequestBody GetMemberInfoByIdRequestDto getMemberInfoByIdRequestDto);
*//**
* 修改顾客信息
*//*
@PostMapping(value = "/customerservice/update")
JSONObject editMemberInfo(@RequestBody EditMemberInfoRequestDto editMemberInfoRequestDto);
*//**
* 获取用户收货地址列表
*//*
@PostMapping(value = "/customerservice/address/getAddressList")
GetReceiveAddressListResponseDto getReceiveAddressList(@RequestBody GetReceiveAddressListDto getReceiveListDto);
*//**
* 新增收货地址
*//*
@PostMapping(value = "/customerservice/address/add")
AddReceiveAddressResponseDto addReceiveAddress(@RequestBody AddReceiveAddressDto addReceiveDto);
*//**
* 修改收货地址
*//*
@PostMapping(value = "/customerservice/address/update")
UpdateReceiveAddressResponseDto updateReceiveAddress(@RequestBody UpdateReceiveAddressDto updateReceiveAddressDto);
*//**
* 删除收货地址
*//*
@PostMapping(value = "/customerservice/address/delete")
DeleteReceiveAddressResponseDto deleteReceiveAddress(@RequestBody DeleteReceiveAddressDto deleteReceiveAddressDto);*/
/**
* 查询收货地址详情
*/
@PostMapping(value = "/customerservice/address/get")
@IgnoreFeignLogAnnotation(logMessage = "/customerservice/address/get",excludeStatusCodes = {ResponseCodeConstant.RESPONSE_SUCCESS_STR})
QueryReceiveAddressResponseDto queryReceiveAddressById(@RequestBody QueryReceiveAddressDto queryReceiveAddressDto);
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: CustomerExtendClient
* @Package cn.freemud.service.thirdparty
* @Description:
* @author: song.cai
* @date: 2019/2/20 16:42
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.thirdparty;
import cn.freemud.annotations.IgnoreFeignLogAnnotation;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.ResponseCodeKeyConstant;
import cn.freemud.entities.dto.CheckDeliveryAddressReq;
import cn.freemud.entities.dto.CheckDeliveryAddressResp;
import cn.freemud.interceptor.FormSupportConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "TAKEAWAY-SERVICE", url = "${saas.takeawayclient.feign.url:}",fallback = TakeawayServiceClientFallback.class,configuration = FormSupportConfig.class)
public interface TakeawayServiceClient {
/**
* 查询门店是否开通第三方配送,是否超配送范围
*/
@PostMapping(value = "/delivery/checkDeliveryAddress",produces = {"application/json;charset=UTF-8"})
@IgnoreFeignLogAnnotation(logMessage = "/delivery/checkDeliveryAddress",excludeStatusCodes = {ResponseCodeConstant.RESPONSE_SUCCESS_STR},messageFieldName=ResponseCodeKeyConstant.MSG)
CheckDeliveryAddressResp checkDeliveryAddress(@RequestBody CheckDeliveryAddressReq checkDeliveryAddressReq);
}
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.CheckDeliveryAddressReq;
import cn.freemud.entities.dto.CheckDeliveryAddressResp;
import org.springframework.stereotype.Component;
//@IgnoreFeignLogAnnotation
@Component
public class TakeawayServiceClientFallback implements TakeawayServiceClient {
/**
* 查询配送超过4秒熔断,返回错误码,直接返回前端
* @param checkDeliveryAddressReq
* @return
*/
@Override
public CheckDeliveryAddressResp checkDeliveryAddress(CheckDeliveryAddressReq checkDeliveryAddressReq) {
CheckDeliveryAddressResp response = new CheckDeliveryAddressResp();
response.setCode("200");
return response;
}
}
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