puzhibing
2023-11-24 328ac3b6130819a31a7ba2d6af84ceec5c9584bf
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -952,6 +953,44 @@
            request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentCallback");
            R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl());
            if(r.getCode() != 200){
                throw new ServiceException(r.getMsg());
            }else{
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                        int time = 0;
                        for (int i = 0; i < 13; i++) {
                            try {
                                time += (5000 * i);
                                Thread.sleep(time);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            R<WeixinPaymentNotifyVo> voR = HuiFuTianXiaUtil.queryPayment(outTradeNo, sdf.format(new Date()));
                            if(voR.getCode() == 200){
                                WeixinPaymentNotifyVo data = voR.getData();
                                //P:处理中;S:成功;F:失败;I: 初始(初始状态很罕见,请联系汇付技术人员处理);
                                String transStat = data.getTransStat();
                                if("S".equals(transStat)){
                                    PartnerTransactionsResult transaction = new PartnerTransactionsResult();
                                    transaction.setOutTradeNo(data.getReqSeqId());
                                    payBack(transaction, data.getFeeFlag() == 1 ? BigDecimal.ZERO : new BigDecimal(data.getFeeAmount()));
                                    return;
                                }
                                if("P".equals(transStat) || "F".equals(transStat)){
                                    continue;
                                }
                                log.error("支付失败,流水号:{}, 状态码:{}", outTradeNo, transStat);
                                return;
                            }else{
                                log.error("支付查询失败!流水号:{},结果:{}", outTradeNo, voR.getMsg());
                            }
                        }
                    }
                }).start();
            }
            com.alibaba.fastjson.JSONObject data = r.getData();
            String mainMchId = WxPayConfiguration.getPlatformTyMacId();
            // 支付相关信息返回
@@ -1226,7 +1265,12 @@
                }
                appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime));
                // 小程序微信下单支付
                createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
//                createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
//                        orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(),
//                        appPlaceActivityDto.getSpbillCreateIp());
                // 小程序微信下单支付 TODO 更换支付渠道(汇付天下)
                createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
                        orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(),
                        appPlaceActivityDto.getSpbillCreateIp());
                //生成自动取消订单延时任务
@@ -1504,11 +1548,6 @@
        Order order = this.getById(orderId);
        if (order.getOrderStatus() != 2) {
            throw new ServiceException(AppErrorConstant.VERIFY_USED);
        }
        //判断商户是否有分账权限
        Shop shop = remoteShopService.getShop(shopId).getData();
        if(shop.getAccountFlag()!=1){
            throw new ServiceException(AppErrorConstant.SHOP_NO_VERIFY);
        }
        // 根据订单用户ID获取用户信息
        Member member = remoteMemberService.getMember(order.getUserId()).getData();
@@ -1894,10 +1933,14 @@
        }
        this.saveOrUpdate(order);
        // 订单金额大于0时进行分账
        if (order.getOnlinePayMoney().compareTo(BigDecimal.ZERO)>0) {
        OrderPayment orderPayment = orderPaymentService.getOne(new QueryWrapper<OrderPayment>()
                .eq("order_id", order.getOrderId()).eq("pay_status", 2)
                .eq("del_flag", 0));
        BigDecimal bigDecimal = orderPayment.getPayMoney().subtract(orderPayment.getFeeAmount()).setScale(2, BigDecimal.ROUND_HALF_EVEN);
        if (bigDecimal.compareTo(BigDecimal.ZERO)>0) {
            // TODO: 2023/10/17  更换分账渠道(汇付天下)
//            submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom());
            submitProfitSharing1(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom());
            submitProfitSharing1(orderId, order.getOrderNo(), order.getShopId(), bigDecimal, order.getOrderFrom());
        }
        //创建支付记录
        if(merVerifyOrderDto.getRelPayMoney().compareTo(BigDecimal.ZERO)>0){
@@ -2043,6 +2086,8 @@
            OrderPayment payment = orderPaymentService.getByOrderId(orderId);
            String transactionId = payment.getTransactionId();
            String outTradeNo = payment.getOutTradeNo();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String org_req_date = sdf.format(payment.getCreateTime());
            R<ShopAuthenticationHftxVo> resultMch = remoteShopService.getShopHFTXSubMchId(shopId);
            ShopAuthenticationHftxVo vo = resultMch.getData();
            if (StringUtils.isEmpty(vo.getHuifuId())) {
@@ -2056,7 +2101,11 @@
                BigDecimal proportionPercent = null;
                //商户订单获取统一分成 活动订单获取活动分成
                if(orderFrom==1){
                    proportionPercent = new BigDecimal(vo.getShareRatio());
                    if(null == vo.getShareRatio()){
                        proportionPercent = new BigDecimal(redisService.getCacheObject(SecurityConstant.SHOP_COMMON_PROPORTION).toString());
                    }else{
                        proportionPercent = new BigDecimal(vo.getShareRatio());
                    }
                }else{
                    R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(shopId);
                    shopProportion = resultShopProportion.getData();
@@ -2074,7 +2123,7 @@
                    if(proportionPercent.compareTo(BigDecimal.ZERO)>0){
                        PaymentDelaytransHFTXVo result = new PaymentDelaytransHFTXVo();
                        // 计算分成金额
                        int amount = orderMoney.multiply(proportionPercent).setScale(0, RoundingMode.UP).intValue();
                        int amount = orderMoney.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).intValue();
                        BigDecimal multiply = orderMoney.multiply(proportionPercent.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN);
                        log.info("订单分账:{} 分账金额: {}", orderNo, amount);
                        if (amount > 0) {
@@ -2089,20 +2138,24 @@
                            // 分账完成
                            request.setFinish(true);
                            NumberFormat numberFormat = NumberFormat.getInstance();
                            numberFormat.setMaximumFractionDigits(2);
                            //分账对象
                            JSONArray acctInfos = new JSONArray();
                            JSONObject jsonObject = new JSONObject();
                            jsonObject.put("div_amt", numberFormat.format(multiply.doubleValue()));
                            jsonObject.put("huifu_id", vo.getHuifuId());
                            if(multiply.compareTo(BigDecimal.ZERO) > 0){
                                JSONObject jsonObject = new JSONObject();
                                jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue()));
                                jsonObject.put("huifu_id", vo.getHuifuId());
                                acctInfos.add(jsonObject);
                            }
                            //平台商户
                            double pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                            JSONObject jsonObject1 = new JSONObject();
                            jsonObject1.put("div_amt", numberFormat.format(pt_amount));
                            jsonObject1.put("huifu_id", HuiFuTianXiaUtil.huifu_id);
                            acctInfos.add(jsonObject1);
                            R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), outTradeNo, acctInfos);
                            BigDecimal pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN);
                            if(pt_amount.compareTo(BigDecimal.ZERO) > 0){
                                JSONObject jsonObject1 = new JSONObject();
                                jsonObject1.put("div_amt", String.format("%.2f", pt_amount.doubleValue()));
                                jsonObject1.put("huifu_id", "6666000141216769");
                                acctInfos.add(jsonObject1);
                            }
                            R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), org_req_date, outTradeNo, acctInfos);
                            if(hftxVoR.getCode() != 200){
                                throw new ServiceException(hftxVoR.getMsg());
                            }
@@ -2123,6 +2176,7 @@
                log.info(resultMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMessage = String.format("订单分账:%s 分账失败:%s", orderNo, e.getMessage());
            log.info(resultMessage);
            throw new ServiceException(resultMessage);
@@ -3172,8 +3226,6 @@
        Order order = this.getById(orderId);
        // 获取会员信息
        Member member = remoteMemberService.getMember(order.getUserId()).getData();
        // 获取商店信息
        Shop shop = remoteShopService.getShop(order.getShopId()).getData();
        // 获取订单商品详细信息
        List<MgtOrderGoodsDetailVo> orderGoodsDetailVoList = orderGoodsService.listMgtVoByOrderId(orderId);
        // 设置MgtOrderDetailVo属性
@@ -3203,6 +3255,7 @@
        }
        // 设置订单编号
        mgtOrderDetailVo.setOrderNo(order.getOrderNo());
        mgtOrderDetailVo.setOutTradeNo(order.getOutTradeNo());
        // 设置订单来源
        switch (order.getOrderFrom()) {
            case 1:
@@ -3233,10 +3286,12 @@
        mgtOrderDetailVo.setCancelTime(order.getCancelTime());
        mgtOrderDetailVo.setOrderRemark(order.getOrderRemark());
        mgtOrderDetailVo.setShopId(order.getShopId());
        if (shop != null) {
        if (3 == order.getOrderStatus()) {
            // 获取商店信息
            Shop shop = remoteShopService.getShop(order.getShopId()).getData();
            mgtOrderDetailVo.setShopName(shop.getShopName());
        } else {
            mgtOrderDetailVo.setShopName("商户已被删除");
            mgtOrderDetailVo.setShopName("");
        }
        mgtOrderDetailVo.setVerifyTime(order.getUseTime());
        //获取支付记录
@@ -5108,12 +5163,15 @@
    @Override
    @Transactional
    @GlobalTransactional(rollbackFor = Exception.class)
    public void payBack(PartnerTransactionsResult transaction) {
    public void payBack(PartnerTransactionsResult transaction, BigDecimal feeAmount) {
        log.info("订单支付回调---"+transaction.toString());
        // Order order = this.getById(orderId);
        // 更新订单状态 outTradeNo
        String outTradeNo = transaction.getOutTradeNo();
        Order order = this.getByOutTradeNo(outTradeNo);
        if(order.getOrderStatus() != 1){
            return;
        }
        String orderId = order.getOrderId();
        order.setOrderStatus(2);
        order.setPayTime(new Date());
@@ -5159,12 +5217,8 @@
            goodsTotalChangeDto.setChangeType(1);
            goodsTotalChangeDto.setChangeNum(orderGoods.getBuyNum());
            goodsTotalChangeDto.setMoney(orderGoods.getGoodsReceivableMoney());
            Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(order.getUserId(), orderGoods.getGoodsId());
            if (bugGoodsNum == null || bugGoodsNum < 1) {
                goodsTotalChangeDto.setPersonNum(1);
            }else{
                goodsTotalChangeDto.setPersonNum(0);
            }
            Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(orderGoods.getGoodsId());
            goodsTotalChangeDto.setPersonNum(bugGoodsNum);
            goodsTotalChangeDtoList.add(goodsTotalChangeDto);
        }
        //更新商品统计
@@ -5239,7 +5293,7 @@
            profitsSharingService.applyProfitSharing(request);*/
        }
        //修改支付记录生成支付记录
        orderPaymentService.updatePaySuccess(transaction.getOutTradeNo(), transaction.getTransactionId());
        orderPaymentService.updatePaySuccess(transaction.getOutTradeNo(), feeAmount, transaction.getTransactionId());
        PayRecord payRecord = new PayRecord();
        payRecord.setDelFlag(0);
        payRecord.setOrderId(orderId);
@@ -5370,12 +5424,8 @@
                goodsTotalChangeDto.setChangeType(2);
                goodsTotalChangeDto.setChangeNum(orderGoods.getBuyNum());
                goodsTotalChangeDto.setMoney(orderGoods.getGoodsReceivableMoney());
                Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(order.getUserId(), orderGoods.getGoodsId());
                if (bugGoodsNum == null || bugGoodsNum <= orderGoods.getBuyNum()) {
                    goodsTotalChangeDto.setPersonNum(1);
                }else{
                    goodsTotalChangeDto.setPersonNum(0);
                }
                Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(orderGoods.getGoodsId());
                goodsTotalChangeDto.setPersonNum(bugGoodsNum);
                goodsTotalChangeDtoList.add(goodsTotalChangeDto);
            }
            remoteGoodsService.changeGoodsTotal(goodsTotalChangeDtoList);
@@ -5522,10 +5572,10 @@
            log.info("调用微信退款---发起退款");
            String subMchId = orderPayment.getSubMchId();
            WxPayConfig config = wxService.getConfig();
//            WxPayConfig config = wxService.getConfig();
            RefundsRequest request = new RefundsRequest();
            request.setSpAppid(config.getAppId());
//            request.setSpAppid(config.getAppId());
            request.setSubMchid(subMchId);
            request.setTransactionId(orderPayment.getTransactionId());
            request.setOutRefundNo(outRefundNo);
@@ -5537,7 +5587,7 @@
            request.setAmount(amount);
            request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentRefundCallback");
            RefundsResult result = wxService.getEcommerceService().refunds(request);
//            RefundsResult result = wxService.getEcommerceService().refunds(request);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String org_req_date = sdf.format(orderPayment.getCreateTime());
@@ -5554,14 +5604,14 @@
            Gson gson = new Gson();
            String refundRequestJson = gson.toJson(request);
            // 返回参数
            String refundResponseJson = gson.toJson(result);
//            String refundResponseJson = gson.toJson(result);
            log.info("调用微信退款返回参数---{}", refundResponseJson);
//            log.info("调用微信退款返回参数---{}", refundResponseJson);
            // 保存支付订单统一下单日志
            paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson);
//            paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson);
        } catch (WxPayException e) {
        } catch (Exception e) {
            throw new ServiceException(e.getMessage());
        }
    }
@@ -6217,4 +6267,22 @@
        ProfitSharingResult profitSharingResult = wxService.getEcommerceService().queryProfitSharing(request);
        return profitSharingResult;
    }
    @Override
    public List<String> getActivityOrderGoods(String activityId) {
        List<Order> orders = this.baseMapper.selectList(new QueryWrapper<Order>()
                .eq("del_flag", 0)
                .in("order_status", Arrays.asList(1, 2, 3))
                .eq("activity_id", activityId)
        );
        if(orders.size() > 0){
            List<String> collect = orders.stream().map(Order::getOrderId).collect(Collectors.toList());
            List<OrderGoods> list = orderGoodsService.list(new QueryWrapper<OrderGoods>()
                    .eq("del_flag", 0)
                    .in("order_id", collect)
            );
            return list.stream().map(OrderGoods::getGoodsId).collect(Collectors.toList());
        }
        return new ArrayList<>();
    }
}