代码更新
This commit is contained in:
parent
ff6018a614
commit
3b49880332
|
|
@ -2,12 +2,9 @@ package com.ruoyi.web.controller.app;
|
|||
|
||||
import java.util.*;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.app.domain.AppLocation;
|
||||
import com.ruoyi.app.domain.AppTask;
|
||||
import com.ruoyi.app.domain.AppWcsTask;
|
||||
import com.ruoyi.app.domain.AppWcsTaskBak;
|
||||
import com.ruoyi.app.service.IAppLocationService;
|
||||
import com.ruoyi.app.service.IAppTaskService;
|
||||
import com.ruoyi.app.service.IAppWcsTaskBakService;
|
||||
|
|
@ -186,24 +183,50 @@ public class AppTaskController extends BaseController
|
|||
thisWmsTaskList.forEach(appTask -> appTask.setTaskStatus(2));// 执行中
|
||||
appTaskService.batchUpdateAppTask(thisWmsTaskList);
|
||||
}
|
||||
return success("任务状态反馈成功。");
|
||||
return success("反馈任务执行中成功。");
|
||||
}
|
||||
if (100 == feedBackRequest.getTaskStatus()) {
|
||||
// 删除wcs任务,并添加任务记录
|
||||
thisFbWcsTask.setFinishTime(new Date());
|
||||
thisFbWcsTask.setWcsTaskStatus(100);
|
||||
|
||||
// 任务完成,更新对应的wms任务状态,然后添加任务记录
|
||||
appWcsTaskBakService.insertAppWcsTaskBak(thisFbWcsTask.toAppWcsTaskBak());
|
||||
appWcsTaskService.deleteAppWcsTaskByWcsTaskId(feedBackRequest.getTaskId());
|
||||
// 任务完成,更新对应的wms任务状态,
|
||||
if (thisWmsTaskList != null && !thisWmsTaskList.isEmpty()) {
|
||||
// 更新wms任务状态
|
||||
thisWmsTaskList.forEach(appTask -> appTask.setTaskStatus(5));// 任务完成
|
||||
appTaskService.batchUpdateAppTask(thisWmsTaskList);
|
||||
}
|
||||
return success("反正任务完成成功。");
|
||||
}
|
||||
if (998 == feedBackRequest.getTaskStatus()) {
|
||||
// 任务取消
|
||||
thisFbWcsTask.setFinishTime(new Date());
|
||||
thisFbWcsTask.setWcsTaskStatus(998);
|
||||
appWcsTaskBakService.insertAppWcsTaskBak(thisFbWcsTask.toAppWcsTaskBak());
|
||||
appWcsTaskService.deleteAppWcsTaskByWcsTaskId(feedBackRequest.getTaskId());
|
||||
// 任务取消,更新对应的wms任务状态
|
||||
if (thisWmsTaskList != null && !thisWmsTaskList.isEmpty()) {
|
||||
// 更新wms任务状态
|
||||
thisWmsTaskList.forEach(appTask -> appTask.setTaskStatus(8));// wcs取消任务
|
||||
appTaskService.batchUpdateAppTask(thisWmsTaskList);
|
||||
}
|
||||
return success("反馈任务取消成功。");
|
||||
}
|
||||
if (999 == feedBackRequest.getTaskStatus()) {
|
||||
// 任务异常
|
||||
thisFbWcsTask.setFinishTime(new Date());
|
||||
thisFbWcsTask.setWcsTaskStatus(999);
|
||||
appWcsTaskService.updateAppWcsTask(thisFbWcsTask);
|
||||
// 任务异常,更新对应的wms任务状态
|
||||
if (thisWmsTaskList != null && !thisWmsTaskList.isEmpty()) {
|
||||
// 更新wms任务状态
|
||||
thisWmsTaskList.forEach(appTask -> appTask.setTaskStatus(9));// 任务异常
|
||||
appTaskService.batchUpdateAppTask(thisWmsTaskList);
|
||||
}
|
||||
return success("反馈任务异常成功。");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return success();
|
||||
return error("处理任务反馈错误。");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,6 +122,14 @@ public class BaseController
|
|||
return AjaxResult.success(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回成功消息
|
||||
*/
|
||||
public AjaxResult success(String message, Object data)
|
||||
{
|
||||
return AjaxResult.success(message, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回失败消息
|
||||
*/
|
||||
|
|
@ -130,6 +138,14 @@ public class BaseController
|
|||
return AjaxResult.error(message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返回失败消息
|
||||
*/
|
||||
public AjaxResult error(String message, Object data)
|
||||
{
|
||||
return AjaxResult.error(message, data);
|
||||
}
|
||||
/**
|
||||
* 返回警告消息
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@
|
|||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-system</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,87 @@
|
|||
package com.ruoyi.quartz.task;
|
||||
|
||||
import com.ruoyi.app.domain.AppTask;
|
||||
import com.ruoyi.app.domain.AppWcsTask;
|
||||
import com.ruoyi.app.service.IAppTaskService;
|
||||
import com.ruoyi.app.service.IAppWcsTaskService;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.uuid.IdUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 任务执行器定时类
|
||||
*/
|
||||
@Component("taskExecutor")
|
||||
public class TaskExecutor {
|
||||
@Autowired
|
||||
private IAppTaskService appTaskService;
|
||||
@Autowired
|
||||
private IAppWcsTaskService appWcsTaskService;
|
||||
|
||||
private final HashMap<Integer, Integer> taskTypeMap = new HashMap<Integer, Integer>() {{
|
||||
put(1, 1);// 入库
|
||||
put(2, 2);// 出库
|
||||
put(3, 3);// 移库
|
||||
}};
|
||||
|
||||
/**
|
||||
* 解析wms任务
|
||||
* 任务状态为0
|
||||
*/
|
||||
public void executeWmsTask() {
|
||||
// 查询所有的任务
|
||||
List<AppTask> wmsTaskList = appTaskService.selectAppTaskList(new AppTask());
|
||||
if (wmsTaskList == null || wmsTaskList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
// 筛选出待解析的任务
|
||||
List<AppTask> executingWmsTaskList = wmsTaskList.stream().filter(task -> task.getTaskStatus() == 0).collect(Collectors.toList());
|
||||
// 任务待下发列表
|
||||
Map<String, AppWcsTask> wcsTaskMap = new HashMap<>();
|
||||
for (AppTask appTask : executingWmsTaskList) {
|
||||
if (StringUtils.isNotEmpty(appTask.getPreTask())) {
|
||||
// 判断前置任务是否已经完成
|
||||
List<AppTask> preTaskList = wmsTaskList.stream().filter(task -> Objects.equals(task.getTaskId(), appTask.getPreTask()) && task.getTaskStatus() != 5).collect(Collectors.toList());
|
||||
if (!preTaskList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
// 判断这个箱子的任务是否已经下发过
|
||||
if (wcsTaskMap.containsKey(appTask.getVehicleId())) {
|
||||
appTask.setWcsTaskId(wcsTaskMap.get(appTask.getVehicleId()).getWcsTaskId());
|
||||
appTask.setTaskStatus(1);
|
||||
continue;
|
||||
}
|
||||
// 添加一个新wcs任务
|
||||
AppWcsTask newWcsTask = new AppWcsTask();
|
||||
newWcsTask.setWcsTaskId("WCS_" + IdUtils.fastUUID());
|
||||
newWcsTask.setWcsTaskType(taskTypeMap.get(appTask.getTaskType()));
|
||||
newWcsTask.setWcsTaskStatus(0);
|
||||
newWcsTask.setTaskPriority(appTask.getTaskPriority());
|
||||
newWcsTask.setVehicleId(appTask.getVehicleId());
|
||||
newWcsTask.setOrigin(appTask.getOrigin());
|
||||
newWcsTask.setDestination(appTask.getDestination());
|
||||
newWcsTask.setCreateTime(new Date());
|
||||
wcsTaskMap.put(appTask.getVehicleId(), newWcsTask);
|
||||
// 更新wms任务信息
|
||||
appTask.setWcsTaskId(wcsTaskMap.get(appTask.getVehicleId()).getWcsTaskId());
|
||||
appTask.setTaskStatus(1);
|
||||
}
|
||||
// 更新wms任务
|
||||
appTaskService.batchUpdateAppTask(executingWmsTaskList);
|
||||
// 存储wcs任务
|
||||
appWcsTaskService.batchInsertAppWcsTask(new ArrayList<>(wcsTaskMap.values()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送wcs任务
|
||||
* 任务状态为0
|
||||
*/
|
||||
public void sendWcsTask() {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -70,6 +70,10 @@ public class AppTask extends BaseEntity
|
|||
@Excel(name = "操作用户")
|
||||
private String opUser;
|
||||
|
||||
/** 前置任务 */
|
||||
@Excel(name = "前置任务")
|
||||
private String preTask;
|
||||
|
||||
public void setTaskId(String taskId)
|
||||
{
|
||||
this.taskId = taskId;
|
||||
|
|
@ -188,6 +192,14 @@ public class AppTask extends BaseEntity
|
|||
return opUser;
|
||||
}
|
||||
|
||||
public String getPreTask() {
|
||||
return preTask;
|
||||
}
|
||||
|
||||
public void setPreTask(String preTask) {
|
||||
this.preTask = preTask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||
|
|
@ -205,6 +217,7 @@ public class AppTask extends BaseEntity
|
|||
.append("opNum", getOpNum())
|
||||
.append("stockNum", getStockNum())
|
||||
.append("opUser", getOpUser())
|
||||
.append("preTask", getPreTask())
|
||||
.toString();
|
||||
}
|
||||
|
||||
|
|
@ -227,6 +240,7 @@ public class AppTask extends BaseEntity
|
|||
appTaskBak.setOpNum(getOpNum());
|
||||
appTaskBak.setStockNum(getStockNum());
|
||||
appTaskBak.setOpUser(getOpUser());
|
||||
appTaskBak.setPreTask(getPreTask());
|
||||
return appTaskBak;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,6 +70,10 @@ public class AppTaskBak extends BaseEntity
|
|||
@Excel(name = "操作用户")
|
||||
private String opUser;
|
||||
|
||||
/** 前置任务 */
|
||||
@Excel(name = "前置任务")
|
||||
private String preTask;
|
||||
|
||||
public void setTaskId(String taskId)
|
||||
{
|
||||
this.taskId = taskId;
|
||||
|
|
@ -188,6 +192,14 @@ public class AppTaskBak extends BaseEntity
|
|||
return opUser;
|
||||
}
|
||||
|
||||
public String getPreTask() {
|
||||
return preTask;
|
||||
}
|
||||
|
||||
public void setPreTask(String preTask) {
|
||||
this.preTask = preTask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||
|
|
@ -205,6 +217,7 @@ public class AppTaskBak extends BaseEntity
|
|||
.append("opNum", getOpNum())
|
||||
.append("stockNum", getStockNum())
|
||||
.append("opUser", getOpUser())
|
||||
.append("preTask", getPreTask())
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ public class AppWcsTask extends BaseEntity
|
|||
* wcs任务类转化为记录类
|
||||
* @return 记录
|
||||
*/
|
||||
public AppWcsTaskBak toAppWcsTask() {
|
||||
public AppWcsTaskBak toAppWcsTaskBak() {
|
||||
AppWcsTaskBak appWcsTaskBak = new AppWcsTaskBak();
|
||||
appWcsTaskBak.setWcsTaskId(getWcsTaskId());
|
||||
appWcsTaskBak.setWcsTaskStatus(getWcsTaskStatus());
|
||||
|
|
|
|||
|
|
@ -36,6 +36,13 @@ public interface AppWcsTaskMapper
|
|||
*/
|
||||
public int insertAppWcsTask(AppWcsTask appWcsTask);
|
||||
|
||||
/**
|
||||
* 批量新增
|
||||
* @param appWcsTaskList 任务
|
||||
* @return 结果
|
||||
*/
|
||||
int batchInsertAppWcsTask(List<AppWcsTask> appWcsTaskList);
|
||||
|
||||
/**
|
||||
* 修改【请填写功能名称】
|
||||
*
|
||||
|
|
|
|||
|
|
@ -36,6 +36,13 @@ public interface IAppWcsTaskService
|
|||
*/
|
||||
public int insertAppWcsTask(AppWcsTask appWcsTask);
|
||||
|
||||
/**
|
||||
* 批量新增
|
||||
* @param appWcsTaskList 任务
|
||||
* @return 结果
|
||||
*/
|
||||
int batchInsertAppWcsTask(List<AppWcsTask> appWcsTaskList);
|
||||
|
||||
/**
|
||||
* 修改【请填写功能名称】
|
||||
*
|
||||
|
|
|
|||
|
|
@ -58,6 +58,11 @@ public class AppWcsTaskServiceImpl implements IAppWcsTaskService
|
|||
return appWcsTaskMapper.insertAppWcsTask(appWcsTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int batchInsertAppWcsTask(List<AppWcsTask> appWcsTaskList) {
|
||||
return appWcsTaskMapper.batchInsertAppWcsTask(appWcsTaskList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改【请填写功能名称】
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,10 +19,11 @@
|
|||
<result property="opNum" column="op_num" />
|
||||
<result property="stockNum" column="stock_num" />
|
||||
<result property="opUser" column="op_user" />
|
||||
<result property="preTask" column="pre_task" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectAppTaskBakVo">
|
||||
select task_id, task_type, task_status, task_priority, vehicle_id, origin, destination, wcs_task_id, create_time, finish_time, goods_id, op_num, stock_num, op_user from app_task_bak
|
||||
select task_id, task_type, task_status, task_priority, vehicle_id, origin, destination, wcs_task_id, create_time, finish_time, goods_id, op_num, stock_num, op_user, pre_task from app_task_bak
|
||||
</sql>
|
||||
|
||||
<select id="selectAppTaskBakList" parameterType="AppTaskBak" resultMap="AppTaskBakResult">
|
||||
|
|
@ -40,6 +41,7 @@
|
|||
<if test="opNum != null "> and op_num = #{opNum}</if>
|
||||
<if test="stockNum != null "> and stock_num = #{stockNum}</if>
|
||||
<if test="opUser != null and opUser != ''"> and op_user = #{opUser}</if>
|
||||
<if test="preTask != null and preTask != ''"> and pre_task = #{preTask}</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
|
@ -65,6 +67,7 @@
|
|||
<if test="opNum != null">op_num,</if>
|
||||
<if test="stockNum != null">stock_num,</if>
|
||||
<if test="opUser != null">op_user,</if>
|
||||
<if test="preTask != null">pre_task,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="taskId != null">#{taskId},</if>
|
||||
|
|
@ -81,6 +84,7 @@
|
|||
<if test="opNum != null">#{opNum},</if>
|
||||
<if test="stockNum != null">#{stockNum},</if>
|
||||
<if test="opUser != null">#{opUser},</if>
|
||||
<if test="preTask != null">#{preTask},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
|
|
@ -100,6 +104,7 @@
|
|||
<if test="opNum != null">op_num = #{opNum},</if>
|
||||
<if test="stockNum != null">stock_num = #{stockNum},</if>
|
||||
<if test="opUser != null">op_user = #{opUser},</if>
|
||||
<if test="preTask != null">pre_task = #{preTask},</if>
|
||||
</trim>
|
||||
where task_id = #{taskId}
|
||||
</update>
|
||||
|
|
|
|||
|
|
@ -19,10 +19,12 @@
|
|||
<result property="opNum" column="op_num" />
|
||||
<result property="stockNum" column="stock_num" />
|
||||
<result property="opUser" column="op_user" />
|
||||
<result property="opUser" column="op_user" />
|
||||
<result property="preTask" column="pre_task" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectAppTaskVo">
|
||||
select task_id, task_type, task_status, task_priority, vehicle_id, origin, destination, wcs_task_id, create_time, finish_time, goods_id, op_num, stock_num, op_user from app_task
|
||||
select task_id, task_type, task_status, task_priority, vehicle_id, origin, destination, wcs_task_id, create_time, finish_time, goods_id, op_num, stock_num, op_user, pre_task from app_task
|
||||
</sql>
|
||||
|
||||
<select id="selectAppTaskList" parameterType="AppTask" resultMap="AppTaskResult">
|
||||
|
|
@ -40,6 +42,7 @@
|
|||
<if test="opNum != null "> and op_num = #{opNum}</if>
|
||||
<if test="stockNum != null "> and stock_num = #{stockNum}</if>
|
||||
<if test="opUser != null and opUser != ''"> and op_user = #{opUser}</if>
|
||||
<if test="preTask != null and preTask != ''"> and pre_task = #{preTask}</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
|
@ -65,6 +68,7 @@
|
|||
<if test="opNum != null">op_num,</if>
|
||||
<if test="stockNum != null">stock_num,</if>
|
||||
<if test="opUser != null">op_user,</if>
|
||||
<if test="preTask != null">pre_task,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="taskId != null">#{taskId},</if>
|
||||
|
|
@ -81,6 +85,7 @@
|
|||
<if test="opNum != null">#{opNum},</if>
|
||||
<if test="stockNum != null">#{stockNum},</if>
|
||||
<if test="opUser != null">#{opUser},</if>
|
||||
<if test="preTask != null">#{preTask},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
|
|
@ -103,6 +108,7 @@
|
|||
<if test="appTask.opNum != null">op_num,</if>
|
||||
<if test="appTask.stockNum != null">stock_num,</if>
|
||||
<if test="appTask.opUser != null">op_user,</if>
|
||||
<if test="appTask.preTask != null">pre_task,</if>
|
||||
</trim>
|
||||
)
|
||||
values
|
||||
|
|
@ -122,6 +128,7 @@
|
|||
<if test="appTask.opNum != null">#{appTask.opNum},</if>
|
||||
<if test="appTask.stockNum != null">#{appTask.stockNum},</if>
|
||||
<if test="appTask.opUser != null">#{appTask.opUser},</if>
|
||||
<if test="appTask.preTask != null">#{appTask.preTask},</if>
|
||||
</trim>
|
||||
)
|
||||
</foreach>
|
||||
|
|
@ -144,6 +151,7 @@
|
|||
<if test="opNum != null">op_num = #{opNum},</if>
|
||||
<if test="stockNum != null">stock_num = #{stockNum},</if>
|
||||
<if test="opUser != null">op_user = #{opUser},</if>
|
||||
<if test="preTask != null">pre_task = #{preTask},</if>
|
||||
</trim>
|
||||
where task_id = #{taskId}
|
||||
</update>
|
||||
|
|
@ -165,6 +173,7 @@
|
|||
<if test="appTask.opNum != null">op_num = #{appTask.opNum},</if>
|
||||
<if test="appTask.stockNum != null">stock_num = #{appTask.stockNum},</if>
|
||||
<if test="appTask.opUser != null">op_user = #{appTask.opUser},</if>
|
||||
<if test="appTask.preTask != null">pre_task = #{appTask.preTask},</if>
|
||||
</trim>
|
||||
where task_id = #{appTask.taskId}
|
||||
</foreach>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,44 @@
|
|||
</trim>
|
||||
</insert>
|
||||
|
||||
<insert id="batchInsertAppWcsTask" parameterType="java.util.List">
|
||||
insert into app_task
|
||||
<foreach collection="list" item="appWcsTask" separator=",">
|
||||
(
|
||||
<trim prefixOverrides=",">
|
||||
<if test="appWcsTask.wcsTaskId != null">wcs_task_id,</if>
|
||||
<if test="appWcsTask.wcsTaskStatus != null">wcs_task_status,</if>
|
||||
<if test="appWcsTask.wcsTaskType != null">wcs_task_type,</if>
|
||||
<if test="appWcsTask.taskPriority != null">task_priority,</if>
|
||||
<if test="appWcsTask.vehicleId != null">vehicle_id,</if>
|
||||
<if test="appWcsTask.origin != null">origin,</if>
|
||||
<if test="appWcsTask.destination != null">destination,</if>
|
||||
<if test="appWcsTask.createTime != null">create_time,</if>
|
||||
<if test="appWcsTask.sendTime != null">send_time,</if>
|
||||
<if test="appWcsTask.finishTime != null">finish_time,</if>
|
||||
<if test="appWcsTask.remark != null">remark,</if>
|
||||
</trim>
|
||||
)
|
||||
values
|
||||
(
|
||||
<trim prefixOverrides=",">
|
||||
<if test="appWcsTask.wcsTaskId != null">#{appWcsTask.wcsTaskId},</if>
|
||||
<if test="appWcsTask.wcsTaskStatus != null">#{appWcsTask.wcsTaskStatus},</if>
|
||||
<if test="appWcsTask.wcsTaskType != null">#{appWcsTask.wcsTaskType},</if>
|
||||
<if test="appWcsTask.taskPriority != null">#{appWcsTask.taskPriority},</if>
|
||||
<if test="appWcsTask.vehicleId != null">#{appWcsTask.vehicleId},</if>
|
||||
<if test="appWcsTask.origin != null">#{appWcsTask.origin},</if>
|
||||
<if test="appWcsTask.destination != null">#{appWcsTask.destination},</if>
|
||||
<if test="appWcsTask.createTime != null">#{appWcsTask.createTime},</if>
|
||||
<if test="appWcsTask.sendTime != null">#{appWcsTask.sendTime},</if>
|
||||
<if test="appWcsTask.finishTime != null">#{appWcsTask.finishTime},</if>
|
||||
<if test="appWcsTask.remark != null">#{appWcsTask.remark},</if>
|
||||
</trim>
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
|
||||
<update id="updateAppWcsTask" parameterType="AppWcsTask">
|
||||
update app_wcs_task
|
||||
<trim prefix="SET" suffixOverrides=",">
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user