mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-05-11 05:20:14 +08:00
计算余额扣除金额
This commit is contained in:
@@ -43,6 +43,7 @@ import com.jsowell.pile.mapper.PileBillingTemplateMapper;
|
|||||||
import com.jsowell.pile.service.*;
|
import com.jsowell.pile.service.*;
|
||||||
import com.jsowell.pile.vo.base.PileInfoVO;
|
import com.jsowell.pile.vo.base.PileInfoVO;
|
||||||
import com.jsowell.pile.vo.uniapp.MemberVO;
|
import com.jsowell.pile.vo.uniapp.MemberVO;
|
||||||
|
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
|
||||||
import com.jsowell.pile.vo.web.BillingTemplateVO;
|
import com.jsowell.pile.vo.web.BillingTemplateVO;
|
||||||
import com.jsowell.pile.vo.web.OrderListVO;
|
import com.jsowell.pile.vo.web.OrderListVO;
|
||||||
import com.jsowell.pile.vo.web.PileDetailVO;
|
import com.jsowell.pile.vo.web.PileDetailVO;
|
||||||
@@ -192,6 +193,14 @@ public class SpringBootTestController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrderPileOccupyService orderPileOccupyService;
|
private OrderPileOccupyService orderPileOccupyService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCalculateTheBalanceDeductionAmount() {
|
||||||
|
String memberId = "123456";
|
||||||
|
BigDecimal amount = new BigDecimal("99.9");
|
||||||
|
List<BalanceDeductionAmountVO> list = orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount);
|
||||||
|
System.out.println(JSON.toJSONString(list));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateOccupyPileOrder() {
|
public void testGenerateOccupyPileOrder() {
|
||||||
String memberId = "67569684";
|
String memberId = "67569684";
|
||||||
|
|||||||
@@ -41,4 +41,6 @@ public interface MemberAdapayRecordMapper {
|
|||||||
List<MemberAdapayRecord> selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType);
|
List<MemberAdapayRecord> selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType);
|
||||||
|
|
||||||
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
|
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
|
||||||
|
|
||||||
|
List<MemberAdapayRecord> selectAvailableBalance(@Param("memberId") String memberId);
|
||||||
}
|
}
|
||||||
@@ -16,11 +16,13 @@ import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
|
|||||||
import com.jsowell.pile.vo.uniapp.OrderVO;
|
import com.jsowell.pile.vo.uniapp.OrderVO;
|
||||||
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
|
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
|
||||||
import com.jsowell.pile.vo.uniapp.SendMessageVO;
|
import com.jsowell.pile.vo.uniapp.SendMessageVO;
|
||||||
|
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
|
||||||
import com.jsowell.pile.vo.web.IndexOrderInfoVO;
|
import com.jsowell.pile.vo.web.IndexOrderInfoVO;
|
||||||
import com.jsowell.pile.vo.web.OrderListVO;
|
import com.jsowell.pile.vo.web.OrderListVO;
|
||||||
import com.jsowell.pile.vo.web.OrderTotalDataVO;
|
import com.jsowell.pile.vo.web.OrderTotalDataVO;
|
||||||
import com.jsowell.wxpay.response.WechatPayRefundResponse;
|
import com.jsowell.wxpay.response.WechatPayRefundResponse;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -150,7 +152,9 @@ public interface IOrderBasicInfoService {
|
|||||||
|
|
||||||
void tempOrderSplittingOperations(String merchantId, String tradeDate);
|
void tempOrderSplittingOperations(String merchantId, String tradeDate);
|
||||||
|
|
||||||
/**
|
List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount);
|
||||||
|
|
||||||
|
/**
|
||||||
* 执行订单分账
|
* 执行订单分账
|
||||||
* @param orderBasicInfo
|
* @param orderBasicInfo
|
||||||
* @param adapayMemberAccount
|
* @param adapayMemberAccount
|
||||||
|
|||||||
@@ -22,4 +22,10 @@ public interface MemberAdapayRecordService{
|
|||||||
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
|
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
|
||||||
|
|
||||||
MemberAdapayRecord selectByPaymentId(String paymentId);
|
MemberAdapayRecord selectByPaymentId(String paymentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会员可用余额充值记录
|
||||||
|
* @param memberId 会员id
|
||||||
|
*/
|
||||||
|
List<MemberAdapayRecord> selectAvailableBalance(String memberId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,4 +64,14 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
|
|||||||
return memberAdapayRecordMapper.selectByPaymentId(paymentId);
|
return memberAdapayRecordMapper.selectByPaymentId(paymentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会员可用余额充值记录
|
||||||
|
* @param memberId 会员id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<MemberAdapayRecord> selectAvailableBalance(String memberId) {
|
||||||
|
return memberAdapayRecordMapper.selectAvailableBalance(memberId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
/**
|
/**
|
||||||
* 查询订单列表
|
* 查询订单列表
|
||||||
* 带权限过滤
|
* 带权限过滤
|
||||||
|
*
|
||||||
* @param dto 订单
|
* @param dto 订单
|
||||||
* @return 订单
|
* @return 订单
|
||||||
*/
|
*/
|
||||||
@@ -206,6 +207,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
/**
|
/**
|
||||||
* 查询订单列表
|
* 查询订单列表
|
||||||
* 无权限过滤
|
* 无权限过滤
|
||||||
|
*
|
||||||
* @param dto 订单
|
* @param dto 订单
|
||||||
* @return 订单
|
* @return 订单
|
||||||
*/
|
*/
|
||||||
@@ -430,6 +432,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 关闭启动失败订单
|
* 关闭启动失败订单
|
||||||
|
*
|
||||||
* @param startTime
|
* @param startTime
|
||||||
* @param endTime
|
* @param endTime
|
||||||
*/
|
*/
|
||||||
@@ -572,6 +575,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过交易流水号查询订单信息
|
* 通过交易流水号查询订单信息
|
||||||
|
*
|
||||||
* @param transactionCode 交易流水号
|
* @param transactionCode 交易流水号
|
||||||
* @return 订单信息
|
* @return 订单信息
|
||||||
*/
|
*/
|
||||||
@@ -801,6 +805,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 解锁vin状态
|
* 解锁vin状态
|
||||||
|
*
|
||||||
* @param vinCode
|
* @param vinCode
|
||||||
*/
|
*/
|
||||||
private void vinStatusUnlocked(String vinCode) {
|
private void vinStatusUnlocked(String vinCode) {
|
||||||
@@ -817,8 +822,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单退款逻辑
|
* 订单退款逻辑
|
||||||
|
*
|
||||||
* @param orderBasicInfo 订单信息
|
* @param orderBasicInfo 订单信息
|
||||||
* @param residue 需退款金额
|
* @param residue 需退款金额
|
||||||
*/
|
*/
|
||||||
private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) {
|
private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) {
|
||||||
String orderCode = orderBasicInfo.getOrderCode();
|
String orderCode = orderBasicInfo.getOrderCode();
|
||||||
@@ -1086,6 +1092,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 余额支付订单,使用余额支付转账
|
* 余额支付订单,使用余额支付转账
|
||||||
|
*
|
||||||
* @param orderBasicInfo
|
* @param orderBasicInfo
|
||||||
* @param adapayMemberAccount
|
* @param adapayMemberAccount
|
||||||
* @return
|
* @return
|
||||||
@@ -1118,6 +1125,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 余额支付订单,使用余额支付转账
|
* 余额支付订单,使用余额支付转账
|
||||||
|
*
|
||||||
* @param orderBasicInfo
|
* @param orderBasicInfo
|
||||||
* @param adapayMemberAccount
|
* @param adapayMemberAccount
|
||||||
* @return
|
* @return
|
||||||
@@ -1144,11 +1152,13 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
status = paymentConfirmResponse.getStatus();
|
status = paymentConfirmResponse.getStatus();
|
||||||
description = paymentConfirmResponse.getDescription();
|
description = paymentConfirmResponse.getDescription();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新这笔交易的剩余金额
|
||||||
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
|
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
|
||||||
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
|
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
|
||||||
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
|
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
|
||||||
// 更新此笔交易单的剩余金额 = 历史剩余金额 - 本次消费金额
|
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
|
||||||
record.setBalanceAmt(record.getBalanceAmt().subtract(deductionAmount));
|
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
|
||||||
memberAdapayRecordService.updateByPrimaryKeySelective(record);
|
memberAdapayRecordService.updateByPrimaryKeySelective(record);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1163,25 +1173,54 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算余额扣除金额
|
* 计算余额扣除金额
|
||||||
|
*
|
||||||
* @param memberId 会员id
|
* @param memberId 会员id
|
||||||
* @param amount 消费金额
|
* @param amount 消费金额
|
||||||
*/
|
*/
|
||||||
private List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) {
|
@Override
|
||||||
|
public List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) {
|
||||||
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
|
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
|
||||||
// 查询会员的余额充值记录 按照充值时间正序
|
// 查询会员的余额充值记录 按照充值时间正序
|
||||||
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAdapayRecordList(memberId, ScenarioEnum.BALANCE.getValue());
|
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableBalance(memberId);
|
||||||
|
|
||||||
|
// 定义一个临时金额等于消费金额
|
||||||
|
BigDecimal tempAmount = new BigDecimal(amount.toString());
|
||||||
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
|
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
|
||||||
// 取出一笔判断是否剩余金额够支付订单消费吗
|
// 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗
|
||||||
|
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
|
||||||
}
|
// 该笔支付扣除金额
|
||||||
|
BigDecimal deductionAmount;
|
||||||
|
|
||||||
|
// 消费金额 - 剩余金额
|
||||||
|
tempAmount = tempAmount.subtract(balanceAmt);
|
||||||
|
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
|
||||||
|
// 计算以后,大于等于0,说明这笔支付剩余金额需要扣完
|
||||||
|
deductionAmount = balanceAmt;
|
||||||
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
|
.memberId(memberId)
|
||||||
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
|
.deductionAmount(deductionAmount)
|
||||||
|
.build();
|
||||||
|
resultList.add(build);
|
||||||
|
} else {
|
||||||
|
// 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环
|
||||||
|
deductionAmount = balanceAmt.add(tempAmount);
|
||||||
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
|
.memberId(memberId)
|
||||||
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
|
.deductionAmount(deductionAmount)
|
||||||
|
.build();
|
||||||
|
resultList.add(build);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return resultList;
|
return resultList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 延迟交易订单 交易确认
|
* 延迟交易订单 交易确认
|
||||||
* @param orderBasicInfo 订单
|
*
|
||||||
|
* @param orderBasicInfo 订单
|
||||||
* @param adapayMemberAccount 结算账户
|
* @param adapayMemberAccount 结算账户
|
||||||
* @throws BaseAdaPayException
|
* @throws BaseAdaPayException
|
||||||
*/
|
*/
|
||||||
@@ -1243,6 +1282,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量查询订单
|
* 批量查询订单
|
||||||
|
*
|
||||||
* @param orderCodeList
|
* @param orderCodeList
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -1418,6 +1458,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成订单编号
|
* 生成订单编号
|
||||||
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String generateNewOrderCode() {
|
private String generateNewOrderCode() {
|
||||||
@@ -1433,6 +1474,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存异常订单到订单主表
|
* 保存异常订单到订单主表
|
||||||
|
*
|
||||||
* @param data 交易记录数据
|
* @param data 交易记录数据
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@@ -2019,12 +2061,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(dto.getPileSn());
|
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(dto.getPileSn());
|
||||||
PileStationWhitelist pileStationWhitelist = pileStationWhitelistService.queryWhitelistByMemberId(String.valueOf(pileBasicInfo.getStationId()), dto.getMemberId());
|
PileStationWhitelist pileStationWhitelist = pileStationWhitelistService.queryWhitelistByMemberId(String.valueOf(pileBasicInfo.getStationId()), dto.getMemberId());
|
||||||
|
|
||||||
if(platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) {
|
if (platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) {
|
||||||
// 是平台测试员
|
// 是平台测试员
|
||||||
accountBalance = new BigDecimal("500");
|
accountBalance = new BigDecimal("500");
|
||||||
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
|
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
|
||||||
|
|
||||||
}else if(pileStationWhitelist != null) {
|
} else if (pileStationWhitelist != null) {
|
||||||
// 站点白名单
|
// 站点白名单
|
||||||
accountBalance = new BigDecimal("500");
|
accountBalance = new BigDecimal("500");
|
||||||
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
|
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
|
||||||
@@ -2268,6 +2310,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 汇付支付-订单退款处理逻辑
|
* 汇付支付-订单退款处理逻辑
|
||||||
|
*
|
||||||
* @param dto
|
* @param dto
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@@ -2345,6 +2388,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算站点订单报表
|
* 计算站点订单报表
|
||||||
|
*
|
||||||
* @param stationId 站点id
|
* @param stationId 站点id
|
||||||
* @param tradeDate 交易日期
|
* @param tradeDate 交易日期
|
||||||
*/
|
*/
|
||||||
@@ -2463,6 +2507,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过结算金额,计算客户到账金额和手续费
|
* 通过结算金额,计算客户到账金额和手续费
|
||||||
|
*
|
||||||
* @param settleAmount 需要拆分的结算金额
|
* @param settleAmount 需要拆分的结算金额
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -2709,7 +2754,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
if (response != null && !response.isEmpty()) {
|
if (response != null && !response.isEmpty()) {
|
||||||
JSONObject expend = JSONObject.parseObject(response.get("expend").toString());
|
JSONObject expend = JSONObject.parseObject(response.get("expend").toString());
|
||||||
JSONObject pay_info = expend.getJSONObject("pay_info");
|
JSONObject pay_info = expend.getJSONObject("pay_info");
|
||||||
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
|
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {
|
||||||
|
});
|
||||||
if (resultMap != null) {
|
if (resultMap != null) {
|
||||||
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
|
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
|
||||||
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
|
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
|
||||||
@@ -2836,7 +2882,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
|
|
||||||
// 如果是鉴权卡或者vin启动,不判断枪口状态
|
// 如果是鉴权卡或者vin启动,不判断枪口状态
|
||||||
if (!(StringUtils.equals(dto.getStartMode(), StartModeEnum.AUTH_CARD.getValue())
|
if (!(StringUtils.equals(dto.getStartMode(), StartModeEnum.AUTH_CARD.getValue())
|
||||||
|| StringUtils.equals(dto.getStartMode(), StartModeEnum.VIN_CODE.getValue()))) {
|
|| StringUtils.equals(dto.getStartMode(), StartModeEnum.VIN_CODE.getValue()))) {
|
||||||
|
|
||||||
// 判断枪口状态
|
// 判断枪口状态
|
||||||
if (!(StringUtils.equals(pileConnector.getConnectorStatus(), PileConnectorDataBaseStatusEnum.FREE.getValue())
|
if (!(StringUtils.equals(pileConnector.getConnectorStatus(), PileConnectorDataBaseStatusEnum.FREE.getValue())
|
||||||
|
|||||||
@@ -470,4 +470,14 @@
|
|||||||
where del_flag = '0'
|
where del_flag = '0'
|
||||||
and payment_id = #{paymentId,jdbcType=VARCHAR}
|
and payment_id = #{paymentId,jdbcType=VARCHAR}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectAvailableBalance" resultMap="BaseResultMap">
|
||||||
|
select
|
||||||
|
<include refid="Base_Column_List" />
|
||||||
|
from member_adapay_record
|
||||||
|
where del_flag = '0'
|
||||||
|
and scenario_type = 'balance'
|
||||||
|
and balance_amt > '0.00'
|
||||||
|
and member_id = #{memberId,jdbcType=VARCHAR}
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
Reference in New Issue
Block a user