代客下单支持外带用餐模式
This commit is contained in:
parent
e9fa13fdd8
commit
1b3158930f
|
|
@ -91,7 +91,7 @@ public class TbPlaceController {
|
|||
@PutMapping("/returnCart")
|
||||
@Log("代客下单 退单")
|
||||
@ApiOperation("代客下单 清空购物车 /shop/table")
|
||||
public ResponseEntity<Object> returnOrder(@Validated @RequestBody RemoveCartDTO removeCartDTO) {
|
||||
public ResponseEntity<Object> returnOrder(@Validated @RequestBody ReturnOrderDTO removeCartDTO) {
|
||||
tbShopTableService.returnCart(removeCartDTO);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
|
@ -112,40 +112,40 @@ public class TbPlaceController {
|
|||
public ResponseEntity<Object> getCart(
|
||||
@RequestParam(defaultValue = "1") Integer page,
|
||||
@RequestParam(defaultValue = "10") Integer size,
|
||||
@RequestParam Long tableId,
|
||||
@RequestParam(required = false) Long tableId,
|
||||
@RequestParam Integer shopId,
|
||||
@RequestParam(required = false) Integer vipUserId,
|
||||
@RequestParam String masterId
|
||||
@RequestParam String masterId,
|
||||
@RequestParam String useType
|
||||
) {
|
||||
return ResponseEntity.ok(tbShopTableService.getCart(tableId, page, size, shopId, vipUserId, masterId));
|
||||
return ResponseEntity.ok(tbShopTableService.getCart(tableId, page, size, shopId,masterId, useType));
|
||||
}
|
||||
@AnonymousAccess
|
||||
|
||||
@AnonymousAccess
|
||||
@GetMapping("/pending/cart")
|
||||
@Log("代客下单 查询购物车")
|
||||
@ApiOperation("代客下单 查询购物车 /shop/table")
|
||||
public ResponseEntity<Object> getPendingCart(
|
||||
@RequestParam Integer shopId,
|
||||
@RequestParam String tableId
|
||||
@RequestParam(required = false) String tableId,
|
||||
@RequestParam String useType
|
||||
) {
|
||||
return ResponseEntity.ok(tbShopTableService.getCar(shopId, tableId));
|
||||
return ResponseEntity.ok(tbShopTableService.getCar(shopId, tableId, useType));
|
||||
}
|
||||
|
||||
@AnonymousAccess
|
||||
|
||||
@GetMapping("/masterId")
|
||||
@Log("代客下单 查询购物车")
|
||||
@ApiOperation("代客下单 ")
|
||||
public ResponseEntity<Object> getMasterId(
|
||||
@RequestParam Integer shopId,
|
||||
@RequestParam Long tableId,
|
||||
@RequestParam(defaultValue = "") String useType,
|
||||
@RequestParam(required = false) Integer vipUserId
|
||||
) {
|
||||
return ResponseEntity.ok(tbShopTableService.getMasterId(shopId, tableId, vipUserId));
|
||||
return ResponseEntity.ok(tbShopTableService.getMasterId(shopId, tableId, vipUserId, useType));
|
||||
}
|
||||
|
||||
@AnonymousAccess
|
||||
|
||||
@PostMapping("/order")
|
||||
@Log("代客下单 查询购物车")
|
||||
@ApiOperation("代客下单 查询购物车 /shop/table")
|
||||
|
|
@ -156,7 +156,6 @@ public class TbPlaceController {
|
|||
}
|
||||
|
||||
@AnonymousAccess
|
||||
|
||||
@PostMapping("/pending")
|
||||
@Log("代客下单 查询购物车")
|
||||
@ApiOperation("代客下单 查询购物车 /shop/table")
|
||||
|
|
@ -167,7 +166,6 @@ public class TbPlaceController {
|
|||
}
|
||||
|
||||
@AnonymousAccess
|
||||
|
||||
@GetMapping("/payType")
|
||||
@Log("代客下单 查询购物车")
|
||||
@ApiOperation("代客下单 查询购物车 /shop/table")
|
||||
|
|
@ -223,8 +221,6 @@ public class TbPlaceController {
|
|||
return ResponseEntity.ok(tbShopTableService.choseCount(choseCountDTO));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@AnonymousAccess
|
||||
@PutMapping("/updateVip")
|
||||
@Log("代客下单 查询购物车")
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package cn.ysk.cashier.dto.shoptable;
|
|||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
|
|
@ -17,7 +18,6 @@ public class AddCartDTO {
|
|||
private Integer skuId;
|
||||
@NotNull
|
||||
private Integer shopId;
|
||||
@NotEmpty
|
||||
private String tableId;
|
||||
@NotNull
|
||||
@Min(1)
|
||||
|
|
@ -26,4 +26,8 @@ public class AddCartDTO {
|
|||
private boolean isGift;
|
||||
private Integer cartId;
|
||||
private String note;
|
||||
|
||||
// 用餐类型
|
||||
@NotBlank
|
||||
private String useType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,4 +17,6 @@ public class ChoseCountDTO {
|
|||
@NotNull
|
||||
@Min(1)
|
||||
private Integer num;
|
||||
@NotEmpty
|
||||
private String useType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,4 +16,5 @@ public class ChoseTableDTO {
|
|||
private String newTableId;
|
||||
@NotEmpty
|
||||
private String oldTableId;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,12 @@ import javax.validation.constraints.NotEmpty;
|
|||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
public class ClearCartDTO {
|
||||
public class ClearCartDTO {
|
||||
@NotEmpty
|
||||
private String masterId;
|
||||
private Integer vipUserId;
|
||||
@NotNull
|
||||
private Long tableId;
|
||||
@NotNull
|
||||
private String shopId;
|
||||
@NotEmpty
|
||||
private String useType;
|
||||
private Long tableId;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@ import javax.validation.constraints.NotNull;
|
|||
public class CreateOrderDTO {
|
||||
@NotEmpty
|
||||
private String masterId;
|
||||
private Integer vipUserId;
|
||||
@NotNull
|
||||
private Integer shopId;
|
||||
@NotEmpty
|
||||
private String tableId;
|
||||
private String note;
|
||||
private boolean postPay;
|
||||
private Integer orderId;
|
||||
@NotEmpty
|
||||
private String useType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,12 @@ package cn.ysk.cashier.dto.shoptable;
|
|||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
public class DeleteOrderDTO {
|
||||
@NotNull
|
||||
private Integer shopId;
|
||||
@NotNull
|
||||
private Integer orderId;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ public class PackCartDTO {
|
|||
private Integer vipUserId;
|
||||
@NotNull
|
||||
private Integer shopId;
|
||||
@NotEmpty
|
||||
private String tableId;
|
||||
@NotNull
|
||||
@Range(min = 0, max = 1)
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package cn.ysk.cashier.dto.shoptable;
|
|||
import lombok.Data;
|
||||
import org.bouncycastle.asn1.cmc.PendInfo;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
|
|
@ -12,9 +13,10 @@ public class PendingDTO {
|
|||
@NotNull
|
||||
private Integer shopId;
|
||||
private String tableId;
|
||||
private Integer vipUserId;
|
||||
@NotNull
|
||||
private Boolean isPending;
|
||||
private Integer orderId;
|
||||
private String note;
|
||||
@NotBlank
|
||||
private String useType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package cn.ysk.cashier.dto.shoptable;
|
|||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
|
|
@ -11,6 +12,7 @@ public class RemoveCartDTO {
|
|||
private Integer cartId;
|
||||
@NotNull
|
||||
private Integer shopId;
|
||||
@NotNull
|
||||
private Long tableId;
|
||||
@NotBlank
|
||||
private String useType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,4 +19,5 @@ public class UpdateVipDTO {
|
|||
@NotNull
|
||||
@Range(min = 0, max = 1)
|
||||
private Integer type;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
package cn.ysk.cashier.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum OrderUseTypeEnum {
|
||||
TAKEOUT("takeout"),
|
||||
DINE_IN_AFTER("dine-in-after"),
|
||||
DINE_IN_BEFORE("dine-in-before");
|
||||
private final String value;
|
||||
|
||||
OrderUseTypeEnum(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
|
@ -20,11 +20,8 @@ public interface TbCashierCartMapper extends BaseMapper<TbCashierCart> {
|
|||
" from tb_cashier_cart where table_id is not null and shop_id = #{shopId} and status = 'refund' group by shop_Id, master_id order by trade_day desc")
|
||||
List<CarVO> selectCar(@Param("shopId") Integer shopId);
|
||||
|
||||
@Select("select a.id orderId,b.pending_at pendingAt, sum(b.total_amount) totalAmount, count(b.id) totalCount, sum(b.total_number) totalNumber, a.remark from tb_order_info a " +
|
||||
"JOIN tb_cashier_cart b on a.id=b.order_id " +
|
||||
"where a.shop_id=#{shopId} and a.`status`='pending' and a.table_id=#{tableId} and a.trade_day=#{day}" +
|
||||
"GROUP BY a.id ORDER BY a.id desc ")
|
||||
List<PendingCountVO> countPending(@Param("shopId") Integer shopId, @Param("tableId") String tableId, @Param("day") String day);
|
||||
|
||||
List<PendingCountVO> countPending(@Param("shopId") Integer shopId, @Param("tableId") String tableId, @Param("day") String day, @Param("useType") String useType);
|
||||
|
||||
@Select("select a.*, b.spec_snap from tb_cashier_cart as a left join tb_product_sku as b on a.sku_id=b.id where a.shop_id=#{shopId} and a.status='refund';")
|
||||
List<TbCashierCartVO> selectPending(Integer shopId);
|
||||
|
|
|
|||
|
|
@ -159,6 +159,8 @@ public class TbCashierCart implements Serializable {
|
|||
private Integer placeNum;
|
||||
@Column(name = "`note`")
|
||||
private String note;
|
||||
@Column(name = "`use_type`")
|
||||
private String useType;
|
||||
|
||||
public void copy(TbCashierCart source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
|
|
|
|||
|
|
@ -119,6 +119,9 @@ public class TbOrderDetail implements Serializable {
|
|||
@Column(name = "`cart_id`")
|
||||
private Integer cartId;
|
||||
|
||||
@Column(name = "`use_type`")
|
||||
private String useType;
|
||||
|
||||
public void copy(TbOrderDetail source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import cn.ysk.cashier.config.security.security.TokenProvider;
|
|||
import cn.ysk.cashier.cons.RedisConstant;
|
||||
import cn.ysk.cashier.cons.rabbit.RabbitConstants;
|
||||
import cn.ysk.cashier.dto.shoptable.*;
|
||||
import cn.ysk.cashier.enums.OrderUseTypeEnum;
|
||||
import cn.ysk.cashier.enums.ShopWxMsgTypeEnum;
|
||||
import cn.ysk.cashier.enums.TableStateEnum;
|
||||
import cn.ysk.cashier.exception.BadRequestException;
|
||||
|
|
@ -341,7 +342,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
@Override
|
||||
public TbCashierCart addCartForUser(AddCartDTO addCartDTO) {
|
||||
checkTableIsOpen(addCartDTO.getTableId());
|
||||
if (StrUtil.isNotBlank(addCartDTO.getTableId())) {
|
||||
checkTableIsOpen(addCartDTO.getTableId());
|
||||
}
|
||||
|
||||
int currentPlaceNum = getCurrentPlaceNum(addCartDTO.getTableId(), addCartDTO.getShopId().toString());
|
||||
|
||||
|
|
@ -362,15 +365,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
.eq(TbCashierCart::getShopId, addCartDTO.getShopId())
|
||||
.eq(TbCashierCart::getSkuId, addCartDTO.getSkuId())
|
||||
.eq(TbCashierCart::getProductId, addCartDTO.getProductId())
|
||||
.eq(TbCashierCart::getTableId, addCartDTO.getTableId())
|
||||
.isNull(TbCashierCart::getPlaceNum)
|
||||
.eq(TbCashierCart::getUseType, addCartDTO.getUseType())
|
||||
.in(TbCashierCart::getStatus, "create", "refund")
|
||||
// .and(q -> {
|
||||
// q.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
|
||||
// .or()
|
||||
// .isNull(TbCashierCart::getTradeDay);
|
||||
//
|
||||
// });
|
||||
.and(query2 -> {
|
||||
query2.and(query3 -> {
|
||||
query3.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
|
||||
|
|
@ -386,6 +383,10 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
query.eq(TbCashierCart::getId, addCartDTO.getCartId());
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(addCartDTO.getTableId())) {
|
||||
query.eq(TbCashierCart::getTableId, addCartDTO.getTableId());
|
||||
}
|
||||
|
||||
TbCashierCart tbCashierCart = cashierCartMapper.selectOne(query);
|
||||
// 增加redis购物车数据
|
||||
String tableCartKey = RedisConstant.getTableCartKey(addCartDTO.getTableId(), addCartDTO.getShopId().toString());
|
||||
|
|
@ -393,11 +394,14 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
// 首次加入
|
||||
if (tbCashierCart == null) {
|
||||
tbCashierCart = new TbCashierCart();
|
||||
tbCashierCart.setUseType(addCartDTO.getUseType());
|
||||
tbCashierCart.setUserId(addCartDTO.getVipUserId());
|
||||
tbCashierCart.setCoverImg(product.getCoverImg());
|
||||
tbCashierCart.setCreatedAt(System.currentTimeMillis());
|
||||
tbCashierCart.setIsSku(product.getTypeEnum());
|
||||
tbCashierCart.setTableId(Long.valueOf(addCartDTO.getTableId()));
|
||||
if (StrUtil.isNotBlank(addCartDTO.getTableId())) {
|
||||
tbCashierCart.setTableId(Long.valueOf(addCartDTO.getTableId()));
|
||||
}
|
||||
tbCashierCart.setName(product.getName());
|
||||
tbCashierCart.setProductId(String.valueOf(product.getId()));
|
||||
tbCashierCart.setSalePrice(productSku.getSalePrice());
|
||||
|
|
@ -451,7 +455,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
cashierCartRepository.save(tbCashierCart);
|
||||
}
|
||||
|
||||
setRedisTableCartInfo(addCartDTO.getTableId(), addCartDTO.getShopId().toString(), Collections.singletonList(tbCashierCart), true);
|
||||
if (StrUtil.isNotBlank(addCartDTO.getTableId())) {
|
||||
setRedisTableCartInfo(addCartDTO.getTableId(), addCartDTO.getShopId().toString(), Collections.singletonList(tbCashierCart), true);
|
||||
}
|
||||
|
||||
return tbCashierCart;
|
||||
}
|
||||
|
|
@ -483,16 +489,17 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
@Override
|
||||
public void removeCart(RemoveCartDTO removeCartDTO) {
|
||||
int currentPlaceNum = getCurrentPlaceNum(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString());
|
||||
int currentPlaceNum = getCurrentPlaceNum(removeCartDTO.getTableId() == null ? "" : removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString());
|
||||
// 会员点单
|
||||
TbCashierCart cashierCart = cashierCartMapper.selectOne(new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getShopId, removeCartDTO.getShopId())
|
||||
.eq(TbCashierCart::getUseType, removeCartDTO.getUseType())
|
||||
.eq(TbCashierCart::getId, removeCartDTO.getCartId()));
|
||||
if (cashierCart == null) {
|
||||
throw new BadRequestException("购物车商品不存在");
|
||||
}
|
||||
|
||||
if (cashierCart.getPlaceNum() != null && !cashierCart.getPlaceNum().equals(currentPlaceNum)) {
|
||||
if (removeCartDTO.getTableId() != null && cashierCart.getPlaceNum() != null && !cashierCart.getPlaceNum().equals(currentPlaceNum)) {
|
||||
throw new BadRequestException("已下单商品仅支持退单操作");
|
||||
}
|
||||
|
||||
|
|
@ -501,26 +508,28 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
.eq(TbOrderDetail::getShopId, cashierCart.getShopId())
|
||||
.eq(TbOrderDetail::getProductId, cashierCart.getProductId())
|
||||
.eq(TbOrderDetail::getProductSkuId, cashierCart.getSkuId())
|
||||
.eq(TbOrderDetail::getUseType, removeCartDTO.getUseType())
|
||||
.isNull(TbOrderDetail::getPlaceNum)
|
||||
.eq(TbOrderDetail::getOrderId, cashierCart.getOrderId()));
|
||||
}
|
||||
|
||||
cashierCartMapper.deleteById(cashierCart.getId());
|
||||
|
||||
// 清空购物车 出票
|
||||
long carCount = countCar(cashierCart.getTableId(), cashierCart.getShopId(), cashierCart.getMasterId());
|
||||
if (removeCartDTO.getTableId() != null) {
|
||||
// 清空购物车 出票
|
||||
long carCount = countCar(cashierCart.getTableId(), cashierCart.getShopId(), cashierCart.getMasterId());
|
||||
|
||||
log.info("购物车数量: {}", carCount);
|
||||
if (cashierCart.getOrderId() != null && carCount < 1) {
|
||||
rabbitMsgUtils.printTicket(String.valueOf(cashierCart.getOrderId()));
|
||||
log.info("购物车数量: {}", carCount);
|
||||
if (cashierCart.getOrderId() != null && carCount < 1) {
|
||||
rabbitMsgUtils.printTicket(String.valueOf(cashierCart.getOrderId()));
|
||||
}
|
||||
setRedisTableCartInfo(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString(), Collections.singletonList(cashierCart), false);
|
||||
}
|
||||
|
||||
setRedisTableCartInfo(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString(), Collections.singletonList(cashierCart), false);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void returnCart(RemoveCartDTO removeCartDTO) {
|
||||
public void returnCart(ReturnOrderDTO removeCartDTO) {
|
||||
rabbitMsgUtils.printDishesReturnTicket(4450, 9313);
|
||||
|
||||
int currentPlaceNum = getCurrentPlaceNum(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString());
|
||||
|
|
@ -562,13 +571,17 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
@Override
|
||||
public void clearCart(ClearCartDTO clearCartDTO) {
|
||||
String orderId = redisTemplate.opsForValue().get(RedisConstant.getCurrentOrderKey(clearCartDTO.getTableId().toString(), clearCartDTO.getShopId()));
|
||||
int currentPlaceNum = getCurrentPlaceNum(clearCartDTO.getTableId().toString(), clearCartDTO.getShopId());
|
||||
String orderId;
|
||||
if (clearCartDTO.getTableId() != null) {
|
||||
orderId = getCurrentOrderId(clearCartDTO.getTableId().toString(), clearCartDTO.getShopId());
|
||||
} else {
|
||||
orderId = "";
|
||||
}
|
||||
|
||||
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>()
|
||||
LambdaQueryWrapper<TbCashierCart> query = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getShopId, clearCartDTO.getShopId())
|
||||
.eq(TbCashierCart::getTableId, clearCartDTO.getTableId())
|
||||
.eq(TbCashierCart::getPlaceNum, currentPlaceNum)
|
||||
.isNull(TbCashierCart::getPlaceNum)
|
||||
.eq(TbCashierCart::getUseType, clearCartDTO.getUseType())
|
||||
.and(q -> {
|
||||
q.eq(TbCashierCart::getMasterId, clearCartDTO.getMasterId())
|
||||
.or()
|
||||
|
|
@ -580,20 +593,14 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
q.eq(TbCashierCart::getOrderId, orderId)
|
||||
.or()
|
||||
.isNull(TbCashierCart::getOrderId);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
if (clearCartDTO.getTableId() != null) {
|
||||
query.eq(TbCashierCart::getTableId, clearCartDTO.getTableId());
|
||||
|
||||
// tbShopTableRepository.deleteByTableIdAndShopId(clearCartDTO.getTableId(), clearCartDTO.getShopId());
|
||||
|
||||
if (StrUtil.isNotBlank(orderId)) {
|
||||
orderDetailMapper.delete(new LambdaQueryWrapper<TbOrderDetail>()
|
||||
.eq(TbOrderDetail::getShopId, clearCartDTO.getShopId())
|
||||
.eq(TbOrderDetail::getPlaceNum, currentPlaceNum)
|
||||
.eq(TbOrderDetail::getOrderId, orderId));
|
||||
rabbitMsgUtils.printTicket(orderId);
|
||||
}
|
||||
|
||||
cashierCartMapper.delete(query);
|
||||
}
|
||||
|
||||
private long countCar(Long tableId, String shopId, String masterId) {
|
||||
|
|
@ -606,11 +613,11 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
@Override
|
||||
public Map<String, Object> getCart(Long tableId, Integer page,
|
||||
Integer size, Integer shopId, Integer vipUserId, String masterId) {
|
||||
Integer size, Integer shopId, String masterId, String useType) {
|
||||
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getTableId, tableId)
|
||||
.in(TbCashierCart::getStatus, "create", "refund", "return")
|
||||
.eq(TbCashierCart::getShopId, shopId)
|
||||
.eq(TbCashierCart::getUseType, useType)
|
||||
.and(query2 -> {
|
||||
query2.or(query3 -> {
|
||||
query3.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
|
||||
|
|
@ -622,12 +629,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
}));
|
||||
});
|
||||
|
||||
// if (vipUserId != null) {
|
||||
// queryWrapper.eq(TbCashierCart::getUserId, vipUserId);
|
||||
// }else {
|
||||
// queryWrapper.eq(TbCashierCart::getMasterId, masterId);
|
||||
// queryWrapper.isNull(TbCashierCart::getUserId);
|
||||
// }
|
||||
if (tableId != null) {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, tableId);
|
||||
}
|
||||
|
||||
com.baomidou.mybatisplus.extension.plugins.pagination.Page<TbCashierCart> cartPage = cashierCartMapper
|
||||
.selectPage(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page, size), queryWrapper);
|
||||
|
|
@ -683,7 +687,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
@Override
|
||||
public void pack(PackCartDTO packCartDTO) {
|
||||
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getTableId, packCartDTO.getTableId())
|
||||
.eq(TbCashierCart::getShopId, packCartDTO.getShopId())
|
||||
.in(TbCashierCart::getStatus, "create", "refund")
|
||||
.and(query2 -> {
|
||||
|
|
@ -697,11 +700,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
}));
|
||||
});
|
||||
|
||||
// if (packCartDTO.getVipUserId() != null) {
|
||||
// queryWrapper.eq(TbCashierCart::getUserId, packCartDTO.getVipUserId());
|
||||
// } else {
|
||||
// queryWrapper.isNull(TbCashierCart::getUserId);
|
||||
// }
|
||||
if (StrUtil.isNotBlank(packCartDTO.getTableId())) {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, packCartDTO.getTableId());
|
||||
}
|
||||
|
||||
List<TbCashierCart> tbCashierCarts = cashierCartMapper.selectList(queryWrapper);
|
||||
tbCashierCarts.forEach(item -> {
|
||||
|
|
@ -925,7 +926,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
private final StringRedisTemplate redisTemplate;
|
||||
|
||||
@Override
|
||||
public JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId) {
|
||||
public JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId, String useType) {
|
||||
String account = tokenProvider.getSubject();
|
||||
if (account == null) {
|
||||
throw new BadRequestException("token解析失败");
|
||||
|
|
@ -934,7 +935,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
String day = DateUtils.getDay();
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
// 当前台桌码
|
||||
String key = "SHOP:CODE:USER:pc" + ":" + shopId + ":" + day + ":" + tableId;
|
||||
String key = "SHOP:CODE:USER:pc" + ":" + shopId + ":" + day + ":" + tableId + useType;
|
||||
String userCode = redisTemplate.opsForValue().get(key);
|
||||
|
||||
if (StringUtils.isEmpty(userCode) || "null".equals(userCode) || "#null".equals(userCode)) {
|
||||
|
|
@ -965,21 +966,24 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
@Override
|
||||
public TbOrderInfo createOrder(CreateOrderDTO createOrderDTO, boolean addMaterId, boolean isPrint) {
|
||||
return Utils.runFunAndCheckKey(() -> {
|
||||
TbShopTable tbShopTable = mpShopTableMapper.selectOne(new LambdaQueryWrapper<TbShopTable>()
|
||||
.eq(TbShopTable::getQrcode, createOrderDTO.getTableId())
|
||||
.in(TbShopTable::getStatus, "idle", "using"));
|
||||
TbShopTable tbShopTable = null;
|
||||
boolean tableFlag = StrUtil.isNotBlank(createOrderDTO.getTableId());
|
||||
if (tableFlag) {
|
||||
tbShopTable = mpShopTableMapper.selectOne(new LambdaQueryWrapper<TbShopTable>()
|
||||
.eq(TbShopTable::getQrcode, createOrderDTO.getTableId())
|
||||
.in(TbShopTable::getStatus, "idle", "using"));
|
||||
|
||||
if (tbShopTable == null) {
|
||||
throw new BadRequestException("台桌未开台或不存在");
|
||||
if (tbShopTable == null) {
|
||||
throw new BadRequestException("台桌未开台或不存在");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 传递orderId直接取否则取当前缓存id
|
||||
String currentOrderKey = RedisConstant.getCurrentOrderKey(createOrderDTO.getTableId(),
|
||||
createOrderDTO.getShopId().toString());
|
||||
String orderIdValue = redisTemplate.opsForValue().get(currentOrderKey);
|
||||
Integer orderId = orderIdValue == null ? null : Integer.parseInt(orderIdValue);
|
||||
orderId = createOrderDTO.getOrderId() != null ? createOrderDTO.getOrderId() : orderId;
|
||||
orderId = tableFlag ? createOrderDTO.getOrderId() != null ? createOrderDTO.getOrderId() : orderId : null;
|
||||
|
||||
// 查询订单
|
||||
TbOrderInfo orderInfo = null;
|
||||
|
|
@ -994,8 +998,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
String day = DateUtils.getDay();
|
||||
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getShopId, createOrderDTO.getShopId())
|
||||
.eq(TbCashierCart::getTableId, createOrderDTO.getTableId())
|
||||
.in(TbCashierCart::getStatus, "create", "refund")
|
||||
.in(TbCashierCart::getStatus, "create")
|
||||
.eq(TbCashierCart::getUseType, createOrderDTO.getUseType())
|
||||
.and(query2 -> {
|
||||
query2.or(query3 -> {
|
||||
query3.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
|
||||
|
|
@ -1007,6 +1011,10 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
}));
|
||||
});
|
||||
|
||||
if (StrUtil.isNotBlank(createOrderDTO.getTableId())) {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, createOrderDTO.getTableId());
|
||||
}
|
||||
|
||||
List<TbCashierCart> cashierCarts = cashierCartMapper
|
||||
.selectList(queryWrapper);
|
||||
if (cashierCarts.isEmpty()) {
|
||||
|
|
@ -1018,13 +1026,13 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
BigDecimal feeAmount = BigDecimal.ZERO;
|
||||
BigDecimal saleAmount = BigDecimal.ZERO;
|
||||
// 当前下单次数
|
||||
int placeNum = getCurrentPlaceNum(createOrderDTO.getTableId(), createOrderDTO.getShopId().toString());
|
||||
int placeNum = StrUtil.isNotBlank(createOrderDTO.getTableId()) ? getCurrentPlaceNum(createOrderDTO.getTableId(), createOrderDTO.getShopId().toString()) : 1;
|
||||
List<TbOrderDetail> orderDetails = new ArrayList<>();
|
||||
|
||||
Integer mealNum = null;
|
||||
|
||||
boolean unAdd = cashierCarts.stream().noneMatch(item -> item.getPlaceNum() == null);
|
||||
if (addMaterId && unAdd) {
|
||||
if (addMaterId && unAdd && !OrderUseTypeEnum.TAKEOUT.getValue().equals(createOrderDTO.getUseType())) {
|
||||
throw new BadRequestException("此次未添加新商品,清先添加商品");
|
||||
}
|
||||
for (TbCashierCart cashierCart : cashierCarts) {
|
||||
|
|
@ -1056,6 +1064,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
orderDetail.setShopId(Integer.valueOf(cashierCart.getShopId()));
|
||||
orderDetail.setPackAmount(cashierCart.getPackFee());
|
||||
orderDetail.setStatus("unpaid");
|
||||
orderDetail.setUseType(createOrderDTO.getUseType());
|
||||
orderDetail.setProductImg(cashierCart.getCoverImg());
|
||||
orderDetail.setCartId(cashierCart.getId());
|
||||
orderDetails.add(orderDetail);
|
||||
|
|
@ -1066,7 +1075,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
orderDetail.setPlaceNum(placeNum);
|
||||
}
|
||||
|
||||
if (mealNum == null) {
|
||||
if ((OrderUseTypeEnum.DINE_IN_BEFORE.getValue().equals(createOrderDTO.getUseType()) || OrderUseTypeEnum.DINE_IN_AFTER.getValue().equals(createOrderDTO.getUseType()))
|
||||
&& mealNum == null) {
|
||||
throw new BadRequestException("请选择用餐人数");
|
||||
}
|
||||
|
||||
|
|
@ -1087,7 +1097,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
orderInfo.setProductAmount(saleAmount);
|
||||
orderInfo.setTradeDay(DateUtils.getDay());
|
||||
orderInfo.setUseType(createOrderDTO.isPostPay() ? "postPay" : "afterPay");
|
||||
orderInfo.setUserId(createOrderDTO.getVipUserId() == null ? null : String.valueOf(createOrderDTO.getVipUserId()));
|
||||
orderInfo.setUseType(createOrderDTO.getUseType());
|
||||
orderInfo.setCreatedAt(DateUtil.current());
|
||||
if (!unAdd) {
|
||||
orderInfo.setPlaceNum(placeNum);
|
||||
|
|
@ -1115,10 +1125,10 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
orderInfo.setMasterId(createOrderDTO.getMasterId());
|
||||
orderInfo.setOutNumber(createOrderDTO.getMasterId());
|
||||
orderInfo.setRemark(createOrderDTO.getNote());
|
||||
orderInfo.setUserId(createOrderDTO.getVipUserId() == null ? null : String.valueOf(createOrderDTO.getVipUserId()));
|
||||
orderInfo.setCreatedAt(DateUtil.current());
|
||||
orderInfo.setTableName(tbShopTable.getName());
|
||||
orderInfo.setTableName(tbShopTable != null ? tbShopTable.getName() : null);
|
||||
orderInfo.setPlaceNum(placeNum);
|
||||
orderInfo.setUseType(createOrderDTO.getUseType());
|
||||
TbMerchantAccount merchantAccount = merchantAccountMapper.selectOne(new LambdaQueryWrapper<TbMerchantAccount>()
|
||||
.eq(TbMerchantAccount::getShopId, createOrderDTO.getShopId())
|
||||
.eq(TbMerchantAccount::getStatus, 1));
|
||||
|
|
@ -1128,7 +1138,10 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
orderInfo.setMerchantId(merchantAccount.getId().toString());
|
||||
orderInfoMapper.insert(orderInfo);
|
||||
|
||||
redisTemplate.opsForValue().set(currentOrderKey, orderInfo.getId().toString());
|
||||
// 台桌下单才保存订单信息
|
||||
if (tableFlag) {
|
||||
redisTemplate.opsForValue().set(currentOrderKey, orderInfo.getId().toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1166,8 +1179,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
// 后付费,不增加当前台桌取餐号
|
||||
if (createOrderDTO.isPostPay()) {
|
||||
addGlobalCode(day, "pc", String.valueOf(createOrderDTO.getShopId()));
|
||||
// String key = "SHOP:CODE:USER:pc" + ":" + createOrderDTO.getShopId() + ":" + day + ":" + orderInfo.getTableId();
|
||||
// redisTemplate.delete(key);
|
||||
}
|
||||
|
||||
if (!createOrderDTO.isPostPay() || (addMaterId && "pending".equals(orderInfo.getStatus()))) {
|
||||
|
|
@ -1225,6 +1236,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
}
|
||||
|
||||
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getUseType, pendingDTO.getUseType())
|
||||
.eq(TbCashierCart::getShopId, pendingDTO.getShopId());
|
||||
|
||||
if (!pendingDTO.getIsPending()) {
|
||||
|
|
@ -1234,9 +1246,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
queryWrapper.eq(TbCashierCart::getOrderId, pendingDTO.getOrderId());
|
||||
|
||||
} else {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, pendingDTO.getTableId())
|
||||
queryWrapper
|
||||
.eq(TbCashierCart::getStatus, "create")
|
||||
.eq(TbCashierCart::getTableId, pendingDTO.getTableId())
|
||||
.and(query2 -> {
|
||||
query2.or(query3 -> {
|
||||
query3.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
|
||||
|
|
@ -1247,12 +1258,11 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
.eq(TbCashierCart::getMasterId, "");
|
||||
}));
|
||||
});
|
||||
// if (pendingDTO.getVipUserId() != null) {
|
||||
// queryWrapper.eq(TbCashierCart::getUserId, pendingDTO.getVipUserId());
|
||||
// }else {
|
||||
// queryWrapper.eq(TbCashierCart::getMasterId, pendingDTO.getMasterId())
|
||||
// .isNull(TbCashierCart::getUserId);
|
||||
// }
|
||||
|
||||
if (StrUtil.isNotBlank(pendingDTO.getTableId())) {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, pendingDTO.getTableId());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
List<TbCashierCart> cashierCarts = cashierCartMapper
|
||||
|
|
@ -1273,22 +1283,22 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
createOrderDTO.setTableId(pendingDTO.getTableId());
|
||||
createOrderDTO.setShopId(pendingDTO.getShopId());
|
||||
createOrderDTO.setMasterId(pendingDTO.getMasterId());
|
||||
createOrderDTO.setVipUserId(pendingDTO.getVipUserId());
|
||||
createOrderDTO.setNote(pendingDTO.getNote());
|
||||
createOrderDTO.setUseType(pendingDTO.getUseType());
|
||||
orderId = createOrder(createOrderDTO, true, false).getId();
|
||||
|
||||
}
|
||||
|
||||
|
||||
TbOrderDetail orderDetail = new TbOrderDetail();
|
||||
orderDetail.setStatus(pendingDTO.getIsPending() ? "pending" : "cancelled");
|
||||
orderDetail.setStatus(pendingDTO.getIsPending() ? "pending" : "unpaid");
|
||||
orderDetailMapper.update(orderDetail, new LambdaUpdateWrapper<TbOrderDetail>()
|
||||
.eq(TbOrderDetail::getShopId, pendingDTO.getIsPending())
|
||||
.eq(TbOrderDetail::getShopId, pendingDTO.getShopId())
|
||||
.eq(TbOrderDetail::getOrderId, orderId));
|
||||
|
||||
TbOrderInfo orderInfo = new TbOrderInfo();
|
||||
orderInfo.setId(orderId);
|
||||
orderInfo.setStatus(pendingDTO.getIsPending() ? "pending" : "cancelled");
|
||||
orderInfo.setStatus(pendingDTO.getIsPending() ? "pending" : "unpaid");
|
||||
orderInfoMapper.updateById(orderInfo);
|
||||
|
||||
TbCashierCart cashierCart = new TbCashierCart();
|
||||
|
|
@ -1299,31 +1309,36 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
|
||||
// 后付款订单,修改台桌状态并打票
|
||||
if (pendingDTO.getIsPending()) {
|
||||
if (pendingDTO.getIsPending() && StrUtil.isNotBlank(pendingDTO.getTableId())) {
|
||||
mpShopTableMapper.update(null, new LambdaUpdateWrapper<TbShopTable>()
|
||||
.eq(TbShopTable::getQrcode, cashierCart.getTableId())
|
||||
.set(TbShopTable::getStatus, TableStateEnum.PENDING.getState()));
|
||||
}
|
||||
|
||||
redisTemplate.delete(RedisConstant.getCurrentOrderKey(pendingDTO.getTableId(), pendingDTO.getShopId().toString()));
|
||||
if (StrUtil.isNotBlank(pendingDTO.getTableId())) {
|
||||
redisTemplate.delete(RedisConstant.getCurrentOrderKey(pendingDTO.getTableId(), pendingDTO.getShopId().toString()));
|
||||
}
|
||||
|
||||
return orderInfoMapper.selectById(orderId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getCar(Integer shopId, String tableId) {
|
||||
public Object getCar(Integer shopId, String tableId, String useType) {
|
||||
ArrayList<Map<String, Object>> data = new ArrayList<>();
|
||||
|
||||
List<PendingCountVO> pendingCountVOS = cashierCartMapper.countPending(shopId, tableId, DateUtils.getDay());
|
||||
List<TbCashierCart> tbCashierCarts = cashierCartMapper.selectList(new LambdaQueryWrapper<TbCashierCart>()
|
||||
List<PendingCountVO> pendingCountVOS = cashierCartMapper.countPending(shopId, tableId, DateUtils.getDay(), useType);
|
||||
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
||||
.eq(TbCashierCart::getShopId, shopId)
|
||||
.eq(TbCashierCart::getTableId, tableId)
|
||||
.eq(TbCashierCart::getStatus, "refund"));
|
||||
.eq(TbCashierCart::getUseType, useType)
|
||||
.eq(TbCashierCart::getStatus, "refund");
|
||||
if (StrUtil.isNotBlank(tableId)) {
|
||||
queryWrapper.eq(TbCashierCart::getTableId, tableId);
|
||||
|
||||
}
|
||||
List<TbCashierCart> tbCashierCarts = cashierCartMapper.selectList(queryWrapper);
|
||||
|
||||
ArrayList<Integer> skuIds = new ArrayList<>();
|
||||
tbCashierCarts.forEach(item -> {
|
||||
skuIds.add(Integer.valueOf(item.getSkuId()));
|
||||
});
|
||||
tbCashierCarts.forEach(item -> skuIds.add(Integer.valueOf(item.getSkuId())));
|
||||
|
||||
List<TbProductSku> skuList = productSkuRepository.findAllById(skuIds);
|
||||
|
||||
|
|
@ -1530,7 +1545,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
|
||||
@Override
|
||||
public Object choseTable(ChoseTableDTO choseTableDTO) {
|
||||
String masterId = getMasterId(choseTableDTO.getShopId(), Long.valueOf(choseTableDTO.getNewTableId()), null).getString("masterId");
|
||||
String masterId = getMasterId(choseTableDTO.getShopId(), Long.valueOf(choseTableDTO.getNewTableId()), null, "").getString("masterId");
|
||||
String currentOrderId = choseTableDTO.getOrderId() == null ? getCurrentOrderId(choseTableDTO.getOldTableId(),
|
||||
choseTableDTO.getShopId().toString()) : choseTableDTO.getOrderId().toString();
|
||||
|
||||
|
|
@ -1598,6 +1613,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||
.eq(TbCashierCart::getMasterId, choseCountDTO.getMasterId())
|
||||
.eq(TbCashierCart::getProductId, "-999")
|
||||
.eq(TbCashierCart::getSkuId, "-999")
|
||||
.eq(TbCashierCart::getUseType, choseCountDTO.getUseType())
|
||||
.eq(TbCashierCart::getTradeDay, cn.ysk.cashier.utils.DateUtils.getDay())
|
||||
.eq(TbCashierCart::getTableId, choseCountDTO.getTableId());
|
||||
TbCashierCart tbCashierCart = cashierCartMapper.selectOne(query);
|
||||
|
|
|
|||
|
|
@ -100,11 +100,11 @@ public interface TbShopTableService {
|
|||
|
||||
void removeCart(RemoveCartDTO removeCartDTO);
|
||||
|
||||
void returnCart(RemoveCartDTO removeCartDTO);
|
||||
void returnCart(ReturnOrderDTO removeCartDTO);
|
||||
|
||||
void clearCart(ClearCartDTO clearCartDTO);
|
||||
|
||||
Map<String, Object> getCart(Long tableId, Integer page, Integer size, Integer shopId, Integer vipUserId, String masterId);
|
||||
Map<String, Object> getCart(Long tableId, Integer page, Integer size, Integer shopId, String masterId, String useType);
|
||||
|
||||
TbCashierCart updateCart(UpdateCartDTO updateCartDTO);
|
||||
|
||||
|
|
@ -112,11 +112,11 @@ public interface TbShopTableService {
|
|||
|
||||
Object createOrder(CreateOrderDTO createOrderDTO, boolean addMasterId, boolean isPrint);
|
||||
|
||||
JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId);
|
||||
JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId, String useType);
|
||||
|
||||
Object pending(PendingDTO pendingDTO);
|
||||
|
||||
Object getCar(Integer shopId, String tableId);
|
||||
Object getCar(Integer shopId, String tableId, String useType);
|
||||
|
||||
Object getPayType(Integer shopId);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="cn.ysk.cashier.mybatis.mapper.TbCashierCartMapper">
|
||||
<select id="countPending" resultType="cn.ysk.cashier.vo.PendingCountVO">
|
||||
select
|
||||
a.id orderId,b.pending_at pendingAt, sum(b.total_amount) totalAmount,
|
||||
count(b.id) totalCount, sum(b.total_number) totalNumber, a.remark
|
||||
from tb_order_info a
|
||||
JOIN tb_cashier_cart b on a.id=b.order_id
|
||||
where a.shop_id=#{shopId} and a.`status`='pending'
|
||||
and a.trade_day=#{day} and a.use_type=#{useType}
|
||||
<if test="tableId != null and tableId != ''">
|
||||
and a.table_id=#{tableId}
|
||||
</if>
|
||||
GROUP BY a.id ORDER BY a.id desc
|
||||
|
||||
</select>
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue