api-增加小程序扫码后初始化界面逻辑接口
This commit is contained in:
@@ -1,40 +0,0 @@
|
||||
package com.sv.api.controller;
|
||||
|
||||
import com.sv.service.api.QRCodeService;
|
||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||
import com.ydd.framework.core.controller.BaseApiController;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 二维码进场Controller
|
||||
*/
|
||||
@RestController
|
||||
public class QREnterController extends BaseApiController {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(QREnterController.class);
|
||||
@Resource
|
||||
private QRCodeService qrCodeService;
|
||||
/**
|
||||
* 进场指令发布
|
||||
*/
|
||||
@RequestMapping(value = "/qr/enter", method = RequestMethod.GET)
|
||||
public ResponseDTO enter(@RequestParam("deviceId") String deviceId) {
|
||||
qrCodeService.enter(deviceId);
|
||||
return ResponseDTO.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫码结果页初始化
|
||||
* 需要进场的场馆信息
|
||||
*/
|
||||
@RequestMapping(value = "/qr/init", method = RequestMethod.GET)
|
||||
public ResponseDTO initEnter(@RequestParam("deviceId")String deviceId) {
|
||||
|
||||
return ResponseDTO.ok().addAttribute("init",qrCodeService.initEnter(deviceId));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,6 +15,8 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
@Intercepts({
|
||||
@@ -27,6 +29,7 @@ public class PlatformIdInterceptor implements Interceptor {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(PlatformIdInterceptor.class);
|
||||
|
||||
private static final List<String> executeControllerList = Arrays.asList(new String [] {"/qrCode/init"});
|
||||
/**
|
||||
* 搜索前缀
|
||||
*/
|
||||
@@ -74,19 +77,26 @@ public class PlatformIdInterceptor implements Interceptor {
|
||||
}catch (Exception e){}
|
||||
if(request == null)
|
||||
return sql;
|
||||
if (checkUrl(request)){
|
||||
return sql;
|
||||
}
|
||||
StringBuilder condition = new StringBuilder(" 1 = 1 ");
|
||||
String platformKey = PlatformContext.getKey();
|
||||
if(StringUtils.isEmpty(platformKey))
|
||||
return sql;
|
||||
|
||||
condition.append(" and ").append(PlatformContext.getKey()).append(" = '").append(PlatformContext.getValue()).append("'");
|
||||
String[] sqls = new String[2];
|
||||
int index = sql.toLowerCase().lastIndexOf("where");
|
||||
sqls[0] = sql.substring(0,index-1);
|
||||
sqls[1] = sql.substring(index+5,sql.length());
|
||||
sqls[1] = sql.substring(index+5);
|
||||
return sqls[0] + " WHERE " + condition.toString() + (sqls.length == 2 ? " AND " + sqls[1] : "");
|
||||
}
|
||||
|
||||
private boolean checkUrl(HttpServletRequest request) {
|
||||
logger.error("request.getRequestURI()===========" + request.getRequestURI());
|
||||
System.err.println(executeControllerList.toString());
|
||||
return executeControllerList.contains(request.getRequestURI());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,4 +26,6 @@ public class Constant {
|
||||
|
||||
public final static String DELIMITER_WORD = "$_$";
|
||||
|
||||
public final static String SPIT_WORD = "#";
|
||||
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package com.sv.netty.controller;
|
||||
|
||||
import com.sv.netty.dto.ResponseDTO;
|
||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController("/netty")
|
||||
public class VenueLessonController {
|
||||
@RestController
|
||||
public class AppVenueLessonController {
|
||||
|
||||
@RequestMapping("/getLessonOrder")
|
||||
public ResponseDTO sendMessage1() {
|
||||
@@ -2,13 +2,13 @@ package com.sv.netty.controller;
|
||||
|
||||
import com.sv.netty.config.ClientChannelCache;
|
||||
import com.sv.netty.config.ErrorCode;
|
||||
import com.sv.netty.dto.ResponseDTO;
|
||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||
import io.netty.channel.Channel;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController("/netty")
|
||||
@RestController
|
||||
public class QRCodeControler {
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.sv.netty.controller;
|
||||
|
||||
import com.sv.netty.config.Constant;
|
||||
import com.sv.service.api.QRCodeService;
|
||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||
import com.ydd.framework.core.controller.BaseApiController;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 小程序二维码进场Controller
|
||||
*/
|
||||
@RestController
|
||||
public class QREnterController extends BaseApiController {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(QREnterController.class);
|
||||
@Resource
|
||||
private QRCodeService qrCodeService;
|
||||
/**
|
||||
* 进场指令发布
|
||||
*/
|
||||
@RequestMapping(value = "/qrCode/enter", method = RequestMethod.GET)
|
||||
public ResponseDTO enter(@RequestParam("deviceId") String deviceId,@RequestParam("memberId") String memberId) {
|
||||
Integer venueId = getVenueId(deviceId);
|
||||
String deviceName = getDeviceName(deviceId);
|
||||
qrCodeService.enter(venueId,deviceName);
|
||||
return ResponseDTO.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫码结果页初始化
|
||||
* 需要进场的场馆信息
|
||||
*/
|
||||
@RequestMapping(value = "/qrCode/init", method = RequestMethod.GET)
|
||||
public ResponseDTO initEnter(@RequestParam("deviceId")String deviceId) {
|
||||
Integer venueId = getVenueId(deviceId);
|
||||
String deviceName = getDeviceName(deviceId);
|
||||
return ResponseDTO.ok().addAttribute("init",qrCodeService.initEnter(venueId,deviceName));
|
||||
}
|
||||
|
||||
|
||||
private Integer getVenueId(String deviceId){
|
||||
String venueId = "0";
|
||||
if (deviceId!=null && deviceId.contains(Constant.SPIT_WORD)){
|
||||
venueId = deviceId.split(Constant.SPIT_WORD)[1];
|
||||
}
|
||||
try {
|
||||
return Integer.parseInt(venueId);
|
||||
}catch (Exception e){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private String getDeviceName(String deviceId){
|
||||
if (deviceId!=null){
|
||||
return deviceId.split(Constant.SPIT_WORD)[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
package com.sv.netty.dto;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
||||
/**
|
||||
* 会员基本信息
|
||||
* MemberDto.java
|
||||
*
|
||||
* @author peakren
|
||||
* @date 2018/12/20 8:39 PM
|
||||
*/
|
||||
public class MemberDto implements Serializable {
|
||||
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
|
||||
private String avatar;
|
||||
|
||||
/**
|
||||
* 姓名
|
||||
*/
|
||||
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 手机号码
|
||||
*/
|
||||
|
||||
private String mobile;
|
||||
|
||||
/**
|
||||
* 余额
|
||||
*/
|
||||
|
||||
private BigDecimal amount;
|
||||
|
||||
/**
|
||||
* 是否第一次进入
|
||||
*/
|
||||
private boolean first = false;
|
||||
|
||||
/**
|
||||
* 场地价格
|
||||
*/
|
||||
private BigDecimal placePrice;
|
||||
/**
|
||||
* 场地名称
|
||||
*/
|
||||
|
||||
private String placeName;
|
||||
|
||||
/**
|
||||
* 会员卡名称
|
||||
*/
|
||||
|
||||
private String cardName;
|
||||
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* 1成功进场 0不允许进场
|
||||
*/
|
||||
private int code;
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
public void setAvatar(String avatar) {
|
||||
this.avatar = avatar;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getMobile() {
|
||||
return mobile;
|
||||
}
|
||||
|
||||
public void setMobile(String mobile) {
|
||||
this.mobile = mobile;
|
||||
}
|
||||
|
||||
public BigDecimal getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public void setAmount(BigDecimal amount) {
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public String getPlaceName() {
|
||||
return placeName;
|
||||
}
|
||||
|
||||
public void setPlaceName(String placeName) {
|
||||
this.placeName = placeName;
|
||||
}
|
||||
|
||||
public String getCardName() {
|
||||
return cardName;
|
||||
}
|
||||
|
||||
public void setCardName(String cardName) {
|
||||
this.cardName = cardName;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(int code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public BigDecimal getPlacePrice() {
|
||||
return placePrice;
|
||||
}
|
||||
|
||||
public void setPlacePrice(BigDecimal placePrice) {
|
||||
this.placePrice = placePrice;
|
||||
}
|
||||
|
||||
public boolean isFirst() {
|
||||
return first;
|
||||
}
|
||||
|
||||
public void setFirst(boolean first) {
|
||||
this.first = first;
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
package com.sv.netty.dto;
|
||||
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
public class ResponseDTO extends LinkedHashMap<String, Object> {
|
||||
public static final String ERR_CODE = "err_code";
|
||||
public static final String ERR_MSG = "err_msg";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
private static final long serialVersionUID = 8410965932046471023L;
|
||||
|
||||
public ResponseDTO() {
|
||||
this(0, "OK");
|
||||
}
|
||||
|
||||
public ResponseDTO(Integer errCode, String errMsg) {
|
||||
this(errCode, errMsg, System.currentTimeMillis() / 1000L);
|
||||
}
|
||||
|
||||
public ResponseDTO(Integer errCode, String errMsg, Long timestamp) {
|
||||
this.addAttribute("err_code", errCode);
|
||||
this.addAttribute("err_msg", errMsg);
|
||||
this.addAttribute("timestamp", timestamp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public ResponseDTO(Integer errCode, String errMsg, String attrName, Object attrValue) {
|
||||
this(errCode, errMsg);
|
||||
this.addAttribute(attrName, attrValue);
|
||||
}
|
||||
|
||||
public static ResponseDTO ok() {
|
||||
return new ResponseDTO();
|
||||
}
|
||||
|
||||
public static ResponseDTO ok(String msg) {
|
||||
ResponseDTO ret = ok();
|
||||
ret.setErrorMsg(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public ResponseDTO addAttribute(String attrName, Object attrValue) {
|
||||
Assert.notNull(attrName, "属性名称不能为空");
|
||||
this.put(attrName, attrValue);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void setErrorCode(Integer errCode) {
|
||||
this.addAttribute("err_code", errCode);
|
||||
}
|
||||
|
||||
public void setErrorMsg(String errMsg) {
|
||||
this.addAttribute("err_msg", errMsg);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@ import com.sv.entity.MemberEnterVenueLog;
|
||||
import com.sv.entity.Venue;
|
||||
import com.sv.entity.face.FaceRecognizeResponse;
|
||||
import com.sv.netty.config.ClientChannelCache;
|
||||
import com.sv.netty.dto.MemberDto;
|
||||
import com.sv.netty.netty.message.HeartBeat;
|
||||
import com.sv.netty.netty.message.Result;
|
||||
import com.sv.netty.netty.service.MessageService;
|
||||
@@ -29,8 +28,6 @@ import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
||||
/**
|
||||
@@ -66,7 +63,7 @@ public class TcpMessageHandlerAdapter implements MessageService {
|
||||
@Resource
|
||||
private RestTemplate restTemplate;
|
||||
|
||||
public void sendMessage(MemberDto memberDto, Integer deviceId) {
|
||||
// public void sendMessage(MemberDto memberDto, Integer deviceId) {
|
||||
// MessageDto messageDto = new MessageDto();
|
||||
// messageDto.setCmdId(Cmd.FACEID.id);
|
||||
// messageDto.setResult(memberDto);
|
||||
@@ -78,7 +75,7 @@ public class TcpMessageHandlerAdapter implements MessageService {
|
||||
// } else {
|
||||
// out.writeAndFlush(messageDto);
|
||||
// }
|
||||
}
|
||||
// }
|
||||
|
||||
/**
|
||||
* 处理心跳信息,存储心跳信息
|
||||
@@ -162,27 +159,27 @@ public class TcpMessageHandlerAdapter implements MessageService {
|
||||
}
|
||||
}
|
||||
}
|
||||
MemberDto memberMessageDto = new MemberDto();
|
||||
memberMessageDto.setName(member.getNickname());
|
||||
memberMessageDto.setAvatar(member.getAvatar());
|
||||
memberMessageDto.setMobile(member.getMobile());
|
||||
|
||||
memberMessageDto.setPlaceName("");
|
||||
member = memberService.findByFaceId(response.getPerson().getId());
|
||||
memberMessageDto.setAmount(member.getMoney());
|
||||
// MemberDto memberMessageDto = new MemberDto();
|
||||
// memberMessageDto.setName(member.getNickname());
|
||||
// memberMessageDto.setAvatar(member.getAvatar());
|
||||
// memberMessageDto.setMobile(member.getMobile());
|
||||
//
|
||||
// memberMessageDto.setPlaceName("");
|
||||
// member = memberService.findByFaceId(response.getPerson().getId());
|
||||
// memberMessageDto.setAmount(member.getMoney());
|
||||
if (code > 0) {
|
||||
EnterResult result = venueService.enterVenue(response.getPerson().getId(), device.getId());
|
||||
if (result.getStatus() >= 0) {
|
||||
memberMessageDto.setCode(1);
|
||||
// memberMessageDto.setCode(1);
|
||||
if (result.getStatus() == 1) {
|
||||
memberMessageDto.setCardName("会员卡");
|
||||
// memberMessageDto.setCardName("会员卡");
|
||||
}
|
||||
if (result.getStatus() == 2) {
|
||||
memberMessageDto.setPlacePrice(result.getMoney());
|
||||
memberMessageDto.setFirst(true);
|
||||
logger.info(member.getId() + "入场成功:" + member.getMoney().toString());
|
||||
member = memberService.findByFaceId(response.getPerson().getId());
|
||||
memberMessageDto.setAmount(member.getMoney());
|
||||
// memberMessageDto.setPlacePrice(result.getMoney());
|
||||
// memberMessageDto.setFirst(true);
|
||||
// logger.info(member.getId() + "入场成功:" + member.getMoney().toString());
|
||||
// member = memberService.findByFaceId(response.getPerson().getId());
|
||||
// memberMessageDto.setAmount(member.getMoney());
|
||||
//5秒后开门
|
||||
// scheduledExecutorService.schedule(new Runnable() {
|
||||
// @Override
|
||||
@@ -202,22 +199,23 @@ public class TcpMessageHandlerAdapter implements MessageService {
|
||||
logger.info(member.getId() + "入场成功:" + member.getMoney().toString());
|
||||
|
||||
}
|
||||
memberMessageDto.setMessage("门禁已开,请入门");
|
||||
// memberMessageDto.setMessage("门禁已开,请入门");
|
||||
venueService.addNumber(venue.getId(), 1, member.getId());
|
||||
venue = venueService.findById(venue.getId());
|
||||
sendNumberChange(venue.getNumber());
|
||||
} else {
|
||||
logger.info(member.getId() + "入场失败:" + member.getMoney().toString());
|
||||
memberMessageDto.setCode(-1);
|
||||
memberMessageDto.setMessage(member.getName() + "您好,您的余额不足,请扫描门禁上张贴的小程序二维码充值");
|
||||
// memberMessageDto.setCode(-1);
|
||||
// memberMessageDto.setMessage(member.getName() + "您好,您的余额不足,请扫描门禁上张贴的小程序二维码充值");
|
||||
}
|
||||
} else {
|
||||
logger.info(member.getId() + "入场失败:连续入场");
|
||||
memberMessageDto.setCode(0);
|
||||
// memberMessageDto.setCode(0);
|
||||
Config config = configService.findById(1);
|
||||
memberMessageDto.setMessage("无出门记录连续入场,请" + config.getValue() + "分钟之后再试");
|
||||
// memberMessageDto.setMessage("无出门记录连续入场,请" + config.getValue() + "分钟之后再试");
|
||||
}
|
||||
sendMessage(memberMessageDto, device.getId());
|
||||
// TODO 校验完,就可以进场了
|
||||
// sendMessage(memberMessageDto, device.getId());
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -238,19 +236,20 @@ public class TcpMessageHandlerAdapter implements MessageService {
|
||||
memberEnterVenueLog.setPlatformId(member.getPlatformId());
|
||||
memberEnterVenueLogService.save(memberEnterVenueLog);
|
||||
logger.info("用户" + member.getNickname() + "出场");
|
||||
MemberDto memberMessageDto = new MemberDto();
|
||||
memberMessageDto.setAmount(member.getMoney());
|
||||
memberMessageDto.setName(member.getNickname());
|
||||
memberMessageDto.setAvatar(member.getAvatar());
|
||||
memberMessageDto.setMobile(member.getMobile());
|
||||
memberMessageDto.setPlaceName("");
|
||||
memberMessageDto.setMessage("欢迎下次再来" + venue.getName());
|
||||
memberMessageDto.setCode(2);
|
||||
// MemberDto memberMessageDto = new MemberDto();
|
||||
// memberMessageDto.setAmount(member.getMoney());
|
||||
// memberMessageDto.setName(member.getNickname());
|
||||
// memberMessageDto.setAvatar(member.getAvatar());
|
||||
// memberMessageDto.setMobile(member.getMobile());
|
||||
// memberMessageDto.setPlaceName("");
|
||||
// memberMessageDto.setMessage("欢迎下次再来" + venue.getName());
|
||||
// memberMessageDto.setCode(2);
|
||||
// MessageDto messageDto = new MessageDto();
|
||||
// messageDto.setCmdId(Cmd.OPEN_DOOR.id);
|
||||
// messageDto.setDoor(2);
|
||||
// sendOpenMessage(messageDto, device.getId());
|
||||
sendMessage(memberMessageDto, device.getId());
|
||||
// 校验玩就可以出场了
|
||||
// sendMessage(memberMessageDto, device.getId());
|
||||
venueService.addNumber(venue.getId(), -1, member.getId());
|
||||
venue = venueService.findById(venue.getId());
|
||||
sendNumberChange(venue.getNumber());
|
||||
|
||||
@@ -51,5 +51,9 @@ public class ExceptionCodeTemplate {
|
||||
|
||||
public static final ExceptionCode VENUE_ERROR = ExceptionCode.init(30023, "场馆暂未开放");
|
||||
|
||||
public static final ExceptionCode DEVICE_ERROR = ExceptionCode.init(30024, "未找到该设备");
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.sv.service.api;
|
||||
import com.sv.entity.Venue;
|
||||
import com.sv.mapper.DeviceMapper;
|
||||
import com.sv.mapper.VenueMapper;
|
||||
import com.ydd.framework.core.exception.ServiceException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -23,28 +24,16 @@ public class QRCodeService {
|
||||
@Resource
|
||||
private DeviceMapper deviceMapper;
|
||||
|
||||
public void enter(String deviceId) {
|
||||
|
||||
public void enter(Integer venueId,String deviceName) {
|
||||
}
|
||||
|
||||
public Venue initEnter(String deviceId) {
|
||||
String deviceName = getDeviceName(deviceId);
|
||||
String venueId = getVenueId(deviceId);
|
||||
int i = Integer.parseInt(venueId);
|
||||
Integer integer = deviceMapper.checkDevice(deviceName, i);
|
||||
public Venue initEnter(Integer venueId,String deviceName) {
|
||||
Integer integer = deviceMapper.checkDevice(deviceName, venueId);
|
||||
if (integer != 1){
|
||||
logger.error("设备【"+deviceId + "】未链接,活着不存在");
|
||||
return null;
|
||||
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.DEVICE_ERROR);
|
||||
}
|
||||
return venueMapper.findById(i);
|
||||
return venueMapper.findById(venueId);
|
||||
}
|
||||
|
||||
private String getVenueId(String deviceId){
|
||||
return deviceId.split("$-$")[1];
|
||||
}
|
||||
|
||||
private String getDeviceName(String deviceId){
|
||||
return deviceId.split("$-$")[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
|
||||
<select id="checkDevice" resultType="java.lang.Integer">
|
||||
SELECT count(1) FROM sv_device
|
||||
WHERE name = #{deviceName} and venue_id=#{venueId} and deleted = 0
|
||||
WHERE 1=1 AND name = #{deviceName} and venue_id=#{venueId} and deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user