“mitao”
2025-12-22 bef045d5b14b246bc0b7afaca19c8ec1020aeb1d
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
package com.ruoyi.system.service.impl;
 
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.config.ICBCConfig;
import com.ruoyi.system.dto.PhysicalGoodsPlaceOrderDTO;
import com.ruoyi.system.mapper.TPhysicalGoodsMapper;
import com.ruoyi.system.mapper.TPhysicalGoodsOrderMapper;
import com.ruoyi.system.model.TPhysicalGoods;
import com.ruoyi.system.model.TPhysicalGoodsOrder;
import com.ruoyi.system.query.BigGiftPackageQuery;
import com.ruoyi.system.service.TPhysicalGoodsOrderService;
import com.ruoyi.system.utils.ICBCPayUtil;
import com.ruoyi.system.utils.OrderCodeGenerator;
import com.ruoyi.system.vo.PlaceOrderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
 
/**
 * <p>
 * 实物商品订单 服务实现类
 * </p>
 *
 * @author xiaochen
 * @since 2025-12-08
 */
@Slf4j
@Service
public class TPhysicalGoodsOrderServiceImpl extends ServiceImpl<TPhysicalGoodsOrderMapper, TPhysicalGoodsOrder> implements TPhysicalGoodsOrderService {
 
    @Resource
    private TPhysicalGoodsMapper physicalGoodsMapper;
 
    @Resource
    private ICBCPayUtil icbcPayUtil;
 
    @Autowired
    private ICBCConfig icbcConfig;
 
    @Override
    public Page<TPhysicalGoodsOrder> pageList(BigGiftPackageQuery query) {
        Page<TPhysicalGoodsOrder> page = new Page<>(query.getPageNum(), query.getPageSize());
        return this.baseMapper.pageList(page, query);
    }
 
    @Override
    public List<TPhysicalGoodsOrder> export(BigGiftPackageQuery query) {
        return this.baseMapper.export(query);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public PlaceOrderVO placeOrder(PhysicalGoodsPlaceOrderDTO dto, Integer appUserId, String openid) {
        // 1. 校验商品是否存在
        TPhysicalGoods physicalGoods = physicalGoodsMapper.selectById(dto.getPhysicalGoodsId());
        if (physicalGoods == null) {
            throw new ServiceException("商品不存在");
        }
 
        // 2. 创建订单
        TPhysicalGoodsOrder order = new TPhysicalGoodsOrder();
        String orderCode = OrderCodeGenerator.generatePhysicalGoodsOrderCode();
        order.setCode(orderCode);
        order.setAppUserId(appUserId);
        order.setCreateTime(LocalDateTime.now());
        order.setPhysicalGoodsId(dto.getPhysicalGoodsId());
        order.setPhysicalGoods(JSON.toJSONString(physicalGoods));
        order.setOrderPrice(physicalGoods.getTotalPrice());
        order.setPaymentPrice(physicalGoods.getTotalPrice());
        // 支付方式:1=微信
        order.setPaymentMethod(1);
        // 订单状态:1=待付款
        order.setStatus(1);
        order.setDelFlag(0);
 
        this.save(order);
 
        // 3. 更新商品销量
        Integer currentSales = physicalGoods.getSales() == null ? 0 : physicalGoods.getSales();
        physicalGoods.setSales(currentSales + 1);
        physicalGoodsMapper.updateById(physicalGoods);
 
        // 4. 调用工行支付
        log.info("实物商品下单,订单号:{},支付金额:{},用户ID:{}", orderCode, physicalGoods.getTotalPrice(), appUserId);
        JSONObject paymentParams = icbcPayUtil.wechatPay(orderCode, physicalGoods.getTotalPrice(), physicalGoods.getName(), openid,icbcConfig.getNotifyUrl()+"/physical/pay-notify");
 
        // 5. 构建返回结果
        PlaceOrderVO vo = new PlaceOrderVO();
        vo.setOrderIds(Collections.singletonList(order.getId()));
        vo.setOrderCodes(Collections.singletonList(orderCode));
        vo.setPaymentParams(paymentParams);
        return vo;
    }
}