package com.nova.sankuai.service.impl;
|
|
import cn.hutool.core.util.IdUtil;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.nova.sankuai.domain.dto.ChannelVisitDto;
|
import com.nova.sankuai.domain.dto.VipCardOrderLogDto;
|
import com.nova.sankuai.domain.dto.VipStatisticsDetailDto;
|
import com.nova.sankuai.domain.entity.ChannelInfo;
|
import com.nova.sankuai.domain.entity.CustomerUser;
|
import com.nova.sankuai.domain.entity.VipCardOrder;
|
import com.nova.sankuai.domain.entity.VipCardOrderLog;
|
import com.nova.sankuai.domain.enums.vipservice.VipCardOrderEnum;
|
import com.nova.sankuai.domain.enums.vipservice.VipCardOrderLogEnum;
|
import com.nova.sankuai.domain.enums.vipservice.VipCardTypeEnum;
|
import com.nova.sankuai.domain.vo.VipStatisticsDetailVo;
|
import com.nova.sankuai.domain.vo.VipStatisticsVo;
|
import com.nova.sankuai.infra.config.CommonException;
|
import com.nova.sankuai.infra.mapper.ChannelInfoMapper;
|
import com.nova.sankuai.infra.mapper.CustomerUserMapper;
|
import com.nova.sankuai.infra.mapper.VipCardOrderLogMapper;
|
import com.nova.sankuai.infra.mapper.VipCardOrderMapper;
|
import com.nova.sankuai.infra.utils.PageRequest;
|
import com.nova.sankuai.infra.utils.PageUtil;
|
import com.nova.sankuai.security.UserDetail;
|
import com.nova.sankuai.service.IVipCardOrderLogService;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.stereotype.Service;
|
|
import java.util.Date;
|
|
/**
|
* @author weikangdi
|
* @create 2022/1/26
|
*/
|
@Service
|
@AllArgsConstructor
|
@Slf4j
|
public class VipCardOrderLogServiceImpl extends ServiceImpl<VipCardOrderLogMapper, VipCardOrderLog> implements IVipCardOrderLogService {
|
|
private final ChannelInfoMapper channelInfoMapper;
|
|
private final VipCardOrderLogMapper vipCardOrderLogMapper;
|
|
private final PageUtil pageUtil;
|
|
private final VipCardOrderMapper vipCardOrderMapper;
|
|
private final CustomerUserMapper customerUserMapper;
|
|
@Override
|
public void addVipCardOrderLog(UserDetail userDetail, VipCardOrderLogDto logDto) {
|
VipCardOrderLog vipCardOrderLog = checkVipOrderLog(userDetail, logDto);
|
if (vipCardOrderLog != null) {
|
vipCardOrderLog.setVipType(VipCardTypeEnum.MEMBER_SERVICE.getCode());
|
save(vipCardOrderLog);
|
}
|
}
|
|
@Override
|
public IPage<VipStatisticsVo> getVipStatisticsList(PageRequest pageRequest, ChannelVisitDto visitDto) {
|
IPage<VipStatisticsVo> result = vipCardOrderLogMapper.getVipStatisticsList(pageUtil.getPage(pageRequest), visitDto.initDate());
|
return result;
|
}
|
|
@Override
|
public IPage<VipStatisticsDetailVo> getVipStatisticsDetail(PageRequest pageRequest, VipStatisticsDetailDto
|
detailDto) {
|
IPage<VipStatisticsDetailVo> result = new Page<>();
|
if (VipCardOrderLogEnum.PURCHASE_NOT_ORDERED.getCode().equals(detailDto.getStatus())) {
|
result = vipCardOrderLogMapper.getNoOrderDetail(pageUtil.getPage(pageRequest), detailDto.initDate());
|
} else if (VipCardOrderLogEnum.PURCHASE_HAS_BEEN_ORDERED.getCode().equals(detailDto.getStatus())) {
|
result = vipCardOrderLogMapper.getOrderedDetail(pageUtil.getPage(pageRequest), detailDto.initDate());
|
} else if (VipCardOrderLogEnum.PURCHASE_SUCCESS.getCode().equals(detailDto.getStatus())) {
|
result = vipCardOrderLogMapper.getVipSuccessDetail(pageUtil.getPage(pageRequest), detailDto.initDate());
|
}
|
return result;
|
}
|
|
@Override
|
public void addQueueVipOrderLog(UserDetail userDetail, VipCardOrderLogDto logDto) {
|
VipCardOrderLog vipCardOrderLog = checkVipOrderLog(userDetail, logDto);
|
if (vipCardOrderLog != null) {
|
vipCardOrderLog.setVipType(VipCardTypeEnum.AUDIT_QUEUE.getCode());
|
save(vipCardOrderLog);
|
}
|
}
|
|
private VipCardOrderLog checkVipOrderLog(UserDetail userDetail, VipCardOrderLogDto logDto) {
|
String uuid = IdUtil.randomUUID();
|
log.info("创建渠道会员订单购买日志:购买日志UUID=" + uuid + "日志参数=" + logDto.toString()
|
+ "用户ID=" + userDetail.getId());
|
ChannelInfo channelInfo = channelInfoMapper.getChannelByAppId(logDto.getAppId());
|
if (channelInfo == null) {
|
log.error("渠道Id非法, 渠道值" + logDto.getAppId());
|
throw new CommonException("渠道Id非法");
|
}
|
//检测日志类型是否正确
|
|
if (VipCardOrderLogEnum.PURCHASE_SUCCESS.getCode().equals(logDto.getStatus())) {
|
log.error("禁止生成购买成功日志" + logDto.toString());
|
return null;
|
}
|
|
VipCardOrderLog vipCardOrderLog = new VipCardOrderLog();
|
CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.<CustomerUser>lambdaQuery()
|
.eq(CustomerUser::getPhone, userDetail.getPhone()));
|
if (customerUser != null) {
|
channelInfo = channelInfoMapper.getChannelByCode(customerUser.getSourceChannel());
|
}
|
vipCardOrderLog.setChannelId(channelInfo.getId());
|
vipCardOrderLog.setCustomerUserId(userDetail.getId());
|
vipCardOrderLog.setStatus(logDto.getStatus());
|
vipCardOrderLog.setCreationDate(new Date());
|
vipCardOrderLog.setUuidFlag(uuid);
|
vipCardOrderLog.setCardId(logDto.getCardId());
|
vipCardOrderLog.setVipOrderId(logDto.getOrderId());
|
vipCardOrderLog.setSellingPrice(logDto.getSellingPrice());
|
vipCardOrderLog.setMarkedPrice(logDto.getMarkedPrice());
|
return vipCardOrderLog;
|
}
|
|
@Override
|
public void addOrderSuccessLog(String thirdOrderId, Long userId) {
|
//判断日志对应的订单是否存在并且是否支付成功
|
VipCardOrder vipCardOrder = vipCardOrderMapper.selectOne(Wrappers.<VipCardOrder>lambdaQuery()
|
.eq(VipCardOrder::getPartnerThirdOrderId, thirdOrderId));
|
if (vipCardOrder == null) {
|
log.error("该订单不存在" + thirdOrderId);
|
return;
|
}
|
if (!VipCardOrderEnum.STATUS_END.getCode().equals(vipCardOrder.getStatus())) {
|
log.error("该订单回调不是支付成功回调" + vipCardOrder.toString());
|
return;
|
}
|
//判断日志对应的订单是否已经生成过成功日志记录
|
VipCardOrderLog orderLog = lambdaQuery()
|
.eq(VipCardOrderLog::getVipOrderId, vipCardOrder.getPartnerThirdOrderId())
|
.eq(VipCardOrderLog::getStatus, VipCardOrderLogEnum.PURCHASE_SUCCESS.getCode())
|
.eq(VipCardOrderLog::getVipType, vipCardOrder.getVipType()).one();
|
if (orderLog != null) {
|
log.error("该订单已经生成成功日志,不重复生成" + vipCardOrder.toString());
|
return;
|
}
|
CustomerUser customerUser = customerUserMapper.selectById(vipCardOrder.getUserId());
|
if (customerUser == null) {
|
log.error("该订单对应用户不存在" + vipCardOrder.toString());
|
return;
|
}
|
//更新用户会员卡Id
|
if (StringUtils.isNotEmpty(vipCardOrder.getCardId()) &&
|
VipCardTypeEnum.MEMBER_SERVICE.getCode().equals(vipCardOrder.getVipType())) {
|
log.info("更新用户会员卡ID, 用户ID:" + customerUser.getId() + ",会员卡ID" + vipCardOrder.getCardId());
|
customerUserMapper.update(null, Wrappers.<CustomerUser>lambdaUpdate()
|
.set(CustomerUser::getVipCardId, vipCardOrder.getCardId())
|
.eq(CustomerUser::getId, customerUser.getId()));
|
}
|
|
//根据订单创建支付成功日志记录
|
String uuid = IdUtil.randomUUID();
|
log.info("创建渠道订单回调成功日志:日志UUID=" + uuid + "日志参数=" + vipCardOrder.toString()
|
+ "用户ID=" + customerUser.getId());
|
VipCardOrderLog vipCardOrderLog = new VipCardOrderLog();
|
ChannelInfo channelInfo = channelInfoMapper.getChannelByCode(customerUser.getSourceChannel());
|
vipCardOrderLog.setChannelId(channelInfo.getId());
|
vipCardOrderLog.setCustomerUserId(customerUser.getId());
|
vipCardOrderLog.setStatus(VipCardOrderLogEnum.PURCHASE_SUCCESS.getCode());
|
vipCardOrderLog.setCreationDate(new Date());
|
vipCardOrderLog.setUuidFlag(uuid);
|
vipCardOrderLog.setCardId(vipCardOrder.getCardId());
|
vipCardOrderLog.setVipOrderId(vipCardOrder.getOrderId());
|
vipCardOrderLog.setSellingPrice(vipCardOrder.getPrice());
|
vipCardOrderLog.setMarkedPrice(vipCardOrder.getPrice() + channelInfo.getMemberDiscount());
|
vipCardOrderLog.setVipType(vipCardOrder.getVipType());
|
save(vipCardOrderLog);
|
}
|
|
|
@Override
|
public void addLoanMarketVipOrderLog(UserDetail userDetail, VipCardOrderLogDto logDto) {
|
VipCardOrderLog vipCardOrderLog = checkVipOrderLog(userDetail, logDto);
|
if (vipCardOrderLog != null) {
|
vipCardOrderLog.setVipType(VipCardTypeEnum.LOAN_MARKET_VIP.getCode());
|
save(vipCardOrderLog);
|
}
|
}
|
|
@Override
|
public void addSeniorVipOrderLog(UserDetail userDetail, VipCardOrderLogDto logDto) {
|
VipCardOrderLog vipCardOrderLog = checkVipOrderLog(userDetail, logDto);
|
if (vipCardOrderLog != null) {
|
vipCardOrderLog.setVipType(VipCardTypeEnum.SENIOR_VIP.getCode());
|
save(vipCardOrderLog);
|
}
|
}
|
}
|