1、增加配送师傅订单派送发送消息通知功能
2、增加普通商品配完成送结算步梯费用给到配送师傅业务功能 3、增加分销商查询个人资金流水功能
This commit is contained in:
@@ -22,6 +22,7 @@ public enum ShopDealerCapitalUpdateEnum {
|
|||||||
FREEZE_MONEY_THAW(50, "佣金解冻", true),
|
FREEZE_MONEY_THAW(50, "佣金解冻", true),
|
||||||
DELIVERY_REWARD(60, "配送奖励", true),
|
DELIVERY_REWARD(60, "配送奖励", true),
|
||||||
DELIVERY_INCOME(61, "配送提成", true),
|
DELIVERY_INCOME(61, "配送提成", true),
|
||||||
|
DELIVERY_FLOOR_FEE(62, "配送步梯费", true),
|
||||||
ORDER_REFUND(70, "佣金退回(退单)", false),
|
ORDER_REFUND(70, "佣金退回(退单)", false),
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import com.gxwebsoft.common.core.web.PageResult;
|
|||||||
import com.gxwebsoft.common.system.entity.User;
|
import com.gxwebsoft.common.system.entity.User;
|
||||||
import com.gxwebsoft.common.system.mapper.UserMapper;
|
import com.gxwebsoft.common.system.mapper.UserMapper;
|
||||||
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
|
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
|
||||||
|
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
|
||||||
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
||||||
import com.gxwebsoft.glt.param.GltTicketOrderDeliveredParam;
|
import com.gxwebsoft.glt.param.GltTicketOrderDeliveredParam;
|
||||||
import com.gxwebsoft.glt.param.GltTicketOrderParam;
|
import com.gxwebsoft.glt.param.GltTicketOrderParam;
|
||||||
@@ -178,14 +179,6 @@ public class GltTicketOrderController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId());
|
gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId());
|
||||||
|
|
||||||
// 订单创建成功后,异步通知所有在线配送员有新订单
|
|
||||||
try {
|
|
||||||
notifyRidersOfNewOrder(gltTicketOrder, loginUser.getTenantId());
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("通知配送员失败(不影响下单): {}", e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return success("下单成功");
|
return success("下单成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,8 +237,14 @@ public class GltTicketOrderController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.info("已向 {} 位配送员发送新订单通知", riders.size());
|
@PreAuthorize("isAuthenticated()")
|
||||||
|
@Operation(summary = "配送员调度单通知")
|
||||||
|
@PostMapping("/sendRiderNewOrderNotice")
|
||||||
|
public ApiResult<?> sendRiderNewOrderNotice(@RequestBody NoticeRiderNewOrderDto noticeRiderNewOrderDto) {
|
||||||
|
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeRiderNewOrderDto);
|
||||||
|
return success("发送消息成功!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("isAuthenticated()")
|
@PreAuthorize("isAuthenticated()")
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.gxwebsoft.glt.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配送员新订单配送通知
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(name = "ShopOrderMyVerifyDto", description = "配送员新订单配送通知")
|
||||||
|
public class NoticeRiderNewOrderDto {
|
||||||
|
|
||||||
|
@Schema(description = "订单号")
|
||||||
|
private String orderNo;
|
||||||
|
|
||||||
|
@Schema(description = "商品名称")
|
||||||
|
private String goodsName;
|
||||||
|
|
||||||
|
@Schema(description = "配送数量")
|
||||||
|
private Integer productCount;
|
||||||
|
|
||||||
|
@Schema(description = "期望送达时间")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@Schema(description = "租户ID")
|
||||||
|
private Integer tenantId;
|
||||||
|
|
||||||
|
@Schema(description = "openID")
|
||||||
|
private String openId;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.gxwebsoft.glt.service;
|
package com.gxwebsoft.glt.service;
|
||||||
|
|
||||||
|
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
|
||||||
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,4 +26,10 @@ public interface GltSubscribeMessageService {
|
|||||||
* @return 是否发送成功
|
* @return 是否发送成功
|
||||||
*/
|
*/
|
||||||
boolean sendOrderStatusNotice(GltTicketOrder order, String riderOpenId, String statusText, Integer tenantId);
|
boolean sendOrderStatusNotice(GltTicketOrder order, String riderOpenId, String statusText, Integer tenantId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送配送师傅接单提醒
|
||||||
|
* @param noticeRiderNewOrderDto
|
||||||
|
*/
|
||||||
|
void sendRiderNewOrderNotice(NoticeRiderNewOrderDto noticeRiderNewOrderDto);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
package com.gxwebsoft.glt.service.impl;
|
package com.gxwebsoft.glt.service.impl;
|
||||||
|
|
||||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
||||||
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
|
|
||||||
import cn.binarywang.wx.miniapp.config.WxMaConfig;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.gxwebsoft.common.core.exception.BusinessException;
|
import com.gxwebsoft.common.core.exception.BusinessException;
|
||||||
import com.gxwebsoft.common.core.utils.RedisUtil;
|
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
|
||||||
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
||||||
import com.gxwebsoft.glt.service.GltSubscribeMessageService;
|
import com.gxwebsoft.glt.service.GltSubscribeMessageService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -19,7 +16,8 @@ import javax.annotation.Resource;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.gxwebsoft.common.core.constants.RedisConstants.*;
|
import static com.gxwebsoft.common.core.constants.RedisConstants.ACCESS_TOKEN_KEY;
|
||||||
|
import static com.gxwebsoft.common.core.constants.RedisConstants.MP_WX_KEY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信订阅消息服务实现
|
* 微信订阅消息服务实现
|
||||||
@@ -43,7 +41,34 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
|
|||||||
* 模板名称:订单配送通知
|
* 模板名称:订单配送通知
|
||||||
* 关键词:订单编号、订单内容、配送地址、订单金额
|
* 关键词:订单编号、订单内容、配送地址、订单金额
|
||||||
*/
|
*/
|
||||||
private static final String ORDER_DELIVERY_ID = "vSMSqGVy3aG1RuzQUZlk2y5sWiTFY_hewF5-R-uYwMk";
|
private static final String ORDER_DELIVERY_ID = "vSMSqGVy3aG1RuzQUZlk282p5hCvuMBcHvix1AFhN90";
|
||||||
|
|
||||||
|
|
||||||
|
public void sendRiderNewOrderNotice(NoticeRiderNewOrderDto entity){
|
||||||
|
//1.获取微信accessToken
|
||||||
|
String accessToken = getAccessToken(entity.getTenantId());
|
||||||
|
if(accessToken == null){
|
||||||
|
log.error("配送发单消息发生失败:获取accessToken失败!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//2.品名字段最大能发送20个长度字符,大于15的长度需做处理
|
||||||
|
String goodsName = entity.getGoodsName();
|
||||||
|
int keepLength = 15;
|
||||||
|
if (goodsName.length() > keepLength) {
|
||||||
|
entity.setGoodsName(goodsName.substring(0, keepLength) + "...");
|
||||||
|
}
|
||||||
|
|
||||||
|
//3.组装入参
|
||||||
|
Map<String, Object> data = new HashMap<>();
|
||||||
|
data.put("character_string1", Map.of("value", String.valueOf(entity.getOrderNo())));
|
||||||
|
data.put("thing22", Map.of("value", String.valueOf(entity.getGoodsName())));
|
||||||
|
data.put("number20", Map.of("value", String.valueOf(entity.getProductCount())));
|
||||||
|
data.put("time24", Map.of("value", String.valueOf(entity.getCreateTime())));
|
||||||
|
|
||||||
|
//推送订阅消息
|
||||||
|
sendSubscribeMessage(accessToken, entity.getOpenId(), data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送新订单通知给配送员
|
* 发送新订单通知给配送员
|
||||||
@@ -65,7 +90,7 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
|
|||||||
// 构建消息内容
|
// 构建消息内容
|
||||||
Map<String, Object> data = new HashMap<>();
|
Map<String, Object> data = new HashMap<>();
|
||||||
data.put("phrase1", Map.of("value", "待配送")); // 订单状态
|
data.put("phrase1", Map.of("value", "待配送")); // 订单状态
|
||||||
data.put("character_string2", Map.of("value", String.valueOf(order.getId()))); // 订单编号
|
data.put("character_string2", Map.of("value", String.valueOf(order.getOrderNo()))); // 订单编号
|
||||||
data.put("thing3", Map.of("value", truncateStr(order.getAddress(), 20))); // 配送地址
|
data.put("thing3", Map.of("value", truncateStr(order.getAddress(), 20))); // 配送地址
|
||||||
data.put("number4", Map.of("value", String.valueOf(order.getTotalNum()))); // 商品数量
|
data.put("number4", Map.of("value", String.valueOf(order.getTotalNum()))); // 商品数量
|
||||||
data.put("time5", Map.of("value", formatTime(order.getSendTime()))); // 期望送达时间
|
data.put("time5", Map.of("value", formatTime(order.getSendTime()))); // 期望送达时间
|
||||||
@@ -208,14 +233,14 @@ public class GltSubscribeMessageServiceImpl implements GltSubscribeMessageServic
|
|||||||
.body();
|
.body();
|
||||||
|
|
||||||
JSONObject result = JSON.parseObject(response);
|
JSONObject result = JSON.parseObject(response);
|
||||||
int errcode = result.getIntValue("errcode");
|
int errCode = result.getIntValue("errcode");
|
||||||
|
|
||||||
if (errcode == 0) {
|
if (errCode == 0) {
|
||||||
log.info("订阅消息发送成功 - openId={}", openId);
|
log.info("订阅消息发送成功 - openId={}", openId);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
log.warn("订阅消息发送失败 - openId={}, errcode={}, errmsg={}",
|
log.warn("订阅消息发送失败 - openId={}, errcode={}, errmsg={}",
|
||||||
openId, errcode, result.getString("errmsg"));
|
openId, errCode, result.getString("errmsg"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,14 @@ import com.gxwebsoft.common.system.entity.User;
|
|||||||
import com.gxwebsoft.common.system.mapper.UserMapper;
|
import com.gxwebsoft.common.system.mapper.UserMapper;
|
||||||
import com.gxwebsoft.common.system.redis.OrderNoUtils;
|
import com.gxwebsoft.common.system.redis.OrderNoUtils;
|
||||||
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
|
import com.gxwebsoft.glt.dto.GltTransferOrderDto;
|
||||||
|
import com.gxwebsoft.glt.dto.NoticeRiderNewOrderDto;
|
||||||
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
||||||
import com.gxwebsoft.glt.entity.GltUserTicket;
|
import com.gxwebsoft.glt.entity.GltUserTicket;
|
||||||
import com.gxwebsoft.glt.entity.GltUserTicketLog;
|
import com.gxwebsoft.glt.entity.GltUserTicketLog;
|
||||||
import com.gxwebsoft.glt.mapper.GltTicketOrderMapper;
|
import com.gxwebsoft.glt.mapper.GltTicketOrderMapper;
|
||||||
import com.gxwebsoft.glt.mapper.GltUserTicketMapper;
|
import com.gxwebsoft.glt.mapper.GltUserTicketMapper;
|
||||||
import com.gxwebsoft.glt.param.GltTicketOrderParam;
|
import com.gxwebsoft.glt.param.GltTicketOrderParam;
|
||||||
|
import com.gxwebsoft.glt.service.GltSubscribeMessageService;
|
||||||
import com.gxwebsoft.glt.service.GltTicketOrderService;
|
import com.gxwebsoft.glt.service.GltTicketOrderService;
|
||||||
import com.gxwebsoft.glt.service.GltUserTicketLogService;
|
import com.gxwebsoft.glt.service.GltUserTicketLogService;
|
||||||
import com.gxwebsoft.glt.service.GltUserTicketService;
|
import com.gxwebsoft.glt.service.GltUserTicketService;
|
||||||
@@ -107,6 +109,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
@Resource
|
@Resource
|
||||||
private ShopStoreRiderMapper shopStoreRiderMapper;
|
private ShopStoreRiderMapper shopStoreRiderMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private GltSubscribeMessageService gltSubscribeMessageService;
|
||||||
|
|
||||||
// 轮询指针(高并发安全)
|
// 轮询指针(高并发安全)
|
||||||
private final AtomicInteger index = new AtomicInteger(0);
|
private final AtomicInteger index = new AtomicInteger(0);
|
||||||
|
|
||||||
@@ -254,6 +259,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
throw new BusinessException("写入核销记录失败");
|
throw new BusinessException("写入核销记录失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//发送配送师傅派单配送消息
|
||||||
|
if(gltTicketOrder.getRiderId() != null){
|
||||||
|
User user = userMapper.getById(gltTicketOrder.getRiderId());
|
||||||
|
if(user != null){
|
||||||
|
NoticeRiderNewOrderDto noticeDto = new NoticeRiderNewOrderDto();
|
||||||
|
noticeDto.setOrderNo(gltTicketOrder.getOrderNo());
|
||||||
|
noticeDto.setGoodsName("商品信息见订单详情");
|
||||||
|
noticeDto.setProductCount(gltTicketOrder.getTotalNum());
|
||||||
|
noticeDto.setCreateTime(gltTicketOrder.getCreateTime());
|
||||||
|
noticeDto.setTenantId(tenantId);
|
||||||
|
noticeDto.setOpenId(user.getOpenid());
|
||||||
|
|
||||||
|
ShopOrder shopOrder = shopOrderService.getByOrderNo(gltTicketOrder.getOrderNo(), tenantId);
|
||||||
|
if(shopOrder != null){
|
||||||
|
Integer formId = shopOrder.getFormId();
|
||||||
|
ShopGoods shopGoods = shopGoodsMapper.selectById(formId);
|
||||||
|
if(shopGoods != null){
|
||||||
|
noticeDto.setGoodsName(shopGoods.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeDto);
|
||||||
|
}
|
||||||
|
}
|
||||||
return gltTicketOrder;
|
return gltTicketOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -748,6 +776,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
dispatchOrder.setUpdateTime(now);
|
dispatchOrder.setUpdateTime(now);
|
||||||
|
|
||||||
baseMapper.insert(dispatchOrder);
|
baseMapper.insert(dispatchOrder);
|
||||||
|
|
||||||
|
//推送配送师傅接单提醒
|
||||||
|
if(dispatchOrder.getRiderId() != null){
|
||||||
|
User user = userMapper.getById(dispatchOrder.getRiderId());
|
||||||
|
if(user != null){
|
||||||
|
NoticeRiderNewOrderDto noticeDto = new NoticeRiderNewOrderDto();
|
||||||
|
noticeDto.setOrderNo(dispatchOrder.getOrderNo());
|
||||||
|
noticeDto.setGoodsName("商品信息见订单详情");
|
||||||
|
noticeDto.setProductCount(dispatchOrder.getTotalNum());
|
||||||
|
noticeDto.setCreateTime(dispatchOrder.getCreateTime());
|
||||||
|
noticeDto.setTenantId(tenantId);
|
||||||
|
noticeDto.setOpenId(user.getOpenid());
|
||||||
|
|
||||||
|
if(shopOrder != null){
|
||||||
|
Integer formId = shopOrder.getFormId();
|
||||||
|
ShopGoods shopGoods = shopGoodsMapper.selectById(formId);
|
||||||
|
if(shopGoods != null){
|
||||||
|
noticeDto.setGoodsName(shopGoods.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltSubscribeMessageService.sendRiderNewOrderNotice(noticeDto);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
@@ -861,6 +912,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId());
|
||||||
//生成配送师傅可提现账户分佣金额数据【配送奖励(按商品设置)、配送提成(每桶0.1)】
|
//生成配送师傅可提现账户分佣金额数据【配送奖励(按商品设置)、配送提成(每桶0.1)】
|
||||||
int qty = ticketOrder.getTotalNum() == null ? 0 : ticketOrder.getTotalNum();
|
int qty = ticketOrder.getTotalNum() == null ? 0 : ticketOrder.getTotalNum();
|
||||||
if (qty > 0) { //配送提成(每桶0.1)
|
if (qty > 0) { //配送提成(每桶0.1)
|
||||||
@@ -872,7 +924,11 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
|
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
|
||||||
reduceDto.setUserId(ticketOrder.getRiderId());
|
reduceDto.setUserId(ticketOrder.getRiderId());
|
||||||
reduceDto.setOrderUserId(ticketOrder.getUserId());
|
reduceDto.setOrderUserId(ticketOrder.getUserId());
|
||||||
reduceDto.setOrderNo(ticketOrder.getNo());
|
if(Arrays.asList(1, 3).contains(order.getOrderType())){
|
||||||
|
reduceDto.setOrderNo(order.getOrderNo());
|
||||||
|
}else {
|
||||||
|
reduceDto.setOrderNo(ticketOrder.getNo());
|
||||||
|
}
|
||||||
reduceDto.setPrice(money);
|
reduceDto.setPrice(money);
|
||||||
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_INCOME);
|
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_INCOME);
|
||||||
shopDealerUserService.reduceBalance(reduceDto);
|
shopDealerUserService.reduceBalance(reduceDto);
|
||||||
@@ -882,7 +938,6 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
//配送奖励(按商品设置)
|
//配送奖励(按商品设置)
|
||||||
Integer goodsId = userTicket.getGoodsId();
|
Integer goodsId = userTicket.getGoodsId();
|
||||||
ShopGoods shopGood = shopGoodsMapper.selectById(goodsId);
|
ShopGoods shopGood = shopGoodsMapper.selectById(goodsId);
|
||||||
ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId());
|
|
||||||
if(shopGood != null && order != null){
|
if(shopGood != null && order != null){
|
||||||
Integer commissionType = shopGood.getCommissionType();
|
Integer commissionType = shopGood.getCommissionType();
|
||||||
BigDecimal money = BigDecimal.ZERO;
|
BigDecimal money = BigDecimal.ZERO;
|
||||||
@@ -896,13 +951,29 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
|||||||
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
|
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
|
||||||
reduceDto.setUserId(ticketOrder.getRiderId());
|
reduceDto.setUserId(ticketOrder.getRiderId());
|
||||||
reduceDto.setOrderUserId(ticketOrder.getUserId());
|
reduceDto.setOrderUserId(ticketOrder.getUserId());
|
||||||
reduceDto.setOrderNo(ticketOrder.getNo());
|
if(Arrays.asList(1, 3).contains(order.getOrderType())){
|
||||||
|
reduceDto.setOrderNo(order.getOrderNo());
|
||||||
|
}else {
|
||||||
|
reduceDto.setOrderNo(ticketOrder.getNo());
|
||||||
|
}
|
||||||
reduceDto.setPrice(money);
|
reduceDto.setPrice(money);
|
||||||
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_REWARD);
|
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_REWARD);
|
||||||
shopDealerUserService.reduceBalance(reduceDto);
|
shopDealerUserService.reduceBalance(reduceDto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//配送费结算
|
||||||
|
if(Arrays.asList(1, 3).contains(order.getOrderType()) && order.getDeliveryFee().compareTo(BigDecimal.ZERO) > 0){
|
||||||
|
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
|
||||||
|
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
|
||||||
|
reduceDto.setUserId(ticketOrder.getRiderId());
|
||||||
|
reduceDto.setOrderUserId(ticketOrder.getUserId());
|
||||||
|
reduceDto.setOrderNo(order.getOrderNo());
|
||||||
|
reduceDto.setPrice(order.getDeliveryFee());
|
||||||
|
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.DELIVERY_FLOOR_FEE);
|
||||||
|
shopDealerUserService.reduceBalance(reduceDto);
|
||||||
|
}
|
||||||
|
|
||||||
//查询未完成订单,完成资金解冻
|
//查询未完成订单,完成资金解冻
|
||||||
if(order != null && order.getOrderStatus() == 0){
|
if(order != null && order.getOrderStatus() == 0){
|
||||||
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
|
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class GltTicketOrderAutoDispatch10584Task {
|
|||||||
@Value("${glt.ticket.dispatch10584.batchSize:50}")
|
@Value("${glt.ticket.dispatch10584.batchSize:50}")
|
||||||
private int batchSize;
|
private int batchSize;
|
||||||
|
|
||||||
@Scheduled(cron = "${glt.ticket.dispatch10584.cron:0/20 * * * * ?}")
|
// @Scheduled(cron = "${glt.ticket.dispatch10584.cron:0/20 * * * * ?}")
|
||||||
@IgnoreTenant("定时任务无登录态,需忽略租户隔离;内部使用 tenantId=10584 精确过滤")
|
@IgnoreTenant("定时任务无登录态,需忽略租户隔离;内部使用 tenantId=10584 精确过滤")
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!running.compareAndSet(false, true)) {
|
if (!running.compareAndSet(false, true)) {
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ import com.gxwebsoft.common.core.web.BaseController;
|
|||||||
import com.gxwebsoft.common.core.web.BatchParam;
|
import com.gxwebsoft.common.core.web.BatchParam;
|
||||||
import com.gxwebsoft.common.core.web.PageResult;
|
import com.gxwebsoft.common.core.web.PageResult;
|
||||||
import com.gxwebsoft.common.system.entity.User;
|
import com.gxwebsoft.common.system.entity.User;
|
||||||
|
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
||||||
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
||||||
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
|
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
|
||||||
|
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.springdoc.api.annotations.ParameterObject;
|
import org.springdoc.api.annotations.ParameterObject;
|
||||||
@@ -39,6 +41,14 @@ public class ShopDealerCapitalController extends BaseController {
|
|||||||
return success(shopDealerCapitalService.pageRel(param));
|
return success(shopDealerCapitalService.pageRel(param));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAuthority('shop:shopDealerCapital:list')")
|
||||||
|
@Operation(summary = "分页查询分销商个人流水")
|
||||||
|
@GetMapping("/myCapitalWater")
|
||||||
|
public ApiResult<PageResult<ShopDealerCapitalWaterVO>> myCapitalWater(ShopDealerCapitalWaterDto waterDto) {
|
||||||
|
// 使用关联查询
|
||||||
|
return success(shopDealerCapitalService.myCapitalWater(waterDto));
|
||||||
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasAuthority('shop:shopDealerCapital:list')")
|
@PreAuthorize("hasAuthority('shop:shopDealerCapital:list')")
|
||||||
@Operation(summary = "查询全部分销商资金明细表")
|
@Operation(summary = "查询全部分销商资金明细表")
|
||||||
@GetMapping()
|
@GetMapping()
|
||||||
|
|||||||
@@ -51,6 +51,13 @@ public class ShopVerifyUserController extends BaseController {
|
|||||||
return success(shopVerifyUserService.getByIdRel(id));
|
return success(shopVerifyUserService.getByIdRel(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @PreAuthorize("hasAuthority('shop:shopVerifyUser:list')")
|
||||||
|
@Operation(summary = "根据用户ID查询订单核销人管理")
|
||||||
|
@GetMapping("/getByUserId")
|
||||||
|
public ApiResult<ShopVerifyUser> getByUserId(@RequestParam("userId") Integer userId) {
|
||||||
|
return success(shopVerifyUserService.getInfo(userId));
|
||||||
|
}
|
||||||
|
|
||||||
// @PreAuthorize("hasAuthority('shop:shopVerifyUser:save')")
|
// @PreAuthorize("hasAuthority('shop:shopVerifyUser:save')")
|
||||||
@OperationLog
|
@OperationLog
|
||||||
@Operation(summary = "添加订单核销人管理")
|
@Operation(summary = "添加订单核销人管理")
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.gxwebsoft.shop.dto;
|
||||||
|
|
||||||
|
import com.gxwebsoft.common.core.web.BaseParam;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询个人流水
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(name = "ShopDealerCapitalWaterDto", description = "查询个人流水")
|
||||||
|
public class ShopDealerCapitalWaterDto extends BaseParam {
|
||||||
|
|
||||||
|
@Schema(description = "用户ID")
|
||||||
|
@NotEmpty(message = "用户ID不能为空!")
|
||||||
|
private Integer userId;
|
||||||
|
|
||||||
|
@Schema(description = "起始时间", example = "2026-05-01")
|
||||||
|
private String dateStart;
|
||||||
|
|
||||||
|
@Schema(description = "结束时间", example = "2026-05-31")
|
||||||
|
private String dateEnd;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -51,6 +51,13 @@ public class ShopActiveImage implements Serializable {
|
|||||||
@Schema(description = "排序")
|
@Schema(description = "排序")
|
||||||
private Integer sortNumber;
|
private Integer sortNumber;
|
||||||
|
|
||||||
|
@Schema(description = "跳转商品ID")
|
||||||
|
private Integer goodsId;
|
||||||
|
|
||||||
|
@Schema(description = "跳转商品名称")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String goodsName;
|
||||||
|
|
||||||
@Schema(description = "租户ID")
|
@Schema(description = "租户ID")
|
||||||
@NotNull(message = "租户ID不能为空!")
|
@NotNull(message = "租户ID不能为空!")
|
||||||
private Integer tenantId;
|
private Integer tenantId;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class ShopDealerCapital implements Serializable {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private Integer orderStatus;
|
private Integer orderStatus;
|
||||||
|
|
||||||
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 70佣金退回【退单】)")
|
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 14现场推广分佣 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 61配送提成 62配送步梯费 70佣金退回【退单】)")
|
||||||
private Integer flowType;
|
private Integer flowType;
|
||||||
|
|
||||||
@Schema(description = "变更金额")
|
@Schema(description = "变更金额")
|
||||||
|
|||||||
@@ -194,6 +194,9 @@ public class ShopGoods implements Serializable {
|
|||||||
@Schema(description = "水票ID")
|
@Schema(description = "水票ID")
|
||||||
private Integer waterTickerId;
|
private Integer waterTickerId;
|
||||||
|
|
||||||
|
@Schema(description = "0-按每桶楼层计算 1-固定金额")
|
||||||
|
private Integer deliveryFeeType;
|
||||||
|
|
||||||
@Schema(description = "配送楼层步梯费(元)")
|
@Schema(description = "配送楼层步梯费(元)")
|
||||||
private BigDecimal deliveryFee;
|
private BigDecimal deliveryFee;
|
||||||
|
|
||||||
|
|||||||
@@ -34,10 +34,13 @@ public class ShopVerifyUser implements Serializable {
|
|||||||
private String userName;
|
private String userName;
|
||||||
|
|
||||||
@Schema(description = "核销权限是否开启 0-未开启 1-已开启")
|
@Schema(description = "核销权限是否开启 0-未开启 1-已开启")
|
||||||
private Boolean verifyFlag;
|
private Integer verifyFlag;
|
||||||
|
|
||||||
@Schema(description = "是否开启 0-未开始 1-已开启")
|
@Schema(description = "是否开启 0-未开始 1-已开启")
|
||||||
private Boolean status;
|
private Integer status;
|
||||||
|
|
||||||
|
@Schema(description = "排序号")
|
||||||
|
private Integer sortNumber;
|
||||||
|
|
||||||
@Schema(description = "创建人")
|
@Schema(description = "创建人")
|
||||||
private Integer creator;
|
private Integer creator;
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ package com.gxwebsoft.shop.mapper;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
||||||
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
||||||
|
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -34,4 +37,12 @@ public interface ShopDealerCapitalMapper extends BaseMapper<ShopDealerCapital> {
|
|||||||
*/
|
*/
|
||||||
List<ShopDealerCapital> selectListRel(@Param("param") ShopDealerCapitalParam param);
|
List<ShopDealerCapital> selectListRel(@Param("param") ShopDealerCapitalParam param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询个人资金流水
|
||||||
|
* @param page
|
||||||
|
* @param entity
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
IPage<ShopDealerCapitalWaterVO> getPageInfo(@Param("page") Page page, @Param("entity") ShopDealerCapitalWaterDto entity);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,5 +55,23 @@
|
|||||||
<select id="selectListRel" resultType="com.gxwebsoft.shop.entity.ShopDealerCapital">
|
<select id="selectListRel" resultType="com.gxwebsoft.shop.entity.ShopDealerCapital">
|
||||||
<include refid="selectSql"></include>
|
<include refid="selectSql"></include>
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getPageInfo" resultType="com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO">
|
||||||
|
SELECT
|
||||||
|
no,
|
||||||
|
order_no,
|
||||||
|
flow_type,
|
||||||
|
money,
|
||||||
|
freeze_money,
|
||||||
|
comments,
|
||||||
|
create_time
|
||||||
|
FROM
|
||||||
|
shop_dealer_capital
|
||||||
|
WHERE
|
||||||
|
user_id = #{entity.userId}
|
||||||
|
<if test="entity.dateStart != null and entity.dateEnd != null">
|
||||||
|
AND DATE(create_time) BETWEEN #{entity.dateStart} AND #{entity.dateEnd}
|
||||||
|
</if>
|
||||||
|
ORDER BY create_time DESC
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -169,8 +169,8 @@ public class ShopGoodsParam extends BaseParam {
|
|||||||
@Schema(description = "水票ID")
|
@Schema(description = "水票ID")
|
||||||
private Integer waterTickerId;
|
private Integer waterTickerId;
|
||||||
|
|
||||||
@Schema(description = "商品大类 1-水 2-茶叶 3-酒 4-香水")
|
@Schema(description = "0-按每桶楼层计算 1-固定金额")
|
||||||
private Integer categoryType;
|
private Integer deliveryFeeType;
|
||||||
|
|
||||||
@Schema(description = "租户id")
|
@Schema(description = "租户id")
|
||||||
private Integer tenantId;
|
private Integer tenantId;
|
||||||
|
|||||||
@@ -352,7 +352,12 @@ public class OrderBusinessService {
|
|||||||
//自配送才计算步梯费用业务【选择步梯配送方式、配送楼层大于1楼、商品已设置配送费】
|
//自配送才计算步梯费用业务【选择步梯配送方式、配送楼层大于1楼、商品已设置配送费】
|
||||||
if(Arrays.asList(1, 3).contains(shopOrder.getOrderType()) && shopOrder.getDeliveryMethod() == 1 && shopOrder.getDeliveryFloor() > 1
|
if(Arrays.asList(1, 3).contains(shopOrder.getOrderType()) && shopOrder.getDeliveryMethod() == 1 && shopOrder.getDeliveryFloor() > 1
|
||||||
&& shopGoods.getDeliveryFee().compareTo(BigDecimal.ZERO) > 0){
|
&& shopGoods.getDeliveryFee().compareTo(BigDecimal.ZERO) > 0){
|
||||||
BigDecimal deliveryFee = BigDecimal.valueOf(shopOrder.getDeliveryFloor() - 1).multiply(shopGoods.getDeliveryFee()).multiply(BigDecimal.valueOf(goodsItem.getQuantity()));
|
BigDecimal deliveryFee = BigDecimal.ZERO;
|
||||||
|
if(shopGoods.getDeliveryFeeType() == 0 ){
|
||||||
|
deliveryFee = BigDecimal.valueOf(shopOrder.getDeliveryFloor() - 1).multiply(shopGoods.getDeliveryFee()).multiply(BigDecimal.valueOf(goodsItem.getQuantity()));
|
||||||
|
}else if(shopOrder.getDeliveryFloor() > 1){
|
||||||
|
deliveryFee = shopGoods.getDeliveryFee();
|
||||||
|
}
|
||||||
if(deliveryFee.compareTo(BigDecimal.ZERO) > 0){
|
if(deliveryFee.compareTo(BigDecimal.ZERO) > 0){
|
||||||
shopOrder.setDeliveryFee(deliveryFee);
|
shopOrder.setDeliveryFee(deliveryFee);
|
||||||
shopOrder.setTotalPrice(shopOrder.getTotalPrice().add(deliveryFee));
|
shopOrder.setTotalPrice(shopOrder.getTotalPrice().add(deliveryFee));
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ package com.gxwebsoft.shop.service;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.gxwebsoft.common.core.web.PageResult;
|
import com.gxwebsoft.common.core.web.PageResult;
|
||||||
|
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
||||||
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
||||||
|
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -23,6 +25,13 @@ public interface ShopDealerCapitalService extends IService<ShopDealerCapital> {
|
|||||||
*/
|
*/
|
||||||
PageResult<ShopDealerCapital> pageRel(ShopDealerCapitalParam param);
|
PageResult<ShopDealerCapital> pageRel(ShopDealerCapitalParam param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询分销商个人流水
|
||||||
|
* @param waterDto
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
PageResult<ShopDealerCapitalWaterVO> myCapitalWater(ShopDealerCapitalWaterDto waterDto);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关联查询全部
|
* 关联查询全部
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -39,6 +39,13 @@ public interface ShopVerifyUserService extends IService<ShopVerifyUser> {
|
|||||||
*/
|
*/
|
||||||
ShopVerifyUser getByIdRel(Integer id);
|
ShopVerifyUser getByIdRel(Integer id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过用户ID查询
|
||||||
|
* @param userId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ShopVerifyUser getInfo(Integer userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改订单核销人开启状态
|
* 修改订单核销人开启状态
|
||||||
* @param id 主键ID
|
* @param id 主键ID
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|||||||
import com.gxwebsoft.common.core.web.PageParam;
|
import com.gxwebsoft.common.core.web.PageParam;
|
||||||
import com.gxwebsoft.common.core.web.PageResult;
|
import com.gxwebsoft.common.core.web.PageResult;
|
||||||
import com.gxwebsoft.shop.entity.ShopActiveImage;
|
import com.gxwebsoft.shop.entity.ShopActiveImage;
|
||||||
|
import com.gxwebsoft.shop.entity.ShopGoods;
|
||||||
import com.gxwebsoft.shop.mapper.ShopActiveImageMapper;
|
import com.gxwebsoft.shop.mapper.ShopActiveImageMapper;
|
||||||
|
import com.gxwebsoft.shop.mapper.ShopGoodsMapper;
|
||||||
import com.gxwebsoft.shop.param.ShopActiveImageParam;
|
import com.gxwebsoft.shop.param.ShopActiveImageParam;
|
||||||
import com.gxwebsoft.shop.service.ShopActiveImageService;
|
import com.gxwebsoft.shop.service.ShopActiveImageService;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@@ -14,6 +16,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推广码底图Service实现
|
* 推广码底图Service实现
|
||||||
@@ -25,16 +28,30 @@ import java.util.List;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class ShopActiveImageServiceImpl extends ServiceImpl<ShopActiveImageMapper, ShopActiveImage> implements ShopActiveImageService {
|
public class ShopActiveImageServiceImpl extends ServiceImpl<ShopActiveImageMapper, ShopActiveImage> implements ShopActiveImageService {
|
||||||
|
|
||||||
|
private ShopGoodsMapper shopGoodsMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<ShopActiveImage> pageRel(ShopActiveImageParam param) {
|
public PageResult<ShopActiveImage> pageRel(ShopActiveImageParam param) {
|
||||||
PageParam<ShopActiveImage, ShopActiveImageParam> page = new PageParam<>(param);
|
PageParam<ShopActiveImage, ShopActiveImageParam> page = new PageParam<>(param);
|
||||||
page.setDefaultOrder("sort_number asc, create_time desc");
|
page.setDefaultOrder("sort_number asc, create_time desc");
|
||||||
List<ShopActiveImage> list = baseMapper.selectPageRel(page, param);
|
List<ShopActiveImage> list = baseMapper.selectPageRel(page, param);
|
||||||
if(CollectionUtils.isNotEmpty(list)){
|
if(CollectionUtils.isNotEmpty(list)){
|
||||||
|
List<Integer> goodsIdList = list.stream().filter(shopActiveImage -> shopActiveImage.getGoodsId() != null).map(ShopActiveImage::getGoodsId)
|
||||||
|
.distinct().collect(Collectors.toList());
|
||||||
|
List<ShopGoods> shopGoodsList = shopGoodsMapper.selectBatchIds(goodsIdList);
|
||||||
|
|
||||||
list.forEach(shopActiveImage -> {
|
list.forEach(shopActiveImage -> {
|
||||||
if(!StringUtils.isEmpty(shopActiveImage.getImgUrl())){
|
if(!StringUtils.isEmpty(shopActiveImage.getImgUrl())){
|
||||||
shopActiveImage.setImgUrlList(Arrays.asList(shopActiveImage.getImgUrl().split(",")));
|
shopActiveImage.setImgUrlList(Arrays.asList(shopActiveImage.getImgUrl().split(",")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//回显商品名称
|
||||||
|
if(shopActiveImage.getGoodsId() != null){
|
||||||
|
ShopGoods shopGoods = shopGoodsList.stream().filter(goods -> shopActiveImage.getGoodsId().equals(goods.getGoodsId())).findFirst().orElse(null);
|
||||||
|
if(shopGoods != null){
|
||||||
|
shopActiveImage.setGoodsName(shopGoods.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return new PageResult<>(list, page.getTotal());
|
return new PageResult<>(list, page.getTotal());
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
package com.gxwebsoft.shop.service.impl;
|
package com.gxwebsoft.shop.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.gxwebsoft.common.core.exception.BusinessException;
|
||||||
|
import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants;
|
||||||
|
import com.gxwebsoft.common.core.utils.LoginUserUtil;
|
||||||
|
import com.gxwebsoft.common.system.entity.User;
|
||||||
|
import com.gxwebsoft.shop.dto.ShopDealerCapitalWaterDto;
|
||||||
import com.gxwebsoft.shop.mapper.ShopDealerCapitalMapper;
|
import com.gxwebsoft.shop.mapper.ShopDealerCapitalMapper;
|
||||||
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
|
import com.gxwebsoft.shop.service.ShopDealerCapitalService;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
||||||
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
import com.gxwebsoft.shop.param.ShopDealerCapitalParam;
|
||||||
import com.gxwebsoft.common.core.web.PageParam;
|
import com.gxwebsoft.common.core.web.PageParam;
|
||||||
import com.gxwebsoft.common.core.web.PageResult;
|
import com.gxwebsoft.common.core.web.PageResult;
|
||||||
|
import com.gxwebsoft.shop.vo.ShopDealerCapitalWaterVO;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,6 +38,27 @@ public class ShopDealerCapitalServiceImpl extends ServiceImpl<ShopDealerCapitalM
|
|||||||
return new PageResult<>(list, page.getTotal());
|
return new PageResult<>(list, page.getTotal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<ShopDealerCapitalWaterVO> myCapitalWater(ShopDealerCapitalWaterDto entity) {
|
||||||
|
PageResult<ShopDealerCapitalWaterVO> pageResult = new PageResult<>();
|
||||||
|
User loginUser = LoginUserUtil.getLoginUser();
|
||||||
|
if(loginUser == null){
|
||||||
|
throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
|
||||||
|
}
|
||||||
|
entity.setUserId(loginUser.getUserId());
|
||||||
|
|
||||||
|
IPage<ShopDealerCapitalWaterVO> pageInfo = baseMapper.getPageInfo(new Page<>(entity.getPage(), entity.getLimit()), entity);
|
||||||
|
if(CollectionUtils.isNotEmpty(pageInfo.getRecords())){
|
||||||
|
List<ShopDealerCapitalWaterVO> records = pageInfo.getRecords();
|
||||||
|
pageResult.setList(records);
|
||||||
|
pageResult.setCount(pageInfo.getTotal());
|
||||||
|
}else {
|
||||||
|
pageResult.setCount(0l);
|
||||||
|
pageResult.setList(new ArrayList<>());
|
||||||
|
}
|
||||||
|
return pageResult;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ShopDealerCapital> listRel(ShopDealerCapitalParam param) {
|
public List<ShopDealerCapital> listRel(ShopDealerCapitalParam param) {
|
||||||
List<ShopDealerCapital> list = baseMapper.selectListRel(param);
|
List<ShopDealerCapital> list = baseMapper.selectListRel(param);
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
|
|||||||
case PROMOTION_PARENT_INCOME:
|
case PROMOTION_PARENT_INCOME:
|
||||||
case TRANSFER_INCOME:
|
case TRANSFER_INCOME:
|
||||||
case DELIVERY_REWARD:
|
case DELIVERY_REWARD:
|
||||||
|
case DELIVERY_FLOOR_FEE:
|
||||||
case DELIVERY_INCOME:{
|
case DELIVERY_INCOME:{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -281,8 +282,8 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
|
|||||||
.in(ShopDealerCapital::getFlowType, Arrays.asList(ShopDealerCapitalUpdateEnum.DISTRIBUTION_INCOME.getType(),
|
.in(ShopDealerCapital::getFlowType, Arrays.asList(ShopDealerCapitalUpdateEnum.DISTRIBUTION_INCOME.getType(),
|
||||||
ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType(), ShopDealerCapitalUpdateEnum.DIVIDEND_INCOME.getType(),
|
ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType(), ShopDealerCapitalUpdateEnum.DIVIDEND_INCOME.getType(),
|
||||||
ShopDealerCapitalUpdateEnum.PROMOTION_INCOME.getType(), ShopDealerCapitalUpdateEnum.PROMOTION_PARENT_INCOME.getType(),
|
ShopDealerCapitalUpdateEnum.PROMOTION_INCOME.getType(), ShopDealerCapitalUpdateEnum.PROMOTION_PARENT_INCOME.getType(),
|
||||||
ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(),
|
ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(),
|
||||||
ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType()))
|
ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType()), ShopDealerCapitalUpdateEnum.DELIVERY_FLOOR_FEE.getType())
|
||||||
.isNotNull(ShopDealerCapital::getUserId)
|
.isNotNull(ShopDealerCapital::getUserId)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
|
|||||||
@Override
|
@Override
|
||||||
public List<ShopOrderGoods> listRel(ShopOrderGoodsParam param) {
|
public List<ShopOrderGoods> listRel(ShopOrderGoodsParam param) {
|
||||||
List<ShopOrderGoods> list = baseMapper.selectListRel(param);
|
List<ShopOrderGoods> list = baseMapper.selectListRel(param);
|
||||||
|
|
||||||
//根据订单ID查询活动并回显对应名称、订单核销码
|
//根据订单ID查询活动并回显对应名称、订单核销码
|
||||||
Integer orderId = param.getOrderId();
|
Integer orderId = param.getOrderId();
|
||||||
if(orderId != null){
|
if(orderId != null){
|
||||||
@@ -55,6 +54,7 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
|
|||||||
saleActivity = shopFlashSaleActivityMapper.selectById(order.getActivityId());
|
saleActivity = shopFlashSaleActivityMapper.selectById(order.getActivityId());
|
||||||
}
|
}
|
||||||
for(ShopOrderGoods orderGoods : list){
|
for(ShopOrderGoods orderGoods : list){
|
||||||
|
orderGoods.setOrderStatus(order.getOrderStatus());
|
||||||
orderGoods.setVerifyCode(order.getVerifyCode());
|
orderGoods.setVerifyCode(order.getVerifyCode());
|
||||||
if(saleActivity != null){
|
if(saleActivity != null){
|
||||||
if(orderGoods.getGoodsId().equals(saleActivity.getGoodsId())){
|
if(orderGoods.getGoodsId().equals(saleActivity.getGoodsId())){
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.gxwebsoft.common.core.config.SpringContextUtil;
|
|||||||
import com.gxwebsoft.common.core.context.TenantContext;
|
import com.gxwebsoft.common.core.context.TenantContext;
|
||||||
import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum;
|
import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum;
|
||||||
import com.gxwebsoft.common.core.enums.ShopDealerTypeEnum;
|
import com.gxwebsoft.common.core.enums.ShopDealerTypeEnum;
|
||||||
|
import com.gxwebsoft.common.core.exception.BusinessException;
|
||||||
import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants;
|
import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants;
|
||||||
import com.gxwebsoft.common.core.service.EnvironmentAwarePaymentService;
|
import com.gxwebsoft.common.core.service.EnvironmentAwarePaymentService;
|
||||||
import com.gxwebsoft.common.core.service.PaymentCacheService;
|
import com.gxwebsoft.common.core.service.PaymentCacheService;
|
||||||
@@ -488,37 +489,37 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
|
|||||||
//1.判断用户是否登录
|
//1.判断用户是否登录
|
||||||
User loginUser = LoginUserUtil.getLoginUser();
|
User loginUser = LoginUserUtil.getLoginUser();
|
||||||
if(loginUser == null){
|
if(loginUser == null){
|
||||||
throw new RuntimeException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
|
throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
|
||||||
}
|
}
|
||||||
|
|
||||||
//2.判断是否有核销权限
|
//2.判断是否有核销权限
|
||||||
Integer verifyType = verifyDto.getVerifyType();
|
Integer verifyType = verifyDto.getVerifyType();
|
||||||
if(verifyType == 2){
|
if(verifyType == 2){
|
||||||
ShopVerifyUser verifyUser = shopVerifyUserMapper.selectOne(new LambdaQueryWrapper<ShopVerifyUser>().eq(ShopVerifyUser::getUserId, loginUser.getUserId()));
|
ShopVerifyUser verifyUser = shopVerifyUserMapper.selectOne(new LambdaQueryWrapper<ShopVerifyUser>().eq(ShopVerifyUser::getUserId, loginUser.getUserId()));
|
||||||
if(!(verifyUser != null && verifyUser.getVerifyFlag() && verifyUser.getStatus())){
|
if(!(verifyUser != null && verifyUser.getVerifyFlag() == 1 && verifyUser.getStatus() == 1)){
|
||||||
throw new RuntimeException("暂无核销权限!");
|
throw new BusinessException("暂无核销权限!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//3.查询订单信息
|
//3.查询订单信息
|
||||||
ShopOrder shopOrder = baseMapper.selectOne(new LambdaQueryWrapper<ShopOrder>().eq(ShopOrder::getVerifyCode, verifyDto.getVerifyCode()));
|
ShopOrder shopOrder = baseMapper.selectOne(new LambdaQueryWrapper<ShopOrder>().eq(ShopOrder::getVerifyCode, verifyDto.getVerifyCode()));
|
||||||
if(shopOrder == null){
|
if(shopOrder == null){
|
||||||
throw new RuntimeException(GlobalErrorCodeConstants.NOT_FOUND.getMsg());
|
throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg());
|
||||||
}
|
}
|
||||||
|
|
||||||
//4.判断当前订单状态是否允许核销
|
//4.判断当前订单状态是否允许核销
|
||||||
if(Arrays.asList(2,3,4,6,7).contains(shopOrder.getOrderStatus())){
|
if(Arrays.asList(2,3,4,6,7).contains(shopOrder.getOrderStatus())){
|
||||||
throw new RuntimeException("订单当前状态不可核销!");
|
throw new BusinessException("订单当前状态不可核销!");
|
||||||
}
|
}
|
||||||
|
|
||||||
//5.判断订单是否已支付
|
//5.判断订单是否已支付
|
||||||
if(!shopOrder.getPayStatus()){
|
if(!shopOrder.getPayStatus()){
|
||||||
throw new RuntimeException("订单未支付,不可核销!");
|
throw new BusinessException("订单未支付,不可核销!");
|
||||||
}
|
}
|
||||||
|
|
||||||
//6.判断是否已核销
|
//6.判断是否已核销
|
||||||
if(shopOrder.getVerifyStatus() != null && shopOrder.getVerifyStatus() == 1){
|
if(shopOrder.getVerifyStatus() != null && shopOrder.getVerifyStatus() == 1){
|
||||||
throw new RuntimeException("此订单已核销,无需重复核销!");
|
throw new BusinessException("此订单已核销,无需重复核销!");
|
||||||
}
|
}
|
||||||
|
|
||||||
shopOrder.setVerifyStatus(1);
|
shopOrder.setVerifyStatus(1);
|
||||||
@@ -624,7 +625,7 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
|
|||||||
}
|
}
|
||||||
return baseMapper.updateById(shopOrder) > 0;
|
return baseMapper.updateById(shopOrder) > 0;
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
throw new RuntimeException("核销失败:" + e.getMessage());
|
throw new BusinessException("核销失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
|
|||||||
@Override
|
@Override
|
||||||
public PageResult<ShopVerifyUser> pageRel(ShopVerifyUserParam param) {
|
public PageResult<ShopVerifyUser> pageRel(ShopVerifyUserParam param) {
|
||||||
PageParam<ShopVerifyUser, ShopVerifyUserParam> page = new PageParam<>(param);
|
PageParam<ShopVerifyUser, ShopVerifyUserParam> page = new PageParam<>(param);
|
||||||
page.setDefaultOrder("create_time desc");
|
page.setDefaultOrder("sort_number asc, create_time desc");
|
||||||
List<ShopVerifyUser> list = baseMapper.selectPageRel(page, param);
|
List<ShopVerifyUser> list = baseMapper.selectPageRel(page, param);
|
||||||
if(CollectionUtils.isNotEmpty(list)){
|
if(CollectionUtils.isNotEmpty(list)){
|
||||||
List<Integer> userIdList = list.stream().map(ShopVerifyUser::getUserId).distinct().collect(Collectors.toList());
|
List<Integer> userIdList = list.stream().map(ShopVerifyUser::getUserId).distinct().collect(Collectors.toList());
|
||||||
@@ -90,15 +90,24 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
|
|||||||
return verifyUser;
|
return verifyUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ShopVerifyUser getInfo(Integer userId) {
|
||||||
|
List<ShopVerifyUser> list = lambdaQuery().eq(ShopVerifyUser::getUserId, userId).list();
|
||||||
|
if(CollectionUtils.isNotEmpty(list)){
|
||||||
|
return list.get(0);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean updateStatus(Integer id) {
|
public Boolean updateStatus(Integer id) {
|
||||||
ShopVerifyUser verifyUser = baseMapper.selectById(id);
|
ShopVerifyUser verifyUser = baseMapper.selectById(id);
|
||||||
if(verifyUser != null){
|
if(verifyUser != null){
|
||||||
Boolean status = verifyUser.getStatus();
|
Integer status = verifyUser.getStatus();
|
||||||
if(status){
|
if(status == 0){
|
||||||
verifyUser.setStatus(false);
|
verifyUser.setStatus(1);
|
||||||
}else {
|
}else {
|
||||||
verifyUser.setStatus(true);
|
verifyUser.setStatus(0);
|
||||||
}
|
}
|
||||||
verifyUser.setUpdateTime(LocalDateTime.now());
|
verifyUser.setUpdateTime(LocalDateTime.now());
|
||||||
User loginUser = LoginUserUtil.getLoginUser();
|
User loginUser = LoginUserUtil.getLoginUser();
|
||||||
@@ -114,11 +123,11 @@ public class ShopVerifyUserServiceImpl extends ServiceImpl<ShopVerifyUserMapper,
|
|||||||
public Boolean updateVerifyFlag(Integer id) {
|
public Boolean updateVerifyFlag(Integer id) {
|
||||||
ShopVerifyUser verifyUser = baseMapper.selectById(id);
|
ShopVerifyUser verifyUser = baseMapper.selectById(id);
|
||||||
if(verifyUser != null){
|
if(verifyUser != null){
|
||||||
Boolean verifyFlag = verifyUser.getVerifyFlag();
|
Integer verifyFlag = verifyUser.getVerifyFlag();
|
||||||
if(verifyFlag){
|
if(verifyFlag == 0){
|
||||||
verifyUser.setVerifyFlag(false);
|
verifyUser.setVerifyFlag(1);
|
||||||
}else {
|
}else {
|
||||||
verifyUser.setVerifyFlag(true);
|
verifyUser.setVerifyFlag(0);
|
||||||
}
|
}
|
||||||
verifyUser.setUpdateTime(LocalDateTime.now());
|
verifyUser.setUpdateTime(LocalDateTime.now());
|
||||||
User loginUser = LoginUserUtil.getLoginUser();
|
User loginUser = LoginUserUtil.getLoginUser();
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class CouponExpireTask {
|
|||||||
* 生产环境:每天凌晨2点执行
|
* 生产环境:每天凌晨2点执行
|
||||||
* 开发环境:每10分钟执行一次(用于测试)
|
* 开发环境:每10分钟执行一次(用于测试)
|
||||||
*/
|
*/
|
||||||
@Scheduled(cron = "${coupon.expire.cron:0 0 2 * * ?}")
|
// @Scheduled(cron = "${coupon.expire.cron:0 0 2 * * ?}")
|
||||||
public void processExpiredCoupons() {
|
public void processExpiredCoupons() {
|
||||||
log.info("开始执行过期优惠券处理任务...");
|
log.info("开始执行过期优惠券处理任务...");
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ public class CouponExpireTask {
|
|||||||
* 每小时执行一次优惠券状态检查(可选)
|
* 每小时执行一次优惠券状态检查(可选)
|
||||||
* 用于及时发现和处理刚过期的优惠券
|
* 用于及时发现和处理刚过期的优惠券
|
||||||
*/
|
*/
|
||||||
@Scheduled(cron = "0 0 * * * ?")
|
// @Scheduled(cron = "0 0 * * * ?")
|
||||||
public void hourlyExpiredCouponsCheck() {
|
public void hourlyExpiredCouponsCheck() {
|
||||||
// 只在生产环境执行
|
// 只在生产环境执行
|
||||||
if (!"prod".equals(activeProfile)) {
|
if (!"prod".equals(activeProfile)) {
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.gxwebsoft.shop.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询个人流水
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(name = "ShopDealerCapitalWaterVO", description = "查询个人流水")
|
||||||
|
public class ShopDealerCapitalWaterVO {
|
||||||
|
|
||||||
|
@Schema(description = "订单编号")
|
||||||
|
private String no;
|
||||||
|
|
||||||
|
@Schema(description = "关联订单编号")
|
||||||
|
private String orderNo;
|
||||||
|
|
||||||
|
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 14现场推广分佣 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 61配送提成 62配送步梯费 70佣金退回【退单】)")
|
||||||
|
private Integer flowType;
|
||||||
|
|
||||||
|
@Schema(description = "变更金额")
|
||||||
|
private BigDecimal money;
|
||||||
|
|
||||||
|
@Schema(description = "变更后金额")
|
||||||
|
private BigDecimal moneyAfter;
|
||||||
|
|
||||||
|
@Schema(description = "变更冻结金额")
|
||||||
|
private BigDecimal freezeMoney;
|
||||||
|
|
||||||
|
@Schema(description = "变更冻结后金额")
|
||||||
|
private BigDecimal freezeMoneyAfter;
|
||||||
|
|
||||||
|
@Schema(description = "描述")
|
||||||
|
private String comments;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -14,8 +14,8 @@ spring:
|
|||||||
# redis
|
# redis
|
||||||
redis:
|
redis:
|
||||||
database: 0
|
database: 0
|
||||||
host: 8.134.55.105
|
host: 1Panel-redis-GmNr
|
||||||
port: 16379
|
port: 6379
|
||||||
password: redis_t74P8C
|
password: redis_t74P8C
|
||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
|
|||||||
@@ -15,9 +15,8 @@ spring:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
database: 0
|
database: 0
|
||||||
host: 8.134.55.105
|
host: localhost
|
||||||
port: 16379
|
port: 6379
|
||||||
password: redis_t74P8C
|
|
||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
|
|||||||
Reference in New Issue
Block a user