2026.3.18
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi;
|
package com.ruoyi;
|
||||||
|
|
||||||
|
import com.ruoyi.schedule.ScheduleThread;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
@@ -7,6 +8,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
|||||||
import org.springframework.scheduling.annotation.EnableAsync;
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动程序
|
* 启动程序
|
||||||
*
|
*
|
||||||
@@ -17,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
|||||||
@EnableAsync
|
@EnableAsync
|
||||||
public class RuoYiApplication
|
public class RuoYiApplication
|
||||||
{
|
{
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
// System.setProperty("spring.devtools.restart.enabled", "false");
|
// System.setProperty("spring.devtools.restart.enabled", "false");
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.ruoyi.queue.srgv.mapper;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
|
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 四向小车任务队列Mapper接口
|
* 四向小车任务队列Mapper接口
|
||||||
@@ -10,8 +9,7 @@ import org.apache.ibatis.annotations.Param;
|
|||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
* @date 2025-11-21
|
* @date 2025-11-21
|
||||||
*/
|
*/
|
||||||
public interface WcsSrgvQueueMapper
|
public interface WcsSrgvQueueMapper {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* 查询四向小车任务队列
|
* 查询四向小车任务队列
|
||||||
*
|
*
|
||||||
@@ -29,9 +27,6 @@ public interface WcsSrgvQueueMapper
|
|||||||
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
|
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询四向小车任务队列列表
|
* 查询四向小车任务队列列表
|
||||||
*
|
*
|
||||||
@@ -77,4 +72,7 @@ public interface WcsSrgvQueueMapper
|
|||||||
Integer selectTsj();
|
Integer selectTsj();
|
||||||
|
|
||||||
Integer selectByCaogoPlaceSite(String siteId);
|
Integer selectByCaogoPlaceSite(String siteId);
|
||||||
|
|
||||||
|
Integer selectByEndSite();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,4 +83,6 @@ public interface IWcsSrgvQueueService
|
|||||||
Integer selectTsj();
|
Integer selectTsj();
|
||||||
|
|
||||||
Integer selectByCaogoPlaceSite(String siteId);
|
Integer selectByCaogoPlaceSite(String siteId);
|
||||||
|
|
||||||
|
Integer selectByEndSite();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,6 +131,28 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
|
|||||||
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
|
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String selectMinCountJob( List<String> outModelSSJ) {
|
||||||
|
return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer selectTsj() {
|
||||||
|
|
||||||
|
return wcsSrgvQueueMapper.selectTsj();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer selectByCaogoPlaceSite(String siteId) {
|
||||||
|
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer selectByEndSite() {
|
||||||
|
return wcsSrgvQueueMapper.selectByEndSite();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WcsSrgvQueue insertHistory(String taskNo) {
|
public WcsSrgvQueue insertHistory(String taskNo) {
|
||||||
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);
|
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);
|
||||||
|
|||||||
@@ -79,6 +79,12 @@ public class PlcSrgvRead implements Runnable {
|
|||||||
if (read1.IsSuccess) {
|
if (read1.IsSuccess) {
|
||||||
setValueByByte1(read1.Content, deviceSrgv);
|
setValueByByte1(read1.Content, deviceSrgv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OperateResultExOne<byte[]> read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414
|
||||||
|
if (read5.IsSuccess) {
|
||||||
|
setValueByByte5(read1.Content, deviceSrgv);
|
||||||
|
}
|
||||||
|
|
||||||
//读取二段任务 小车是否接收完成1段作业
|
//读取二段任务 小车是否接收完成1段作业
|
||||||
OperateResultExOne<byte[]> read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414
|
OperateResultExOne<byte[]> read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414
|
||||||
if (read3.IsSuccess) {
|
if (read3.IsSuccess) {
|
||||||
@@ -111,7 +117,7 @@ public class PlcSrgvRead implements Runnable {
|
|||||||
// agvData.setStatus(0);
|
// agvData.setStatus(0);
|
||||||
agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8)));
|
agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8)));
|
||||||
//载货标志
|
//载货标志
|
||||||
agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt16(content, 13)));
|
// agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt32(content[1], 13)));
|
||||||
//接收完成标志
|
//接收完成标志
|
||||||
// agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10)));
|
// agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10)));
|
||||||
// agvData.setFinish(0);
|
// agvData.setFinish(0);
|
||||||
@@ -131,6 +137,15 @@ public class PlcSrgvRead implements Runnable {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void setValueByByte5(byte[] content, DeviceSrgv agvData) {
|
||||||
|
int cargoFlag = content[27] & 0xFF;
|
||||||
|
agvData.setCargoFlag(cargoFlag);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//单字
|
//单字
|
||||||
private void setValueByByte3(byte[] content, DeviceSrgv agvData) {
|
private void setValueByByte3(byte[] content, DeviceSrgv agvData) {
|
||||||
// agvData.setTaskType(0);
|
// agvData.setTaskType(0);
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ public class PlcSsjRead implements Runnable {
|
|||||||
// 线体到位输送机
|
// 线体到位输送机
|
||||||
readPlcOtherSsj(ssjDevice);
|
readPlcOtherSsj(ssjDevice);
|
||||||
break;
|
break;
|
||||||
|
case "4":
|
||||||
|
// 线体到位输送机
|
||||||
|
readPlcInDwSsj(ssjDevice);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +90,18 @@ public class PlcSsjRead implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void readPlcInDwSsj(DeviceSsj ssjDevice) {
|
||||||
|
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10"));
|
||||||
|
String ddsx1 = "0";
|
||||||
|
if (read2.IsSuccess) {
|
||||||
|
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
|
||||||
|
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
|
||||||
|
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
|
||||||
|
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 其他输送机
|
* 其他输送机
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class CdzThread implements Runnable {
|
|||||||
private final Integer LITTLE_BETTERY = 40;
|
private final Integer LITTLE_BETTERY = 40;
|
||||||
private final Integer MIDDLE_BETTERY = 70;
|
private final Integer MIDDLE_BETTERY = 70;
|
||||||
private final Integer MAX_BETTERY = 90;
|
private final Integer MAX_BETTERY = 90;
|
||||||
|
private final Integer JOB_BETTERY=50;
|
||||||
private ISrgvChargingJobService chargingJobService;
|
private ISrgvChargingJobService chargingJobService;
|
||||||
private IDeviceCdzService deviceCdzService;
|
private IDeviceCdzService deviceCdzService;
|
||||||
private IDeviceSrgvService deviceSrgvService;
|
private IDeviceSrgvService deviceSrgvService;
|
||||||
@@ -139,7 +140,7 @@ public class CdzThread implements Runnable {
|
|||||||
List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
|
List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
|
||||||
for (DeviceCdz deviceCdz : deviceCdzdd) {
|
for (DeviceCdz deviceCdz : deviceCdzdd) {
|
||||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
|
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
|
||||||
if (((deviceSrgv.getBattery() >= MIDDLE_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
|
if (((deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
|
||||||
&& deviceSrgv.getWorkMode() == 5
|
&& deviceSrgv.getWorkMode() == 5
|
||||||
&& deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
|
&& deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
|
||||||
createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
|
createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
|
||||||
|
|||||||
@@ -338,9 +338,11 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
|||||||
}
|
}
|
||||||
if (deviceSrgv != null) {
|
if (deviceSrgv != null) {
|
||||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
||||||
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
// WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
||||||
|
|
||||||
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) {
|
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1
|
||||||
|
// && wcsSrgvQueue4 == null
|
||||||
|
) {
|
||||||
//查询小车是否为取货楼层
|
//查询小车是否为取货楼层
|
||||||
String endSite = "";
|
String endSite = "";
|
||||||
String issued = "0";
|
String issued = "0";
|
||||||
@@ -1416,13 +1418,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
|||||||
//不同层,终点为提升机
|
//不同层,终点为提升机
|
||||||
endSite = "tsj";
|
endSite = "tsj";
|
||||||
}
|
}
|
||||||
// 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下
|
|
||||||
// if (endSite.equals("tsj")) {
|
|
||||||
// Integer count = wcsSagvQueueMapper.selectTsj();
|
|
||||||
// if (count > 0) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
|
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
|
||||||
xfType = "1";//入库
|
xfType = "1";//入库
|
||||||
@@ -1517,7 +1513,26 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
|||||||
{
|
{
|
||||||
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
|
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
|
||||||
}
|
}
|
||||||
|
// 如果是空车且 任务是点到点并且目标点是“070301”
|
||||||
|
}else if ("1".equals(taskType)&&wcsSrgvQueue.getDefault02().equals("4")&&wcsSrgvQueue.getEndSite().equals("070301")){
|
||||||
|
String endSite = "";
|
||||||
|
String xfType = "";
|
||||||
|
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
|
||||||
|
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
|
||||||
|
// 取货点地图和放货点地图不为空
|
||||||
|
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
|
||||||
|
//如果是同层,终点为取货点
|
||||||
|
endSite = cargoPickSite;
|
||||||
|
// 更新目标点,修改执行队列
|
||||||
|
wcsSrgvQueue.setEndSite(endSite);
|
||||||
|
wcsSrgvQueue.setDefault02("4");
|
||||||
|
wcsSrgvQueue.setIssued("0");
|
||||||
|
wcsSrgvQueue.setExecutionStatus("1");
|
||||||
|
wcsSrgvQueue.setTaskType("1");
|
||||||
|
}
|
||||||
|
wcsSrgvQueue.setStartSite(currSite);
|
||||||
|
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
|
||||||
|
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
//更新小车待机时间
|
//更新小车待机时间
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ import com.ruoyi.schedule.plcRead.util.Tools;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TsjThread implements Runnable {
|
public class TsjThread implements Runnable {
|
||||||
@@ -212,8 +214,16 @@ public class TsjThread implements Runnable {
|
|||||||
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
|
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
|
||||||
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
|
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
|
||||||
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
|
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
|
||||||
|
Integer count = wcsSrgvQueueService.selectByEndSite();
|
||||||
|
List<DeviceSrgv> collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d ->
|
||||||
|
d.getCurrSite().equals(cargoPickSite))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (count > 0 || !collect.isEmpty()) {
|
||||||
|
wcsSrgvQueue.setEndSite("070301");
|
||||||
|
} else {
|
||||||
wcsSrgvQueue.setEndSite(cargoPickSite);
|
wcsSrgvQueue.setEndSite(cargoPickSite);
|
||||||
|
}
|
||||||
|
|
||||||
wcsSrgvQueue.setDefault02("4");
|
wcsSrgvQueue.setDefault02("4");
|
||||||
wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString());
|
wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString());
|
||||||
wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString());
|
wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString());
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class GetDeviceSrgvMap {
|
|||||||
AgvDto dto = new AgvDto();
|
AgvDto dto = new AgvDto();
|
||||||
dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId()));
|
dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId()));
|
||||||
dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo()));
|
dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo()));
|
||||||
dto.setIsThere((d.getWorkPhase() >= 3 && d.getWorkPhase() < 6 ? "1" : "0"));
|
dto.setIsThere(d.getCargoFlag()==256?"1":"0");
|
||||||
Integer wp = d.getWorkPhase();
|
Integer wp = d.getWorkPhase();
|
||||||
String status = "0";
|
String status = "0";
|
||||||
if (wp != null) {
|
if (wp != null) {
|
||||||
|
|||||||
@@ -101,15 +101,11 @@ public class GetDeviceSsjMap {
|
|||||||
dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException())));
|
dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException())));
|
||||||
dto.setKX(String.valueOf(d.getKx()));
|
dto.setKX(String.valueOf(d.getKx()));
|
||||||
if (!dto.getTaskNo().equals("0")){
|
if (!dto.getTaskNo().equals("0")){
|
||||||
if (dto.getRotationDirection().equals("1")){
|
|
||||||
dto.setDW(String.valueOf(d.getDw()));
|
|
||||||
}else {
|
|
||||||
if (dto.getKX().equals("0")){
|
if (dto.getKX().equals("0")){
|
||||||
dto.setDW("1");
|
dto.setDW("1");
|
||||||
}else {
|
}else {
|
||||||
dto.setDW("0");
|
dto.setDW("0");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}else {
|
}else {
|
||||||
dto.setDW("0");
|
dto.setDW("0");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ public class Wcs2wmsgetEmptyCargoSpace {
|
|||||||
dto.setTrayCode(getText(node, "trayCode"));
|
dto.setTrayCode(getText(node, "trayCode"));
|
||||||
dto.setProductCode(getText(node, "productCode"));
|
dto.setProductCode(getText(node, "productCode"));
|
||||||
dto.setProductName(getText(node, "productName"));
|
dto.setProductName(getText(node, "productName"));
|
||||||
|
dto.setCargoSpaceId(getText(node, "cargoSpaceId"));
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,5 +126,6 @@ public class Wcs2wmsgetEmptyCargoSpace {
|
|||||||
private String trayCode;
|
private String trayCode;
|
||||||
private String productCode;
|
private String productCode;
|
||||||
private String productName;
|
private String productName;
|
||||||
|
private String cargoSpaceId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,4 +222,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId}
|
select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectByEndSite" resultType="java.lang.Integer" >
|
||||||
|
select count(1) from wcs_srgv_queue where end_site='070101' or end_site ='050101'
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
Reference in New Issue
Block a user