bug修复
This commit is contained in:
parent
0fa8c91a18
commit
78c2785be3
27
src/main/java/com/zhgd/xmgl/base/ParkReservation.java
Normal file
27
src/main/java/com/zhgd/xmgl/base/ParkReservation.java
Normal file
@ -0,0 +1,27 @@
|
||||
package com.zhgd.xmgl.base;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ParkReservation {
|
||||
@JsonProperty("parkSyscode")
|
||||
private String parkSyscode;
|
||||
@JsonProperty("plateNo")
|
||||
private String plateNo;
|
||||
@JsonProperty("phoneNo")
|
||||
private String phoneNo;
|
||||
@JsonProperty("owner")
|
||||
private String owner;
|
||||
@JsonProperty("allowTimes")
|
||||
private Long allowTimes;
|
||||
@JsonProperty("isCharge")
|
||||
private String isCharge;
|
||||
@JsonProperty("resvWay")
|
||||
private String resvWay;
|
||||
@JsonProperty("startTime")
|
||||
private String startTime;
|
||||
@JsonProperty("endTime")
|
||||
private String endTime;
|
||||
|
||||
}
|
||||
@ -1,23 +1,21 @@
|
||||
package com.zhgd.xmgl.call;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.zhgd.jeecg.common.api.vo.Result;
|
||||
import com.zhgd.xmgl.base.HikvisionCarInfo;
|
||||
import com.zhgd.xmgl.base.HikvisionEventsPictureRq;
|
||||
import com.zhgd.xmgl.base.HikvisionOrganization;
|
||||
import com.zhgd.xmgl.base.SubscribeEventQo;
|
||||
import com.zhgd.xmgl.base.*;
|
||||
import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry;
|
||||
import com.zhgd.xmgl.modules.basicdata.mapper.HikvisionRequestRetryMapper;
|
||||
import com.zhgd.xmgl.modules.car.entity.CarInfo;
|
||||
import com.zhgd.xmgl.modules.car.entity.CarPassRecord;
|
||||
import com.zhgd.xmgl.modules.car.mapper.CarInfoMapper;
|
||||
import com.zhgd.xmgl.modules.car.mapper.CarPassRecordMapper;
|
||||
import com.zhgd.xmgl.modules.car.mapper.CarTypeMapper;
|
||||
import com.zhgd.xmgl.modules.project.entity.Project;
|
||||
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
|
||||
import com.zhgd.xmgl.modules.worker.entity.DepartmentInfo;
|
||||
@ -36,10 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
import java.util.*;
|
||||
@ -50,6 +45,8 @@ import java.util.*;
|
||||
public class HikvisionCall {
|
||||
@Value("${upload.image.url.prefix:}")
|
||||
private String imageUrlPrefix;
|
||||
@Value("${basePath:}")
|
||||
private String basePath;
|
||||
@Autowired
|
||||
@Lazy
|
||||
private ProjectMapper projectMapper;
|
||||
@ -65,6 +62,12 @@ public class HikvisionCall {
|
||||
@Autowired
|
||||
@Lazy
|
||||
private HikvisionRequestRetryMapper hikvisionRequestRetryMapper;
|
||||
@Autowired
|
||||
@Lazy
|
||||
private CarTypeMapper carTypeMapper;
|
||||
@Autowired
|
||||
@Lazy
|
||||
private CarInfoMapper carInfoMapper;
|
||||
|
||||
/**
|
||||
* 海康请求失败重试定时
|
||||
@ -109,7 +112,7 @@ public class HikvisionCall {
|
||||
jsonBody.put("jobNo", workerInfo.getPersonSn());
|
||||
ArrayList<HashMap<String, String>> faceList = new ArrayList<>();
|
||||
HashMap<String, String> faceMap = new HashMap<>();
|
||||
faceMap.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(imageUrlPrefix + "/" + workerInfo.getFieldAcquisitionUrl())));
|
||||
faceMap.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(basePath + "/" + workerInfo.getFieldAcquisitionUrl())));
|
||||
faceList.add(faceMap);
|
||||
jsonBody.put("faces", faceList);
|
||||
String body = jsonBody.toJSONString();
|
||||
@ -161,7 +164,7 @@ public class HikvisionCall {
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
JSONObject jo = new JSONObject();
|
||||
jo.put("personId", workerInfo.getId());
|
||||
jo.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(imageUrlPrefix + "/" + workerInfo.getFieldAcquisitionUrl())));
|
||||
jo.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(basePath + "/" + workerInfo.getFieldAcquisitionUrl())));
|
||||
HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
@ -250,25 +253,63 @@ public class HikvisionCall {
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/vehicle/batch/add";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionCarInfo hikvisionCarInfo = getHikvisionCarInfo(carInfo);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionCarInfo, JsonObject.class));
|
||||
String body = array.toString();
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
ArrayList<HikvisionCarInfo> list = new ArrayList<>();
|
||||
list.add(hikvisionCarInfo);
|
||||
HikvisionUtil.doPost(host, path, JSON.toJSONString(list), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
private HikvisionCarInfo getHikvisionCarInfo(CarInfo carInfo) {
|
||||
HikvisionCarInfo hikvisionCarInfo = new HikvisionCarInfo();
|
||||
hikvisionCarInfo.setClientId(carInfo.getId());
|
||||
hikvisionCarInfo.setPlateNo(carInfo.getCarNumber());
|
||||
hikvisionCarInfo.setPersonId(carInfo.getDriverName());
|
||||
hikvisionCarInfo.setPersonId(carInfo.getDriverWorkerId());
|
||||
hikvisionCarInfo.setPlateType(null);
|
||||
hikvisionCarInfo.setPlateColor(null);
|
||||
hikvisionCarInfo.setVehicleType(null);
|
||||
hikvisionCarInfo.setPlateColor(getPlateColor(carInfo));
|
||||
hikvisionCarInfo.setVehicleType(getVehicleType(carInfo));
|
||||
hikvisionCarInfo.setVehicleColor(getVehicleColor(carInfo.getCarColor()));
|
||||
hikvisionCarInfo.setDescription(null);
|
||||
return hikvisionCarInfo;
|
||||
}
|
||||
|
||||
private String getPlateColor(CarInfo carInfo) {
|
||||
String carColor = carInfo.getCarColor();
|
||||
if (StringUtils.isBlank(carColor)) {
|
||||
return null;
|
||||
}
|
||||
switch (carColor) {
|
||||
case "蓝色":
|
||||
return "0";
|
||||
case "黄色":
|
||||
return "1";
|
||||
case "白色":
|
||||
return "2";
|
||||
case "黑色":
|
||||
return "3";
|
||||
case "绿色":
|
||||
return "4";
|
||||
case "民航黑色":
|
||||
return "5";
|
||||
case "其他颜色":
|
||||
return "255";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getVehicleType(CarInfo carInfo) {
|
||||
String carTypeName = carInfoMapper.getCarTypeName(carInfo);
|
||||
switch (carTypeName) {
|
||||
case "其他车":
|
||||
return "0";
|
||||
case "小型车":
|
||||
return "1";
|
||||
case "大型车":
|
||||
return "2";
|
||||
case "摩托车":
|
||||
return "3";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getVehicleColor(String carColor) {
|
||||
if (StringUtils.isBlank(carColor)) {
|
||||
return null;
|
||||
@ -325,10 +366,9 @@ public class HikvisionCall {
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/vehicle/single/update";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionCarInfo hikvisionCarInfo = getHikvisionCarInfo(carInfo);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionCarInfo, JsonObject.class));
|
||||
String body = array.toString();
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
ArrayList<HikvisionCarInfo> list = new ArrayList<>();
|
||||
list.add(hikvisionCarInfo);
|
||||
HikvisionUtil.doPost(host, path, JSON.toJSONString(list), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -491,9 +531,9 @@ public class HikvisionCall {
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/batch/add";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(enterpriseInfo);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionOrganization, JsonObject.class));
|
||||
String body = array.toString();
|
||||
ArrayList<HikvisionOrganization> list = new ArrayList<HikvisionOrganization>();
|
||||
list.add(hikvisionOrganization);
|
||||
String body = JSON.toJSONString(list);
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
@ -557,10 +597,9 @@ public class HikvisionCall {
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/batch/add";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(teamInfo);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionOrganization, JsonObject.class));
|
||||
String body = array.toString();
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
ArrayList<HikvisionOrganization> list = new ArrayList<>();
|
||||
list.add(hikvisionOrganization);
|
||||
HikvisionUtil.doPost(host, path, JSON.toJSONString(list), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
private HikvisionOrganization getHikvisionOrganization(TeamInfo teamInfo) {
|
||||
@ -621,10 +660,9 @@ public class HikvisionCall {
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/batch/add";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(departmentInfo);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionOrganization, JsonObject.class));
|
||||
String body = array.toString();
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
ArrayList<HikvisionOrganization> list = new ArrayList<>();
|
||||
list.add(hikvisionOrganization);
|
||||
HikvisionUtil.doPost(host, path, JSON.toJSONString(list), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
private HikvisionOrganization getHikvisionOrganization(DepartmentInfo departmentInfo) {
|
||||
@ -681,21 +719,101 @@ public class HikvisionCall {
|
||||
return;
|
||||
}
|
||||
final String ARTEMIS_PATH = "/artemis";
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/single/update";
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/batch/add";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(project);
|
||||
JsonArray array = new JsonArray();
|
||||
array.add(BeanUtil.toBean(hikvisionOrganization, JsonObject.class));
|
||||
String body = array.toString();
|
||||
List l = new ArrayList<HikvisionOrganization>();
|
||||
l.add(hikvisionOrganization);
|
||||
HikvisionUtil.doPost(host, path, JSONArray.toJSONString(l), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取组织列表
|
||||
*
|
||||
* @param project
|
||||
*/
|
||||
public void getOrg(Project project) {
|
||||
if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) {
|
||||
return;
|
||||
}
|
||||
final String ARTEMIS_PATH = "/artemis";
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/org/orgList";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
JSONObject jo = new JSONObject();
|
||||
jo.put("pageNo", 1);
|
||||
jo.put("pageSize", 100);
|
||||
String body = jo.toJSONString();
|
||||
HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取停车库列表
|
||||
*
|
||||
* @param project
|
||||
*/
|
||||
public void getParkList(Project project) {
|
||||
if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) {
|
||||
return;
|
||||
}
|
||||
final String ARTEMIS_PATH = "/artemis";
|
||||
final String path = ARTEMIS_PATH + "/api/resource/v1/park/parkList";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
JSONObject jo = new JSONObject();
|
||||
HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
private HikvisionOrganization getHikvisionOrganization(Project project) {
|
||||
HikvisionOrganization hikvisionOrganization = new HikvisionOrganization();
|
||||
hikvisionOrganization.setClientId(null);
|
||||
hikvisionOrganization.setOrgIndexCode(project.getProjectSn());
|
||||
hikvisionOrganization.setOrgName(project.getProjectName());
|
||||
hikvisionOrganization.setParentIndexCode(null);
|
||||
hikvisionOrganization.setParentIndexCode("root000000");
|
||||
return hikvisionOrganization;
|
||||
}
|
||||
|
||||
@GetMapping("/getOrg")
|
||||
public Result getOrg() {
|
||||
Project project = projectMapper.selectOne(new LambdaQueryWrapper<Project>().eq(Project::getProjectSn, "B717CB992D054A878FDAFB4A5C169947"));
|
||||
getOrg(project);
|
||||
return null;
|
||||
}
|
||||
|
||||
@GetMapping("/getPark")
|
||||
public Result getParkList() {
|
||||
Project project = projectMapper.selectOne(new LambdaQueryWrapper<Project>().eq(Project::getProjectSn, "B717CB992D054A878FDAFB4A5C169947"));
|
||||
getParkList(project);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 预约车辆
|
||||
*
|
||||
* @param project
|
||||
*/
|
||||
public void save(Project project) {
|
||||
if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) {
|
||||
return;
|
||||
}
|
||||
final String ARTEMIS_PATH = "/artemis";
|
||||
final String path = ARTEMIS_PATH + "/api/pms/v2/parkingSpace/reservations/addition";
|
||||
String host = "https://" + project.getArtemisConfigHost();
|
||||
ParkReservation parkReservation = getParkReservation(project);
|
||||
HikvisionUtil.doPost(host, path, JSON.toJSONString(parkReservation), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret());
|
||||
}
|
||||
|
||||
private ParkReservation getParkReservation(Project project) {
|
||||
ParkReservation parkReservation = new ParkReservation();
|
||||
parkReservation.setParkSyscode(null);
|
||||
//parkReservation.setPlateNo();
|
||||
//parkReservation.setPhoneNo();
|
||||
//parkReservation.setOwner();
|
||||
//parkReservation.setAllowTimes();
|
||||
//parkReservation.setIsCharge();
|
||||
//parkReservation.setResvWay();
|
||||
//parkReservation.setStartTime();
|
||||
//parkReservation.setEndTime();
|
||||
return parkReservation;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@ import org.jeecgframework.poi.excel.annotation.Excel;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @Description: 车辆黑白名单管理
|
||||
@ -30,7 +31,7 @@ public class CarInfo implements Serializable {
|
||||
/**
|
||||
* 项目车辆信息表
|
||||
*/
|
||||
|
||||
|
||||
@TableId(type = IdType.AUTO)
|
||||
@ApiModelProperty(value = "项目车辆信息表")
|
||||
private java.lang.Long id;
|
||||
@ -98,4 +99,19 @@ public class CarInfo implements Serializable {
|
||||
|
||||
@ApiModelProperty(value = "报警推送人")
|
||||
private java.lang.String alarmPushWorkerId;
|
||||
|
||||
@ApiModelProperty(value = "是否预约车辆")
|
||||
private Boolean isReserveCar;
|
||||
|
||||
@ApiModelProperty(value = "预约开始时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reserveStartTime;
|
||||
|
||||
@ApiModelProperty(value = "预约结束时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reserveEndTime;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -13,13 +13,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
/**
|
||||
* @Description: 车辆黑白名单管理
|
||||
* @author: pds
|
||||
* @date: 2020-09-29
|
||||
* @date: 2020-09-29
|
||||
* @version: V1.0
|
||||
*/
|
||||
@Mapper
|
||||
public interface CarInfoMapper extends BaseMapper<CarInfo> {
|
||||
|
||||
List<EntityMap> selectCarList(Page<EntityMap> page, @Param("param")Map<String, Object> map);
|
||||
List<EntityMap> selectCarList(Page<EntityMap> page, @Param("param") Map<String, Object> map);
|
||||
|
||||
List<Map<String, Object>> selectCarTypeCount(Map<String, Object> map);
|
||||
|
||||
String getCarTypeName(CarInfo carInfo);
|
||||
}
|
||||
|
||||
@ -16,10 +16,17 @@
|
||||
</select>
|
||||
<select id="selectCarTypeCount" resultType="java.util.Map">
|
||||
SELECT b.car_type_name carTypeName,COUNT(1) carTypeNum,
|
||||
IFNULL(SUM((CASE WHEN a.is_black=1 THEN 1 ELSE 0 END)),0) blackNum,
|
||||
IFNULL(SUM((CASE WHEN a.is_black=0 THEN 1 ELSE 0 END)),0) whiteNum
|
||||
IFNULL(SUM((CASE WHEN a.is_black=1 THEN 1 ELSE 0 END)),0) blackNum,
|
||||
IFNULL(SUM((CASE WHEN a.is_black=0 THEN 1 ELSE 0 END)),0) whiteNum
|
||||
FROM car_info a INNER JOIN car_type b ON (a.car_type=b.id and a.project_sn=b.project_sn)
|
||||
WHERE a.project_sn=#{projectSn}
|
||||
group by a.car_type
|
||||
</select>
|
||||
|
||||
<select id="getCarTypeName" resultType="java.lang.String">
|
||||
select ct.car_type_name
|
||||
from car_info ci
|
||||
inner join car_type ct on ci.car_type = ct.id
|
||||
where ci.id=#{id}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@ -354,7 +354,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
||||
redisRepository.del("projectInfoBySn:" + projectEntity.getProjectSn());
|
||||
|
||||
//同步海康
|
||||
asyncHikvision.editProjectForHikvision(project);
|
||||
asyncHikvision.editProjectForHikvision(projectEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -32,6 +32,7 @@ public class HikvisionUtil {
|
||||
|
||||
public static String doPost(String host, String path, String body, Map<String, String> querys, String appKey, String appSecret) {
|
||||
log.info("HikvisionUtil#doPost.url:{}", host + path);
|
||||
log.info("HikvisionUtil#doPost.body:{}", body);
|
||||
String responseStr = null;
|
||||
try {
|
||||
Map<String, String> headers = new HashMap();
|
||||
|
||||
@ -16,5 +16,6 @@ public class PathUtil {
|
||||
System.out.println(reviseSlash("/homefoo//"));
|
||||
System.out.println(reviseSlash("http://192.168.34.221:19111/xmgl/weight/weighInfo/getNewestWeighInfo"));
|
||||
System.out.println(reviseSlash("http://192.168.34.221:19111/xmgl//weight/weighInfo/getNewestWeighInfo"));
|
||||
System.out.println(reviseSlash("http://192.168.34.221:9111/image//65e5733735f013f4cc322278.jpg"));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user