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 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 getVipStatisticsList(PageRequest pageRequest, ChannelVisitDto visitDto) { IPage result = vipCardOrderLogMapper.getVipStatisticsList(pageUtil.getPage(pageRequest), visitDto.initDate()); return result; } @Override public IPage getVipStatisticsDetail(PageRequest pageRequest, VipStatisticsDetailDto detailDto) { IPage 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.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.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.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); } } }