Commit eea99d56 authored by chenzhao's avatar chenzhao

Merge branch 'developer' of http://172.16.10.76/moa/amos-boot-biz into developer

# Conflicts: # amos-boot-module/amos-boot-module-biz/amos-boot-module-common-biz/src/main/java/com/yeejoin/amos/boot/module/common/biz/service/impl/FailureDetailsServiceImpl.java
parents d819740f 9bcbbe81
......@@ -32,6 +32,11 @@ public class FailureRepairlog extends BaseEntity {
*/
@TableField("process_auditor")
private String processAuditor;
/**
* 流程处理人
*/
@TableField("process_auditor_name")
private String processAuditorName;
/**
* 处理人所属部门
......
......@@ -9,7 +9,7 @@ import com.yeejoin.amos.boot.module.common.api.entity.FailureRepairlog;
* @date 2021-08-12
*/
public interface IFailureRepairlogService {
public FailureRepairlog findByprocessAuditorId(Long userId);
public FailureRepairlog findByprocessAuditor(String userId);
public FailureRepairlog findByFaultId(Long faultId) ;
......
......@@ -6,7 +6,7 @@ public class CalendarStatusCountRespone {
/**
* 个数
*/
private Double count;
private Long count;
/**
* 状态
*/
......@@ -16,7 +16,7 @@ public class CalendarStatusCountRespone {
public double getCount() {
return count;
}
public void setCount(double count) {
public void setCount(Long count) {
this.count = count;
}
public String getStatus() {
......
......@@ -5,7 +5,7 @@
<select id="queryAlertStatusCount" resultType="java.util.Map">
SELECT
count( 1 ) calledCount,
sum( CASE WHEN father_alert = null THEN 1 ELSE 0 END ) majorAlertCount,
sum( CASE WHEN father_alert is null THEN 1 ELSE 0 END ) majorAlertCount,
sum( CASE WHEN alarm_type_code = 'KRJY' THEN 1 ELSE 0 END ) sleepyIncidentCount,
sum( CASE WHEN alarm_type_code = 'GZWX' THEN 1 ELSE 0 END ) faultRescueCount,
sum( CASE WHEN alarm_type_code = 'TSZX' THEN 1 ELSE 0 END ) suggestionsCount
......
......@@ -49,9 +49,9 @@ public class FailureRepairlogServiceImpl extends BaseService<FailureRepairlogDto
}
public FailureRepairlog findByprocessAuditorId(Long userId) {
QueryWrapper<FailureRepairlog> queryWrapper = new QueryWrapper<FailureRepairlog>();
queryWrapper.eq("process_auditor_id", userId);
public FailureRepairlog findByprocessAuditor(String userId) {
LambdaQueryWrapper<FailureRepairlog> queryWrapper = new LambdaQueryWrapper<FailureRepairlog>();
queryWrapper.eq(FailureRepairlog::getProcessAuditor, userId);
queryWrapper.last("LIMIT 1");
return baseMapper.selectOne(queryWrapper);
}
......
......@@ -295,11 +295,12 @@ public class CheckController extends AbstractBaseController {
/**
* 获取巡检日历数据
*
* @param queryRequests
* @param date
* @return
*/
@PersonIdentify
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "获取巡检日历数据-mobile", notes = "获取巡检日历数据-mobile")
@ApiOperation(value = "维保日历-mobile", notes = "维保日历-mobile")
@GetMapping(value = "/{date}/checkCalendar", produces = "application/json;charset=UTF-8")
public CommonResponse checkCalendar(
@ApiParam(value = "date,格式YYYY-MM-DD",required = true)@PathVariable String date) {
......
package com.yeejoin.amos.maintenance.business.controller;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.maintenance.business.service.intfc.IStatisticsService;
import com.yeejoin.amos.maintenance.business.util.CommonResponse;
import com.yeejoin.amos.maintenance.business.util.CommonResponseUtil;
import com.yeejoin.amos.maintenance.core.framework.PersonIdentify;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import java.util.HashMap;
import java.util.Map;
/**
* @author DELL
*/
@RestController
@RequestMapping(value = "/api/statistics")
@Api(tags = "统计api")
public class StatisticsController extends AbstractBaseController {
@Autowired
IStatisticsService iStatisticsService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PersonIdentify
@GetMapping(value = "/task")
@ApiOperation(value = "app首页任务统计")
public CommonResponse taskStatusStatistics(){
ReginParams reginParams = getSelectedOrgInfo();
String loginOrgCode = getOrgCode(reginParams);
Map<String,Object> result = iStatisticsService.taskStatusStatistics(opIdentifyInfo(),loginOrgCode);
return CommonResponseUtil.success(result);
}
}
......@@ -179,4 +179,5 @@ public interface PlanTaskMapper extends BaseMapper {
List<Map<String, Object>> queryTimeAxis(HashMap<String, Object> params);
List<Map<String, Object>> statisticsTaskWithAuth(Map<String, Object> param);
}
package com.yeejoin.amos.maintenance.business.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.LinkedHashMap;
import java.util.List;
......@@ -37,5 +34,14 @@ public interface EquipFeign {
*/
@RequestMapping(value = "${equip.fegin.prefix}"+"/area/tree", method = RequestMethod.GET ,consumes="application/json")
LinkedHashMap<String,Object> getRegionTress();
/**
* 查询维保到期设备
* @param type
* @param companyId
* @return
*/
@GetMapping(value = "${equip.fegin.prefix}+/facility")
List<Map<String,Object>> overTimeMaintenanceFacility(@RequestParam String type,String companyId);
}
package com.yeejoin.amos.maintenance.business.feign;
//@RequestLine
//@FeignClient(name = "${Remote3D.fegin.name}",configuration=FeignConfiguration.class)
//public interface Remote3D {
// @RequestMapping(value = "/patrol/check", method = RequestMethod.POST)
// @ResponseBody
// CommonResponse checkStatusPush( @RequestBody List<PointCheckInfoRespone> pointCheckInfo);
//
//
// @RequestMapping(value = "/patrol/task", method = RequestMethod.POST)
// CommonResponse errorTaskPushTo3D( @RequestBody List<TaskInfoRespone> taskInfoRespone);
//
//
// @RequestMapping(value = "/view3d/synchronous/points", method = RequestMethod.POST)
// CommonResponse pointInfoPush( @RequestBody List<PointInfoSyn3DRespone> pointInfoResponseList);
//
//
// @RequestMapping(value = "/view3d/synchronous/routes", method = RequestMethod.POST)
// CommonResponse routeInfoPush( @RequestBody List<RouteResponse> routeResponseList);
//
//
//
//
//
//
//
//}
//package com.yeejoin.amos.maintenance.business.feign;
//
//import java.util.List;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.http.HttpEntity;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Service;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.client.RestTemplate;
//
//import com.yeejoin.amos.maintenance.business.util.CommonResponse;
//import com.yeejoin.amos.maintenance.business.util.CommonResponseUtil;
//import com.yeejoin.amos.maintenance.core.common.response.PointCheckInfoRespone;
//import com.yeejoin.amos.maintenance.core.common.response.PointInfoSyn3DRespone;
//import com.yeejoin.amos.maintenance.core.common.response.RouteResponse;
//import com.yeejoin.amos.maintenance.core.common.response.TaskInfoRespone;
//
//
//
////三维远程访问
//@Service("remote3DServer")
//public class Remote3DServer {
// @Autowired
// private RestTemplate restTemplate;
//
// @Value("${Remote3D.fegin.name}")
// private String Remote3DFeginName;
//
//
// private static String checkStatusPush = "/patrol/check";
//
// private static String errorTaskPushTo3D = "/patrol/task";
//
// private static String pointInfoPush = "/view3d/synchronous/points";
//
// private static String routeInfoPush = "/view3d/synchronous/routes";
//
//
//
// public String geturls(String url){
// return "http://"+Remote3DFeginName+url;
// }
// public HttpHeaders getHeader(String toke,String product,String appKey){
// HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.APPLICATION_JSON);
// headers.set("Content-Type", "application/json");
// headers.set("token", toke);
// headers.set("product",product);
// headers.set("appKey", appKey);
// return headers;
// }
//
//
// public CommonResponse checkStatusPush( String toke,String product,String appKey, List<PointCheckInfoRespone> pointCheckInfo){
// try {
// HttpEntity httpEntity = new HttpEntity<>(pointCheckInfo, getHeader( toke, product, appKey));
// CommonResponse commonResponse1 = restTemplate.postForObject(geturls(checkStatusPush),httpEntity, CommonResponse.class);
// return commonResponse1;
// } catch (Exception e) {
// e.printStackTrace();
// return CommonResponseUtil.failure("发送失败");
//
// }
// }
//
//
//
// public CommonResponse errorTaskPushTo3D( String toke,String product,String appKey, List<TaskInfoRespone> taskInfoRespone){
// try {
// HttpEntity httpEntity = new HttpEntity<>(taskInfoRespone, getHeader( toke, product, appKey));
// CommonResponse commonResponse1 = restTemplate.postForObject(geturls(errorTaskPushTo3D),httpEntity, CommonResponse.class);
// return commonResponse1;
// } catch (Exception e) {
// e.printStackTrace();
// return CommonResponseUtil.failure("发送失败");
//
// }
// }
//
//
// public CommonResponse pointInfoPush(String toke,String product,String appKey,List<PointInfoSyn3DRespone> pointInfoResponseList){
// try {
// HttpEntity httpEntity = new HttpEntity<>(pointInfoResponseList, getHeader( toke, product, appKey));
// CommonResponse commonResponse1 = restTemplate.postForObject(geturls(pointInfoPush),httpEntity, CommonResponse.class);
// return commonResponse1;
// } catch (Exception e) {
// e.printStackTrace();
// return CommonResponseUtil.failure("发送失败");
//
// }
// }
//
//
// public CommonResponse routeInfoPush( String toke,String product,String appKey, List<RouteResponse> routeResponseList){
// try {
// HttpEntity httpEntity = new HttpEntity<>(routeResponseList, getHeader( toke, product, appKey));
// CommonResponse commonResponse1 = restTemplate.postForObject(geturls(routeInfoPush),httpEntity, CommonResponse.class);
// return commonResponse1;
// } catch (Exception e) {
// e.printStackTrace();
// return CommonResponseUtil.failure("发送失败");
//
// }
// }
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//}
package com.yeejoin.amos.maintenance.business.service.impl;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.maintenance.business.dao.mapper.PlanTaskMapper;
import com.yeejoin.amos.maintenance.business.feign.EquipFeign;
import com.yeejoin.amos.maintenance.business.service.intfc.IStatisticsService;
import com.yeejoin.amos.maintenance.common.enums.PlanTaskDetailIsFinishEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.utils.Bean;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author DELL
*/
@Service
public class StatisticsServiceImpl implements IStatisticsService {
@Autowired
PlanTaskMapper planTaskMapper;
@Autowired
EquipFeign equipFeign;
@Override
public Map<String, Object> taskStatusStatistics(ReginParams.PersonIdentity opIdentifyInfo, String orgCode) {
Map<String, Object> param = Bean.BeantoMap(opIdentifyInfo);
param.put("orgCode", orgCode);
List<Map<String, Object>> list = planTaskMapper.statisticsTaskWithAuth(param);
Map<Integer, Long> statusNumberMap = list.stream().collect(Collectors.toMap(map -> Integer.parseInt(map.get("is_finish").toString()), v -> Long.parseLong(v.get("total").toString())));
Map<String, Object> resultMap = new HashMap<>();
// 待执行任务数量
resultMap.put("waitExecuteTask", statusNumberMap.get(PlanTaskDetailIsFinishEnum.UNFINISHED.getValue()) == null ? 0L : statusNumberMap.get(PlanTaskDetailIsFinishEnum.UNFINISHED.getValue()));
// 超时任务数量
resultMap.put("overTimeTask", statusNumberMap.get(PlanTaskDetailIsFinishEnum.OVERTIME.getValue()) == null ? 0L : statusNumberMap.get(PlanTaskDetailIsFinishEnum.OVERTIME.getValue()));
List<Map<String, Object>> overTimeFacility = new ArrayList<>();
//overTimeFacility = equipFeign.overTimeMaintenanceFacility(opIdentifyInfo.getIdentityType(),opIdentifyInfo.getCompanyId());
// 到期维保设备
resultMap.put("overTimeFacility", overTimeFacility.size());
return resultMap;
}
}
package com.yeejoin.amos.maintenance.business.service.intfc;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import java.util.Map;
/**
* @author DELL
*/
public interface IStatisticsService {
/**
* 维保任务统计
* @return Map<String, Object>
*/
Map<String, Object> taskStatusStatistics(ReginParams.PersonIdentity opIdentifyInfo, String loginOrgCode);
}
......@@ -3,7 +3,6 @@ package com.yeejoin.amos.boot.module.tzs.biz.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.SystemClock;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -68,7 +67,7 @@ import java.util.stream.Stream;
*/
@RestController
@Api(tags = "警情接警填报记录Api")
@RequestMapping(value = "/tzs/alert-called")
@RequestMapping(value = "/alert-called")
public class AlertCalledController extends BaseController {
@Autowired
......@@ -218,21 +217,21 @@ public class AlertCalledController extends BaseController {
// 当天接警
alarmStatisticsDto.setTodayAlarmNum(map.get("calledCount") == null ? 0 : Integer.valueOf(map.get("calledCount").toString())) ;
//当天提交
alarmStatisticsDto.setTodayAlarmNum(map.get("majorAlertCount") == null ? 0 : Integer.valueOf(map.get("majorAlertCount").toString())) ;
alarmStatisticsDto.setSubmitNum(map.get("majorAlertCount") == null ? 0 : Integer.valueOf(map.get("majorAlertCount").toString())) ;
//投诉咨询数量
alarmStatisticsDto.setSuggestions(map.get("suggestionsCount") == null ? 0 : Integer.valueOf(map.get("suggestionsCount").toString())) ;
//故障维修数量
alarmStatisticsDto.setSuggestions(map.get("faultRescueCount") == null ? 0 : Integer.valueOf(map.get("faultRescueCount").toString())) ;
alarmStatisticsDto.setFaultRescue(map.get("faultRescueCount") == null ? 0 : Integer.valueOf(map.get("faultRescueCount").toString())) ;
//困人救援数量
alarmStatisticsDto.setSuggestions(map.get("sleepyIncidentCount") == null ? 0 : Integer.valueOf(map.get("sleepyIncidentCount").toString())) ;
alarmStatisticsDto.setSleepyIncident(map.get("sleepyIncidentCount") == null ? 0 : Integer.valueOf(map.get("sleepyIncidentCount").toString())) ;
Map<String,Integer> recordMap = Maps.newHashMap();
// 近七天办理数量
for(int i = 1 ; i < 8; i++) {
Map<String, Object> nearlySevenDaysMap = iAlertCalledService.getAlertInfoList(DateUtils.stampToDate(System.currentTimeMillis(),"yyyy-MM-dd")+" 00:00:00",
DateUtils.stampToDate(System.currentTimeMillis(),"yyyy-MM-dd")+" 23:59:59",null,
Map<String, Object> nearlySevenDaysMap = iAlertCalledService.getAlertInfoList(DateUtils.stampToDate(DateUtils.dateAddDays(new Date(), -i).getTime(),"yyyy-MM-dd")+" 00:00:00",
DateUtils.stampToDate(DateUtils.dateAddDays(new Date(), -i).getTime(),"yyyy-MM-dd")+" 23:59:59",null,
getUserInfo().getUserId());
recordMap.put(DateUtils.dateFormat(DateUtils.dateAddDays(new Date(), -i),""),nearlySevenDaysMap.get("calledCount") == null ? 0 : Integer.valueOf(nearlySevenDaysMap.get("calledCount").toString()));
recordMap.put(DateUtils.stampToDate(DateUtils.dateAddDays(new Date(), -i).getTime(),"yyyy-MM-dd"),nearlySevenDaysMap.get("calledCount") == null ? 0 : Integer.valueOf(nearlySevenDaysMap.get("calledCount").toString()));
}
alarmStatisticsDto.setNearlySevenDaysNum(recordMap);
}
......
......@@ -34,7 +34,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
*/
@RestController
@Api(tags = "派遣单Api")
@RequestMapping(value = "/tzs/dispatch-paper")
@RequestMapping(value = "/dispatch-paper")
public class DispatchPaperController extends BaseController {
@Autowired
......
......@@ -34,7 +34,7 @@ import io.swagger.annotations.ApiOperation;
*/
@RestController
@Api(tags = "派遣任务Api")
@RequestMapping(value = "/tzs/dispatch-task")
@RequestMapping(value = "/dispatch-task")
public class DispatchTaskController extends BaseController {
@Autowired
......
......@@ -35,7 +35,7 @@ import java.util.List;
*/
@RestController
@Api(tags = "处置过程Api")
@RequestMapping(value = "/tzs/repair-consult")
@RequestMapping(value = "/repair-consult")
public class RepairConsultController extends BaseController {
@Autowired
......
......@@ -34,7 +34,7 @@ import io.swagger.annotations.ApiOperation;
*/
@RestController
@Api(tags = "救援过程表Api")
@RequestMapping(value = "/tzs/rescue-process")
@RequestMapping(value = "/rescue-process")
public class RescueProcessController extends BaseController {
@Autowired
......
......@@ -32,7 +32,7 @@ import java.util.List;
*/
@RestController
@Api(tags = "模板表Api")
@RequestMapping(value = "/tzs/template")
@RequestMapping(value = "/template")
public class TemplateController extends BaseController {
@Autowired
......
package com.yeejoin.amos.boot.module.tzs.biz.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledFormDto;
......@@ -39,7 +38,7 @@ import java.util.UUID;
*/
@RestController
@Api(tags = "通话记录附件Api")
@RequestMapping(value = "/tzs/voice-record-file")
@RequestMapping(value = "/voice-record-file")
public class VoiceRecordFileController extends BaseController {
@Autowired
......
......@@ -171,39 +171,39 @@ public class ESAlertCalledService {
long currentTime = System.currentTimeMillis() ;
currentTime = currentTime - 120*60*1000;
BoolQueryBuilder qb1 = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("callTimeLong").gte(currentTime));
.filter(QueryBuilders.rangeQuery("callTimeLong").gte(currentTime));
boolMust.must(qb1);
//报警电话一致
if (!ValidationUtil.isEmpty(alertCalled.getEmergencyCall()) && !ValidationUtil.isEmpty(alertCalled.getContactPhone()))
{
BoolQueryBuilder qb2 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("emergencyCall.keyword", alertCalled.getEmergencyCall()))
.must(QueryBuilders.termQuery("contactPhone.keyword", alertCalled.getContactPhone()));
boolMust.should(qb2);
.should(QueryBuilders.termQuery("emergencyCall.keyword", alertCalled.getEmergencyCall()))
.should(QueryBuilders.termQuery("contactPhone.keyword", alertCalled.getContactPhone()));
boolMust.must(qb2);
}
//事发地点一致,或相距不超过200米的
if (!ValidationUtil.isEmpty(alertCalled.getAddress()))
{
BoolQueryBuilder qb3 = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("address", alertCalled.getAddress()));
.filter(QueryBuilders.matchQuery("address", alertCalled.getAddress()));
boolMust.should(qb3);
}
//警情类型一致
BoolQueryBuilder qb4 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("alarmTypeCode", alertCalled.getAlarmTypeCode()));
.filter(QueryBuilders.termQuery("alarmTypeCode", alertCalled.getAlarmTypeCode()));
boolMust.must(qb4);
//使用单位名称一致
if (!ValidationUtil.isEmpty(alertCalled.getUseUnit()))
{
BoolQueryBuilder qb5 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("useUnit.keyword", alertCalled.getUseUnit()));
.filter(QueryBuilders.termQuery("useUnit.keyword", alertCalled.getUseUnit()));
boolMust.must(qb5);
}
//电梯识别码一致
if(!ValidationUtil.isEmpty(alertCalled.getDeviceId())) {
BoolQueryBuilder qb6 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("deviceId.keyword", alertCalled.getDeviceId()));
boolMust.should(qb6);
.filter(QueryBuilders.termQuery("deviceId.keyword", alertCalled.getDeviceId()));
boolMust.must(qb6);
}
/**
......
......@@ -304,14 +304,14 @@
</sql>
<select id="calendarData" resultType="Map">
SELECT
sum(is_ok) AS count,
count(id) AS count,
DATE_FORMAT(check_time, '%Y-%m-%d') time,
is_ok status
FROM
p_check
<include refid="calendar-where"/>
GROUP BY is_ok,time
ORDER BY time
ORDER BY check_time
</select>
......
......@@ -833,4 +833,24 @@
ORDER BY
ppk.begin_time DESC LIMIT 60
</select>
<select id="statisticsTaskWithAuth" resultType="java.util.Map">
SELECT
count(1) as total,
td.is_finish
from p_plan_task_detail td ,
p_plan_task t,
p_route r
where
td.task_no = t.id
and t.route_id = r.id
<choose>
<when test="identityType==1">
and (t.org_code LIKE CONCAT( #{orgCode}, '-%' ) or t.org_code= #{orgCode} )
</when>
<when test="identityType==2">
And r.owner_id = #{companyId}
</when>
</choose>
GROUP BY td.is_finish
</select>
</mapper>
\ No newline at end of file
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