超市订单、早中午订单统计
This commit is contained in:
@ -102,6 +102,8 @@ public interface ErrorCodeConstants {
|
|||||||
|
|
||||||
ErrorCode STORE_GOODS_NOT_EXISTS = new ErrorCode(1_007_904_001, "商品不存在");
|
ErrorCode STORE_GOODS_NOT_EXISTS = new ErrorCode(1_007_904_001, "商品不存在");
|
||||||
|
|
||||||
|
ErrorCode STORE_GOODS_IS_SALE = new ErrorCode(1_007_904_001, "售卖商品不允许删除");
|
||||||
|
|
||||||
ErrorCode STORE_GOODS_TYPE_NOT_EXISTS = new ErrorCode(1_007_904_002,"商品类别不存在");
|
ErrorCode STORE_GOODS_TYPE_NOT_EXISTS = new ErrorCode(1_007_904_002,"商品类别不存在");
|
||||||
|
|
||||||
ErrorCode STORE_SALE_GOODS_NOT_EXISTS = new ErrorCode(1_007_904_003, "售卖商品不存在");
|
ErrorCode STORE_SALE_GOODS_NOT_EXISTS = new ErrorCode(1_007_904_003, "售卖商品不存在");
|
||||||
|
@ -79,6 +79,14 @@ public class StoreGoodsController {
|
|||||||
return success(BeanUtils.toBean(pageResult, StoreGoodsRespVO.class));
|
return success(BeanUtils.toBean(pageResult, StoreGoodsRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/salePage")
|
||||||
|
@Operation(summary = "获得商品分页")
|
||||||
|
public CommonResult<PageResult<StoreGoodsRespVO>> getSaleGoodsPage(@Valid StoreGoodsPageReqVO pageReqVO) {
|
||||||
|
PageResult<StoreGoodsDO> pageResult = storeGoodsService.getSaleGoodsPage(pageReqVO);
|
||||||
|
return success(BeanUtils.toBean(pageResult, StoreGoodsRespVO.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出商品 Excel")
|
@Operation(summary = "导出商品 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('member:store-goods:export')")
|
@PreAuthorize("@ss.hasPermission('member:store-goods:export')")
|
||||||
|
@ -34,4 +34,6 @@ public class StoreGoodsPageReqVO extends PageParam {
|
|||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] createTime;
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
|
private List<Integer> ids;
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.member.controller.admin.storeorder;
|
package cn.iocoder.yudao.module.member.controller.admin.storeorder;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||||
|
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
||||||
|
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||||
|
import cn.iocoder.yudao.module.system.api.cashregisterinfo.CashregisterinfoApi;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -37,6 +42,10 @@ public class StoreOrderController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private StoreOrderService storeOrderService;
|
private StoreOrderService storeOrderService;
|
||||||
|
@Resource
|
||||||
|
private MemberUserService userService;
|
||||||
|
@Resource
|
||||||
|
private CashregisterinfoApi cashregisterinfoApi;
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@Operation(summary = "创建商品订单")
|
@Operation(summary = "创建商品订单")
|
||||||
@ -66,17 +75,24 @@ public class StoreOrderController {
|
|||||||
@Operation(summary = "获得商品订单")
|
@Operation(summary = "获得商品订单")
|
||||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
@PreAuthorize("@ss.hasPermission('member:store-order:query')")
|
@PreAuthorize("@ss.hasPermission('member:store-order:query')")
|
||||||
public CommonResult<StoreOrderRespVO> getStoreOrder(@RequestParam("id") Integer id) {
|
public CommonResult<StoreOrderDetailVO> getStoreOrder(@RequestParam("id") Integer id) {
|
||||||
StoreOrderDO storeOrder = storeOrderService.getStoreOrder(id);
|
StoreOrderDO storeOrder = storeOrderService.getStoreOrder(id);
|
||||||
return success(BeanUtils.toBean(storeOrder, StoreOrderRespVO.class));
|
StoreOrderDetailVO storeOrderDetailVO = new StoreOrderDetailVO();
|
||||||
|
BeanUtil.copyProperties(storeOrder, storeOrderDetailVO);
|
||||||
|
MemberUserDO user = userService.getUser(storeOrder.getUserId());
|
||||||
|
storeOrderDetailVO.setNickName(user.getNickname());
|
||||||
|
storeOrderDetailVO.setMobile(user.getMobile());
|
||||||
|
String storeName = cashregisterinfoApi.getStoreName(storeOrder.getEquipmentCode());
|
||||||
|
storeOrderDetailVO.setStoresName(storeName);
|
||||||
|
return success(storeOrderDetailVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得商品订单分页")
|
@Operation(summary = "获得商品订单分页")
|
||||||
@PreAuthorize("@ss.hasPermission('member:store-order:query')")
|
@PreAuthorize("@ss.hasPermission('member:store-order:query')")
|
||||||
public CommonResult<PageResult<StoreOrderRespVO>> getStoreOrderPage(@Valid StoreOrderPageReqVO pageReqVO) {
|
public CommonResult<PageResult<StoreOrderPageVO>> getStoreOrderPage(@Valid StoreOrderPageVO pageReqVO) {
|
||||||
PageResult<StoreOrderDO> pageResult = storeOrderService.getStoreOrderPage(pageReqVO);
|
PageResult<StoreOrderPageVO> storeOrderPageNew = storeOrderService.getStoreOrderPageNew(pageReqVO);
|
||||||
return success(BeanUtils.toBean(pageResult, StoreOrderRespVO.class));
|
return success(storeOrderPageNew);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
package cn.iocoder.yudao.module.member.controller.admin.storeorder.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderDetailVo;
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 商品订单 Response VO")
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
public class StoreOrderDetailVO {
|
||||||
|
|
||||||
|
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22788")
|
||||||
|
@ExcelProperty("编号")
|
||||||
|
private Integer orderId;
|
||||||
|
|
||||||
|
@Schema(description = "设备ID")
|
||||||
|
private String equipmentCode;
|
||||||
|
|
||||||
|
@Schema(description = "总价钱", example = "1722")
|
||||||
|
private Double totalPrice;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@Schema(description = "用户ID")
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
@Schema(description = "减免金额")
|
||||||
|
private Double reductionPrice;
|
||||||
|
|
||||||
|
@Schema(description = "用户", example = "1722")
|
||||||
|
private String nickName;
|
||||||
|
@Schema(description = "手机", example = "1722")
|
||||||
|
private String mobile;
|
||||||
|
@Schema(description = "门店", example = "1722")
|
||||||
|
private String storesName;
|
||||||
|
|
||||||
|
|
||||||
|
@Schema(description = "订单详情")
|
||||||
|
private List<AppStoreOrderDetailVo> detailDOS;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package cn.iocoder.yudao.module.member.controller.admin.storeorder.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 商品订单分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class StoreOrderPageVO extends PageParam {
|
||||||
|
|
||||||
|
|
||||||
|
@Schema(description = "总价钱", example = "1722")
|
||||||
|
private Double totalPrice;
|
||||||
|
@Schema(description = "订单ID", example = "1722")
|
||||||
|
private Integer orderId;
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
@Schema(description = "用户", example = "1722")
|
||||||
|
private String nickName;
|
||||||
|
@Schema(description = "手机", example = "1722")
|
||||||
|
private String mobile;
|
||||||
|
@Schema(description = "门店", example = "1722")
|
||||||
|
private String storesName;
|
||||||
|
|
||||||
|
@Schema(description = "减免金额")
|
||||||
|
private Double reductionPrice;
|
||||||
|
|
||||||
|
@Schema(description = "时间段", example = "1722")
|
||||||
|
private String timePeriod;
|
||||||
|
|
||||||
|
}
|
@ -51,6 +51,9 @@ public class StoreOrderRespVO {
|
|||||||
@ExcelProperty("用户")
|
@ExcelProperty("用户")
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
|
@Schema(description = "门店", example = "1722")
|
||||||
|
private String storesName;
|
||||||
|
|
||||||
@Schema(description = "订单详情")
|
@Schema(description = "订单详情")
|
||||||
private List<AppStoreOrderDetailVo> detailDOS;
|
private List<AppStoreOrderDetailVo> detailDOS;
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO;
|
|||||||
import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO;
|
||||||
import cn.iocoder.yudao.module.member.service.storeorder.StoreOrderService;
|
import cn.iocoder.yudao.module.member.service.storeorder.StoreOrderService;
|
||||||
import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService;
|
import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService;
|
||||||
|
import cn.iocoder.yudao.module.system.api.cashregisterinfo.CashregisterinfoApi;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
@ -41,7 +42,8 @@ public class AppStoreOrderController {
|
|||||||
private StoreOrderService storeOrderService;
|
private StoreOrderService storeOrderService;
|
||||||
@Resource
|
@Resource
|
||||||
private StoreOrderDetailService orderDetailService;
|
private StoreOrderDetailService orderDetailService;
|
||||||
|
@Resource
|
||||||
|
private CashregisterinfoApi cashregisterinfoApi;
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得商品订单分页")
|
@Operation(summary = "获得商品订单分页")
|
||||||
@ -52,6 +54,7 @@ public class AppStoreOrderController {
|
|||||||
for (StoreOrderRespVO vo: bean.getList()) {
|
for (StoreOrderRespVO vo: bean.getList()) {
|
||||||
List<AppStoreOrderDetailVo> listByOrderNo = orderDetailService.getListByOrderNo(vo.getOrderId());
|
List<AppStoreOrderDetailVo> listByOrderNo = orderDetailService.getListByOrderNo(vo.getOrderId());
|
||||||
vo.setDetailDOS(listByOrderNo);
|
vo.setDetailDOS(listByOrderNo);
|
||||||
|
vo.setStoresName(cashregisterinfoApi.getStoreName(vo.getEquipmentCode()));
|
||||||
}
|
}
|
||||||
return success(bean);
|
return success(bean);
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,9 @@ import lombok.Data;
|
|||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class AppStoreOrderDetailVo {
|
public class AppStoreOrderDetailVo {
|
||||||
private Double custom_price;
|
private Double customPrice;
|
||||||
private Integer number;
|
private Integer number;
|
||||||
private Double weight;
|
private Double weight;
|
||||||
private String goods_name;
|
private String goodsName;
|
||||||
private String img;
|
private String img;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.member.dal.dataobject.business;
|
package cn.iocoder.yudao.module.member.dal.dataobject.business;
|
||||||
|
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
@ -12,6 +13,7 @@ import java.math.BigDecimal;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
|
|
||||||
@ -58,7 +60,7 @@ public class BusinessDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 提现
|
* 提现
|
||||||
*/
|
*/
|
||||||
private BigDecimal withdrawal;
|
private BigDecimal withdrawal;
|
||||||
/**
|
/**
|
||||||
* 补贴钱包
|
* 补贴钱包
|
||||||
*/
|
*/
|
||||||
@ -86,9 +88,15 @@ public class BusinessDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 门店编号
|
* 门店编号
|
||||||
*/
|
*/
|
||||||
private Long carteenId;
|
private Long carteenId;
|
||||||
|
|
||||||
|
|
||||||
private BigDecimal reduce;
|
private BigDecimal reduce;
|
||||||
|
|
||||||
|
private Integer breakfastNum;
|
||||||
|
|
||||||
|
private Integer lunchNum;
|
||||||
|
|
||||||
|
private Integer dinnerNum;
|
||||||
|
|
||||||
}
|
}
|
@ -54,4 +54,9 @@ public class StoreOrderDO extends BaseDO {
|
|||||||
|
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 减免金额
|
||||||
|
*/
|
||||||
|
private Double reductionPrice;
|
||||||
|
|
||||||
}
|
}
|
@ -25,6 +25,7 @@ public interface StoreGoodsMapper extends BaseMapperX<StoreGoodsDO> {
|
|||||||
.eqIfPresent(StoreGoodsDO::getSalesModel, reqVO.getSalesModel())
|
.eqIfPresent(StoreGoodsDO::getSalesModel, reqVO.getSalesModel())
|
||||||
.eqIfPresent(StoreGoodsDO::getEquipmentCode, reqVO.getEquipmentCode())
|
.eqIfPresent(StoreGoodsDO::getEquipmentCode, reqVO.getEquipmentCode())
|
||||||
.betweenIfPresent(StoreGoodsDO::getCreateTime, reqVO.getCreateTime())
|
.betweenIfPresent(StoreGoodsDO::getCreateTime, reqVO.getCreateTime())
|
||||||
|
.inIfPresent(StoreGoodsDO::getGoodsId, reqVO.getIds())
|
||||||
.orderByDesc(StoreGoodsDO::getCategoryId));
|
.orderByDesc(StoreGoodsDO::getCategoryId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,8 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.*;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.*;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品订单 Mapper
|
* 商品订单 Mapper
|
||||||
@ -30,4 +32,6 @@ public interface StoreOrderMapper extends BaseMapperX<StoreOrderDO> {
|
|||||||
.orderByDesc(StoreOrderDO::getOrderId));
|
.orderByDesc(StoreOrderDO::getOrderId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IPage<StoreOrderPageVO> getStoreOrderPageNew(IPage<StoreOrderPageVO> page, @Param("vo") StoreOrderPageVO vo);
|
||||||
|
|
||||||
}
|
}
|
@ -107,10 +107,14 @@ public class BusinessServiceImpl implements BusinessService {
|
|||||||
@Override
|
@Override
|
||||||
public void updateStatistics(StatisticsVo vo) {
|
public void updateStatistics(StatisticsVo vo) {
|
||||||
synchronized(getStoreLock(vo.getCarteenId())){
|
synchronized(getStoreLock(vo.getCarteenId())){
|
||||||
|
LocalDate now = LocalDate.now();
|
||||||
|
if(vo.getTime()!=null){
|
||||||
|
now = vo.getTime().toLocalDate();
|
||||||
|
}
|
||||||
// 获取今天的开始时间
|
// 获取今天的开始时间
|
||||||
LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
|
LocalDateTime startOfDay =now.atStartOfDay();
|
||||||
// 获取今天的结束时间 (23:59:59.999)
|
// 获取今天的结束时间 (23:59:59.999)
|
||||||
LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
|
LocalDateTime endOfDay = LocalDateTime.of(now, LocalTime.MAX);
|
||||||
|
|
||||||
List<BusinessDO> businessDOS = businessMapper.selectList(Wrappers.<BusinessDO>lambdaQuery()
|
List<BusinessDO> businessDOS = businessMapper.selectList(Wrappers.<BusinessDO>lambdaQuery()
|
||||||
.between(BusinessDO::getCreateTime, startOfDay, endOfDay)
|
.between(BusinessDO::getCreateTime, startOfDay, endOfDay)
|
||||||
@ -150,10 +154,13 @@ public class BusinessServiceImpl implements BusinessService {
|
|||||||
|
|
||||||
if(timePeriod.equals(CostTypeEnum.MORNING.getCode())){
|
if(timePeriod.equals(CostTypeEnum.MORNING.getCode())){
|
||||||
businessDO.setBreakfast(businessDO.getBreakfast().add(vo.getTotalMoney()));
|
businessDO.setBreakfast(businessDO.getBreakfast().add(vo.getTotalMoney()));
|
||||||
|
businessDO.setBreakfastNum(businessDO.getBreakfastNum() + vo.getOrder_sum());
|
||||||
}else if (timePeriod.equals(CostTypeEnum.NOON.getCode())){
|
}else if (timePeriod.equals(CostTypeEnum.NOON.getCode())){
|
||||||
businessDO.setLunch(businessDO.getLunch().add(vo.getTotalMoney()));
|
businessDO.setLunch(businessDO.getLunch().add(vo.getTotalMoney()));
|
||||||
|
businessDO.setLunchNum(businessDO.getLunchNum() + vo.getOrder_sum());
|
||||||
}else if (timePeriod.equals(CostTypeEnum.NIGHT.getCode())){
|
}else if (timePeriod.equals(CostTypeEnum.NIGHT.getCode())){
|
||||||
businessDO.setDinner(businessDO.getDinner().add(vo.getTotalMoney()));
|
businessDO.setDinner(businessDO.getDinner().add(vo.getTotalMoney()));
|
||||||
|
businessDO.setDinnerNum(businessDO.getDinnerNum() + vo.getOrder_sum());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,4 +55,6 @@ public interface StoreGoodsService {
|
|||||||
|
|
||||||
List<StoreGoodsDO> getAll(List<Integer> goodsIds);
|
List<StoreGoodsDO> getAll(List<Integer> goodsIds);
|
||||||
|
|
||||||
|
PageResult<StoreGoodsDO> getSaleGoodsPage(StoreGoodsPageReqVO pageReqVO);
|
||||||
|
|
||||||
}
|
}
|
@ -6,15 +6,20 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoods.vo.StoreGoodsPageReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storegoods.vo.StoreGoodsPageReqVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoods.vo.StoreGoodsSaveReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storegoods.vo.StoreGoodsSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.storegoods.StoreGoodsDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.storegoods.StoreGoodsDO;
|
||||||
|
import cn.iocoder.yudao.module.member.dal.dataobject.storesalegoods.StoreSaleGoodsDO;
|
||||||
import cn.iocoder.yudao.module.member.dal.mysql.storegoods.StoreGoodsMapper;
|
import cn.iocoder.yudao.module.member.dal.mysql.storegoods.StoreGoodsMapper;
|
||||||
|
import cn.iocoder.yudao.module.member.dal.mysql.storesalegoods.StoreSaleGoodsMapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_IS_SALE;
|
||||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,6 +33,8 @@ public class StoreGoodsServiceImpl implements StoreGoodsService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private StoreGoodsMapper storeGoodsMapper;
|
private StoreGoodsMapper storeGoodsMapper;
|
||||||
|
@Resource
|
||||||
|
private StoreSaleGoodsMapper storeSaleGoodsMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Integer createStoreGoods(StoreGoodsSaveReqVO createReqVO) {
|
public Integer createStoreGoods(StoreGoodsSaveReqVO createReqVO) {
|
||||||
@ -51,6 +58,11 @@ public class StoreGoodsServiceImpl implements StoreGoodsService {
|
|||||||
public void deleteStoreGoods(Integer id) {
|
public void deleteStoreGoods(Integer id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateStoreGoodsExists(id);
|
validateStoreGoodsExists(id);
|
||||||
|
// 校验是否售卖商品
|
||||||
|
List<StoreSaleGoodsDO> storeSaleGoodsDOS = storeSaleGoodsMapper.selectList(Wrappers.<StoreSaleGoodsDO>lambdaQuery().eq(StoreSaleGoodsDO::getGoodsId, id));
|
||||||
|
if(CollectionUtil.isNotEmpty(storeSaleGoodsDOS)){
|
||||||
|
throw exception(STORE_GOODS_IS_SALE);
|
||||||
|
}
|
||||||
// 删除
|
// 删除
|
||||||
storeGoodsMapper.deleteById(id);
|
storeGoodsMapper.deleteById(id);
|
||||||
}
|
}
|
||||||
@ -80,4 +92,17 @@ public class StoreGoodsServiceImpl implements StoreGoodsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<StoreGoodsDO> getSaleGoodsPage(StoreGoodsPageReqVO pageReqVO) {
|
||||||
|
PageResult<StoreGoodsDO> storeGoodsDOPageResult = null;
|
||||||
|
|
||||||
|
List<StoreSaleGoodsDO> storeSaleGoodsDOS = storeSaleGoodsMapper.selectList();
|
||||||
|
if(CollectionUtil.isNotEmpty(storeSaleGoodsDOS)){
|
||||||
|
List<Integer> ids = storeSaleGoodsDOS.stream().map(StoreSaleGoodsDO::getGoodsId).collect(Collectors.toList());
|
||||||
|
pageReqVO.setIds(ids);
|
||||||
|
storeGoodsDOPageResult = storeGoodsMapper.selectPage(pageReqVO);
|
||||||
|
}
|
||||||
|
return storeGoodsDOPageResult;
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.service.storeorder;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto;
|
import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderDto;
|
import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderDto;
|
||||||
@ -65,4 +66,6 @@ public interface StoreOrderService {
|
|||||||
String codePay(StoreOrderDto dto);
|
String codePay(StoreOrderDto dto);
|
||||||
|
|
||||||
void batchCacheOrder(StoreOrderUploadDto dto);
|
void batchCacheOrder(StoreOrderUploadDto dto);
|
||||||
|
|
||||||
|
PageResult<StoreOrderPageVO> getStoreOrderPageNew(StoreOrderPageVO pageReqVO);
|
||||||
}
|
}
|
@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto;
|
import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreGoodsDto;
|
import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreGoodsDto;
|
||||||
@ -19,10 +20,13 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrder
|
|||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||||
import cn.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper;
|
import cn.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper;
|
||||||
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
|
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.member.enums.TimePeriodEnum;
|
||||||
import cn.iocoder.yudao.module.member.service.amount.DeductionService;
|
import cn.iocoder.yudao.module.member.service.amount.DeductionService;
|
||||||
import cn.iocoder.yudao.module.member.service.card.CardService;
|
import cn.iocoder.yudao.module.member.service.card.CardService;
|
||||||
import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService;
|
import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService;
|
||||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@ -65,7 +69,6 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
private DeductionService deductionService;
|
private DeductionService deductionService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private StringRedisTemplate storeOrderRedisTemplate;
|
private StringRedisTemplate storeOrderRedisTemplate;
|
||||||
|
|
||||||
@ -144,7 +147,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
BigDecimal compute = compute(total, userDO.getId());
|
BigDecimal compute = compute(total, userDO.getId());
|
||||||
UserInfoVo userInfoVo = new UserInfoVo();
|
UserInfoVo userInfoVo = new UserInfoVo();
|
||||||
userInfoVo.setUserName(userDO.getNickname());
|
userInfoVo.setUserName(userDO.getNickname());
|
||||||
userInfoVo.setAvatar("https://yclhit.com:8896"+userDO.getAvatar());
|
userInfoVo.setAvatar("https://yclhit.com:8896" + userDO.getAvatar());
|
||||||
userInfoVo.setBalance(compute.doubleValue());
|
userInfoVo.setBalance(compute.doubleValue());
|
||||||
return userInfoVo;
|
return userInfoVo;
|
||||||
}
|
}
|
||||||
@ -154,7 +157,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
public String cardPay(StoreOrderDto dto) {
|
public String cardPay(StoreOrderDto dto) {
|
||||||
|
|
||||||
MemberUserDO userDO = userService.getByCardId(dto.getCardNumber());
|
MemberUserDO userDO = userService.getByCardId(dto.getCardNumber());
|
||||||
if (ObjectUtil.isEmpty(userDO)){
|
if (ObjectUtil.isEmpty(userDO)) {
|
||||||
return "该卡未绑定用户";
|
return "该卡未绑定用户";
|
||||||
}
|
}
|
||||||
dto.setUserId(userDO.getId());
|
dto.setUserId(userDO.getId());
|
||||||
@ -191,9 +194,9 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void batchCacheOrder(StoreOrderUploadDto dto) {
|
public void batchCacheOrder(StoreOrderUploadDto dto) {
|
||||||
for (StoreLocalOrderDto orderDto :dto.getMgcrCacheOrderVoList()){
|
for (StoreLocalOrderDto orderDto : dto.getMgcrCacheOrderVoList()) {
|
||||||
StoreOrderDO storeOrderDO = new StoreOrderDO();
|
StoreOrderDO storeOrderDO = new StoreOrderDO();
|
||||||
BeanUtil.copyProperties(orderDto, storeOrderDO,"createTime");
|
BeanUtil.copyProperties(orderDto, storeOrderDO, "createTime");
|
||||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
storeOrderDO.setCreateTime(LocalDateTime.parse(orderDto.getCreateTime(), formatter));
|
storeOrderDO.setCreateTime(LocalDateTime.parse(orderDto.getCreateTime(), formatter));
|
||||||
|
|
||||||
@ -216,10 +219,21 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal compute(BigDecimal total, Long userId) {
|
public BigDecimal compute(BigDecimal total, Long userId) {
|
||||||
return deductionService.storeDeduction(total, userId);
|
return deductionService.storeDeduction(total, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void test(){
|
@Override
|
||||||
|
public PageResult<StoreOrderPageVO> getStoreOrderPageNew(StoreOrderPageVO pageReqVO) {
|
||||||
|
Page<StoreOrderPageVO> page = Page.of(pageReqVO.getPageNo(), pageReqVO.getPageSize());
|
||||||
|
IPage<StoreOrderPageVO> pageNew = storeOrderMapper.getStoreOrderPageNew(page, pageReqVO);
|
||||||
|
List<StoreOrderPageVO> records = pageNew.getRecords();
|
||||||
|
// for (StoreOrderPageVO record : records) {
|
||||||
|
// record.setTimePeriod(TimePeriodEnum.getTimeName(record.getCreateTime()));
|
||||||
|
// }
|
||||||
|
return new PageResult<>(records, pageNew.getTotal());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void test() {
|
||||||
//计算金额
|
//计算金额
|
||||||
//if (total.compareTo(wxAmount) <= 0) {
|
//if (total.compareTo(wxAmount) <= 0) {
|
||||||
// cardDO.setWxAmount(wxAmount.subtract(total).setScale(2, BigDecimal.ROUND_HALF_UP));
|
// cardDO.setWxAmount(wxAmount.subtract(total).setScale(2, BigDecimal.ROUND_HALF_UP));
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
<?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.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||||
|
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||||
|
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||||
|
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<select id="getStoreOrderPageNew"
|
||||||
|
resultType="cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO">
|
||||||
|
select so.order_id,so.total_price,so.create_time,mu.nickname,mu.mobile,tc.stores_name,so.reduction_price
|
||||||
|
from member_store_order so
|
||||||
|
left join member_user mu on so.user_id = mu.id
|
||||||
|
left join t_cash_register_info tr on tr.equipment_code = so.equipment_code
|
||||||
|
left join t_carteen tc on tr.carteen_id = tc.id
|
||||||
|
<where>
|
||||||
|
so.deleted = false
|
||||||
|
<if test="vo.orderId != null">
|
||||||
|
and so.order_id = #{vo.orderId}
|
||||||
|
</if>
|
||||||
|
<if test="vo.nickName != null and vo.nickName != ''">
|
||||||
|
and mu.nickname like concat('%',#{vo.nickName},'%')
|
||||||
|
</if>
|
||||||
|
<if test="vo.mobile != null and vo.mobile != ''">
|
||||||
|
and mu.mobile like concat('%',#{mobile},'%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
@ -0,0 +1,9 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.api.cashregisterinfo;
|
||||||
|
|
||||||
|
public interface CashregisterinfoApi {
|
||||||
|
|
||||||
|
String getStoreName(String equipmentCode);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.api.cashregisterinfo;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.dataobject.cashregisterinfo.CashRegisterInfoDO;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.mysql.carteen.CarteenMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.mysql.cashregisterinfo.CashRegisterInfoMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.mysql.dishes.DishesMapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class CashregisterinfoApiImpl implements CashregisterinfoApi{
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CarteenMapper carteenMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CashRegisterInfoMapper cashRegisterInfoMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStoreName(String equipmentCode) {
|
||||||
|
List<CashRegisterInfoDO> cashRegisterInfoDOS = cashRegisterInfoMapper.selectList(Wrappers.<CashRegisterInfoDO>lambdaQuery().eq(CashRegisterInfoDO::getEquipmentCode, equipmentCode));
|
||||||
|
if(CollectionUtil.isNotEmpty(cashRegisterInfoDOS)){
|
||||||
|
CashRegisterInfoDO cashRegisterInfoDO = cashRegisterInfoDOS.get(0);
|
||||||
|
return carteenMapper.selectById(cashRegisterInfoDO.getCarteenId()).getStoresName();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
@ -40,8 +40,8 @@ public class AppDishImageController {
|
|||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@Operation(summary = "获得本周菜单")
|
@Operation(summary = "获得本周菜单")
|
||||||
public CommonResult<DishImageRespVO> getThisWeekDishImage(Long carteenId) {
|
public CommonResult<DishImageRespVO> getThisWeekDishImage(Long carteenId,String time) {
|
||||||
DishImageDO dishImage = dishImageService.getThisWeekDishImage(carteenId);
|
DishImageDO dishImage = dishImageService.getThisWeekDishImage(carteenId,time);
|
||||||
return success(BeanUtils.toBean(dishImage, DishImageRespVO.class));
|
return success(BeanUtils.toBean(dishImage, DishImageRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public interface DishImageService {
|
|||||||
/**
|
/**
|
||||||
* 获得本周菜单
|
* 获得本周菜单
|
||||||
*/
|
*/
|
||||||
DishImageDO getThisWeekDishImage(Long carteenId);
|
DishImageDO getThisWeekDishImage(Long carteenId,String time);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.system.service.dishimage;
|
package cn.iocoder.yudao.module.system.service.dishimage;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dishimage.vo.DishImagePageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dishimage.vo.DishImagePageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dishimage.vo.DishImageSaveReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dishimage.vo.DishImageSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.dishimage.DishImageDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.dishimage.DishImageDO;
|
||||||
@ -81,10 +82,12 @@ public class DishImageServiceImpl implements DishImageService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DishImageDO getThisWeekDishImage(Long carteenId) {
|
public DishImageDO getThisWeekDishImage(Long carteenId,String time) {
|
||||||
// 获取今天的日期
|
// 获取今天的日期
|
||||||
LocalDate today = LocalDate.now();
|
LocalDate today = LocalDate.now();
|
||||||
|
if(StrUtil.isNotBlank(time)){
|
||||||
|
today= LocalDate.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
}
|
||||||
// 获取本周的开始日期(周一)
|
// 获取本周的开始日期(周一)
|
||||||
LocalDate weekStart = today.with(DayOfWeek.MONDAY);
|
LocalDate weekStart = today.with(DayOfWeek.MONDAY);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user