fix: 任务类
This commit is contained in:
@@ -106,7 +106,14 @@ public class SendAirShaftAgvTask extends AbstractAcsTask {
|
|||||||
// 取消
|
// 取消
|
||||||
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
// todo: 分切计划是否需要回退
|
// 分切计划是否需要回退 状态 02->01
|
||||||
|
List<String> collect = Stream.of(task.getVehicle_code(), task.getVehicle_code2())
|
||||||
|
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||||
|
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
|
||||||
|
p.setStatus("01");
|
||||||
|
TaskUtils.updateOptMessageBySlitterPlan(p);
|
||||||
|
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
|
.in(PdmBiSlittingproductionplan::getQzzno, collect));
|
||||||
}
|
}
|
||||||
task.setUpdate_time(DateUtil.now());
|
task.setUpdate_time(DateUtil.now());
|
||||||
taskService.updateById(task);
|
taskService.updateById(task);
|
||||||
|
|||||||
@@ -1,45 +1,140 @@
|
|||||||
package org.nl.b_lms.sch.tasks.slitter;
|
package org.nl.b_lms.sch.tasks.slitter;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.b_lms.bst.ivt.cutpointivt.service.IBstIvtCutpointivtService;
|
||||||
|
import org.nl.b_lms.bst.ivt.shafttubeivt.service.IBstIvtShafttubeivtService;
|
||||||
|
import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService;
|
||||||
|
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||||
|
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||||
|
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||||
|
import org.nl.common.utils.SecurityUtils;
|
||||||
|
import org.nl.common.utils.TaskUtils;
|
||||||
|
import org.nl.modules.wql.WQL;
|
||||||
|
import org.nl.modules.wql.core.bean.WQLObject;
|
||||||
import org.nl.wms.sch.AcsTaskDto;
|
import org.nl.wms.sch.AcsTaskDto;
|
||||||
import org.nl.wms.sch.manage.AbstractAcsTask;
|
import org.nl.wms.sch.manage.AbstractAcsTask;
|
||||||
|
import org.nl.wms.sch.manage.TaskStatusEnum;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: lyd
|
* @Author: lyd
|
||||||
* @Description: 送铜箔子卷任务 ????
|
* @Description: acs请求拔轴完毕的送铜箔子卷任务
|
||||||
* @Date: 2024/2/1
|
* @Date: 2024/2/1
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class SendCopperFoilSubRollTrussTask extends AbstractAcsTask {
|
public class SendCopperFoilSubRollTrussTask extends AbstractAcsTask {
|
||||||
|
private final String THIS_CLASS = SendCopperFoilSubRollTrussTask.class.getName();
|
||||||
|
@Autowired
|
||||||
|
private IschBaseTaskService taskService;
|
||||||
|
@Autowired
|
||||||
|
private IPdmBiSlittingproductionplanService slittingproductionplanService;
|
||||||
|
@Autowired
|
||||||
|
private IBstIvtCutpointivtService bcutpointivtService;
|
||||||
|
@Autowired
|
||||||
|
private IBstIvtShafttubeivtService shafttubeivtService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<AcsTaskDto> addTask() {
|
public List<AcsTaskDto> addTask() {
|
||||||
return null;
|
/*
|
||||||
|
* 下发给ACS时需要特殊处理
|
||||||
|
*/
|
||||||
|
List<SchBaseTask> taskList = taskService.getIssueTasks(THIS_CLASS);
|
||||||
|
|
||||||
|
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
|
||||||
|
String agv_system_type = "2";
|
||||||
|
for (SchBaseTask task : taskList) {
|
||||||
|
AcsTaskDto dto = AcsTaskDto.builder()
|
||||||
|
.ext_task_id(task.getTask_id())
|
||||||
|
.task_code(task.getTask_code())
|
||||||
|
.task_type(task.getAcs_task_type())
|
||||||
|
.start_device_code(task.getPoint_code1())
|
||||||
|
.next_device_code(task.getPoint_code2())
|
||||||
|
.start_device_code2(task.getPoint_code3())
|
||||||
|
.next_device_code2(task.getPoint_code4())
|
||||||
|
.vehicle_code(task.getVehicle_code())
|
||||||
|
.agv_system_type(agv_system_type)
|
||||||
|
.priority(task.getPriority())
|
||||||
|
.remark(task.getRemark())
|
||||||
|
.product_area(task.getProduct_area())
|
||||||
|
.build();
|
||||||
|
resultList.add(dto);
|
||||||
|
}
|
||||||
|
return resultList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTaskStatus(JSONObject taskObj, String status) {
|
public void updateTaskStatus(JSONObject taskObj, String status) {
|
||||||
|
SchBaseTask task = taskService.getById(taskObj.getString("task_id"));
|
||||||
|
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
|
||||||
|
// 更新任务状态为执行中
|
||||||
|
task.setTask_status(TaskStatusEnum.EXECUTING.getCode());
|
||||||
|
}
|
||||||
|
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
|
||||||
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
|
}
|
||||||
|
// 取消
|
||||||
|
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||||
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
|
}
|
||||||
|
TaskUtils.updateOptMessageByTask(task);
|
||||||
|
taskService.updateById(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createTask(JSONObject form) {
|
public String createTask(JSONObject form) {
|
||||||
return null;
|
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||||
|
String currentUsername = SecurityUtils.getCurrentUsername();
|
||||||
|
|
||||||
|
SchBaseTask task = new SchBaseTask();
|
||||||
|
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||||
|
task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||||
|
task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
|
||||||
|
task.setPoint_code1(form.getString("point_code1"));
|
||||||
|
task.setPoint_code2(form.getString("point_code2"));
|
||||||
|
task.setMaterial_code(form.getString("material_code"));
|
||||||
|
task.setAcs_task_type("6");
|
||||||
|
task.setIs_delete("0");
|
||||||
|
task.setRequest_param(form.toJSONString());
|
||||||
|
task.setTask_type(form.getString("task_type"));
|
||||||
|
task.setProduct_area(form.getString("product_area"));
|
||||||
|
task.setCreate_id(currentUserId);
|
||||||
|
task.setCreate_name(currentUsername);
|
||||||
|
task.setCreate_time(DateUtil.now());
|
||||||
|
task.setHandle_class(THIS_CLASS);
|
||||||
|
//根据类型获取对应的任务优先级
|
||||||
|
JSONObject priority_jo = WQL.getWO("PDA_COOLIN").addParam("flag", "3").addParam("task_type", task.getTask_type()).process().uniqueResult(0);
|
||||||
|
if (ObjectUtil.isEmpty(priority_jo)) {
|
||||||
|
task.setPriority("1");
|
||||||
|
} else {
|
||||||
|
task.setPriority(priority_jo.getString("value"));
|
||||||
|
}
|
||||||
|
taskService.save(task);
|
||||||
|
// this.immediateNotifyAcs(null);
|
||||||
|
return task.getTask_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void forceFinish(String task_id) {
|
public void forceFinish(String task_id) {
|
||||||
|
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
|
||||||
|
this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancel(String task_id) {
|
public void cancel(String task_id) {
|
||||||
|
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
|
||||||
|
this.updateTaskStatus(taskObj, "0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ public class SlitterDownAgvTask extends AbstractAcsTask {
|
|||||||
// 取消
|
// 取消
|
||||||
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
// todo: 分切计划是否需要回退
|
|
||||||
}
|
}
|
||||||
task.setUpdate_time(DateUtil.now());
|
task.setUpdate_time(DateUtil.now());
|
||||||
taskService.updateById(task);
|
taskService.updateById(task);
|
||||||
@@ -124,7 +123,7 @@ public class SlitterDownAgvTask extends AbstractAcsTask {
|
|||||||
task.setPriority(priority_jo.getString("value"));
|
task.setPriority(priority_jo.getString("value"));
|
||||||
}
|
}
|
||||||
taskService.save(task);
|
taskService.save(task);
|
||||||
this.immediateNotifyAcs(null);
|
// this.immediateNotifyAcs(null);
|
||||||
return task.getTask_id();
|
return task.getTask_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import cn.hutool.core.util.IdUtil;
|
|||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nl.b_lms.bst.ivt.cutpointivt.service.IBstIvtCutpointivtService;
|
import org.nl.b_lms.bst.ivt.cutpointivt.service.IBstIvtCutpointivtService;
|
||||||
import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt;
|
import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt;
|
||||||
import org.nl.b_lms.bst.ivt.shafttubeivt.service.IBstIvtShafttubeivtService;
|
import org.nl.b_lms.bst.ivt.shafttubeivt.service.IBstIvtShafttubeivtService;
|
||||||
import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt;
|
import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt;
|
||||||
import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService;
|
import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService;
|
||||||
|
import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan;
|
||||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||||
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||||
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||||
@@ -27,6 +29,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: lyd
|
* @Author: lyd
|
||||||
@@ -116,7 +120,14 @@ public class TrussSendAirShaftTask extends AbstractAcsTask {
|
|||||||
// 取消
|
// 取消
|
||||||
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
// todo: 是否需要回退分切计划套轴完成?
|
// 是否需要回退分切计划套轴完成
|
||||||
|
List<String> collect = Stream.of(task.getVehicle_code(), task.getVehicle_code2())
|
||||||
|
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||||
|
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
|
||||||
|
p.setIs_child_tz_ok("0");
|
||||||
|
TaskUtils.updateOptMessageBySlitterPlan(p);
|
||||||
|
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
|
.in(PdmBiSlittingproductionplan::getQzzno, collect));
|
||||||
}
|
}
|
||||||
TaskUtils.updateOptMessageByTask(task);
|
TaskUtils.updateOptMessageByTask(task);
|
||||||
taskService.updateById(task);
|
taskService.updateById(task);
|
||||||
|
|||||||
@@ -121,6 +121,15 @@ public class UpShaftTrussTask extends AbstractAcsTask {
|
|||||||
// 取消
|
// 取消
|
||||||
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||||
|
|
||||||
|
// 分切计划修改状态回退03
|
||||||
|
List<String> collect = Stream.of(task.getVehicle_code(), task.getVehicle_code2())
|
||||||
|
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||||
|
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
|
||||||
|
p.setStatus("03");
|
||||||
|
TaskUtils.updateOptMessageBySlitterPlan(p);
|
||||||
|
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
|
.in(PdmBiSlittingproductionplan::getQzzno, collect));
|
||||||
}
|
}
|
||||||
TaskUtils.updateOptMessageByTask(task);
|
TaskUtils.updateOptMessageByTask(task);
|
||||||
taskService.updateById(task);
|
taskService.updateById(task);
|
||||||
|
|||||||
@@ -47,4 +47,9 @@ public class SlitterController {
|
|||||||
entity.put("container", collect);
|
entity.put("container", collect);
|
||||||
return new ResponseEntity<>(slitterService.mesSlittingMachineSendMaterial(entity), HttpStatus.CREATED);
|
return new ResponseEntity<>(slitterService.mesSlittingMachineSendMaterial(entity), HttpStatus.CREATED);
|
||||||
}
|
}
|
||||||
|
@PostMapping("/test4")
|
||||||
|
@Log("1111")
|
||||||
|
public ResponseEntity<Object> create4(@RequestBody JSONObject entity){
|
||||||
|
return new ResponseEntity<>(slitterService.acsFinishShaftPluckTube(entity), HttpStatus.CREATED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import org.nl.b_lms.sch.point.dao.StIvtCutpointivt;
|
|||||||
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
||||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||||
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||||
|
import org.nl.b_lms.sch.tasks.slitter.SendCopperFoilSubRollTrussTask;
|
||||||
import org.nl.b_lms.sch.tasks.slitter.SlitterDownTrussTask;
|
import org.nl.b_lms.sch.tasks.slitter.SlitterDownTrussTask;
|
||||||
import org.nl.b_lms.sch.tasks.slitter.TrussSendAirShaftTask;
|
import org.nl.b_lms.sch.tasks.slitter.TrussSendAirShaftTask;
|
||||||
import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper;
|
import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper;
|
||||||
@@ -57,6 +58,8 @@ public class SlitterServiceImpl implements SlitterService {
|
|||||||
private TrussSendAirShaftTask trussSendAirShaftTask;
|
private TrussSendAirShaftTask trussSendAirShaftTask;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SlitterDownTrussTask slitterDownTrussTask;
|
private SlitterDownTrussTask slitterDownTrussTask;
|
||||||
|
@Autowired
|
||||||
|
private SendCopperFoilSubRollTrussTask sendCopperFoilSubRollTrussTask;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONObject acsRequestShaftPluckTube(JSONObject param) {
|
public JSONObject acsRequestShaftPluckTube(JSONObject param) {
|
||||||
@@ -82,7 +85,8 @@ public class SlitterServiceImpl implements SlitterService {
|
|||||||
SchBaseTask previousTask = taskService.getById(taskId);
|
SchBaseTask previousTask = taskService.getById(taskId);
|
||||||
// hint: 使用子卷号
|
// hint: 使用子卷号
|
||||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
.eq(PdmBiSlittingproductionplan::getContainer_name, subVolume));
|
.eq(PdmBiSlittingproductionplan::getContainer_name, subVolume)
|
||||||
|
.eq(PdmBiSlittingproductionplan::getStatus, "09"));
|
||||||
PdmBiSlittingproductionplan plan;
|
PdmBiSlittingproductionplan plan;
|
||||||
if ("1".equals(deviceCode.substring(deviceCode.length() - 1))) {
|
if ("1".equals(deviceCode.substring(deviceCode.length() - 1))) {
|
||||||
plan = plans.stream().filter(p -> "1".equals(p.getLeft_or_right())).findFirst().orElse(null);
|
plan = plans.stream().filter(p -> "1".equals(p.getLeft_or_right())).findFirst().orElse(null);
|
||||||
@@ -97,10 +101,9 @@ public class SlitterServiceImpl implements SlitterService {
|
|||||||
taskParam.put("point_code1", deviceCode);
|
taskParam.put("point_code1", deviceCode);
|
||||||
taskParam.put("point_code2", "B_CZW01");
|
taskParam.put("point_code2", "B_CZW01");
|
||||||
taskParam.put("material_code", plan.getContainer_name());
|
taskParam.put("material_code", plan.getContainer_name());
|
||||||
taskParam.put("vehicle_code", plan.getQzzno());
|
taskParam.put("task_type", "6");
|
||||||
taskParam.put("task_type", "未定义");
|
taskParam.put("product_area", "Test");
|
||||||
taskParam.put("product_area", "未定义");
|
sendCopperFoilSubRollTrussTask.createTask(taskParam);
|
||||||
// sendCopperFoilSubRollTrussTask.createTask(taskParam);
|
|
||||||
res.put("code", HttpStatus.HTTP_OK);
|
res.put("code", HttpStatus.HTTP_OK);
|
||||||
res.put("message", "任务请求成功!");
|
res.put("message", "任务请求成功!");
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class TaskServiceImpl implements TaskService {
|
|||||||
UserAreaServiceImpl userAreaService = new UserAreaServiceImpl();
|
UserAreaServiceImpl userAreaService = new UserAreaServiceImpl();
|
||||||
String in_area_id = userAreaService.getInArea();
|
String in_area_id = userAreaService.getInArea();
|
||||||
if (ObjectUtil.isNotEmpty(in_area_id)) {
|
if (ObjectUtil.isNotEmpty(in_area_id)) {
|
||||||
// map.put("in_area_id", in_area_id);
|
map.put("in_area_id", in_area_id);
|
||||||
}
|
}
|
||||||
JSONObject json = WQL.getWO("QSCH_TASK_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc");
|
JSONObject json = WQL.getWO("QSCH_TASK_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc");
|
||||||
JSONArray content = json.getJSONArray("content");
|
JSONArray content = json.getJSONArray("content");
|
||||||
|
|||||||
Reference in New Issue
Block a user