liujie
2025-06-05 a8e83d12274b776b215895273e7021c4eb2ba789
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
package com.ruoyi.system.service.impl;
 
 
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.ruoyi.common.utils.OrderUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.dto.AddBuyerCompanyInfoDto;
import com.ruoyi.system.mapper.TbOrderMapper;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.MyOrderListQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.wx.WxProperties;
import com.ruoyi.system.vo.MyPushCompanyListVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.util.Date;
import java.util.List;
 
/**
 * <p>
 * 订单表 服务实现类
 * </p>
 *
 * @author administrator
 * @since 2025-05-27
 */
@Slf4j
@Service
public class TbOrderServiceImpl extends ServiceImpl<TbOrderMapper, TbOrder> implements TbOrderService {
 
 
    @Resource
    private WxProperties wxProperties;
 
    @Resource
    private WxPayService wxPayService;
 
    @Autowired
    private TbSystemConfigService configService;
 
    @Autowired
    private TbUserService userService;
 
    @Autowired
    private TbCompanyService companyService;
 
    @Autowired
    private TbMessageService messageService;
 
 
    @Override
    public Page<MyPushCompanyListVo> getMyOrderList(MyOrderListQuery query, Long userId) {
        Page<MyPushCompanyListVo> page = new Page<>(query.getPageNum(), query.getPageSize());
        return this.baseMapper.getMyOrderList(page,query,userId);
    }
 
    @Override
    public WxPayMpOrderResult payOrder(TbOrder tbOrder, Long userId) {
        TbUser user = userService.getById(userId);
        WxPayMpOrderResult result = this.createWxOrderToWxService(user.getOpenId(),tbOrder.getOrderNo(),tbOrder.getPrice(),"购买商品", "");
        return result;
    }
 
    @Override
    public void placeOrder(String companyId, TbCompany company,Long userId) {
        // 创建订单
        TbOrder tbOrder = new TbOrder();
        tbOrder.setCompanyId(companyId);
        tbOrder.setUserId(userId.toString());
        tbOrder.setOrderNo( OrderUtil.getOrderNoForPrefix("ZSX"));
        tbOrder.setStatus(2);
        tbOrder.setPrice(company.getSaleMoney());
        tbOrder.insert();
 
        company.setStatus(4);
        company.updateById();
    }
 
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public String weAppletChatNotice(String xmlData) throws WxPayException {
        final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(
                xmlData);
        // 更新用户订单状态
        String outTradeNo = notifyResult.getOutTradeNo();
        TbOrder order = this.getOne(new LambdaQueryWrapper<TbOrder>().eq(TbOrder::getOrderNo, outTradeNo));
        if (order!=null) {
            order.setStatus(4);
            order.setPayTime(new Date());
            order.setOutTradeNo(notifyResult.getTransactionId());
            TbCompany company = companyService.getById(order.getCompanyId());
            // 生成记录  看是否分佣 金额
            TbUser user = userService.getById(company.getUserId());
            TbSystemConfig config = configService.getOne(new LambdaQueryWrapper<TbSystemConfig>().eq(TbSystemConfig::getType, 3));
            if(config!=null){
                JSONObject jsonObject = JSONObject.parseObject(config.getContent());
                BigDecimal platformCommission = new BigDecimal(jsonObject.get("platform").toString());
                BigDecimal userCommission = new BigDecimal(jsonObject.get("user").toString());
                BigDecimal price = order.getPrice();
                BigDecimal divide = platformCommission.divide(new BigDecimal("100"));
                BigDecimal platformCommissionMoney = divide.multiply(price).setScale(2, RoundingMode.HALF_UP);
                if(StringUtils.isNotEmpty(user.getInviteId()) && user.getInviteNum()>0){
                    BigDecimal divide1 = userCommission.divide(new BigDecimal("100"));
                    BigDecimal userCommissionMoney = divide1.multiply(price).setScale(2, RoundingMode.HALF_UP);
                    order.setCommissionPrice(userCommissionMoney);
                }
                order.setShareUserId(user.getInviteId());
                order.setCommissionPlatform(platformCommissionMoney);
            }
            order.updateById();
 
            // 生成记录
            TbAccountDetail tbAccountDetail = new TbAccountDetail();
            tbAccountDetail.setUserId(company.getUserId());
            tbAccountDetail.setType(1);
            tbAccountDetail.setCategory(2);
            tbAccountDetail.setStatus(1);
            BigDecimal subtract = order.getPrice().subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform());
            tbAccountDetail.setMoney(subtract);
            tbAccountDetail.setOrderId(order.getId());
            tbAccountDetail.insert();
 
            // 生成记录
            TbAccountDetail tbAccountDetail1 = new TbAccountDetail();
            tbAccountDetail1.setUserId(order.getUserId());
            tbAccountDetail1.setType(2);
            tbAccountDetail1.setCategory(5);
            tbAccountDetail1.setStatus(2);
            tbAccountDetail1.setMoney(order.getPrice());
            tbAccountDetail1.setOrderId(order.getId());
            tbAccountDetail1.insert();
 
 
            messageService.addMessage("下单成功,请及时发送快递", order.getUserId(),order.getId());
            messageService.addMessage("您发布的订单买家已支付,请尽快处理!", company.getUserId(),order.getId());
        }
 
 
        return "<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>";
    }
 
    @Override
    public void commission(TbOrder order,String userId) {
        String shareUserId = order.getShareUserId();
        if(StringUtils.isNotEmpty(shareUserId)){
            TbUser shareUser = userService.getById(shareUserId);
            BigDecimal add = shareUser.getBalance().add(order.getCommissionPrice());
            shareUser.setBalance(add);
            shareUser.updateById();
 
            TbAccountDetail accountDetail = new TbAccountDetail();
            accountDetail.setUserId(shareUserId);
            accountDetail.setType(1);
            accountDetail.setCategory(4);
            accountDetail.setStatus(2);
            accountDetail.setMoney(order.getCommissionPrice());
            accountDetail.setOrderPrice(order.getPrice());
            accountDetail.setSourceId(order.getUserId());
            accountDetail.insert();
 
 
        }
        BigDecimal decimal = order.getPrice().subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform());
        TbUser user = userService.getById(userId);
        BigDecimal add = user.getBalance().add(decimal);
        user.setBalance(add);
        user.updateById();
 
    }
 
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void lastPayOrderData(TbOrder tbOrder, AddBuyerCompanyInfoDto dto, Long userId,TbCompany company) {
        TbBuyerCompanyInfo tbBuyerCompanyInfo = new TbBuyerCompanyInfo();
        BeanUtils.copyProperties(dto,tbBuyerCompanyInfo);
        tbBuyerCompanyInfo.setOrderId(tbOrder.getId());
        List<TbShareholder> shareholders = dto.getShareholders();
 
        BigDecimal addMoney=BigDecimal.ZERO;
        int addDay=0;
        // 判断是否需要支付改名费 迁区费
        if(dto.getNeedRename()==1){
            addMoney = company.getRenameMoney();
            addDay=company.getRenameDay();
        }
        if(dto.getNewDistrict()==1){
            addMoney = addMoney.add(company.getRelocationAreaMoney());
            addDay = addDay+company.getRelocationAreaDay();
        }
        // 更新订单金额
        if(addMoney.compareTo(BigDecimal.ZERO)>0){
            BigDecimal add = tbOrder.getPrice().add(addMoney);
            tbOrder.setPrice(add);
            tbOrder.updateById();
        }
        if(addDay>0){
            tbBuyerCompanyInfo.setAddDay(addDay);
        }
        tbBuyerCompanyInfo.insert();
        for (TbShareholder shareholder : shareholders) {
            shareholder.setOrderId(tbOrder.getId());
            shareholder.insert();
        }
    }
 
 
    /**
     * @param openId      微信用户openId
     * @param outTradeNo  我们的系统订单编号
     * @param amountPrice      付款金额
     * @param description 商品描述
     * @param type        付款类型 详见PayTypeEnumConst
     * @Description: 向微信服务器发起预付款订单
     * @Return: java.util.Map<java.lang.String, java.lang.Object>
     */
    public WxPayMpOrderResult createWxOrderToWxService(String openId, String outTradeNo,
                                                       BigDecimal amountPrice, String description, String type){
        double amount = amountPrice.doubleValue(); // 将字符串"0.01"转换为浮点数0.01
        int amountInFen = (int) (amount * 100);
        try {
            WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
 
            wxPayUnifiedOrderRequest.setBody("购买商品");
            wxPayUnifiedOrderRequest.setOutTradeNo(outTradeNo);
            wxPayUnifiedOrderRequest.setTotalFee(amountInFen);// 元转成分
            wxPayUnifiedOrderRequest.setOpenid(openId);
            wxPayUnifiedOrderRequest.setSpbillCreateIp(
                    InetAddress.getLoopbackAddress().getHostAddress());
            wxPayUnifiedOrderRequest.setTradeType("JSAPI");
            wxPayUnifiedOrderRequest.setNotifyUrl(
                    wxProperties.getNotifyUrl() +"mall-hotel-order/WX/callback");
            WxPayMpOrderResult result = wxPayService.createOrder(wxPayUnifiedOrderRequest);
 
            return result;
        } catch (WxPayException e) {
            log.error("微信支付失败!订单号:{},原因:{}", outTradeNo, e.getMessage());
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}