1
sunshine
2024-11-05 92a9e53e82c74d36a72eb92f93777bbb16e2db73
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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);
        }
    }
}