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
package com.dy.pipIrrSell.virtualCard;
 
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.daoSe.SeVcRechargeMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import com.dy.pipIrrSell.result.SellResultCode;
import com.dy.pipIrrSell.virtualCard.dto.DtoVirtualCard;
import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM;
import com.dy.pipIrrSell.virtualCard.enums.OrderStateENUM;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.Date;
 
/**
 * @author ZhuBaoMin
 * @date 2024-03-06 8:41
 * @LastEditTime 2024-03-06 8:41
 * @Description
 */
 
@Slf4j
@Service
public class VirtualCardSv {
    @Autowired
    private SeVirtualCardMapper seVirtualCardMapper;
 
    @Autowired
    private SeVcRechargeMapper seVcRechargeMapper;
 
    /**
     * 注册虚拟卡
     * @param po
     * @return
     */
    public Long insertVirtualCard(SeVirtualCard po) {
        seVirtualCardMapper.insert(po);
        return po.getId();
    }
 
    /**
     * 修改虚拟卡
     * 充值、消费、申请退款、审核退款时需要修改虚拟卡的:余额、最后操作、最后操作时间
     * @param po
     * @return
     */
    public Integer updateVirtualCard(SeVirtualCard po) {
        return seVirtualCardMapper.updateByPrimaryKeySelective(po);
    }
 
    /**
     * 根据虚拟卡编号获取虚拟卡对象
     * @param virtualId
     * @return
     */
    public SeVirtualCard selectVirtuCardById(Long virtualId) {
        return seVirtualCardMapper.selectByPrimaryKey(virtualId);
    }
    /**
     * 添加虚拟卡充值记录
     * JSAPI下单后生成部分充值记录
     * @param po
     * @return
     */
    public BaseResponse<Boolean> insertVCRecharge(DtoVirtualCard po) {
        String orderNumber = po.getOrderNumber();
        Long virtualId = po.getVirtualId();
        Long clientId = po.getClientId();
        Integer rechargeAmount = po.getRechargeAmount();
 
        // 验证该虚拟卡账户是否存在并取出当前账户余额
        SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId);
        if(seVirtualCard == null) {
            return BaseResponseUtils.buildFail(SellResultCode.NO_ACCOUNT.getMessage());
        }
        Double money = seVirtualCard.getMoney();
 
        // 添加充值记录
        SeVcRecharge seVcRecharge = new SeVcRecharge();
        seVcRecharge.setVcId(virtualId);
        seVcRecharge.setClientId(clientId);
        seVcRecharge.setMoney(money);
        seVcRecharge.setOrderNumber(orderNumber);
        seVcRecharge.setRechargeAmount(rechargeAmount);
        seVcRecharge.setOrderTime(new Date());
        seVcRecharge.setOrderState(OrderStateENUM.NON_PAYMENT.getCode());
        Integer rec = seVcRechargeMapper.insert(seVcRecharge);
        if(rec == null) {
            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
        }
        return BaseResponseUtils.buildSuccess(true) ;
    }
 
    /**
     * 修改虚拟卡充值记录
     * 微信支付通知后:
     *      1. 更新充值表:充值后余额、支付完成时间、订单状态
     *      2. 更新虚拟卡表:账户余额、最后操作、最后操作时间
     * @param orderNumber 订单编号
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public BaseResponse<Boolean> updateVCRecharge(String orderNumber, Date rechargeTime) {
        SeVcRecharge seVcRecharge = seVcRechargeMapper.getVCRechargeByorderNumber(orderNumber);
        if(seVcRecharge == null) {
            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_NOT_EXIST.getMessage());
        }
 
        Long virtualId = seVcRecharge.getVcId();
        Double money = seVcRecharge.getMoney();
        Integer rechargeAmount = seVcRecharge.getRechargeAmount();
        Double afterRrecharge = money + rechargeAmount;
 
        seVcRecharge.setAfterRecharge(afterRrecharge);
        seVcRecharge.setRechargeTime(rechargeTime);
        seVcRecharge.setOrderState(OrderStateENUM.PAID.getCode());
        Integer rec = seVcRechargeMapper.updateByPrimaryKeySelective(seVcRecharge);
        if(rec == null) {
            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
        }
 
        SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId);
        if(seVirtualCard == null) {
            return BaseResponseUtils.buildFail(SellResultCode.VIRTUAL_CARD_NOT_EXIST.getMessage());
        }
        seVirtualCard.setMoney(afterRrecharge);
        seVirtualCard.setLastOperate(LastOperateENUM.RECHARGE.getCode());
        seVirtualCard.setLastOperateTime(new Date());
        Integer rec2 = seVirtualCardMapper.updateByPrimaryKeySelective(seVirtualCard);
        if(rec2 == null) {
            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
        }
        return BaseResponseUtils.buildSuccess(true) ;
    }
 
    /**
     * 修改虚拟卡充值记录
     * 微信小程序支付通知后修改:余额、充值后余额、充值完成时间
     * @param po
     * @return
     */
    public Integer updateVCRecharge(SeVcRecharge po) {
        return seVcRechargeMapper.updateByPrimaryKeySelective(po);
    }
}