cloudroam
2024-12-04 6c823dd44dbde79f008001a2a11e7bf9bc6bf8cc
src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java
@@ -9,13 +9,15 @@
import com.mzl.flower.dto.request.payment.TransferDetailReqDTO;
import com.mzl.flower.dto.request.payment.TransferReqDTO;
import com.mzl.flower.dto.request.payment.UserPaymentDTO;
import com.mzl.flower.entity.flower.Flower;
import com.mzl.flower.entity.payment.*;
import com.mzl.flower.entity.system.UserWechat;
import com.mzl.flower.mapper.flower.FlowerMapper;
import com.mzl.flower.mapper.payment.*;
import com.mzl.flower.mapper.system.UserWechatMapper;
import com.mzl.flower.service.BaseService;
import com.mzl.flower.service.coupon.CouponRecordService;
import com.mzl.flower.service.flower.FlowerService;
import com.mzl.flower.service.point.PointGoodsService;
import com.mzl.flower.utils.UUIDGenerator;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
@@ -43,9 +45,7 @@
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -103,6 +103,18 @@
    @Autowired
    private OrderRefundMapper orderRefundMapper;
    @Autowired
    private OrderPointGoodsMapper orderPointGoodsMapper;
    @Autowired
    private PointGoodsService pointGoodsService;
    @Autowired
    private CouponRecordService couponRecordService;
    @Autowired
    private OrderService orderService;
    /**
     * 微信预支付
@@ -166,7 +178,7 @@
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
        // 使用formatter格式化ZonedDateTime
        String formattedDateTime = zonedDateTime.plusMinutes(5).format(formatter);
        String formattedDateTime = zonedDateTime.plusMinutes(15).format(formatter);
        return formattedDateTime; // 格式化日期
    }
@@ -316,6 +328,18 @@
                    order.setPaymentAmount(order.getTotalAmount());
                }
                order.setPaymentTime(up.getPaymentTimeCallback());
                if(null!=order.getPaymentTime()){
                    LocalDateTime paymentTime = order.getPaymentTime();
                    LocalDate paymentDate = paymentTime.toLocalDate();
                    LocalDateTime today1700 = paymentTime.with(LocalTime.of(17, 0));
                    // 比较时间是否大于当天的 17:00
                    if (paymentTime.isAfter(today1700)) {
                        // 如果大于 17:00,设置为下一天的日期
                        paymentDate = paymentDate.plusDays(1);
                    }
                    order.setPaymentDateSta(paymentDate);
                }
                order.setStatus(Constants.ORDER_STATUS.SEND.name());
            } else if (Constants.ORDER_STATUS_BACKEND.CANCEL.name().equals(orderStatus)){
                order.setStatus(Constants.ORDER_STATUS.CANCEL.name());
@@ -439,11 +463,46 @@
    }
    private void releasePrepayLock(Order order){
        log.info("恢复库存: " + order);
        log.info("恢复库存 积分商品兑换券 优惠券: " + order);
        revertFlowerStock(order.getId());
        //恢复积分商品兑换券
        revertPointGoodsRecord(order.getId());
        //恢复优惠券
        String memberCouponId = order.getMemberCouponId();
        if(StringUtils.isNotEmpty(memberCouponId)) {
            couponRecordService.cancelCouponUsage(order.getId());
        }
    }
    private void revertPointGoodsRecord(String orderId){
        List<OrderPointGoods> ls = orderPointGoodsMapper.selectList(new QueryWrapper<OrderPointGoods>()
                .eq("order_id", orderId));
        if(ls != null && ls.size() > 0){
            for(OrderPointGoods pg : ls){
                pointGoodsService.revertExchangeGoods(pg.getGoodsRecordId());
            }
        }
    }
    public Map payAgain(String orderId){
        // 获取订单里面的商品是否有限购的,如果有则判断是否已经超过限购数量
        List<OrderItem> orderItemList = orderItemMapper.selectList(new QueryWrapper<OrderItem>()
                .eq("order_id", orderId));
        orderItemList.forEach(orderItem -> {
            // 限购数量 鲜花数量校验
            Integer completeNumToday=orderService.getFlowerCompleteNumToday(orderItem.getCreateBy(),orderItem.getFlowerId());
            Integer tmp=completeNumToday+orderItem.getNum();
            Flower flower=flowerMapper.selectById(orderItem.getFlowerId());
            if(null!=flower.getLimited() && tmp.compareTo(flower.getLimited())>0){
                throw new ValidationException("商品:'"+flower.getName()+"' 昨天17:00到今天17:00 超过限售数量:"+flower.getLimited()+"!");
            }
        });
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", orderId));
        if(StringUtils.isNotEmpty(up.getStatus())){
@@ -490,15 +549,6 @@
        request.setTransactionId(o.getPaymentTrId());
        request.setNotifyUrl(PyamentV3Configurer.notify_url_refund);
        AmountReq amount = new AmountReq();
        int oa = prepareAmount(o.getPaymentAmount());
        amount.setTotal((long)oa);
        amount.setRefund((long)oa);
        amount.setCurrency("CNY");
        request.setAmount(amount);
        // 调用接口
        refundService.create(request);
        o.setRefundAmount(o.getPaymentAmount());
        o.setRefundNo(request.getOutRefundNo());
        o.setRefundTime(LocalDateTime.now());
@@ -512,6 +562,16 @@
        deliveryOrderService.refundDelete(orderId);
        releasePrepayLock(o);
        //最后调用微信退款接口,防止回滚
        AmountReq amount = new AmountReq();
        int oa = prepareAmount(o.getPaymentAmount());
        amount.setTotal((long)oa);
        amount.setRefund((long)oa);
        amount.setCurrency("CNY");
        request.setAmount(amount);
        // 调用接口
        refundService.create(request);
    }
    public String refundOrderSub(Order o, BigDecimal refundAmount){
@@ -652,8 +712,8 @@
        InitiateBatchTransferRequest request = new InitiateBatchTransferRequest();
        request.setAppid(dto.getAppId());
        request.setOutBatchNo(transfer.getId());//【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一
        request.setBatchName(transfer.getName());//【批次名称】 该笔批量转账的名称
        request.setBatchRemark(transfer.getRemarks());//【批次备注】 转账说明,UTF8编码,最多允许32个字符
        request.setBatchName(subString(transfer.getName(), 32));//【批次名称】 该笔批量转账的名称
        request.setBatchRemark(subString(transfer.getRemarks(), 32));//【批次备注】 转账说明,UTF8编码,最多允许32个字符
        List<TransferDetailReqDTO> details = dto.getDetails();
        transfer.setTotalNum(details.size());
@@ -698,6 +758,19 @@
        return transfer.getId();
    }
    private String subString(String str, int len){
        if(StringUtils.isEmpty(str)){
            return str;
        }
        int length = str.length();
        if(length > len){
            return str.substring(0, len - 1);
        }
        return str;
    }
    public void checkTransferStatus(Transfer transfer) {//定时任务验证转账状态
        GetTransferBatchByOutNoRequest request = new GetTransferBatchByOutNoRequest();
        request.setOutBatchNo(transfer.getId());