Commit fbb0ba16 by guojuxing

资源组调整:区分自有商户的店铺和共享店铺,分开存放,避免重复授权(共享店铺不能二次共享授权)

parent 9a7e00b4
...@@ -65,11 +65,21 @@ public class ResourceGroupDTO implements Serializable{ ...@@ -65,11 +65,21 @@ public class ResourceGroupDTO implements Serializable{
private Integer weimobOrderArea; private Integer weimobOrderArea;
/** /**
* 微盟店铺多选,weimob_order_area选择1时选择店铺,英文逗号隔开 * 微盟店铺多选(前端使用),weimob_order_area选择1时选择店铺,英文逗号隔开
*/ */
private String weimobStoreId; private String weimobStoreId;
/** /**
* 微盟店铺多选(业务使用:只存本商户自有的店铺数据),weimob_order_area选择1时选择店铺,英文逗号隔开。为了避免重复授权,新增一个特有字段
*/
private String weimobStoreIdOwn;
/**
* 微盟店铺多选(业务使用:只存共享的店铺数据),weimob_order_area选择1时选择店铺,英文逗号隔开。为了避免重复授权,新增一个特有字段
*/
private String weimobStoreIdShare;
/**
* 短信签名多选,英文逗号隔开 * 短信签名多选,英文逗号隔开
*/ */
private String smsId; private String smsId;
...@@ -267,6 +277,24 @@ public class ResourceGroupDTO implements Serializable{ ...@@ -267,6 +277,24 @@ public class ResourceGroupDTO implements Serializable{
return this; return this;
} }
public String getWeimobStoreIdOwn() {
return weimobStoreIdOwn;
}
public ResourceGroupDTO setWeimobStoreIdOwn(String weimobStoreIdOwn) {
this.weimobStoreIdOwn = weimobStoreIdOwn;
return this;
}
public String getWeimobStoreIdShare() {
return weimobStoreIdShare;
}
public ResourceGroupDTO setWeimobStoreIdShare(String weimobStoreIdShare) {
this.weimobStoreIdShare = weimobStoreIdShare;
return this;
}
@Override @Override
public String toString() { public String toString() {
return "ResourceGroupDTO{" + return "ResourceGroupDTO{" +
...@@ -281,6 +309,8 @@ public class ResourceGroupDTO implements Serializable{ ...@@ -281,6 +309,8 @@ public class ResourceGroupDTO implements Serializable{
", storeOrderArea=" + storeOrderArea + ", storeOrderArea=" + storeOrderArea +
", weimobOrderArea=" + weimobOrderArea + ", weimobOrderArea=" + weimobOrderArea +
", weimobStoreId='" + weimobStoreId + '\'' + ", weimobStoreId='" + weimobStoreId + '\'' +
", weimobStoreIdOwn='" + weimobStoreIdOwn + '\'' +
", weimobStoreIdShare='" + weimobStoreIdShare + '\'' +
", smsId='" + smsId + '\'' + ", smsId='" + smsId + '\'' +
", createTime=" + createTime + ", createTime=" + createTime +
", updateTime=" + updateTime + ", updateTime=" + updateTime +
......
...@@ -56,11 +56,21 @@ public class TabSysResourceGroup { ...@@ -56,11 +56,21 @@ public class TabSysResourceGroup {
private Integer weimobOrderArea; private Integer weimobOrderArea;
/** /**
* 微盟店铺多选,weimob_order_area选择1时选择店铺,英文逗号隔开 * 前端使用:微盟店铺多选,weimob_order_area选择1时选择店铺,英文逗号隔开
*/ */
private String weimobStoreId; private String weimobStoreId;
/** /**
* 微盟店铺多选(业务使用:只存本商户自有的店铺数据),weimob_order_area选择1时选择店铺,英文逗号隔开。为了避免重复授权,新增一个特有字段
*/
private String weimobStoreIdOwn;
/**
* 微盟店铺多选(业务使用:只存共享的店铺数据),weimob_order_area选择1时选择店铺,英文逗号隔开。为了避免重复授权,新增一个特有字段
*/
private String weimobStoreIdShare;
/**
* 短信签名多选,英文逗号隔开 * 短信签名多选,英文逗号隔开
*/ */
private String smsId; private String smsId;
...@@ -205,4 +215,22 @@ public class TabSysResourceGroup { ...@@ -205,4 +215,22 @@ public class TabSysResourceGroup {
this.deleteFlag = deleteFlag; this.deleteFlag = deleteFlag;
return this; return this;
} }
public String getWeimobStoreIdOwn() {
return weimobStoreIdOwn;
}
public TabSysResourceGroup setWeimobStoreIdOwn(String weimobStoreIdOwn) {
this.weimobStoreIdOwn = weimobStoreIdOwn;
return this;
}
public String getWeimobStoreIdShare() {
return weimobStoreIdShare;
}
public TabSysResourceGroup setWeimobStoreIdShare(String weimobStoreIdShare) {
this.weimobStoreIdShare = weimobStoreIdShare;
return this;
}
} }
\ No newline at end of file
package com.gic.auth.service.outer.impl; package com.gic.auth.service.outer.impl;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.gic.platform.member.constant.enums.CuTypeEnum;
import com.gic.store.service.UnionStoreChangeApiService;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
...@@ -19,20 +14,24 @@ import com.alibaba.fastjson.JSON; ...@@ -19,20 +14,24 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page; import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse; import com.gic.api.base.commons.ServiceResponse;
import com.gic.application.center.api.service.AuthorizeService;
import com.gic.auth.dto.*; import com.gic.auth.dto.*;
import com.gic.auth.entity.TabSysResourceGroup; import com.gic.auth.entity.TabSysResourceGroup;
import com.gic.auth.service.*; import com.gic.auth.service.ResourceGroupApiService;
import com.gic.auth.service.ResourceGroupService;
import com.gic.auth.service.UserResourceService;
import com.gic.auth.utils.resourcegroup.ResourceGroupUtils; import com.gic.auth.utils.resourcegroup.ResourceGroupUtils;
import com.gic.commons.util.EntityUtil; import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.GICMQClientUtil; import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.PageHelperUtils; import com.gic.commons.util.PageHelperUtils;
import com.gic.enterprise.dto.WmStoreDTO;
import com.gic.enterprise.dto.union.UnionEnterpriseAuthDTO; import com.gic.enterprise.dto.union.UnionEnterpriseAuthDTO;
import com.gic.enterprise.error.ErrorCode; import com.gic.enterprise.error.ErrorCode;
import com.gic.enterprise.exception.CommonException; import com.gic.enterprise.exception.CommonException;
import com.gic.enterprise.service.UnionEnterpriseAuthApiService; import com.gic.enterprise.service.UnionEnterpriseAuthApiService;
import com.gic.enterprise.service.WmStoreApiService;
import com.gic.mq.sdk.GicMQClient; import com.gic.mq.sdk.GicMQClient;
import com.gic.store.service.StoreWidgetApiService; import com.gic.platform.member.constant.enums.CuTypeEnum;
import com.gic.store.service.UnionStoreChangeApiService;
/** /**
* 资源组 * 资源组
...@@ -47,37 +46,24 @@ public class ResourceGroupApiServiceImpl implements ResourceGroupApiService{ ...@@ -47,37 +46,24 @@ public class ResourceGroupApiServiceImpl implements ResourceGroupApiService{
@Autowired @Autowired
private ResourceGroupService resourceGroupService; private ResourceGroupService resourceGroupService;
@Autowired @Autowired
private AuthorizeService authorizeService;
@Autowired
private UserResourceService userResourceService; private UserResourceService userResourceService;
@Autowired @Autowired
private UserService userService;
@Autowired
private StoreWidgetApiService storeWidgetApiService;
@Autowired
private UnionEnterpriseAuthApiService unionEnterpriseAuthApiService; private UnionEnterpriseAuthApiService unionEnterpriseAuthApiService;
@Autowired @Autowired
private AuthCodeApiService authCodeApiService;
@Autowired
private UnionStoreChangeApiService unionStoreChangeApiService; private UnionStoreChangeApiService unionStoreChangeApiService;
@Autowired
private WmStoreApiService wmStoreApiService;
@Override @Override
public ServiceResponse<Integer> saveResourceGroup(ResourceGroupDTO resourceGroup) { public ServiceResponse<Integer> saveResourceGroup(ResourceGroupDTO resourceGroup) {
String validParamResponse = validParam(resourceGroup); validParam(resourceGroup);
if (validParamResponse != null) {
return ServiceResponse.failure(ErrorCode.PARAMETER_ERROR.getCode(), validParamResponse);
}
Integer resourceGroupId = resourceGroupService.saveResourceGroup(resourceGroup); Integer resourceGroupId = resourceGroupService.saveResourceGroup(resourceGroup);
return ServiceResponse.success(resourceGroupId); return ServiceResponse.success(resourceGroupId);
} }
@Override @Override
public ServiceResponse<String> editResourceGroup(ResourceGroupDTO resourceGroup) { public ServiceResponse<String> editResourceGroup(ResourceGroupDTO resourceGroup) {
String validParamResponse = validParam(resourceGroup); validParam(resourceGroup);
if (validParamResponse != null) {
return ServiceResponse.failure(ErrorCode.PARAMETER_ERROR.getCode(), validParamResponse);
}
//是否联合授权,如果是 //是否联合授权,如果是
UnionEnterpriseAuthDTO unionEnterpriseAuthDTO = unionEnterpriseAuthApiService UnionEnterpriseAuthDTO unionEnterpriseAuthDTO = unionEnterpriseAuthApiService
.getUnionEnterpriseAuthByResourceGroupId(resourceGroup.getResourceGroupId()).getResult(); .getUnionEnterpriseAuthByResourceGroupId(resourceGroup.getResourceGroupId()).getResult();
...@@ -249,45 +235,85 @@ public class ResourceGroupApiServiceImpl implements ResourceGroupApiService{ ...@@ -249,45 +235,85 @@ public class ResourceGroupApiServiceImpl implements ResourceGroupApiService{
* @param resourceGroup * @param resourceGroup
* @return null:验证OK * @return null:验证OK
*/ */
private String validParam(ResourceGroupDTO resourceGroup) { private void validParam(ResourceGroupDTO resourceGroup) {
Integer resourceGroupId = resourceGroup.getResourceGroupId(); Integer resourceGroupId = resourceGroup.getResourceGroupId();
if (resourceGroupId != null) { if (resourceGroupId != null) {
TabSysResourceGroup record = resourceGroupService.getResourceGroup(resourceGroupId); TabSysResourceGroup record = resourceGroupService.getResourceGroup(resourceGroupId);
if (record == null) { if (record == null) {
return"资源组不存在"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "资源组不存在");
} }
} }
//param valid //param valid
if (StringUtils.isBlank(resourceGroup.getResourceGroupName())) { if (StringUtils.isBlank(resourceGroup.getResourceGroupName())) {
return "资源组名称不能为空"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "资源组名称不能为空");
} }
Integer enterpriseId = resourceGroup.getEnterpriseId(); Integer enterpriseId = resourceGroup.getEnterpriseId();
if (enterpriseId == null) { if (enterpriseId == null) {
return "商户ID不能为空"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "商户ID不能为空");
} }
if (resourceGroupService.isRepeatResourceGroupName(resourceGroupId, resourceGroup.getResourceGroupName(), enterpriseId)) { if (resourceGroupService.isRepeatResourceGroupName(resourceGroupId, resourceGroup.getResourceGroupName(), enterpriseId)) {
return "资源组名称重复"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "资源组名称重复");
} }
Integer customUser = resourceGroup.getCustomUser(); Integer customUser = resourceGroup.getCustomUser();
if (customUser == null) { if (customUser == null) {
return "用户域授予标志不能为空"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "用户域授予标志不能为空");
} }
//用户域是否授予 //用户域是否授予
boolean hasAuthCustomUser = customUser == 1; boolean hasAuthCustomUser = customUser == 1;
String customUserData = resourceGroup.getCustomUserData(); String customUserData = resourceGroup.getCustomUserData();
if (hasAuthCustomUser) { if (hasAuthCustomUser) {
if (StringUtils.isBlank(customUserData)) { if (StringUtils.isBlank(customUserData)) {
return "用户域授予资源为空,请选择不授予"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "用户域授予资源为空,请选择不授予");
} }
try { try {
List<ResourceGroupCustomUserDTO> customUserList = JSON.parseArray(customUserData, ResourceGroupCustomUserDTO.class); List<ResourceGroupCustomUserDTO> customUserList = JSON.parseArray(customUserData, ResourceGroupCustomUserDTO.class);
} catch (Exception e) { } catch (Exception e) {
return "用户域数据格式有误"; throw new CommonException(ErrorCode.PARAMETER_ERROR.getCode(), "用户域数据格式有误");
}
}
//微盟订单店铺配置值
setWeimobStore(resourceGroup);
}
private void setWeimobStore(ResourceGroupDTO resourceGroupDTO) {
Integer ownEnterpriseId = resourceGroupDTO.getEnterpriseId();
String weimobStoreId = resourceGroupDTO.getWeimobStoreId();
Integer weimobOrderArea = resourceGroupDTO.getWeimobOrderArea();
//授予店铺订单资源
if ("1".equals(weimobOrderArea) && StringUtils.isNotBlank(weimobStoreId)) {
//查询所有的店铺信息
List<String> wmStoreIdList = Arrays.stream(weimobStoreId.split(",")).collect(Collectors.toList());
ServiceResponse<List<WmStoreDTO>> response = wmStoreApiService.listWmStore(wmStoreIdList, null);
if (response.isSuccess()) {
List<WmStoreDTO> wmStoreList = response.getResult();
if (CollectionUtils.isNotEmpty(wmStoreList)) {
//区分自有商户的店铺和共享店铺,分开存放,避免重复授权(共享店铺不能二次共享授权)
StringBuilder weimobStoreIdOwn = new StringBuilder();
StringBuilder weimobStoreIdShare = new StringBuilder();
for (int i = 0, len = wmStoreList.size(); i < len; i ++) {
WmStoreDTO temp = wmStoreList.get(i);
if (i == len - 1) {
//最后一个,不用加逗号
if (ownEnterpriseId.equals(temp.getEnterpriseId())) {
weimobStoreIdOwn.append(temp.getWmStoreId());
} else {
weimobStoreIdShare.append(temp.getWmStoreId());
}
} else {
if (ownEnterpriseId.equals(temp.getEnterpriseId())) {
weimobStoreIdOwn.append(temp.getWmStoreId()).append(",");
} else {
weimobStoreIdShare.append(temp.getWmStoreId()).append(",");
}
}
}
//赋值
resourceGroupDTO.setWeimobStoreIdOwn(weimobStoreIdOwn.toString());
resourceGroupDTO.setWeimobStoreIdShare(weimobStoreIdShare.toString());
}
} }
} }
return null;
} }
private TabSysResourceGroup checkExistResourceGroup(Integer resourceGroupId) { private TabSysResourceGroup checkExistResourceGroup(Integer resourceGroupId) {
......
...@@ -81,5 +81,6 @@ ...@@ -81,5 +81,6 @@
<dubbo:reference interface="com.gic.enterprise.service.QrCodeApiService" id="qrCodeApiService" timeout="6000" /> <dubbo:reference interface="com.gic.enterprise.service.QrCodeApiService" id="qrCodeApiService" timeout="6000" />
<dubbo:reference interface="com.gic.enterprise.service.UnionEnterpriseAuthApiService" id="unionEnterpriseAuthApiService" timeout="6000" /> <dubbo:reference interface="com.gic.enterprise.service.UnionEnterpriseAuthApiService" id="unionEnterpriseAuthApiService" timeout="6000" />
<dubbo:reference interface="com.gic.enterprise.service.WmStoreApiService" id="wmStoreApiService" timeout="6000" />
<dubbo:reference interface="com.gic.store.service.UnionStoreChangeApiService" id="unionStoreChangeApiService" timeout="6000" /> <dubbo:reference interface="com.gic.store.service.UnionStoreChangeApiService" id="unionStoreChangeApiService" timeout="6000" />
</beans> </beans>
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
<result column="store_order_area" jdbcType="INTEGER" property="storeOrderArea" /> <result column="store_order_area" jdbcType="INTEGER" property="storeOrderArea" />
<result column="weimob_order_area" jdbcType="INTEGER" property="weimobOrderArea" /> <result column="weimob_order_area" jdbcType="INTEGER" property="weimobOrderArea" />
<result column="weimob_store_id" jdbcType="VARCHAR" property="weimobStoreId" /> <result column="weimob_store_id" jdbcType="VARCHAR" property="weimobStoreId" />
<result column="weimob_store_id_own" jdbcType="VARCHAR" property="weimobStoreIdOwn" />
<result column="weimob_store_id_share" jdbcType="VARCHAR" property="weimobStoreIdShare" />
<result column="sms_id" jdbcType="VARCHAR" property="smsId" /> <result column="sms_id" jdbcType="VARCHAR" property="smsId" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
...@@ -19,7 +21,7 @@ ...@@ -19,7 +21,7 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
resource_group_id, resource_group_name, enterprise_id, custom_user, custom_user_data, resource_group_id, resource_group_name, enterprise_id, custom_user, custom_user_data,
store_resource, goods_resource_id, store_order_area, weimob_order_area, weimob_store_id, store_resource, goods_resource_id, store_order_area, weimob_order_area, weimob_store_id, weimob_store_id_own, weimob_store_id_share,
sms_id, create_time, update_time, delete_flag sms_id, create_time, update_time, delete_flag
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
...@@ -32,13 +34,14 @@ ...@@ -32,13 +34,14 @@
insert into tab_sys_resource_group (resource_group_id, resource_group_name, insert into tab_sys_resource_group (resource_group_id, resource_group_name,
enterprise_id, custom_user, custom_user_data, enterprise_id, custom_user, custom_user_data,
store_resource, goods_resource_id, store_order_area, store_resource, goods_resource_id, store_order_area,
weimob_order_area, weimob_store_id, sms_id, weimob_order_area, weimob_store_id, weimob_store_id_own, weimob_store_id_share, sms_id,
create_time, update_time, delete_flag create_time, update_time, delete_flag
) )
values (#{resourceGroupId,jdbcType=INTEGER}, #{resourceGroupName,jdbcType=VARCHAR}, values (#{resourceGroupId,jdbcType=INTEGER}, #{resourceGroupName,jdbcType=VARCHAR},
#{enterpriseId,jdbcType=INTEGER}, #{customUser,jdbcType=INTEGER}, #{customUserData,jdbcType=VARCHAR}, #{enterpriseId,jdbcType=INTEGER}, #{customUser,jdbcType=INTEGER}, #{customUserData,jdbcType=VARCHAR},
#{storeResource,jdbcType=BIGINT}, #{goodsResourceId,jdbcType=BIGINT}, #{storeOrderArea,jdbcType=INTEGER}, #{storeResource,jdbcType=BIGINT}, #{goodsResourceId,jdbcType=BIGINT}, #{storeOrderArea,jdbcType=INTEGER},
#{weimobOrderArea,jdbcType=INTEGER}, #{weimobStoreId,jdbcType=VARCHAR}, #{smsId,jdbcType=VARCHAR}, #{weimobOrderArea,jdbcType=INTEGER}, #{weimobStoreId,jdbcType=VARCHAR}, #{weimobStoreIdOwn,jdbcType=VARCHAR}, #{weimobStoreIdShare,jdbcType=VARCHAR},
#{smsId,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{deleteFlag,jdbcType=INTEGER} #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{deleteFlag,jdbcType=INTEGER}
) )
</insert> </insert>
...@@ -75,6 +78,12 @@ ...@@ -75,6 +78,12 @@
<if test="weimobStoreId != null"> <if test="weimobStoreId != null">
weimob_store_id, weimob_store_id,
</if> </if>
<if test="weimobStoreIdOwn != null">
weimob_store_id_own,
</if>
<if test="weimobStoreIdShare != null">
weimob_store_id_share,
</if>
<if test="smsId != null"> <if test="smsId != null">
sms_id, sms_id,
</if> </if>
...@@ -119,6 +128,12 @@ ...@@ -119,6 +128,12 @@
<if test="weimobStoreId != null"> <if test="weimobStoreId != null">
#{weimobStoreId,jdbcType=VARCHAR}, #{weimobStoreId,jdbcType=VARCHAR},
</if> </if>
<if test="weimobStoreIdOwn != null">
#{weimobStoreIdOwn,jdbcType=VARCHAR},
</if>
<if test="weimobStoreIdShare != null">
#{weimobStoreIdShare,jdbcType=VARCHAR},
</if>
<if test="smsId != null"> <if test="smsId != null">
#{smsId,jdbcType=VARCHAR}, #{smsId,jdbcType=VARCHAR},
</if> </if>
...@@ -163,6 +178,12 @@ ...@@ -163,6 +178,12 @@
<if test="weimobStoreId != null"> <if test="weimobStoreId != null">
weimob_store_id = #{weimobStoreId,jdbcType=VARCHAR}, weimob_store_id = #{weimobStoreId,jdbcType=VARCHAR},
</if> </if>
<if test="weimobStoreIdOwn != null">
weimob_store_id_own = #{weimobStoreIdOwn,jdbcType=VARCHAR},
</if>
<if test="weimobStoreIdShare != null">
weimob_store_id_share = #{weimobStoreIdShare,jdbcType=VARCHAR},
</if>
<if test="smsId != null"> <if test="smsId != null">
sms_id = #{smsId,jdbcType=VARCHAR}, sms_id = #{smsId,jdbcType=VARCHAR},
</if> </if>
...@@ -189,6 +210,8 @@ ...@@ -189,6 +210,8 @@
store_order_area = #{storeOrderArea,jdbcType=INTEGER}, store_order_area = #{storeOrderArea,jdbcType=INTEGER},
weimob_order_area = #{weimobOrderArea,jdbcType=INTEGER}, weimob_order_area = #{weimobOrderArea,jdbcType=INTEGER},
weimob_store_id = #{weimobStoreId,jdbcType=VARCHAR}, weimob_store_id = #{weimobStoreId,jdbcType=VARCHAR},
weimob_store_id_own = #{weimobStoreIdOwn,jdbcType=VARCHAR},
weimob_store_id_share = #{weimobStoreIdShare,jdbcType=VARCHAR},
sms_id = #{smsId,jdbcType=VARCHAR}, sms_id = #{smsId,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP}, create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP},
......
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