Commit 54dc3735 authored by Administrator's avatar Administrator

-

Signed-off-by: Administrator's avatarAdministrator <admin@example.com>
parent 889af0e5
...@@ -6,10 +6,7 @@ import lombok.NoArgsConstructor; ...@@ -6,10 +6,7 @@ import lombok.NoArgsConstructor;
import org.redisson.api.*; import org.redisson.api.*;
import java.time.Duration; import java.time.Duration;
import java.util.Collection; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -486,4 +483,17 @@ public class RedisUtils { ...@@ -486,4 +483,17 @@ public class RedisUtils {
RKeys rKeys = CLIENT.getKeys(); RKeys rKeys = CLIENT.getKeys();
return rKeys.countExists(key) > 0; return rKeys.countExists(key) > 0;
} }
/***
*@Description: 锁-释放
*@Param:
*@return: boolean
*@Author: Dgm
*@date: 2022/6/15 9:41
*/
public static void hasValueDelete (String lockKey, String value) {
if (value.contentEquals(Objects.requireNonNull(CLIENT.getBucket(lockKey).get()+""))) {
CLIENT.getBucket(lockKey).delete();
}
}
} }
...@@ -4,11 +4,8 @@ import com.dsk.common.core.domain.R; ...@@ -4,11 +4,8 @@ import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.monitor.domain.vo.*; import com.dsk.monitor.domain.vo.*;
import com.dsk.monitor.service.MonitorService; import com.dsk.monitor.service.MonitorService;
import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -51,13 +48,13 @@ public class MonitorController { ...@@ -51,13 +48,13 @@ public class MonitorController {
} }
/*** /***
*@Description: 同步推送数据入库 *@Description: 新增修改我的规则
*@Param: *@Param:
*@return: com.dsk.common.core.domain.R *@return: com.dsk.common.core.domain.R
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@PostMapping(value = "push/insertRules") @PostMapping(value = "push/rules/insertOrUpdate")
public R insertRules(@RequestBody PushMonitorRulesVo rulesVo) { public R insertRules(@RequestBody PushMonitorRulesVo rulesVo) {
return monitorService.insertRules(rulesVo); return monitorService.insertRules(rulesVo);
} }
...@@ -69,7 +66,7 @@ public class MonitorController { ...@@ -69,7 +66,7 @@ public class MonitorController {
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@GetMapping(value = "push/rulesDetail") @PostMapping(value = "push/rulesDetail")
public R rulesDetail(@RequestBody PushMonitorRulesDetailVo detailVo) { public R rulesDetail(@RequestBody PushMonitorRulesDetailVo detailVo) {
return monitorService.rulesDetail(detailVo); return monitorService.rulesDetail(detailVo);
} }
...@@ -81,7 +78,7 @@ public class MonitorController { ...@@ -81,7 +78,7 @@ public class MonitorController {
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@GetMapping(value = "companyDynamicPage") @PostMapping(value = "company/dynamicPage")
public TableDataInfo companyDynamicPage(@RequestBody PushMonitorDynamicPageVo pageVo) throws Exception{ public TableDataInfo companyDynamicPage(@RequestBody PushMonitorDynamicPageVo pageVo) throws Exception{
return monitorService.companyDynamicPage(pageVo); return monitorService.companyDynamicPage(pageVo);
} }
...@@ -93,7 +90,7 @@ public class MonitorController { ...@@ -93,7 +90,7 @@ public class MonitorController {
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@GetMapping(value = "companyDynamic/detail") @PostMapping(value = "company/dynamicDetail")
public R companyDynamicDetail(@RequestBody PushMonitorDynamicDetailVo detailVo) { public R companyDynamicDetail(@RequestBody PushMonitorDynamicDetailVo detailVo) {
return monitorService.companyDynamicDetail(detailVo); return monitorService.companyDynamicDetail(detailVo);
} }
...@@ -105,7 +102,7 @@ public class MonitorController { ...@@ -105,7 +102,7 @@ public class MonitorController {
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@GetMapping(value = "reportPage") @PostMapping(value = "reportPage")
public TableDataInfo reportPage(@RequestBody PushMonitorReportPageVo pageVo) throws Exception{ public TableDataInfo reportPage(@RequestBody PushMonitorReportPageVo pageVo) throws Exception{
return monitorService.reportPage(pageVo); return monitorService.reportPage(pageVo);
} }
...@@ -117,7 +114,7 @@ public class MonitorController { ...@@ -117,7 +114,7 @@ public class MonitorController {
*@Author: Dgm *@Author: Dgm
*@date: 2023/12/9 9:29 *@date: 2023/12/9 9:29
*/ */
@GetMapping(value = "system/companyPage") @PostMapping(value = "system/companyPage")
public TableDataInfo companyPage(@RequestBody PushMonitorCompanyPageVo pageVo) throws Exception{ public TableDataInfo companyPage(@RequestBody PushMonitorCompanyPageVo pageVo) throws Exception{
return monitorService.companyPage(pageVo); return monitorService.companyPage(pageVo);
} }
...@@ -146,4 +143,16 @@ public class MonitorController { ...@@ -146,4 +143,16 @@ public class MonitorController {
return monitorService.systemCancel(cancelVo); return monitorService.systemCancel(cancelVo);
} }
/***
*@Description: 导入
*@Param:
*@return: java.lang.String
*@Author: Dgm
*@date: 2022/6/14 10:45
*/
@RequestMapping("/system/import")
public R importGuarantee(@RequestParam MultipartFile file) throws Exception{
return monitorService.importGuarantee(file);
}
} }
...@@ -13,7 +13,7 @@ import java.util.Date; ...@@ -13,7 +13,7 @@ import java.util.Date;
* @Version * @Version
*/ */
@Data @Data
public class PushMonitorInfoDto implements Serializable { public class PushMonitorInfo implements Serializable {
private static final long serialVersionUID = 6732846953537725830L; private static final long serialVersionUID = 6732846953537725830L;
......
...@@ -13,7 +13,7 @@ import java.util.Date; ...@@ -13,7 +13,7 @@ import java.util.Date;
* @Version * @Version
*/ */
@Data @Data
public class PushMonitorRulesDto implements Serializable { public class PushMonitorRules implements Serializable {
private static final long serialVersionUID = -2226356282137776096L; private static final long serialVersionUID = -2226356282137776096L;
...@@ -25,7 +25,7 @@ public class PushMonitorRulesDto implements Serializable { ...@@ -25,7 +25,7 @@ public class PushMonitorRulesDto implements Serializable {
/** /**
* 创建人Id * 创建人Id
*/ */
private String userId; private String userId = "98";
/** /**
* 风险类型,多个逗号隔开 * 风险类型,多个逗号隔开
......
...@@ -12,5 +12,5 @@ import lombok.Data; ...@@ -12,5 +12,5 @@ import lombok.Data;
@Data @Data
public class PushMonitorDynamicDetailVo { public class PushMonitorDynamicDetailVo {
private String id; private String sourceId;
} }
package com.dsk.monitor.domain.vo;
import lombok.Data;
import java.util.List;
/**
* @ClassName PushMonitorImportCompanyVo
* @Description
* @Author Dgm
* @Date 2023/12/9 11:05
* @Version
*/
@Data
public class PushMonitorImportCompanyVo {
/**
* 条件查询企业名称
*/
private String companyName;
}
package com.dsk.monitor.domain.vo; package com.dsk.monitor.domain.vo;
import com.dsk.monitor.domain.dto.PushMonitorInfoDto; import com.dsk.monitor.domain.dto.PushMonitorInfo;
import lombok.Data; import lombok.Data;
/** /**
...@@ -11,6 +11,6 @@ import lombok.Data; ...@@ -11,6 +11,6 @@ import lombok.Data;
* @Version * @Version
*/ */
@Data @Data
public class PushMonitorInfoVo extends PushMonitorInfoDto { public class PushMonitorInfoVo extends PushMonitorInfo {
} }
...@@ -14,5 +14,5 @@ public class PushMonitorRulesDetailVo { ...@@ -14,5 +14,5 @@ public class PushMonitorRulesDetailVo {
/** /**
* 创建人Id * 创建人Id
*/ */
private String userId; private String userId = "98";
} }
package com.dsk.monitor.domain.vo; package com.dsk.monitor.domain.vo;
import com.dsk.monitor.domain.dto.PushMonitorRulesDto; import com.dsk.monitor.domain.dto.PushMonitorRules;
/** /**
* @ClassName PushMonitorRulesVo * @ClassName PushMonitorRulesVo
...@@ -9,5 +9,5 @@ import com.dsk.monitor.domain.dto.PushMonitorRulesDto; ...@@ -9,5 +9,5 @@ import com.dsk.monitor.domain.dto.PushMonitorRulesDto;
* @Date 2023/12/9 11:05 * @Date 2023/12/9 11:05
* @Version * @Version
*/ */
public class PushMonitorRulesVo extends PushMonitorRulesDto { public class PushMonitorRulesVo extends PushMonitorRules {
} }
...@@ -2,7 +2,7 @@ package com.dsk.monitor.job; ...@@ -2,7 +2,7 @@ package com.dsk.monitor.job;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dsk.common.utils.DateUtils; import com.dsk.common.utils.DateUtils;
import com.dsk.monitor.domain.dto.PushMonitorRulesDto; import com.dsk.monitor.domain.dto.PushMonitorRules;
import com.dsk.monitor.mapper.PushMonitorInfoMapper; import com.dsk.monitor.mapper.PushMonitorInfoMapper;
import com.dsk.monitor.mapper.PushMonitorRulesMapper; import com.dsk.monitor.mapper.PushMonitorRulesMapper;
import com.dsk.monitor.util.SendMessageUtil; import com.dsk.monitor.util.SendMessageUtil;
...@@ -30,7 +30,7 @@ public class PushScheduling { ...@@ -30,7 +30,7 @@ public class PushScheduling {
// 获取当前整点时间 // 获取当前整点时间
Integer concurrentHour = DateUtils.getHour(); Integer concurrentHour = DateUtils.getHour();
QueryWrapper queryWrapper = new QueryWrapper(); QueryWrapper queryWrapper = new QueryWrapper();
PushMonitorRulesDto detail = rulesMapper.selectOne(queryWrapper); PushMonitorRules detail = rulesMapper.selectOne(queryWrapper);
// 推送时段-起 // 推送时段-起
Integer timePeriodStart = detail.getTimePeriodStart(); Integer timePeriodStart = detail.getTimePeriodStart();
// 推送时段-止 // 推送时段-止
......
package com.dsk.monitor.mapper; package com.dsk.monitor.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.monitor.domain.vo.PushMonitorInfoVo; import com.dsk.monitor.domain.dto.PushMonitorInfo;
/** /**
* @ClassName PushMonitorInfoMapper * @ClassName PushMonitorInfoMapper
...@@ -10,5 +10,5 @@ import com.dsk.monitor.domain.vo.PushMonitorInfoVo; ...@@ -10,5 +10,5 @@ import com.dsk.monitor.domain.vo.PushMonitorInfoVo;
* @Date 2023/12/9 9:38 * @Date 2023/12/9 9:38
* @Version 1.0.0 * @Version 1.0.0
*/ */
public interface PushMonitorInfoMapper extends BaseMapper<PushMonitorInfoVo> { public interface PushMonitorInfoMapper extends BaseMapper<PushMonitorInfo> {
} }
package com.dsk.monitor.mapper; package com.dsk.monitor.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.monitor.domain.dto.PushMonitorRulesDto; import com.dsk.monitor.domain.dto.PushMonitorRules;
/** /**
* @ClassName PushMonitorInfoMapper * @ClassName PushMonitorInfoMapper
...@@ -10,5 +10,5 @@ import com.dsk.monitor.domain.dto.PushMonitorRulesDto; ...@@ -10,5 +10,5 @@ import com.dsk.monitor.domain.dto.PushMonitorRulesDto;
* @Date 2023/12/9 9:38 * @Date 2023/12/9 9:38
* @Version 1.0.0 * @Version 1.0.0
*/ */
public interface PushMonitorRulesMapper extends BaseMapper<PushMonitorRulesDto> { public interface PushMonitorRulesMapper extends BaseMapper<PushMonitorRules> {
} }
...@@ -3,6 +3,7 @@ package com.dsk.monitor.service; ...@@ -3,6 +3,7 @@ package com.dsk.monitor.service;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.monitor.domain.vo.*; import com.dsk.monitor.domain.vo.*;
import org.springframework.web.multipart.MultipartFile;
/** /**
* @ClassName MonitorService * @ClassName MonitorService
...@@ -104,4 +105,13 @@ public interface MonitorService { ...@@ -104,4 +105,13 @@ public interface MonitorService {
*@date: 2023/12/9 10:03 *@date: 2023/12/9 10:03
*/ */
R systemCancel(PushMonitorCompanyCancelVo cancelVo); R systemCancel(PushMonitorCompanyCancelVo cancelVo);
/***
*@Description: 取消监控
*@Param: cancelVo 信息
*@return: R
*@Author: Dgm
*@date: 2023/12/9 10:03
*/
R importGuarantee(MultipartFile file) throws Exception;
} }
package com.dsk.monitor.service.impl; package com.dsk.monitor.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.monitor.domain.dto.PushMonitorRulesDto; import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.monitor.domain.dto.PushMonitorInfo;
import com.dsk.monitor.domain.dto.PushMonitorRules;
import com.dsk.monitor.domain.vo.*; import com.dsk.monitor.domain.vo.*;
import com.dsk.monitor.mapper.PushMonitorInfoMapper; import com.dsk.monitor.mapper.PushMonitorInfoMapper;
import com.dsk.monitor.mapper.PushMonitorRulesMapper; import com.dsk.monitor.mapper.PushMonitorRulesMapper;
import com.dsk.monitor.service.MonitorService; import com.dsk.monitor.service.MonitorService;
import com.dsk.system.utils.DskOpenApiUtil; import com.dsk.system.utils.DskOpenApiUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.time.Duration;
import java.util.HashMap; import java.util.*;
import java.util.List; import java.util.concurrent.TimeUnit;
import java.util.Map;
/** /**
* @ClassName MonitorServiceImpl * @ClassName MonitorServiceImpl
...@@ -25,6 +32,7 @@ import java.util.Map; ...@@ -25,6 +32,7 @@ import java.util.Map;
* @Date 2023/12/9 10:04 * @Date 2023/12/9 10:04
* @Version * @Version
*/ */
@Slf4j
@Service @Service
public class MonitorServiceImpl implements MonitorService { public class MonitorServiceImpl implements MonitorService {
...@@ -53,21 +61,26 @@ public class MonitorServiceImpl implements MonitorService { ...@@ -53,21 +61,26 @@ public class MonitorServiceImpl implements MonitorService {
objectMap.put("riskType", riskType); objectMap.put("riskType", riskType);
// 维度 // 维度
List<String> dimension = new ArrayList<>(10); List<String> dimension = new ArrayList<>(10);
riskType.add("法院公告"); dimension.add("法院公告");
riskType.add("裁判文书"); dimension.add("裁判文书");
riskType.add("开庭公告"); dimension.add("开庭公告");
riskType.add("股权冻结"); dimension.add("股权冻结");
riskType.add("限制高消费"); dimension.add("限制高消费");
riskType.add("被执行人"); dimension.add("被执行人");
riskType.add("失信被执行人"); dimension.add("失信被执行人");
riskType.add("限制高消费"); dimension.add("限制高消费");
objectMap.put("dimension", dimension); objectMap.put("dimension", dimension);
return R.ok(objectMap); return R.ok(objectMap);
} }
@Override @Override
public R insertRules(PushMonitorRulesVo monitorRulesDto) { public R insertRules(PushMonitorRulesVo monitorRulesDto) {
rulesMapper.insert(monitorRulesDto); // todo 20231211 规则是否与使用登录人强关联
if (ObjectUtil.isEmpty(monitorRulesDto.getId())) {
rulesMapper.insert(monitorRulesDto);
} else {
rulesMapper.updateById(monitorRulesDto);
}
return R.ok(); return R.ok();
} }
...@@ -75,27 +88,27 @@ public class MonitorServiceImpl implements MonitorService { ...@@ -75,27 +88,27 @@ public class MonitorServiceImpl implements MonitorService {
public R rulesDetail(PushMonitorRulesDetailVo detailVo) { public R rulesDetail(PushMonitorRulesDetailVo detailVo) {
QueryWrapper queryWrapper = new QueryWrapper(); QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("user_id", detailVo.getUserId()); queryWrapper.eq("user_id", detailVo.getUserId());
PushMonitorRulesDto detail = rulesMapper.selectOne(queryWrapper); PushMonitorRules detail = rulesMapper.selectOne(queryWrapper);
return R.ok(detail); return R.ok(detail);
} }
@Override @Override
public TableDataInfo companyDynamicPage(PushMonitorDynamicPageVo pageVo) throws Exception { public TableDataInfo companyDynamicPage(PushMonitorDynamicPageVo pageVo) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/company/info/companyDynamicList", BeanUtil.beanToMap(pageVo, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/monitor/company/info/companyDynamicList", BeanUtil.beanToMap(pageVo, false, false));
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
@Override @Override
public R companyDynamicDetail(PushMonitorDynamicDetailVo detailVo) { public R companyDynamicDetail(PushMonitorDynamicDetailVo detailVo) {
QueryWrapper queryWrapper = new QueryWrapper(); QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("id", detailVo.getId()); queryWrapper.eq("source_id", detailVo.getSourceId());
PushMonitorInfoVo detail = monitorInfoMapper.selectOne(queryWrapper); PushMonitorInfo detail = monitorInfoMapper.selectOne(queryWrapper);
return R.ok(detail); return R.ok(detail);
} }
@Override @Override
public TableDataInfo reportPage(PushMonitorReportPageVo pageVo) throws Exception { public TableDataInfo reportPage(PushMonitorReportPageVo pageVo) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/company/info/monitor/report", BeanUtil.beanToMap(pageVo, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/monitor/company/info/monitor/report", BeanUtil.beanToMap(pageVo, false, false));
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
...@@ -117,4 +130,72 @@ public class MonitorServiceImpl implements MonitorService { ...@@ -117,4 +130,72 @@ public class MonitorServiceImpl implements MonitorService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/monitor/company/supplier/system/cancel", BeanUtil.beanToMap(cancelVo, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/monitor/company/supplier/system/cancel", BeanUtil.beanToMap(cancelVo, false, false));
return BeanUtil.toBean(map, R.class); return BeanUtil.toBean(map, R.class);
} }
@Override
public R importGuarantee(MultipartFile file) {
//存放保单信息
List<PushMonitorImportCompanyVo> companyVoListList = new ArrayList<PushMonitorImportCompanyVo>();
String userId = "98";
// 设置redisKey
String lockKey = "stockKey" + userId;
// 设置redisValue
String value = UUID.randomUUID().toString();
try {
// 这里默认设置超时时间为30秒
boolean hasKey = RedisUtils.setObjectIfAbsent(lockKey, value, Duration.ofMillis(1000 * 30));
if (!hasKey) {
return R.fail("数据正在上传请等待");
}
//如果文件不存在 则文件上传失败
if (file == null){
return R.fail("操作失敗,数据异常,請使用正确的模板");
}
if (file.isEmpty()){
return R.fail("操作失敗,数据异常,請使用正确的模板");
}
//得到整个excel
XSSFWorkbook wook = new XSSFWorkbook((file.getInputStream()));
//得到第一个表单sheet
Sheet sheet = wook.getSheetAt(0);
//得到最后一行的行号
int lastRowNum = sheet.getLastRowNum();
//如果总行数小于等于2 (没有数据)提示数据异常
if ((lastRowNum) < 1){
return R.fail("未提供有效数据,请确认!");
}
//进行excel格式判定
String name = sheet.getRow(0).getCell(0) + "";
//只要其中一个不满足则格式有误
if (!"企业名称".equals(name)){
return R.fail("操作失败,数据异常,请使用正确的模板");
}
//行列皆从0开始
for (int i = 1; i <= lastRowNum; i++) {
PushMonitorImportCompanyVo vo = new PushMonitorImportCompanyVo();
// 统一社会信用代码
Cell companyName = sheet.getRow(i).getCell(0);
if (ObjectUtil.isNotEmpty(companyName)) {
String cn = companyName.toString();
vo.setCompanyName(cn.trim());
}
companyVoListList.add(vo);
}
} catch (Exception e) {
log.error("",e.getMessage());
} finally {
RedisUtils.hasValueDelete(lockKey, value);
}
if (ObjectUtil.isEmpty(companyVoListList)) {
return R.fail("操作失败");
}
Map<String, Object> param = new HashMap<>(1);
param.put("names", companyVoListList);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/monitor/company/supplier/system/addPatch", param);
return BeanUtil.toBean(map, R.class);
}
} }
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