Ver Fonte

add 拨打师傅电话

tea há 1 mês atrás
pai
commit
65f8078343

+ 23 - 28
kxmall-app-api/src/main/java/com/kxmall/web/controller/callback/CallbackController.java

@@ -43,30 +43,23 @@ import java.util.List;
 @RequestMapping("/cb")
 public class CallbackController {
 
+    private static final Logger logger = LoggerFactory.getLogger(CallbackController.class);
 
     @Autowired
     private IKxAppOrderService appOrderService;
-
     @Autowired
     private OrderBizService orderBizService;
-
     @Autowired
     private KxStoreOrderProductMapper orderProductMapper;
-
     @Autowired
     private KxStoreProductMapper storeProductMapper;
-
     @Autowired
     private KxGroupShopMapper groupShopMapper;
-
     @Autowired
     private AdminNotifyBizService adminNotifyBizService;
-
     @Autowired
     private AdminPrintBizService adminPrintBizService;
 
-    private static final Logger logger = LoggerFactory.getLogger(CallbackController.class);
-
     @RequestMapping("/wxpay")
     @SaIgnore
     @Transactional(rollbackFor = Exception.class)
@@ -75,10 +68,10 @@ public class CallbackController {
         WxPayOrderNotifyResult result;
         try {
             WxPayService wxPayService = WxPayConfiguration.getPayService(PayMethodEnum.H5);
-            if(wxPayService == null) {
+            if (wxPayService == null) {
                 wxPayService = WxPayConfiguration.getPayService(PayMethodEnum.MINI);
             }
-            if(wxPayService == null) {
+            if (wxPayService == null) {
                 wxPayService = WxPayConfiguration.getPayService(PayMethodEnum.APP);
             }
             result = wxPayService.parseOrderNotifyResult(body);
@@ -98,17 +91,24 @@ public class CallbackController {
         String payId = result.getTransactionId();
 
         List<KxStoreOrderVo> KxStoreOrderList = appOrderService.selectListVoByWrapper(
-            new QueryWrapper<KxStoreOrder>()
-                .eq("order_id", orderNo));
+                new QueryWrapper<KxStoreOrder>()
+                        .eq("order_id", orderNo));
 
         if (CollectionUtils.isEmpty(KxStoreOrderList)) {
             return WxPayNotifyResponse.fail("订单不存在 orderNo=" + orderNo);
         }
 
         KxStoreOrderVo order = KxStoreOrderList.get(0);
+        KxStoreOrder updateOrderDO = KxStoreOrder.builder().build();
+        updateOrderDO.setPayId(payId);
+        updateOrderDO.setPayChannel("WX");
+        updateOrderDO.setPayTime(new Date());
+        updateOrderDO.setUpdateTime(order.getPayTime());
 
         // 检查这个订单是否已经处理过
         if (order.getStatus() != OrderStatusType.UNPAY.getCode()) {
+            logger.warn("【{}】 订单状态异常:{}, 更新支付信息", orderNo, order.getStatus());
+            orderBizService.changeOrderStatus(orderNo, order.getStatus(), updateOrderDO);
             return WxPayNotifyResponse.success("订单已经处理成功!");
         }
 
@@ -121,12 +121,7 @@ public class CallbackController {
 
         //**************** 在此之前都没有 数据库修改 操作 所以前面是直接返回错误的 **********************//
 
-        KxStoreOrder updateOrderDO = KxStoreOrder.builder().build();
-        updateOrderDO.setPayId(payId);
-        updateOrderDO.setPayChannel("WX");
-        updateOrderDO.setPayTime(new Date());
-        updateOrderDO.setUpdateTime(order.getPayTime());
-        if (order.getCombinationId() != null && order.getCombinationId()!=0L) {
+        if (order.getCombinationId() != null && order.getCombinationId() != 0L) {
             updateOrderDO.setStatus(OrderStatusType.GROUP_SHOP_WAIT.getCode());
         } else {
             updateOrderDO.setStatus(OrderStatusType.WAIT_PREPARE_GOODS.getCode());
@@ -136,15 +131,15 @@ public class CallbackController {
         List<KxStoreOrderProductVo> orderProducts = orderProductMapper.selectVoList(new QueryWrapper<KxStoreOrderProduct>().eq("order_id", order.getId()));
         order.setProductList(orderProducts);
         orderProducts.forEach(item -> {
-            //增加销量
+            // 增加销量
             storeProductMapper.incSales(item.getProductId(), item.getNum());
             if (order.getCombinationId() != null) {
-                //增加团购人数, 若想算商品数这里就获取orderSku的数量,若想算人数,这里就写1
+                // 增加团购人数, 若想算商品数这里就获取orderSku的数量,若想算人数,这里就写1
                 groupShopMapper.incCurrentNum(order.getCombinationId(), item.getNum());
             }
         });
 
-        //通知管理员发货
+        // 通知管理员发货
         GlobalExecutor.execute(() -> {
             adminNotifyBizService.newOrder(order);
             adminPrintBizService.newOrderPrint(order);
@@ -161,8 +156,8 @@ public class CallbackController {
 
 
         List<KxStoreOrderVo> KxStoreOrderList = appOrderService.selectListVoByWrapper(
-            new QueryWrapper<KxStoreOrder>()
-                .eq("order_id", orderNo));
+                new QueryWrapper<KxStoreOrder>()
+                        .eq("order_id", orderNo));
 
         if (CollectionUtils.isEmpty(KxStoreOrderList)) {
             return WxPayNotifyResponse.fail("订单不存在 orderNo=" + orderNo);
@@ -182,27 +177,27 @@ public class CallbackController {
         updateOrderDO.setPayChannel("WX");
         updateOrderDO.setPayTime(new Date());
         updateOrderDO.setUpdateTime(order.getPayTime());
-        if (order.getCombinationId() != null && order.getCombinationId()!=0L) {
+        if (order.getCombinationId() != null && order.getCombinationId() != 0L) {
             updateOrderDO.setStatus(OrderStatusType.GROUP_SHOP_WAIT.getCode());
         } else {
             updateOrderDO.setStatus(OrderStatusType.WAIT_PREPARE_GOODS.getCode());
         }
         orderBizService.changeOrderStatus(orderNo, OrderStatusType.UNPAY.getCode(), updateOrderDO);
 
-        //扣款
+        // 扣款
 
         List<KxStoreOrderProductVo> orderProducts = orderProductMapper.selectVoList(new QueryWrapper<KxStoreOrderProduct>().eq("order_id", order.getId()));
         order.setProductList(orderProducts);
         orderProducts.forEach(item -> {
-            //增加销量
+            // 增加销量
             storeProductMapper.incSales(item.getProductId(), item.getNum());
             if (order.getCombinationId() != null) {
-                //增加团购人数, 若想算商品数这里就获取orderSku的数量,若想算人数,这里就写1
+                // 增加团购人数, 若想算商品数这里就获取orderSku的数量,若想算人数,这里就写1
                 groupShopMapper.incCurrentNum(order.getCombinationId(), item.getNum());
             }
         });
 
-        //通知管理员发货
+        // 通知管理员发货
         GlobalExecutor.execute(() -> {
             adminNotifyBizService.newOrder(order);
             adminPrintBizService.newOrderPrint(order);

+ 37 - 0
kxmall-app-api/src/main/java/com/kxmall/web/controller/order/KxAppOrderController.java

@@ -24,6 +24,7 @@ import com.kxmall.web.controller.order.builder.OrderBuilder;
 import com.kxmall.web.controller.order.builder.OrderDirector;
 import com.kxmall.web.controller.order.service.IKxAppOrderService;
 import com.kxmall.web.controller.storage.service.IKxAppStorageService;
+import com.kxmall.rider.mapper.KxRiderMapper;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
@@ -60,6 +61,7 @@ public class KxAppOrderController extends BaseAppController {
     private final OrderBuilder orderBuilder;
     private final IKxAppOrderService appOrderService;
     private final IKxAppStorageService appStorageService;
+    private final KxRiderMapper riderMapper;
 
     /**
      * 提交订单
@@ -267,6 +269,41 @@ public class KxAppOrderController extends BaseAppController {
         }
     }
 
+    /**
+     * 获取师傅联系信息
+     *
+     * @param orderId 订单ID
+     * @return 师傅联系信息
+     */
+    @GetMapping("/getRiderContact")
+    public R<Map<String, Object>> getRiderContact(Long orderId) {
+        Long userId = getAppLoginUser().getUserId();
+        
+        // 获取订单详情
+        KxStoreOrderVo orderDetail = appOrderService.getOrderDetail(orderId, userId);
+        if (orderDetail == null) {
+            throw new ServiceException("订单不存在");
+        }
+        
+        Long riderId = orderDetail.getPostId();
+        if (riderId == null || riderId == 0) {
+            throw new ServiceException("订单暂未分配师傅");
+        }
+        
+        // 获取师傅信息
+        com.kxmall.rider.domain.KxRider rider = riderMapper.selectById(riderId);
+        if (rider == null) {
+            throw new ServiceException("师傅信息不存在");
+        }
+        
+        Map<String, Object> result = new HashMap<>();
+        result.put("riderId", rider.getId());
+        result.put("riderName", rider.getName());
+        result.put("riderPhone", rider.getPhone());
+        
+        return R.ok(result);
+    }
+
     /**
      * 生成随机的经度
      * 经度范围:-180 到 180

+ 0 - 1
kxmall-app-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxAppOrderService.java

@@ -94,7 +94,6 @@ public class KxAppOrderService implements IKxAppOrderService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Object wxPrepay(String orderId, Long userId, Integer loginType, String openId) {
-        Date now = new Date();
         KxStoreOrder updateOrderDO = orderBizService.checkOrderExist(orderId, userId);
         // 检测订单状态
         Integer status = updateOrderDO.getStatus();

+ 21 - 22
kxmall-app-api/src/main/java/com/kxmall/web/controller/quartz/CheckQuartz.java

@@ -60,7 +60,6 @@ public class CheckQuartz {
     @Autowired
     private TransactionTemplate transactionTemplate;
 
-
     @Autowired
     private IKxAppOrderService appOrderService;
 
@@ -90,22 +89,22 @@ public class CheckQuartz {
                         }
                     });
                 }
-                //15分钟执行一次
-                long minutes = (now.getTime() / (1000 * 60));
-                if (minutes % 15 == 0) {
-                    List<String> waitConfirmNos = orderMapper.selectExpireOrderNos(OrderStatusType.WAIT_CONFIRM.getCode(), new Date(now.getTime() - 1000l * 60 * 60 * 24 * 7));
-                    waitConfirmNos.forEach(item -> {
-                        try {
-
-                            KxStoreOrder kxStoreOrder = orderMapper.selectOne(new LambdaQueryWrapper<KxStoreOrder>().eq(KxStoreOrder::getOrderId, item));
-                            if (!ObjectUtils.isEmpty(kxStoreOrder)) {
-                                appOrderService.confirm(kxStoreOrder.getOrderId(), kxStoreOrder.getUid());
-                            }
-                        } catch (Exception e) {
-                            logger.error("[未确认检测] 异常", e);
-                        }
-                    });
-                }
+                // 15分钟执行一次
+                // long minutes = (now.getTime() / (1000 * 60));
+                // if (minutes % 15 == 0) {
+                //     List<String> waitConfirmNos = orderMapper.selectExpireOrderNos(OrderStatusType.WAIT_CONFIRM.getCode(), new Date(now.getTime() - 1000l * 60 * 60 * 24 * 7));
+                //     waitConfirmNos.forEach(item -> {
+                //         try {
+                //
+                //             KxStoreOrder kxStoreOrder = orderMapper.selectOne(new LambdaQueryWrapper<KxStoreOrder>().eq(KxStoreOrder::getOrderId, item));
+                //             if (!ObjectUtils.isEmpty(kxStoreOrder)) {
+                //                 appOrderService.confirm(kxStoreOrder.getOrderId(), kxStoreOrder.getUid());
+                //             }
+                //         } catch (Exception e) {
+                //             logger.error("[未确认检测] 异常", e);
+                //         }
+                //     });
+                // }
             }
         } catch (Exception e) {
             logger.error("[订单状态检测定时任务] 异常", e);
@@ -118,7 +117,7 @@ public class CheckQuartz {
     /**
      * 设定60s跑一次,团购商品到期自动退款,改变状态
      */
-    @Scheduled(fixedRate = 60000)
+    // @Scheduled(fixedRate = 60000)
     @Transactional(rollbackFor = Exception.class)
     public void groupShopStart() throws Exception {
         Lock lock = RedisUtils.lock(GROUP_SHOP_START_LOCK);
@@ -163,7 +162,7 @@ public class CheckQuartz {
 
     }
 
-    @Scheduled(fixedRate = 60000)
+    // @Scheduled(fixedRate = 60000)
     @Transactional(rollbackFor = Exception.class)
     public void groupShopEnd() throws Exception {
         Lock lock = RedisUtils.lock(GROUP_SHOP_END_LOCK);
@@ -178,7 +177,7 @@ public class CheckQuartz {
                  */
                 QueryWrapper<KxGroupShop> wrapper = new QueryWrapper<KxGroupShop>()
                         .eq("status", StatusType.ACTIVE.getCode())
-                        .and(w->w.gt("start_time", now).or().le("end_time", now));
+                        .and(w -> w.gt("start_time", now).or().le("end_time", now));
                 List<KxGroupShop> lockGroupShopDOList = groupShopMapper.selectList(wrapper);
                 // 2.2 将团购订单的状态转为对应的退款或待出库状态,对未达人数且自动退款的商品订单进行退款,对达到人数或不自动退款的商品订单转换状态
                 if (!CollectionUtils.isEmpty(lockGroupShopDOList)) {
@@ -206,7 +205,7 @@ public class CheckQuartz {
                                     @Override
                                     protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                                         try {
-                                            //对订单退款保证原子性,仅退款成功的单子,变更状态
+                                            // 对订单退款保证原子性,仅退款成功的单子,变更状态
                                             orderBizService.groupShopStatusRefund(orderDO.getOrderId());
                                             logger.info("[团购订单退款] 完成 orderNo:" + orderDO.getOrderId());
                                         } catch (Exception e) {
@@ -241,7 +240,7 @@ public class CheckQuartz {
 
     }
 
-    @Scheduled(fixedRate = 60000)
+    // @Scheduled(fixedRate = 60000)
     @Transactional(rollbackFor = Exception.class)
     public void groupShopLock() throws Exception {
         Lock lock = RedisUtils.lock(GROUP_SHOP_LOCK_LOCK);

+ 4 - 4
kxmall-rider-api/src/main/java/com/kxmall/web/controller/rider/service/impl/RiderReviewServiceImpl.java

@@ -112,10 +112,10 @@ public class RiderReviewServiceImpl implements RiderReviewService {
         List<KxStoreAppraise> appraises = appraiseMapper.selectList(lqw);
         
         if (CollUtil.isNotEmpty(appraises)) {
-            long count = appraises.stream().filter(StreamUtil.distinctByKey(KxStoreAppraise::getOrderId)).count();
-            stats.put("totalReviews", count);
-            double sum = appraises.stream().mapToDouble(KxStoreAppraise::getScore).sum();
-            BigDecimal avg = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(count), 2, RoundingMode.HALF_UP);
+            List<KxStoreAppraise> distinctAppraises = appraises.stream().filter(StreamUtil.distinctByKey(KxStoreAppraise::getOrderId)).collect(Collectors.toList());
+            stats.put("totalReviews", distinctAppraises.size());
+            double sum = distinctAppraises.stream().mapToDouble(KxStoreAppraise::getScore).sum();
+            BigDecimal avg = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(distinctAppraises.size()), 2, RoundingMode.HALF_UP);
             stats.put("averageRating", avg);
         }
 

+ 5 - 9
kxmall-system/src/main/java/com/kxmall/wechat/WxPayConfiguration.java

@@ -24,17 +24,13 @@ import java.util.Map;
 @Configuration(proxyBeanMethods = false)
 public class WxPayConfiguration {
 
+    private final static String KXMALL_WEIXIN_PAY_SERVICE = "kxmall_weixin_pay_service";
     private static Map<String, WxPayService> payServices = Maps.newHashMap();
-
     private static SysOssMapper sysOssMapper;
-
     private static ISysConfigService configService;
 
-
-    private final static String KXMALL_WEIXIN_PAY_SERVICE = "kxmall_weixin_pay_service";
-
     @Autowired
-    public WxPayConfiguration(ISysConfigService configService,SysOssMapper sysOssMapper) {
+    public WxPayConfiguration(ISysConfigService configService, SysOssMapper sysOssMapper) {
         WxPayConfiguration.configService = configService;
         WxPayConfiguration.sysOssMapper = sysOssMapper;
     }
@@ -78,9 +74,9 @@ public class WxPayConfiguration {
      * 移除WxPayService
      */
     public static void removeWxPayService() {
-        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE+PayMethodEnum.H5.getValue());
-        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE+PayMethodEnum.APP.getValue());
-        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE+PayMethodEnum.MINI.getValue());
+        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE + PayMethodEnum.H5.getValue());
+        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE + PayMethodEnum.APP.getValue());
+        payServices.remove(KXMALL_WEIXIN_PAY_SERVICE + PayMethodEnum.MINI.getValue());
     }
 
 }

+ 5 - 4
需求列表.md

@@ -13,7 +13,7 @@
 
 # 订单互动
 - [ ] 订单内置聊天(*确认需求)
-- [ ] 拨打师傅电话
+- [x] 拨打师傅电话
 - [x] 评价添加师傅
 - [ ] 订单售后-重新服务(*确认需求) xx
 
@@ -35,8 +35,8 @@
 # 订单列表-admin
 - [ ] 手动派单
 - [ ] 手动派单-理由
-- [ ] 订单评价
-- [ ] 售后订单 - 判定责任方 - 退款或补偿
+- [x] 订单评价
+- [x] 售后订单 - 判定责任方 - 退款或补偿
 
 # 报表
 - [ ] 订单统计 展示每日 / 每月订单量、交易额、活跃用户数、活跃师傅数。
@@ -53,4 +53,5 @@
 # 系统bug
 - [x] 订单客户信息有误
 - [ ] 师傅测订单状态异常
-- [x] 退出登录清除余额等信息
+- [x] 退出登录清除余额等信息
+- [x] 订单唤起支付但是未支付,系统取消后支付 !!!