Commit 1ad795a7 authored by hanbing's avatar hanbing

[update] 信号优化首页,子区信息-路口监测

parent 9927b379
......@@ -147,21 +147,6 @@ public class SituationDetectionController extends BaseController {
return jsonViewObject.success(allDeviceStatusMap);
}
@AspectLog(description = "绿波监测-关联路口", operationType = BaseEnum.OperationTypeEnum.QUERY)
@ApiOperation(value = "绿波监测-关联路口", notes = "绿波监测-关联路口", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenwaveCross",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
public JsonViewObject greenwaveCross(@RequestBody GreenwaveCrossInVO greenwaveCrossInVO) {
String adCode = greenwaveCrossInVO.getAdCode();
String currentTime = greenwaveCrossInVO.getCurrentTime();
Integer id = greenwaveCrossInVO.getId();
List<GreenwaveCrossOutVO> greenwaveCrossOutVOList = situationDetectionService.greenwaveCross(adCode, currentTime, id);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(greenwaveCrossOutVOList);
}
@AspectLog(description = "路口设备状态信息", operationType = BaseEnum.OperationTypeEnum.QUERY)
@ApiOperation(value = "路口设备状态信息", notes = "路口设备状态信息", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON)
......
package net.wanji.web.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author Kent HAN
* @date 2022/10/31 11:04
*/
@Data
public class GreenwaveCrossPO {
@ApiModelProperty(name = "路口名称",notes = "")
private String name;
@ApiModelProperty(name = "位置信息POINT(经度,维度)",notes = "")
private String location;
}
......@@ -30,8 +30,6 @@ public interface SituationDetectionService {
Map<String, Map<String, Integer>> allDeviceStatus(String adCode);
List<GreenwaveCrossOutVO> greenwaveCross(String adCode, String currentTime, Integer id);
List<CrossDeviceStatusInfoOutVO> crossDeviceStatusInfo();
BaseCrossInfoPO selectCrossInfoById(String signalId);
......
......@@ -12,9 +12,14 @@ import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.common.utils.tool.BeanMapUtils;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.po.TBaseCrossInfo;
import net.wanji.databus.vo.*;
import net.wanji.databus.vo.CrossDeviceStatusInfoOutVO;
import net.wanji.databus.vo.CrossInfoOutVo;
import net.wanji.databus.vo.CrossInfoPageVO;
import net.wanji.databus.vo.ManufacturerInfoOutVO;
import net.wanji.databus.vo.ManufacturerVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.common.enums.ControlHistEnum;
import net.wanji.web.common.enums.CrossAlarmEnum;
......@@ -28,17 +33,56 @@ import net.wanji.web.entity.TBaseAreaCross;
import net.wanji.web.entity.TBaseAreaInfo;
import net.wanji.web.entity.TCrossControlHist;
import net.wanji.web.entity.TDeviceStatusInfo;
import net.wanji.web.mapper.*;
import net.wanji.web.po.*;
import net.wanji.web.mapper.AllDeviceStatusMapper;
import net.wanji.web.mapper.ControlHistMapper;
import net.wanji.web.mapper.CrossAlarmMapper;
import net.wanji.web.mapper.EventAlarmMapper;
import net.wanji.web.mapper.GreenwaveRealtimeMapper;
import net.wanji.web.mapper.OptRecordsMapper;
import net.wanji.web.mapper.TBaseAreaCrossMapper;
import net.wanji.web.mapper.TBaseAreaInfoMapper;
import net.wanji.web.mapper.TDeviceStatusLogMapper;
import net.wanji.web.mapper.VehicleTraceMapper;
import net.wanji.web.mapper.VideoDeviceInfoMapper;
import net.wanji.web.po.BaseAreaDataPO;
import net.wanji.web.po.ControlHistPO;
import net.wanji.web.po.CrossAlarmPO;
import net.wanji.web.po.EventAlarmPO;
import net.wanji.web.po.GreenwaveRealtimePO;
import net.wanji.web.po.VehicleTracePO;
import net.wanji.web.po.VideoDeviceInfoPO;
import net.wanji.web.service.SituationDetectionService;
import net.wanji.web.vo.situationDetection.*;
import net.wanji.web.vo.situationDetection.AreaListVO;
import net.wanji.web.vo.situationDetection.ControlHistOutVO;
import net.wanji.web.vo.situationDetection.CrossAlarmOutVO;
import net.wanji.web.vo.situationDetection.DeviceFaultCountVO;
import net.wanji.web.vo.situationDetection.EventAlarmOutVO;
import net.wanji.web.vo.situationDetection.GreenwaveRealtimeOutVO;
import net.wanji.web.vo.situationDetection.JurisdictionAreaTreeVO;
import net.wanji.web.vo.situationDetection.OptRecordsOutVO;
import net.wanji.web.vo.situationDetection.SignalFaultInfoVO;
import net.wanji.web.vo.situationDetection.SignalManufacturerCountInfoVO;
import net.wanji.web.vo.situationDetection.SignalOperationModeCountVO;
import net.wanji.web.vo.situationDetection.SignalOperationModeVO;
import net.wanji.web.vo.situationDetection.VehicleTraceOutVO;
import net.wanji.web.vo.situationDetection.VideoDeviceInfoOutVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
......@@ -377,25 +421,6 @@ public class SituationDetectionServiceImpl implements SituationDetectionService
return res;
}
@Override
public List<GreenwaveCrossOutVO> greenwaveCross(String adCode, String currentTime, Integer id) {
List<GreenwaveCrossOutVO> greenwaveCrossOutVOList = new ArrayList<>();
List<GreenwaveCrossPO> greenwaveCrossPOList = greenwaveCrossMapper.selectByGreenwaveId(adCode, currentTime, id);
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) {
GreenwaveCrossOutVO greenwaveCrossOutVO = new GreenwaveCrossOutVO();
greenwaveCrossOutVO.setName(greenwaveCrossPO.getName());
// 构造坐标
String location = greenwaveCrossPO.getLocation();
double[] lonLat = CrossUtil.getLonLat(location);
greenwaveCrossOutVO.setLongitude(lonLat[0]);
greenwaveCrossOutVO.setLatitude(lonLat[1]);
greenwaveCrossOutVOList.add(greenwaveCrossOutVO);
}
return greenwaveCrossOutVOList;
}
@Override
public List<CrossDeviceStatusInfoOutVO> crossDeviceStatusInfo() {
List<CrossDeviceStatusInfoOutVO> results = tBaseBaseCrossInfoMapper.listCrossDeviceStatusInfo();
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.web.mapper.GreenwaveCrossMapper">
<!-- 通用查询映射结果 -->
<resultMap type="net.wanji.web.po.GreenwaveCrossPO" id="BaseResultMap">
<result property="name" column="NAME"/>
<result property="location" column="LOCATION"/>
</resultMap>
<select id="selectByGreenwaveId" resultMap="BaseResultMap">
select t3.NAME as name, t3.LOCATION as location
from t_greenwave_cross as t1
join t_greenwave_realtime as t2
join t_base_cross_info as t3
on t1.green_id = t2.greenwave_id and t1.cross_id = t3.ID
where t1.green_id = #{id} and to_days(#{currentTime}) = to_days(t1.gmt_create)
</select>
</mapper>
package net.wanji.opt.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author Kent HAN
* @date 2023/6/9 13:52
*/
@Data
@ApiModel(value = "GreenwaveIdBO", description = "绿波ID")
public class GreenwaveIdBO {
@ApiModelProperty(value = "绿波ID")
private Integer greenwaveId;
}
......@@ -6,16 +6,12 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.EventAlarmDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.service.impl.TrendServiceImpl;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.EventAlarmVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import net.wanji.opt.vo.GreenwaveVO;
import net.wanji.opt.vo.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -44,6 +40,18 @@ public class TrendController {
this.trendService = trendService;
}
@ApiOperation(value = "子区信息-路口监测", notes = "子区信息-路口监测", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenwaveCrossMonitor",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenWaveCrossMonitorVO.class),
})
public JsonViewObject greenwaveCrossMonitor(@RequestBody GreenwaveIdBO greenwaveIdBO) {
List<GreenWaveCrossMonitorVO> res = trendService.greenwaveCrossMonitor(greenwaveIdBO);
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "问题子区列表", notes = "问题子区列表", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenwaveList",
......
package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.EventAlarmVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import net.wanji.opt.vo.*;
import java.text.ParseException;
import java.util.Date;
......@@ -28,4 +25,6 @@ public interface TrendService {
AbnormalCrossDetailVO abnormalCrossDetail(CrossIdDTO crossIdDTO);
List<EventAlarmVO> eventAlarm(Date todayTime) throws ParseException;
List<GreenWaveCrossMonitorVO> greenwaveCrossMonitor(GreenwaveIdBO greenwaveIdBO);
}
......@@ -9,14 +9,23 @@ import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.EventAlarmEnum;
import net.wanji.common.enums.EventAlarmSourceEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.GreenwaveCrossPO;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.dao.mapper.BaseCrossDirInfoMapper;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossDirDataHistMapper;
import net.wanji.databus.dao.mapper.CrossDirDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossTurnDataRealtimeMapper;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.po.CrossTurnDataRealtimePO;
import net.wanji.databus.po.TBaseCrossInfo;
import net.wanji.databus.vo.AbnormalCrossListVO;
import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
import net.wanji.opt.dao.mapper.trend.EventAlarmMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
......@@ -25,12 +34,24 @@ import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.trend.EventAlarmPO;
import net.wanji.opt.service.TrendService;
import net.wanji.opt.vo.*;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossStats;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.EventAlarmVO;
import net.wanji.opt.vo.GreenWaveCrossMonitorVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import org.springframework.stereotype.Service;
import net.wanji.databus.po.CrossDirDataRealtimePO;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
......@@ -48,6 +69,8 @@ public class TrendServiceImpl implements TrendService {
private final RidInfoMapper ridInfoMapper;
private final BaseCrossDirInfoMapper baseCrossDirInfoMapper;
private final CrossSchemeOptLogMapper crossSchemeOptLogMapper;
private final GreenwaveCrossMapper greenwaveCrossMapper;
private final CrossDirDataRealtimeMapper crossDirDataRealtimeMapper;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
......@@ -56,7 +79,7 @@ public class TrendServiceImpl implements TrendService {
CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper,
CrossDirDataHistMapper crossDirDataHistMapper, EventAlarmMapper eventAlarmMapper,
RidInfoMapper ridInfoMapper, BaseCrossDirInfoMapper baseCrossDirInfoMapper,
CrossSchemeOptLogMapper crossSchemeOptLogMapper) {
CrossSchemeOptLogMapper crossSchemeOptLogMapper, GreenwaveCrossMapper greenwaveCrossMapper, CrossDirDataRealtimeMapper crossDirDataRealtimeMapper) {
this.greenwaveInfoMapper = greenwaveInfoMapper;
this.baseCrossInfoMapper = baseCrossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
......@@ -66,6 +89,8 @@ public class TrendServiceImpl implements TrendService {
this.ridInfoMapper = ridInfoMapper;
this.baseCrossDirInfoMapper = baseCrossDirInfoMapper;
this.crossSchemeOptLogMapper = crossSchemeOptLogMapper;
this.greenwaveCrossMapper = greenwaveCrossMapper;
this.crossDirDataRealtimeMapper = crossDirDataRealtimeMapper;
}
@Override
......@@ -292,6 +317,42 @@ public class TrendServiceImpl implements TrendService {
return eventAlarmOutVOList;
}
@Override
public List<GreenWaveCrossMonitorVO> greenwaveCrossMonitor(GreenwaveIdBO greenwaveIdBO) {
Integer greenwaveId = greenwaveIdBO.getGreenwaveId();
List<GreenwaveCrossPO> greenwaveCrossPOList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
List<GreenWaveCrossMonitorVO> res = buildRes(greenwaveCrossPOList);
return res;
}
private List<GreenWaveCrossMonitorVO> buildRes(List<GreenwaveCrossPO> greenwaveCrossPOList) {
List<GreenWaveCrossMonitorVO> res = new ArrayList<>();
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) {
GreenWaveCrossMonitorVO greenWaveCrossMonitorVO = new GreenWaveCrossMonitorVO();
String crossId = greenwaveCrossPO.getCrossId();
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
BaseCrossInfoPO baseCrossInfoPO = baseCrossInfoMapper.selectById(crossId);
if (crossDataRealtimePO != null && baseCrossInfoPO != null) {
greenWaveCrossMonitorVO.setCrossId(crossId);
greenWaveCrossMonitorVO.setCrossName(baseCrossInfoPO.getName());
greenWaveCrossMonitorVO.setFlow(crossDataRealtimePO.getFlow());
List<CrossDirDataRealtimePO> crossDirDataRealtimePOList =
crossDirDataRealtimeMapper.selectBycrossId(crossId);
Integer capacity = 0;
for (CrossDirDataRealtimePO crossDirDataRealtimePO : crossDirDataRealtimePOList) {
capacity += crossDirDataRealtimePO.getCapacity();
}
greenWaveCrossMonitorVO.setCapacity(capacity);
greenWaveCrossMonitorVO.setCongestionIndex(crossDataRealtimePO.getCongestionIndex());
res.add(greenWaveCrossMonitorVO);
}
}
return res;
}
private List<AbnormalCrossDetailVO.DirDataElement> buildDirData(String crossId) {
List<AbnormalCrossDetailVO.DirDataElement> dirData = new ArrayList<>();
// 获取当前时间之前40分钟的10位时间戳
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "GreenWaveCrossMonitorVO", description = "子区信息-路口监测返回值")
public class GreenWaveCrossMonitorVO {
@ApiModelProperty(value = "路口ID")
private String crossId;
@ApiModelProperty(value = "路口名称")
private String crossName;
@ApiModelProperty(value = "流量")
private Integer flow;
@ApiModelProperty(value = "通行能力")
private Integer capacity;
@ApiModelProperty(value = "拥堵指数")
private Double congestionIndex;
}
package net.wanji.databus.dao.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author Kent HAN
* @date 2022/10/31 11:04
*/
@Data
public class GreenwaveCrossPO {
/** id */
@ApiModelProperty(value = "id",notes = "")
private Integer id ;
/** 绿波ID */
@ApiModelProperty(value = "绿波ID",notes = "")
private Integer greenId ;
/** 路口ID */
@ApiModelProperty(value = "路口ID",notes = "")
private String crossId ;
/** 进口方向:1:北 2:东北 3:东 4:东南 5:南 6:西南 7:西 8:西北 */
@ApiModelProperty(value = "进口方向:1:北 2:东北 3:东 4:东南 5:南 6:西南 7:西 8:西北",notes = "")
private Integer inDir ;
/** 驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer outDir ;
/** 相位差(秒) */
@ApiModelProperty(value = "相位差(秒)",notes = "")
private Integer offset ;
/** 路口顺序号 */
@ApiModelProperty(value = "路口顺序号",notes = "")
private Integer sort ;
/** 时段ID */
@ApiModelProperty(value = "时段ID",notes = "")
private Integer sectionId ;
/** 到下个路口距离(米) */
@ApiModelProperty(value = "到下个路口距离(米)",notes = "")
private Double nextCrossLen ;
/** 是否关键路口:0否;1是 */
@ApiModelProperty(value = "是否关键路口:0否;1是",notes = "")
private Integer isKeyRoute ;
/** 创建时间 */
@ApiModelProperty(value = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ;
}
......@@ -22,4 +22,6 @@ public interface CrossDirDataRealtimeMapper extends BaseMapper<CrossDirDataRealt
List<CrossDirDataRealtimePO> selectByCrossIdAndInOutType(String crossId, Integer inOutType);
Integer selectStatus(String secondId, Integer inDir, int inOutType);
List<CrossDirDataRealtimePO> selectBycrossId(String crossId);
}
package net.wanji.web.mapper;
package net.wanji.databus.dao.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import net.wanji.web.po.GreenwaveCrossPO;
import org.apache.ibatis.annotations.Param;
import net.wanji.databus.dao.entity.GreenwaveCrossPO;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -12,9 +10,6 @@ import java.util.List;
* @date 2022/10/31 11:03
*/
@Repository
@DS("webService")
public interface GreenwaveCrossMapper {
List<GreenwaveCrossPO> selectByGreenwaveId(@Param("adCode") String adCode,
@Param("currentTime") String currentTime,
@Param("id") Integer id);
List<GreenwaveCrossPO> selectByGreenwaveId(Integer id);
}
......@@ -66,4 +66,10 @@
where dir_type = #{inDir} and in_out_type = #{inOutType} and cross_id = #{secondId}
</select>
<select id="selectBycrossId" resultType="net.wanji.databus.po.CrossDirDataRealtimePO">
select <include refid="Base_Column_List"/>
from t_cross_dir_data_realtime
where cross_id = #{crossId}
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.databus.dao.mapper.GreenwaveCrossMapper">
<select id="selectByGreenwaveId" resultType="net.wanji.databus.dao.entity.GreenwaveCrossPO">
select
id,green_id,cross_id,in_dir,out_dir,offset,sort,section_id,next_cross_len,is_key_route,gmt_create,gmt_modified
from t_greenwave_cross
where green_id = #{id}
</select>
</mapper>
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