b602f18e 康伟

Merge remote-tracking branch 'origin/master'

2 个父辈 dad7c4d6 ea10bd28
......@@ -2,7 +2,7 @@ package com.skua.modules.dataAnalysis.controller;
import com.skua.core.api.vo.Result;
import com.skua.core.aspect.annotation.AutoLog;
import com.skua.modules.dataAnalysis.service.impl.WaterAnalysisNewService;
import com.skua.modules.dataAnalysis.service.WaterAnalysisNewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......
......@@ -343,7 +343,7 @@
IFNULL( a.totalCount, 0 ) AS totalCount
FROM
sys_factory_info sfi
LEFT JOIN alarm_level_standard_config alsc ON alsc.alarm_standard_level_code = sfi.out_level
LEFT JOIN alarm_level_standard_config alsc ON alsc.id = sfi.out_level
LEFT JOIN sys_depart d ON sfi.depart_id = d.id
LEFT JOIN (
SELECT
......
package com.skua.modules.dataAnalysis.service.impl;
package com.skua.modules.dataAnalysis.service;
import java.util.List;
import java.util.Map;
......
......@@ -7,7 +7,7 @@ import com.skua.core.api.vo.DictModel;
import com.skua.core.context.BaseContextHandler;
import com.skua.core.util.DateUtils;
import com.skua.modules.dataAnalysis.mapper.WaterAnalysisNewMapper;
import com.skua.modules.dataAnalysis.service.impl.WaterAnalysisNewService;
import com.skua.modules.dataAnalysis.service.WaterAnalysisNewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -17,18 +17,14 @@ import java.util.concurrent.atomic.AtomicReference;
@Service
public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
private static String REPOART_ID_HY = "9bffaf9187093d6e6a4390e8c56acca8";
private static String FACTORYIDS = "1519193830953553920,1519200041706954752,1816759403152666624,1818214145808531456,1818214519948836864," +
" 1818214642204409856,1818214704200417280,1818214745841467392,1818214781186867200,1818214830096646144,1818214870622011392," +
" 1818214905388597248,1818214961122508800,1818215007217909760,1818215052952600576,1818215093192753152,1818215141427249152," +
" 1818215178001580032,1818215228744269824,1818215268359471104,1818215307165171712,1818215363477897216,1818215411217465344";
@Autowired
private WaterAnalysisNewMapper waterAnalysisNewMapper;
@Override
public Map<String, Object> queryTotalBySummary(String time) {
Map<String, Object> result = Maps.newHashMap();
// String departIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> facs = waterAnalysisNewMapper.queryTotalBySummary(time,FACTORYIDS);
Long facCount = waterAnalysisNewMapper.queryTotalCount(FACTORYIDS);
String departIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> facs = waterAnalysisNewMapper.queryTotalBySummary(time,departIds);
Long facCount = waterAnalysisNewMapper.queryTotalCount(departIds);
Long summaryCount = facCount;
Long noSummaryCount = 0L;
StringBuilder facInfo = new StringBuilder();
......@@ -67,10 +63,10 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
@Override
public List<Map<String, Object>> queryFacListWaterQCL(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String departIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> result = Lists.newArrayList();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_HY,"CSCOD,CSTN,CSZL,CSAD,JSCOD,JSZD,JSZL,JSAD", FACTORYIDS, time);
List<Map<String, Object>> list = waterAnalysisNewMapper.queryAllFactoryList(time,FACTORYIDS,dataViewName);
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_HY,"CSCOD,CSTN,CSZL,CSAD,JSCOD,JSZD,JSZL,JSAD", departIds, time);
List<Map<String, Object>> list = waterAnalysisNewMapper.queryAllFactoryList(time,departIds,dataViewName);
if (list != null) {
for (Map<String, Object> map : list) {
Double jsCODAvgSum = Double.parseDouble(map.get("jscod").toString());
......@@ -110,9 +106,9 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
@Override
public Map<String, Object> queryWaterQCL(String time) {
Map<String, Object> result = Maps.newHashMap();
// String factoryIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_HY,"CSCOD,CSTN,CSZL,CSAD,JSCOD,JSZD,JSZL,JSAD", FACTORYIDS, time);
result = waterAnalysisNewMapper.queryAvgQcl(dataViewName, time, FACTORYIDS);
String departIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_HY,"CSCOD,CSTN,CSZL,CSAD,JSCOD,JSZD,JSZL,JSAD", departIds, time);
result = waterAnalysisNewMapper.queryAvgQcl(dataViewName, time, departIds);
if(result==null){
result = new HashMap<>();
result.put("COD", 0.00);
......@@ -124,7 +120,7 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
}
@Override
public List<Map<String, Object>> queryCSAnalysis(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String departIds = BaseContextHandler.getDeparts();
//获取负荷比例
List<DictModel> fhData = waterAnalysisNewMapper.queryDictItemsByCode("water_analysis_proportion");
Double low = 0.0;
......@@ -143,7 +139,7 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
Double finalUp = up;
data.forEach(v -> {
String code = (String) v.get("id");
List<Double> datan = waterAnalysisNewMapper.queryAvgByCode(code, time, FACTORYIDS);
List<Double> datan = waterAnalysisNewMapper.queryAvgByCode(code, time, departIds);
if (datan != null && datan.size() > 0) {
DoubleSummaryStatistics statistics = datan.stream().mapToDouble(Number::doubleValue).summaryStatistics();
//取最大值
......@@ -168,18 +164,18 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
@Override
public List<Map<String, Object>> queryNoSummaryList(String time) {
Map<String, Map<String, Object>> tmpMap = Maps.newHashMap();
// String factoryIds = BaseContextHandler.getDeparts();
String departIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> facs = new ArrayList<>();
facs = waterAnalysisNewMapper.queryNewFacList(time,FACTORYIDS);
facs = waterAnalysisNewMapper.queryNewFacList(time,departIds);
return facs;
}
@Override
public Map<String, Object> queryNewSummaryCount(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String departIds = BaseContextHandler.getDeparts();
Map<String, Object> csbzCharData = Maps.newHashMap();
//上个月DateUtils.getLastMonthOfMonth(time)
List<Map<String, Object>> maps = waterAnalysisNewMapper.queryNewSummaryCount(time,FACTORYIDS);
List<Map<String, Object>> maps = waterAnalysisNewMapper.queryNewSummaryCount(time,departIds);
List<String> names = Lists.newArrayList();
List<Long> data = Lists.newArrayList();
List<Long> max = Lists.newArrayList();
......@@ -307,8 +303,8 @@ public class WaterAnalysisNewServiceImpl implements WaterAnalysisNewService {
}
@Override
public List<Map<String, Object>> queryFacListBySummary(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> maps = waterAnalysisNewMapper.queryFacListBySummary(time, DateUtils.getDayCountOfMonth(time),FACTORYIDS);
String departIds = BaseContextHandler.getDeparts();
List<Map<String, Object>> maps = waterAnalysisNewMapper.queryFacListBySummary(time, DateUtils.getDayCountOfMonth(time),departIds);
maps.forEach(v -> {
Double db = Double.parseDouble(String.valueOf(v.get("db")));
if (db < 90) {
......
......@@ -20,25 +20,21 @@ import java.util.Map;
@Service
public class WaterCountAnalysisNewServiceImpl implements WaterCountAnalysisNewService {
private static String REPOART_ID_SL = "2119ecbf53a1d2d0708258ff67cfd9e1";
private static String FACTORYIDS = "1519193830953553920,1519200041706954752,1816759403152666624,1818214145808531456,1818214519948836864," +
" 1818214642204409856,1818214704200417280,1818214745841467392,1818214781186867200,1818214830096646144,1818214870622011392," +
" 1818214905388597248,1818214961122508800,1818215007217909760,1818215052952600576,1818215093192753152,1818215141427249152," +
" 1818215178001580032,1818215228744269824,1818215268359471104,1818215307165171712,1818215363477897216,1818215411217465344";
@Autowired
private WaterCountAnalysisNewMapper waterCountAnalysisNewMapper;
@Autowired
private ISysMonitorMetricInfoService sysMonitorMetricInfoService;
@Override
public Map<String, Object> querySLDeatailList(String startTime, String endTime) {
// String factoryIds = BaseContextHandler.getDeparts();
String departIds = BaseContextHandler.getDeparts();
DecimalFormat df = new DecimalFormat("#.##");
Map<String, Object> result = Maps.newHashMap();
Map<String, List<Map<String, Object>>> tmp = Maps.newTreeMap();
List<String> list = DateUtils.sliceUpDateRange(startTime, endTime, "year");
String dataViewName = ReportViewUtil.buildView(REPOART_ID_SL,"CSL", FACTORYIDS, startTime, endTime);
String dataViewName = ReportViewUtil.buildView(REPOART_ID_SL,"CSL", departIds, startTime, endTime);
//查询年度水量数据
List<Map<String, Object>> facLists = waterCountAnalysisNewMapper.queryFacLists("",FACTORYIDS);
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTimesSLDataByFac(dataViewName, startTime, endTime, FACTORYIDS);
List<Map<String, Object>> facLists = waterCountAnalysisNewMapper.queryFacLists("",departIds);
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTimesSLDataByFac(dataViewName, startTime, endTime, departIds);
if (data != null && data.size() > 0) {
data.forEach(v -> {
String ti = (String) v.get("time");
......@@ -87,19 +83,19 @@ public class WaterCountAnalysisNewServiceImpl implements WaterCountAnalysisNewSe
@Override
public List<Map<String, Object>> queryZLSAnalysis(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"JSL,CSL", FACTORYIDS, time);
String departIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"JSL,CSL", departIds, time);
List<Map<String, Object>> list = new ArrayList<>();
list = waterCountAnalysisNewMapper.queryZLSAnalysis(dataViewName, time, FACTORYIDS);
list = waterCountAnalysisNewMapper.queryZLSAnalysis(dataViewName, time, departIds);
return list;
}
@Override
public Map<String, Object> querySLFHLAnalysis(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, time);
String departIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, time);
Map<String, Object> result = Maps.newHashMap();
List<Map<String, Object>> mets = waterCountAnalysisNewMapper.queryWaterListAllByMonth(dataViewName, time, FACTORYIDS);
List<Map<String, Object>> mets = waterCountAnalysisNewMapper.queryWaterListAllByMonth(dataViewName, time, departIds);
List<Map<String, Object>> upList = Lists.newArrayList();
List<Map<String, Object>> lowList = Lists.newArrayList();
List<Map<String, Object>> list = Lists.newArrayList();
......@@ -157,22 +153,22 @@ public class WaterCountAnalysisNewServiceImpl implements WaterCountAnalysisNewSe
}
@Override
public Map<String, Object> querySLAnalysis(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String thisDataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, time);
String lastDataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, DateUtils.getLastMonthOfMonth(time));
String departIds = BaseContextHandler.getDeparts();
String thisDataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, time);
String lastDataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, DateUtils.getLastMonthOfMonth(time));
Map<String, Object> result = Maps.newHashMap();
//增长率
List<Map<String, Object>> upData = waterCountAnalysisNewMapper.queryUpFacList(thisDataViewName, lastDataViewName, time, DateUtils.getLastMonthOfMonth(time), FACTORYIDS);
List<Map<String, Object>> upData = waterCountAnalysisNewMapper.queryUpFacList(thisDataViewName, lastDataViewName, time, DateUtils.getLastMonthOfMonth(time), departIds);
//下降率
List<Map<String, Object>> lowData = waterCountAnalysisNewMapper.queryLowFacList(thisDataViewName, lastDataViewName, time, DateUtils.getLastMonthOfMonth(time), FACTORYIDS);
List<Map<String, Object>> lowData = waterCountAnalysisNewMapper.queryLowFacList(thisDataViewName, lastDataViewName, time, DateUtils.getLastMonthOfMonth(time), departIds);
result.put("upData", upData);
result.put("lowData", lowData);
return result;
}
@Override
public Map<String, Object> queryTotalSLList(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, time);
String departIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, time);
Map<String, Object> result = Maps.newHashMap();
Map<String, List<Map<String, Object>>> tmp = Maps.newTreeMap();
String nowYear = DateUtils.getDate("yyyy");
......@@ -183,8 +179,8 @@ public class WaterCountAnalysisNewServiceImpl implements WaterCountAnalysisNewSe
list = DateUtils.sliceUpDateRange(time + "-01", time + "-12", "year");
}
//查询年度水量数据
List<Map<String, Object>> facLists = waterCountAnalysisNewMapper.queryFacLists("",FACTORYIDS);
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTotalSLDataByFac(dataViewName, time, FACTORYIDS);
List<Map<String, Object>> facLists = waterCountAnalysisNewMapper.queryFacLists("",departIds);
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTotalSLDataByFac(dataViewName, time, departIds);
if (data != null && data.size() > 0) {
data.forEach(v -> {
String ti = (String) v.get("time");
......@@ -219,16 +215,16 @@ public class WaterCountAnalysisNewServiceImpl implements WaterCountAnalysisNewSe
}
@Override
public Map<String, Object> queryTotalSLData(String time) {
// String factoryIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, time);
String departIds = BaseContextHandler.getDeparts();
String dataViewName = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, time);
Map<String, Object> result = Maps.newHashMap();
StringBuilder stringBuilder = new StringBuilder();
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTotalSLData(dataViewName, time, FACTORYIDS);
List<Map<String, Object>> data = waterCountAnalysisNewMapper.queryTotalSLData(dataViewName, time, departIds);
String time2 = String.valueOf(Integer.parseInt(time) - 1);
String dataViewName2 = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", FACTORYIDS, time2);
List<Map<String, Object>> lastData = waterCountAnalysisNewMapper.queryTotalSLData(dataViewName2, time2, FACTORYIDS);
String dataViewName2 = ReportViewUtil.buildViewLike(REPOART_ID_SL,"CSL", departIds, time2);
List<Map<String, Object>> lastData = waterCountAnalysisNewMapper.queryTotalSLData(dataViewName2, time2, departIds);
for (int i =0 ;i<data.size();i++){
Map<String, Object> map = data.get(i);
......
package com.skua.modules.report.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.skua.core.api.vo.Result;
import com.skua.modules.report.entity.ReportDisplay;
import com.skua.modules.report.entity.ReportHeader;
import com.skua.modules.report.mapper.FReportManageMapper;
import com.skua.modules.report.mapper.ReportHeaderMapper;
import com.skua.modules.report.service.IJmReportService;
import com.skua.modules.report.service.IReportDisplayService;
import com.skua.modules.report.vo.ReportShow;
import com.skua.modules.util.ReportUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Api(tags = "积木 报表展示")
@RestController
@RequestMapping("/report/jmReport")
public class JmReportController {
@Autowired
ReportDisplayController reportDisplayController;
@Autowired
FReportManageMapper reportManageMapper;
@Autowired
IReportDisplayService reportDisplayService;
@Autowired
ReportHeaderMapper reportHeaderMapper;
@Autowired
IJmReportService jmReportService;
@ApiOperation(value = "化验日报-在线值", notes = "积木报表")
@GetMapping(value = "/hyrbZxz")
public Map trCount(
@RequestParam(name = "departId" ) String departId,
@RequestParam(name = "date" ) String date //yyyy-MM-dd
) {
Map returnData = new HashMap();
//查询【表头】 保持和[生产报表]一致
QueryWrapper<ReportDisplay> reportDisplayQueryWrapper = new QueryWrapper<>();
reportDisplayQueryWrapper.eq("depart_id",departId);
reportDisplayQueryWrapper.eq("report_name","生产报表");
ReportDisplay reportDisplay = reportDisplayService.getOne(reportDisplayQueryWrapper);
if (reportDisplay == null) {
return returnData;
}
List<Map<String, String>> reportHeaderList = reportHeaderMapper.hyrbZxz(reportDisplay.getId());
Map<String, String> reportHeaderMap = reportHeaderList.stream().collect(Collectors.toMap(v -> v.get("tag"), o -> o.get("metricId")));
//查询【数据】
ReportShow params = new ReportShow();
params.setId(reportDisplay.getId());
params.setDepartId(departId);
params.setStartDateTime(date + " 00:00:00");
params.setEndDateTime(date + " 23:59:59");
params.setReportType("day");
Result<List<Map<String, Object>>> dataListResult = reportDisplayController.reprotShow(params);
List<Map<String, Object>> dataList = CollectionUtils.isEmpty(dataListResult.getResult()) ? new LinkedList<>() : dataListResult.getResult();//(正常情况下只有一条)
//查询【告警上限】
List<Map<String, String>> limitList = reportHeaderMapper.queryLimit(departId);
Map<String, String> limitMap = limitList.stream().collect(Collectors.toMap(v -> v.get("tag"), o -> o.get("maxValue")));
List<String> tagList = Arrays.asList("CSCOD","CSNH3N","CSPH","CSTN","CSTP","JSCOD","JSNH3N","JSPH","JSTN","JSTP","JSSS","CSSS");
//组装数据
for (Map<String, Object> dataMap : dataList) {
for (String tag : tagList) {
String metricId = reportHeaderMap.get(tag);//点位Id
dataMap.put(tag, dataMap.get(metricId));
BigDecimal minValue = tag.contains("PH") ? new BigDecimal("6") : BigDecimal.ZERO; //PH的阈值固定为6~9
BigDecimal maxValue = tag.contains("PH") ? new BigDecimal("9") : ReportUtil.getBigDecimalValue(tag, limitMap);
maxValue = maxValue == null ? new BigDecimal("9999999") : maxValue;
boolean flag = false;
BigDecimal valueBigDecimal = ReportUtil.newBigDecimal(metricId, null);
if(valueBigDecimal != null && (valueBigDecimal.compareTo(minValue) < 0 || valueBigDecimal.compareTo(maxValue) > 0)){
flag = true; //超标!
}
dataMap.put(tag + "_是否超标", flag ? "yes" : "no"); //判断是否告警
}
}
returnData.put("data",dataList);
return returnData;
}
}
package com.skua.modules.report.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.skua.modules.report.entity.ReportHeader;
......@@ -15,4 +16,13 @@ public interface ReportHeaderMapper extends BaseMapper<ReportHeader> {
//查询报表信息
List<ReportHeader> headerAll(@Param("reportId") String reportId);
List<Map<String, String>> hyrbZxz(String id);
/**
* 查询告警上限值
* @param depart
* @return
*/
List<Map<String, String>> queryLimit(String depart);
}
......
......@@ -30,4 +30,31 @@
report_id =#{reportId}
ORDER BY sort_num
</select>
<select id="hyrbZxz" resultType="java.util.Map">
select m.metric_uid_tag as 'tag', h.key_index as 'metricId', h.title
from report_header h
join sys_monitor_metric_info m on h.key_index = m.id
where
h.report_id = #{id}
and metric_uid_tag is not null
and metric_uid_tag != ''
</select>
<select id="queryLimit" resultType="java.util.Map">
SELECT
b.alarm_param_code AS tag,
b.alarm_param_upper_limit AS `maxValue`
FROM
sys_factory_info a
LEFT JOIN alarm_param_standard_config b ON a.out_level = b.alarm_level_standard_id
WHERE
depart_id = #{depart}
UNION ALL
SELECT
index_code,
upper
FROM
water_quality_in_level
WHERE
depart_id = #{depart}
</select>
</mapper>
......
......@@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......
......@@ -49,6 +49,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除
filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串
filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码
filterChainDefinitionMap.put("/report/jmReport/*", "anon");//积木报表
filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录
filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在
filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!