From e3a2245265516fef78b4737d6fffc939e7c5e0af Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期四, 03 七月 2025 17:56:07 +0800
Subject: [PATCH] bug修改

---
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java |  115 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 79 insertions(+), 36 deletions(-)

diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
index a6ebf4c..f5c55a3 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
@@ -33,12 +33,17 @@
 import com.ruoyi.errand.object.vo.sys.UserStatsVO;
 import com.ruoyi.errand.service.OrderService;
 import com.ruoyi.errand.utils.*;
+import com.ruoyi.errand.utils.sms.AliyunSmsService;
+import com.ruoyi.errand.utils.wx.PayResult;
+import com.ruoyi.errand.utils.wx.RefundCallbackResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -67,11 +72,16 @@
     @Resource
     private DeliveryWebSocket deliveryWebSocket;
 
+    @Autowired
+    private WechatPayService wechatPayService;
+
     @Override
     public ConfirmOrderVO confirmOrder(ConfirmOrderDTO confirmOrderDTO) {
 
         ConfirmOrderVO confirmOrderVO = new ConfirmOrderVO();
         BeanUtils.copyProperties(confirmOrderDTO, confirmOrderVO);
+
+
 
         //小区是否存在
         Community community = communityMapper.selectById(confirmOrderDTO.getCommodityId());
@@ -83,6 +93,10 @@
         }
         //将地址簿信息查询出来
         AddressBook addressBook = addressBookMapper.selectById(confirmOrderDTO.getAddressBookId());
+        //地址簿是否存在
+        if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("地址簿不存在");
+        }
         confirmOrderVO.setRecipientName(addressBook.getRecipientName());
         confirmOrderVO.setRecipientPhone(addressBook.getRecipientPhone());
         confirmOrderVO.setAddressDetail(addressBook.getAddressDetail());
@@ -101,7 +115,7 @@
         }else if (confirmOrderDTO.getPayMethod()==1){
             confirmOrderVO.setPayMethod(1);
             //会员支付
-            if (appuser.getEndTime().isAfter(LocalDateTime.now())) {
+            if (appuser.getEndTime().isBefore(LocalDateTime.now())) {
                 //过期了
                 throw new ServiceException("支付错误:会员已到期");
             }
@@ -118,6 +132,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public R orderPayment(ConfirmOrderDTO confirmOrderDTO) {
         Order order = new Order();
         BeanUtils.copyProperties(confirmOrderDTO, order);
@@ -134,6 +149,10 @@
 
         //将地址簿信息查询出来
         AddressBook addressBook = addressBookMapper.selectById(confirmOrderDTO.getAddressBookId());
+        //地址簿是否存在
+        if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("地址簿不存在");
+        }
         order.setRecipientName(addressBook.getRecipientName());
         order.setRecipientPhone(addressBook.getRecipientPhone());
         order.setAddressDetail(addressBook.getAddressDetail());
@@ -177,18 +196,23 @@
         if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){
             //调起微信支付
             String agencyMatters = order.getAgencyMatters();
-            UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(),  "代办事项",
-                    agencyMatters, "", "/app/order/orderPaymentCallback", appuser.getWxOpenid(), null);
-            if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){
-                return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg());
+            try {
+                R r = wechatPayService.unifiedOrder(order.getId().toString(), order.getOrderNumber(), paymentMoney.toString(), agencyMatters,appuser.getWxOpenid(),"/app/order/orderPaymentCallback");
+                if (null == r || 200 != r.getCode()){
+                    //支付失败 删除订单
+                    order.setDelFlag(1);
+                    this.updateById(order);
+                    //返回报错信息
+                    return R.fail(null == r ? "支付失败" : r.getMsg());
+                }
+                //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
+                long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
+                redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second);
+                return r;
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
-            String rc_result = uniPayResult.getRc_Result();
-            JSONObject jsonObject = JSON.parseObject(rc_result);
-            jsonObject.put("orderId", order.getId().toString());
-            //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
-            long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
-            redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second);
-            return R.ok(jsonObject.toJSONString());
+
         }
 
         //会员支付或支付金额为0直接支付成功
@@ -197,11 +221,17 @@
         order.setOrderTime(LocalDateTime.now());//下单时间
         this.updateById(order);
         Map<String,Object> courier= appUserMapper.getCourierByCommunityId(order.getCommunityId());
-        if (courier == null || courier.isEmpty()) {
+        if (courier == null || courier.isEmpty() ||null == courier.get("id")  ) {
             log.warn("未找到社区ID={}对应的骑手", order.getCommunityId());
             return R.ok();
         }
-        //todo 短信通知
+        if (courier.get("status").equals("0")){
+            log.warn("当前社区骑手离职中,骑手id={}", courier.get("courierId"));
+            return R.ok();
+        }
+        Integer courierIdLong = (Integer) courier.get("courierId");
+        order.setCourierId(courierIdLong);
+        this.updateById(order);
         sendSmsNotificationToCourier(courier,order);
         //小程序弹窗通知
         notifyDeliveryPerson((Long) courier.get("id"), order,1);//1=新订单
@@ -222,8 +252,7 @@
                 return;
             }
 //            String content = String.format("您有新的跑腿订单(订单号:%s),请及时处理!", order.getOrderNumber());
-            //todo  调用短信服务API
-//            SMSUtil.sendSms(order.getOrderNumber(),phoneNumber, "", "");
+            AliyunSmsService.sendOrderRemindSms(phoneNumber);
             log.info("已发送短信通知给骑手: {}", phoneNumber);
         } catch (Exception e) {
             log.error("发送短信通知失败", e);
@@ -242,15 +271,15 @@
     }
 
     @Override
-    public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) {
-        Order order = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, uniPayCallbackResult.getR2_OrderNo()));
+    public R orderPaymentCallback(PayResult payResult) {
+        Order order = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, payResult.getOrderNumber()));
         if(null == order || order.getPayStatus() == 2){
             return R.ok();
         }
         order.setOrderStatus(1);//待确认
         order.setPayStatus(2);//已支付
         order.setOrderTime(LocalDateTime.now());//下单时间
-        String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo();
+        String r7TrxNo = payResult.getTransactionId();
         order.setSerialNumber(r7TrxNo);
         this.updateById(order);
 
@@ -259,7 +288,14 @@
             log.warn("未找到社区ID={}对应的骑手", order.getCommunityId());
             return R.ok();
         }
-        //todo 短信通知
+        if (courier.get("status").equals("0")){
+            log.warn("当前社区骑手离职中,骑手id={}", courier.get("courierId"));
+            return R.ok();
+        }
+        Integer courierIdLong = (Integer) courier.get("courierId");
+        order.setCourierId(courierIdLong);
+        this.updateById(order);
+
         sendSmsNotificationToCourier(courier,order);
         //小程序弹窗通知
         notifyDeliveryPerson((Long) courier.get("id"), order,1);//1=新订单
@@ -283,11 +319,11 @@
                     continue;
                 }
                 //开始执行关闭订单操作
-                CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber());
-                if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) &&
-                        Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){
+                //开始执行关闭订单操作
+                Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber());
+                if((null == map || !map.get("return_code").equals("SUCCESS"))){
                     redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), 0);
-                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult));
+                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg"));
                 }
                 redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber());
                 //删除订单
@@ -320,13 +356,13 @@
                 ||!Objects.equals(order.getAppUserId(), appuser.getId())){
             throw new ServiceException("订单id错误");
         }
-        if (order.getOrderStatus()!=1){
+        if (order.getOrderStatus()!=1 && order.getOrderStatus()!=2){
             throw new ServiceException("订单状态错误");
         }
         //判断地址簿id是否存在
         if (setConfirmOrderDTO.getAddressBookId()!=null){
             AddressBook addressBook = addressBookMapper.selectById(setConfirmOrderDTO.getAddressBookId());
-            if (addressBook==null||addressBook.getDel_flag().equals(DelFlagConstant.DELETE)){
+            if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
                 throw new ServiceException("该地址簿id不存在");
             }
             if (!Objects.equals(addressBook.getCommunityId(), order.getCommunityId())){
@@ -392,13 +428,16 @@
     }
 
     @Override
-    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
-        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
-        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
+    public R refundPayMoneyCallback(String xmlData) {
+        RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData);
+        if (!result.isSuccess()) {
+            return R.fail(result.getMsg());
+        }
+        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, result.getOrderNo()));
         if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
             return R.ok();
         }
-        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
+        order.setRefundCode(result.getRefundNo());
         order.setRefundStatus(2);
         order.setRefundTime(LocalDateTime.now());
         this.updateById(order);
@@ -411,7 +450,7 @@
         OrderTopInfoVO orderTopInfoVO = new OrderTopInfoVO();
         //总金额
         Map<String, Object> total = this.baseMapper.getOrderTopInfoByDate(communityId,null,null);
-        orderTopInfoVO.setTodayOrderNum(Integer.valueOf(String.valueOf(total.get("num"))) );
+        orderTopInfoVO.setTotalOrderNum(Integer.valueOf(String.valueOf(total.get("num"))) );
         orderTopInfoVO.setTotalOrderAmount(new BigDecimal(String.valueOf(total.get("amount"))));
 
         //今日
@@ -467,6 +506,7 @@
     public IPage<FinanceStatisticsVO> financeStatistics(FinanceStatisticsDTO dto) {
         //查询出总的数量
         IPage<FinanceStatisticsVO> page = new Page<>();
+        dto.setPageNum(Math.max(dto.getPageNum() - 1, 0)*dto.getPageSize());
         page.setTotal(this.getBaseMapper().selectPageTotal(dto));
         List<FinanceStatisticsVO> list=this.getBaseMapper().financeStatistics(dto);
         page.setRecords(list);
@@ -584,14 +624,17 @@
      */
     public R refundPayMoney(Order order) {
         //开始退款
-        BigDecimal paymentAmount = order.getPaymentAmount();
         if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0
             //微信退款
-            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(),
-                    "/app/order/refundPayMoneyCallback");
-            if (!"100".equals(refund.getRa_Status())) {
-                return R.fail(refund.getRc_CodeMsg());//退款失败
+            Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "退款", "/order/refundPayMoneyCallback");
+
+            if (!"SUCCESS".equals(map.get("return_code"))) {
+                return R.fail(map.get("return_msg"));//退款失败
             }
+            //这里申请成功后先返回
+            order.setRefundStatus(1);
+            this.updateById(order);
+            return R.ok();
         }
         return R.ok();
     }

--
Gitblit v1.7.1