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

Commit f18093d6 authored by 胡佳晨's avatar 胡佳晨

Merge remote-tracking branch 'origin/dev_goblin' into dev_goblin

parents 8403bc11 ab577203
...@@ -22,7 +22,7 @@ public class GoblinStoreMgtGoodsAddSkuParam implements Serializable { ...@@ -22,7 +22,7 @@ public class GoblinStoreMgtGoodsAddSkuParam implements Serializable {
@ApiModelProperty(position = 10, required = false, value = "单品ID[编辑时必传]") @ApiModelProperty(position = 10, required = false, value = "单品ID[编辑时必传]")
private String skuId; private String skuId;
@ApiModelProperty(position = 11, required = true, value = "单品默认图片的url[256]") @ApiModelProperty(position = 11, required = true, value = "单品默认图片的url[256]")
@NotBlank(message = "图片不能为空") @NotBlank(message = "单品图片不能为空")
private String skuPic; private String skuPic;
@ApiModelProperty(position = 12, required = true, value = "单品规格信息") @ApiModelProperty(position = 12, required = true, value = "单品规格信息")
@NotNull(message = "规格信息不能为空") @NotNull(message = "规格信息不能为空")
......
...@@ -83,6 +83,7 @@ public class GoblinStoreMgtGoodsEditSkuParam implements Serializable { ...@@ -83,6 +83,7 @@ public class GoblinStoreMgtGoodsEditSkuParam implements Serializable {
for (GoblinGoodsSpecDto goblinGoodsSpecDto : skuSpecList) { for (GoblinGoodsSpecDto goblinGoodsSpecDto : skuSpecList) {
goodsSkuInfoVo.setName(goodsSkuInfoVo.getName().concat(goblinGoodsSpecDto.getSpecVname())); goodsSkuInfoVo.setName(goodsSkuInfoVo.getName().concat(goblinGoodsSpecDto.getSpecVname()));
} }
goodsSkuInfoVo.setSkuSpecList(skuSpecList);
} }
goodsSkuInfoVo.setSkuId(this.getSkuId()); goodsSkuInfoVo.setSkuId(this.getSkuId());
goodsSkuInfoVo.setSkuPic(this.getSkuPic()); goodsSkuInfoVo.setSkuPic(this.getSkuPic());
......
...@@ -53,11 +53,11 @@ public interface IGoblinstoreMgtGoodsService { ...@@ -53,11 +53,11 @@ public interface IGoblinstoreMgtGoodsService {
* @param mgtGoodsEditSkuParam GoblinStoreMgtGoodsEditSkuParam * @param mgtGoodsEditSkuParam GoblinStoreMgtGoodsEditSkuParam
* @param goodsInfoVo GoblinGoodsInfoVo * @param goodsInfoVo GoblinGoodsInfoVo
* @param delSpuSpecMap Map<String, String> * @param delSpuSpecMap Map<String, String>
* @param beUpdateSpuSpecFlg boolean * @param addSpuSpecMap Map<String, String>
* @return boolean * @return boolean
*/ */
boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam,
GoblinGoodsInfoVo goodsInfoVo, Map<String, String> delSpuSpecMap, boolean beUpdateSpuSpecFlg); GoblinGoodsInfoVo goodsInfoVo, Map<String, String> delSpuSpecMap, Map<String, String> addSpuSpecMap);
/** /**
* 商品管理:商品编辑:SKU添加 * 商品管理:商品编辑:SKU添加
......
...@@ -79,6 +79,9 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G ...@@ -79,6 +79,9 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G
updateWrapper.set(GoblinSelfTag::getTagName, selfTag.getTagName()); updateWrapper.set(GoblinSelfTag::getTagName, selfTag.getTagName());
updateWrapper.set(GoblinSelfTag::getTagPic, selfTag.getTagPic()); updateWrapper.set(GoblinSelfTag::getTagPic, selfTag.getTagPic());
if (this.update(updateWrapper)) { if (this.update(updateWrapper)) {
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_TAG);
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_EXTAG);
UpdateResult updateResult = mongoTemplate.getCollection(GoblinSelfTagVo.class.getSimpleName()).updateOne( UpdateResult updateResult = mongoTemplate.getCollection(GoblinSelfTagVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("tagId").is(selfTag.getTagId()).and("tagBelong").is(selfTag.getTagBelong()).and("delFlg").is("0")).getQueryObject(), Query.query(Criteria.where("tagId").is(selfTag.getTagId()).and("tagBelong").is(selfTag.getTagBelong()).and("delFlg").is("0")).getQueryObject(),
Update.update("tagType", selfTag.getTagType()).set("tagName", selfTag.getTagName()).set("tagPic", selfTag.getTagPic()).getUpdateObject() Update.update("tagType", selfTag.getTagType()).set("tagName", selfTag.getTagName()).set("tagPic", selfTag.getTagPic()).getUpdateObject()
...@@ -89,10 +92,6 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G ...@@ -89,10 +92,6 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G
} }
log.info("店铺管理:标签管理:编辑[selfTag={},MONGO.UpdateResult={}]", JsonUtils.toJson(selfTag), JsonUtils.toJson(updateResult)); log.info("店铺管理:标签管理:编辑[selfTag={},MONGO.UpdateResult={}]", JsonUtils.toJson(selfTag), JsonUtils.toJson(updateResult));
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_TAG);
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_EXTAG);
try { try {
boolean isTagFlg = selfTag.getTagBelong().equals("0"); boolean isTagFlg = selfTag.getTagBelong().equals("0");
String subDocName = isTagFlg ? "tagVoList" : "extagVoList"; String subDocName = isTagFlg ? "tagVoList" : "extagVoList";
...@@ -136,6 +135,9 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G ...@@ -136,6 +135,9 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G
); );
if (rmvResultFlg) { if (rmvResultFlg) {
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_TAG);
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_EXTAG);
UpdateResult updateResult = mongoTemplate.updateMulti(Query.query(Criteria.where("tagId").in(tagIdArr).and("delFlg").is("0").and("tagBelong").is(tagBelong)), UpdateResult updateResult = mongoTemplate.updateMulti(Query.query(Criteria.where("tagId").in(tagIdArr).and("delFlg").is("0").and("tagBelong").is(tagBelong)),
Update.update("delFlg", "1"), Update.update("delFlg", "1"),
GoblinSelfTagVo.class.getSimpleName() GoblinSelfTagVo.class.getSimpleName()
...@@ -146,10 +148,6 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G ...@@ -146,10 +148,6 @@ public class GoblinSelfTagServiceImpl extends ServiceImpl<GoblinSelfTagMapper, G
} }
log.info("店铺管理:标签管理:删除[tagIdArr={},tagBelong={},MONGO.UpdateResult={}]", JsonUtils.toJson(tagIdArr), tagBelong, JsonUtils.toJson(updateResult)); log.info("店铺管理:标签管理:删除[tagIdArr={},tagBelong={},MONGO.UpdateResult={}]", JsonUtils.toJson(tagIdArr), tagBelong, JsonUtils.toJson(updateResult));
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_TAG);
redisGoblinUtil.del(GoblinRedisConst.BASIC_SELF_EXTAG);
try { try {
int updateGoodsTagCount = -1, updateGoodsArtagCount = -1; int updateGoodsTagCount = -1, updateGoodsArtagCount = -1;
GoblinGoodsTag updateGoodsTag = new GoblinGoodsTag(); GoblinGoodsTag updateGoodsTag = new GoblinGoodsTag();
......
...@@ -530,7 +530,7 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -530,7 +530,7 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
@Override @Override
public boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsInfoVo goodsInfoVo, public boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsInfoVo goodsInfoVo,
Map<String, String> updateSpuSpecMap, boolean beUpdateSpuSpecFlg) { Map<String, String> delSpuSpecMap, Map<String, String> addSpuSpecMap) {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
GoblinGoodsSkuInfoVo updateSkuInfoVo = mgtGoodsEditSkuParam.initEditGoodsSkuInfoVo(); GoblinGoodsSkuInfoVo updateSkuInfoVo = mgtGoodsEditSkuParam.initEditGoodsSkuInfoVo();
...@@ -560,7 +560,6 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -560,7 +560,6 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
LinkedList<Object[]> updateSkuSpecValueObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> updateSkuSpecValueObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> initSpuSpecValueObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> initSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> delSpuSpecValueObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> delSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> updateSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
List<GoblinGoodsSpecVo> specVoList = goodsInfoVo.getSpecVoList(); List<GoblinGoodsSpecVo> specVoList = goodsInfoVo.getSpecVoList();
List<GoblinGoodsSpecDto> skuSpecList = mgtGoodsEditSkuParam.getSkuSpecList(); List<GoblinGoodsSpecDto> skuSpecList = mgtGoodsEditSkuParam.getSkuSpecList();
...@@ -568,35 +567,25 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -568,35 +567,25 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
String specName = spec.getSpecName(), specVname = spec.getSpecVname(); String specName = spec.getSpecName(), specVname = spec.getSpecVname();
GoblinGoodsSpecVo specVo = specVoList.stream().filter(r -> r.getSpecName().equals(specName)).findAny().get(); GoblinGoodsSpecVo specVo = specVoList.stream().filter(r -> r.getSpecName().equals(specName)).findAny().get();
GoblinGoodsSpecValueVo specValueVo = specVo.getSpecValues().stream().filter(rv -> rv.getSpecVname().equals(specVname)).findAny().get(); specVo.getSpecValues().forEach(r -> initSpuSpecValueObjs.add(new Object[]{spuId, specName, r.getSpecVname(), r.getSpecVsort()}));
initSpuSpecValueObjs.add(new Object[]{spuId, specName, specVname, specValueVo.getSpecVsort()});
updateSkuSpecValueObjs.add(new Object[]{specVname, skuId, specName}); updateSkuSpecValueObjs.add(new Object[]{specVname, skuId, specName});
if (!CollectionUtils.isEmpty(marketSkuIdList)) { if (!CollectionUtils.isEmpty(marketSkuIdList)) {
marketSkuIdList.forEach(marketSkuId -> updateSkuSpecValueObjs.add(new Object[]{specVname, marketSkuId, specName})); marketSkuIdList.forEach(marketSkuId -> updateSkuSpecValueObjs.add(new Object[]{specVname, marketSkuId, specName}));
} }
}); });
if (beUpdateSpuSpecFlg) { boolean updateGoodsInfoVoFlg = false;
for (GoblinGoodsSpecVo specVo : specVoList) { if (!delSpuSpecMap.isEmpty()) {// 删除了规格值,需要同步SPU里的规格信息
List<GoblinGoodsSpecValueVo> specValues = specVo.getSpecValues(); updateGoodsInfoVoFlg = true;
specValues.sort(Comparator.comparing(GoblinGoodsSpecValueVo::getSpecVsort)); goodsInfoVo.setUpdatedBy(uid);
for (int i = 0; i < specValues.size(); i++) { goodsInfoVo.setUpdatedAt(now);
GoblinGoodsSpecValueVo specValueVo = specValues.get(i);
specValueVo.setSpecVsort(i);
updateSpuSpecValueObjs.add(new Object[]{i, spuId, specVo.getSpecName(), specValueVo.getSpecVname()});
}
}
if (!CollectionUtils.isEmpty(updateSpuSpecMap)) {// 更改了规格,需要同步SPU里的规格信息
goodsInfoVo.setUpdatedBy(uid);
goodsInfoVo.setUpdatedAt(now);
goblinMongoUtils.updateGoodsInfoVo(goodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(spuId);
updateSpuSpecMap.forEach((k, v) -> delSpuSpecValueObjs.add(new Object[]{spuId, k, v})); delSpuSpecMap.forEach((k, v) -> delSpuSpecValueObjs.add(new Object[]{spuId, k, v}));
} }
if (!addSpuSpecMap.isEmpty()) {// 新增了规格值,需要同步SPU里的规格信息
updateGoodsInfoVoFlg = true;
goodsInfoVo.setUpdatedBy(uid);
goodsInfoVo.setUpdatedAt(now);
} }
BigDecimal priceGe = BigDecimal.ZERO, priceLe = BigDecimal.ZERO; BigDecimal priceGe = BigDecimal.ZERO, priceLe = BigDecimal.ZERO;
...@@ -609,15 +598,17 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -609,15 +598,17 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
} }
LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
if (priceGe.compareTo(goodsInfoVo.getPriceGe()) != 0 || priceLe.compareTo(goodsInfoVo.getPriceLe()) != 0) { if (priceGe.compareTo(goodsInfoVo.getPriceGe()) != 0 || priceLe.compareTo(goodsInfoVo.getPriceLe()) != 0) {
updateGoodsInfoVoFlg = true;
goodsInfoVo.setPriceGe(priceGe); goodsInfoVo.setPriceGe(priceGe);
goodsInfoVo.setPriceLe(priceLe); goodsInfoVo.setPriceLe(priceLe);
goodsInfoVo.setUpdatedBy(uid); goodsInfoVo.setUpdatedBy(uid);
goodsInfoVo.setUpdatedAt(now); goodsInfoVo.setUpdatedAt(now);
updateGoodsObjs.add(new Object[]{priceGe, priceLe, uid, now, spuId});
}
if (updateGoodsInfoVoFlg) {
goblinMongoUtils.updateGoodsInfoVo(goodsInfoVo); goblinMongoUtils.updateGoodsInfoVo(goodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(spuId); goblinRedisUtils.delGoodsInfoVo(spuId);
updateGoodsObjs.add(new Object[]{priceGe, priceLe, uid, now, spuId});
} }
String buyRoster = mgtGoodsEditSkuParam.getBuyRoster(); String buyRoster = mgtGoodsEditSkuParam.getBuyRoster();
if (StringUtils.isNotEmpty(buyRoster)) { if (StringUtils.isNotEmpty(buyRoster)) {
...@@ -642,14 +633,12 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -642,14 +633,12 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
// LinkedList<Object[]> initSpuSpecValueObjs = CollectionUtil.linkedListObjectArr(); // LinkedList<Object[]> initSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods_spu_spec_value.update_by_editdel")); toMqSqls.add(SqlMapping.get("goblin_goods_spu_spec_value.update_by_editdel"));
// LinkedList<Object[]> delSpuSpecValueObjs = CollectionUtil.linkedListObjectArr(); // LinkedList<Object[]> delSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods_spu_spec_value.update_by_edit"));
// LinkedList<Object[]> updateSpuSpecValueObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_edit_sku")); toMqSqls.add(SqlMapping.get("goblin_goods.update_by_edit_sku"));
// LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr(); // LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(), queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, updateGoodsSkuForMarketObjs, updateGoodsSkuObjs, SqlMapping.gets(toMqSqls, updateGoodsSkuForMarketObjs, updateGoodsSkuObjs,
updateSkuSpecValueObjs, initSpuSpecValueObjs, delSpuSpecValueObjs, updateSpuSpecValueObjs, updateGoodsObjs)); updateSkuSpecValueObjs, initSpuSpecValueObjs, delSpuSpecValueObjs, updateGoodsObjs));
return true; return true;
} }
Integer operStock = mgtGoodsEditSkuParam.getOperStock(); Integer operStock = mgtGoodsEditSkuParam.getOperStock();
......
...@@ -122,7 +122,7 @@ public class GoblinRedisUtils { ...@@ -122,7 +122,7 @@ public class GoblinRedisUtils {
List<GoblinSelfTagVo> vos; List<GoblinSelfTagVo> vos;
if (valStrIsEmptyFlg) { if (valStrIsEmptyFlg) {
if (!CollectionUtils.isEmpty(vos = goblinMongoUtils.getSelfTagVos("0"))) { if (!CollectionUtils.isEmpty(vos = goblinMongoUtils.getSelfTagVos("0"))) {
redisUtil.set(GoblinRedisConst.BASIC_SELF_TAG, JsonUtils.toJson(vos)); redisUtil.set(GoblinRedisConst.BASIC_SELF_TAG, JsonUtils.toJson(vos), 60 * 60);
} }
} else { } else {
vos = JsonUtils.fromJson(valStr, new TypeReference<List<GoblinSelfTagVo>>() { vos = JsonUtils.fromJson(valStr, new TypeReference<List<GoblinSelfTagVo>>() {
...@@ -144,7 +144,7 @@ public class GoblinRedisUtils { ...@@ -144,7 +144,7 @@ public class GoblinRedisUtils {
List<GoblinSelfTagVo> vos; List<GoblinSelfTagVo> vos;
if (StringUtils.isEmpty(valStr)) { if (StringUtils.isEmpty(valStr)) {
if (!CollectionUtils.isEmpty(vos = goblinMongoUtils.getSelfTagVos("1"))) { if (!CollectionUtils.isEmpty(vos = goblinMongoUtils.getSelfTagVos("1"))) {
redisUtil.set(GoblinRedisConst.BASIC_SELF_TAG, JsonUtils.toJson(vos)); redisUtil.set(GoblinRedisConst.BASIC_SELF_TAG, JsonUtils.toJson(vos), 60 * 60);
} }
} else { } else {
vos = JsonUtils.fromJson(valStr, new TypeReference<List<GoblinSelfTagVo>>() { vos = JsonUtils.fromJson(valStr, new TypeReference<List<GoblinSelfTagVo>>() {
......
...@@ -29,7 +29,6 @@ goblin_goods_spec_value.insert_byreplace=REPLACE INTO goblin_goods_spec_value (s ...@@ -29,7 +29,6 @@ goblin_goods_spec_value.insert_byreplace=REPLACE INTO goblin_goods_spec_value (s
#---- 商品关联规格信息 #---- 商品关联规格信息
goblin_goods_spu_spec_value.insert_byreplace=REPLACE INTO goblin_goods_spu_spec_value (spu_id,spec_name,spec_vname,sort,del_flg)VALUES(?,?,?,?,'0') goblin_goods_spu_spec_value.insert_byreplace=REPLACE INTO goblin_goods_spu_spec_value (spu_id,spec_name,spec_vname,sort,del_flg)VALUES(?,?,?,?,'0')
goblin_goods_spu_spec_value.update_by_editdel=UPDATE goblin_goods_spu_spec_value SET del_flg='1' WHERE spu_id=? AND spec_name=? AND spec_vname=? AND del_flg='0' goblin_goods_spu_spec_value.update_by_editdel=UPDATE goblin_goods_spu_spec_value SET del_flg='1' WHERE spu_id=? AND spec_name=? AND spec_vname=? AND del_flg='0'
goblin_goods_spu_spec_value.update_by_edit=UPDATE goblin_goods_spu_spec_value SET sort=? WHERE spu_id=? AND spec_name=? AND spec_vname=? AND del_flg='0'
goblin_goods_spu_spec_value.update_by_del_sku=UPDATE goblin_goods_spu_spec_value SET sort=?,del_flg=? WHERE spu_id=? AND spec_name=? AND spec_vname=? goblin_goods_spu_spec_value.update_by_del_sku=UPDATE goblin_goods_spu_spec_value SET sort=?,del_flg=? WHERE spu_id=? AND spec_name=? AND spec_vname=?
goblin_goods_sku_spec_value.insert_byreplace=REPLACE INTO goblin_goods_sku_spec_value (spu_id,sku_id,spec_name,spec_vname,del_flg)VALUES(?,?,?,?,'0') goblin_goods_sku_spec_value.insert_byreplace=REPLACE INTO goblin_goods_sku_spec_value (spu_id,sku_id,spec_name,spec_vname,del_flg)VALUES(?,?,?,?,'0')
goblin_goods_sku_spec_value.update_by_edit=UPDATE goblin_goods_sku_spec_value SET spec_vname=? WHERE sku_id=? AND spec_name=? AND del_flg='0' goblin_goods_sku_spec_value.update_by_edit=UPDATE goblin_goods_sku_spec_value SET spec_vname=? WHERE sku_id=? AND spec_name=? AND del_flg='0'
......
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