From 6acf6357094588946b5528f1ef1ed84a0f1037fd Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期五, 13 六月 2025 19:45:27 +0800
Subject: [PATCH] 小程序收付款

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java |  309 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 253 insertions(+), 56 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
index 37fddf0..9594278 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -4,7 +4,8 @@
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.account.api.feignClient.AppUserClient;
 import com.ruoyi.account.api.model.AppUser;
 import com.ruoyi.common.core.constant.ExpressCompanyMap;
@@ -15,31 +16,46 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.order.dto.ConfirmOrderDTO;
+
 import com.ruoyi.order.enums.OrderStatus;
 import com.ruoyi.order.mapper.OrderMapper;
 import com.ruoyi.order.model.Order;
 import com.ruoyi.order.service.OrderService;
 import com.ruoyi.order.util.payment.model.RefundCallbackResult;
+import com.ruoyi.order.util.payment.model.UniPayCallbackResult;
+import com.ruoyi.order.util.payment.wechat.PayMoneyUtil;
+import com.ruoyi.order.util.payment.wx.WechatPayService;
+import com.ruoyi.order.util.payment.wx.vo.PayResult;
 import com.ruoyi.order.util.vo.MapTrackKD100Vo;
+import com.ruoyi.order.util.vo.ShopAnalysisVO;
 import com.ruoyi.order.vo.*;
 import com.ruoyi.other.api.domain.BaseSetting;
 import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.dto.ShopAnalysisDTO;
 import com.ruoyi.other.api.feignClient.BaseSettingClient;
+import com.ruoyi.other.api.feignClient.ShopClient;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import com.ruoyi.system.api.model.LoginUser;
 import io.swagger.annotations.*;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -69,17 +85,59 @@
     @Resource
     private AppUserClient appUserClient;
 
+    @Resource
+    private ShopClient shopClient;
+    @Resource
+    private PayMoneyUtil payMoneyUtil;
+    @Resource
+    private WechatPayService wechatPayService;
 
 
     @ResponseBody
-    @GetMapping("/confirmOrder")
+    @PostMapping("/confirmOrder")
     @ApiOperation(value = "确定订单", tags = {"商城-订单-小程序"})
-    public R<ConfirmOrderVo> confirmOrder(@ApiParam("商品id") Integer goodId,@ApiParam("支付类型(1-现金,2-积分)")Integer type) {
-        ConfirmOrderVo confirmOrderVo = orderService.confirmOrder(goodId,type);
+    public R<ConfirmOrderVo> confirmOrder(@RequestBody ConfirmOrderDTO confirmOrderDTO) {
+        ConfirmOrderVo confirmOrderVo = orderService.confirmOrder(confirmOrderDTO.getGoodId(),confirmOrderDTO.getType());
         return R.ok(confirmOrderVo);
     }
 
+    @ResponseBody
+    @PostMapping("/orderPayment")
+    @ApiOperation(value = "订单支付", tags = {"商城-订单支付-小程序"})
+    public R orderPayment(@RequestBody OrderPayment orderPayment){
+        return orderService.orderPayment(orderPayment);
+    }
 
+    /**
+     * 订单支付回调通知
+     */
+    @ResponseBody
+    @PostMapping("/orderPaymentCallback")
+    public void orderPaymentCallback(HttpServletRequest request, HttpServletResponse response){
+//        String jsonString = JSONObject.toJSONString(uniPayCallbackResult);
+        System.err.println("1111111111111");
+        PayResult  payResult= null;
+        try {
+            payResult = wechatPayService.processNotify(request);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("1111111111111111111111");
+//        System.out.println(jsonString);
+        R callback = orderService.orderPaymentCallback(payResult);
+        if(callback.getCode() == 200){
+            response.setStatus(200);
+            PrintWriter out = null;
+            try {
+                out = response.getWriter();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            out.println("success");
+            out.flush();
+            out.close();
+        }
+    }
 
     /**
      * 我的订单列表
@@ -119,14 +177,11 @@
      * 扫码校验
      */
     @ApiOperation(value = "扫码校验", tags = {"小程序-个人中心-门店管理"})
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "分享id", name = "shareId", required = true, dataType = "int", paramType = "query"),
-    })
     @GetMapping("/check/{orderNumber}/{shopId}")
     public R<Boolean> check(@PathVariable("orderNumber") String orderNumber, @PathVariable("shopId") Integer shopId) {
         LoginUser loginUserApplet = tokenService.getLoginUserApplet();
         Order order = orderService.getOne(new LambdaQueryWrapper<Order>()
-                .eq(Order::getOrderNumber, orderNumber));
+                .eq(Order::getId, orderNumber));
         return R.ok(orderService.check(order, shopId, loginUserApplet.getUserid()));
     }
 
@@ -134,14 +189,29 @@
      * 订单核销
      */
     @ApiOperation(value = "订单核销", tags = {"小程序-个人中心-门店管理"})
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "String"),
-    })
     @GetMapping("/writeOff")
-    public R<Void> writeOff(String code, Integer shopId, String technicianId) {
-        orderService.writeOff(code, shopId, technicianId);
+    public R<Void> writeOff(@ApiParam("id") String id, @ApiParam("shopId") Integer shopId) {
+        orderService.writeOff(id, shopId);
         return R.ok();
     }
+
+    @GetMapping("/getShopOrderList")
+    @ApiOperation(value = "获取订单列表", tags = {"门店后台-订单管理", })
+    public R<IPage<OrderPageListVo>> getShopOrderList(@ApiParam("模糊查询:订单编号/商品名/手机号 ") String content ,
+                                                      @ApiParam("订单状态") Integer status,
+                                                      @ApiParam("门店id") Integer shopId,
+                                                      @ApiParam("页码") @RequestParam("pageNum") Integer pageNum,
+                                                      @ApiParam("每一页数据大小") @RequestParam("pageSize") Integer pageSize) {
+        return R.ok(orderService.getShopOrderList(content,status,shopId,pageNum,pageSize));
+    }
+
+    @PutMapping("/shopCancelOrder/{orderId}")
+    @ApiOperation(value = "取消订单", tags = {"门店后台-订单管理"})
+    public R shopCancelOrder(@PathVariable("orderId") Long orderId) {
+        return orderService.shopCancelOrder(orderId);
+    }
+
+
 
     /**
      * 取消订单
@@ -241,7 +311,7 @@
 
 
     @PutMapping("/cancelOrder/{orderId}")
-    @ApiOperation(value = "取消订单操作", tags = {"管理后台-订单管理"})
+    @ApiOperation(value = "取消订单操作", tags = {"后台-订单管理"})
     public R cancelOrder(@PathVariable("orderId") Long orderId) {
         return orderService.cancelOrder(orderId);
     }
@@ -262,15 +332,15 @@
 
 
     @GetMapping("/getOrderPageList")
-//    @ApiOperation(value = "获取订单列表", tags = {"管理后台-订单管理", "门店后台-订单管理"})
-    public R<PageInfo<OrderPageListVo>> getOrderPageList(OrderPageList orderPageList) {
+    @ApiOperation(value = "获取订单列表", tags = {"后台-订单管理", })
+    public R<PageInfo<OrderManagePageListVO>> getOrderPageList(OrderPageList orderPageList) {
         return R.ok(orderService.getOrderPageList(orderPageList));
     }
 
     /**
      * 订单统计
      */
-    @GetMapping("/getOrderStatistics")
+ /*   @GetMapping("/getOrderStatistics")
     @ApiOperation(value = "订单统计", tags = {"管理后台-首页统计"})
     public R<OrderStatistics> getOrderStatistics(@RequestParam("startTime") String startTime,
                                                  @RequestParam("endTime") String endTime) {
@@ -348,29 +418,19 @@
         return R.ok(orderStatistics);
     }
 
-
+*/
     /**
      * 订单取消支付回退
-     *
-     * @param refundCallbackResult
-     * @param response
-     * @return
      */
     @ResponseBody
-    @GetMapping("/refundPayMoneyCallback")
-    public void refundPayMoneyCallback(RefundCallbackResult refundCallbackResult, HttpServletResponse response) {
-        R callback = orderService.refundPayMoneyCallback(refundCallbackResult);
+    @PostMapping("/refundPayMoneyCallback")
+    public String refundPayMoneyCallback( @RequestBody(required = false) String xmlData) {
+        R callback = orderService.refundPayMoneyCallback(xmlData);
         if (callback.getCode() == 200) {
-            response.setStatus(200);
-            PrintWriter out = null;
-            try {
-                out = response.getWriter();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-            out.println("success");
-            out.flush();
-            out.close();
+          return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+        }else {
+            System.err.println("支付回退错误:"+callback.getMsg());
+            return "<xml><return_code><![CDATA[FAIL]]></return_code></xml>";
         }
     }
 
@@ -434,12 +494,12 @@
     }
 
 
-    /**
+  /*  *//**
      * 获取订单快递明细
      *
      * @param id
      * @return
-     */
+     *//*
     @GetMapping("/getOrderExpress/{id}")
     @ApiOperation(value = "获取订单快递明细", tags = {"小程序-订单管理"})
     public R<MapTrackKD100Vo> getOrderExpress(@PathVariable("id") Long id) {
@@ -451,7 +511,7 @@
         }
         return R.ok();
     }
-
+*/
 
     /**
      * 根据id获取订单详情
@@ -485,7 +545,7 @@
      */
     @GetMapping("/exportExpress")
     public void exportExpress(HttpServletResponse response, OrderPageList orderPage) {
-        //搜索条件,用户姓名
+       /* //搜索条件,用户姓名
         if (StringUtils.isNotEmpty(orderPage.getUserName())) {
             List<AppUser> data = appUserClient.getAppUserByNameNoFilter(orderPage.getUserName()).getData();
             List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
@@ -499,7 +559,7 @@
             } else {
                 orderPage.setAppUserIds(collect);
             }
-        }
+        }*/
         //搜索条件,用户电话
         if (StringUtils.isNotEmpty(orderPage.getPhone())) {
             List<AppUser> data = appUserClient.getAppUserByPhoneNoFilter(orderPage.getPhone()).getData();
@@ -523,11 +583,26 @@
             orderPage.setAppUserIds(orderPage.getAppUserIds().stream().distinct().collect(Collectors.toList()));
         }
 
-//        UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
-//        orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone());
-//        userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress());
-//        orderInfo.setAddress(userAddress.getRecieveAddress());
-
+        //搜索条件 店铺名称
+        if (StringUtils.isNotEmpty(orderPage.getShopName())){
+            List<Integer> shopSet = new ArrayList<>(shopClient.getShopIdByName(orderPage.getShopName()).getData());
+            if (CollectionUtils.isEmpty(shopSet)) {
+                return ;
+            }
+            if (null != orderPage.getShopIds()) {
+                List<Integer> shopIds = orderPage.getShopIds();
+                if (!containsIntegerAny(shopIds, shopSet)) {
+                    return ;
+                }
+                shopIds.addAll(shopSet);
+                orderPage.setShopIds(shopIds);
+            } else {
+                orderPage.setShopIds(shopSet);
+            }
+        }
+        if (null != orderPage.getShopIds()) {
+            orderPage.setShopIds(orderPage.getShopIds().stream().distinct().collect(Collectors.toList()));
+        }
 
         List<OrderExport> orderExportList = orderMapper.getOrderExportList(orderPage);
         orderExportList.forEach(orderExport -> {
@@ -541,15 +616,8 @@
             if (StringUtils.isNotEmpty(goodJson) && !"NULL".equals(goodJson)) {
                 Goods goods = JSONObject.parseObject(goodJson, Goods.class);
                 orderExport.setGoodsName(goods.getName());
-                orderExport.setCompanyCostPrice(goods.getOperatingCost());
-                orderExport.setSupplierCostPrice(goods.getShopCost());
-            }
-
-            String expressJson = orderExport.getExpressJson();
-            if (StringUtils.isNotEmpty(expressJson) && !expressJson.equals("NULL")) {
-                JSONObject jsonObject = JSONObject.parseObject(expressJson);
-                orderExport.setExpressNum(jsonObject.getString("num"));
-                orderExport.setExpressName(ExpressCompanyMap.getCompanyNameByCode(jsonObject.getString("com")));
+           /*     orderExport.setCompanyCostPrice(goods.getOperatingCost());
+                orderExport.setSupplierCostPrice(goods.getShopCost());*/
             }
         });
 
@@ -579,6 +647,27 @@
         // 如果没有找到共同元素,返回 false
         return false;
     }
+    /**
+     * 判断 list1 是否包含 list2 中的至少一个元素
+     *
+     * @param list1 第一个列表
+     * @param list2 第二个列表
+     * @return 如果 list1 包含 list2 中的至少一个元素,返回 true;否则返回 false
+     */
+    private boolean containsIntegerAny(List<Integer> list1, List<Integer> list2) {
+        // 将 list1 转换为 HashSet 以提高查询效率
+        Set<Integer> set1 = new HashSet<>(list1);
+
+        // 遍历 list2,检查是否有元素存在于 set1 中
+        for (Integer element : list2) {
+            if (set1.contains(element)) {
+                return true;
+            }
+        }
+
+        // 如果没有找到共同元素,返回 false
+        return false;
+    }
 
 
     /**
@@ -590,11 +679,119 @@
     @PostMapping("/getOrderCountByAppUserId")
     public R<Long> getOrderCountByAppUserId(@RequestParam("id") Long appUserId) {
         long count = orderService.count(new LambdaQueryWrapper<Order>().eq(Order::getDelFlag, 0)
-                .eq(Order::getAppUserId, appUserId).in(Order::getOrderStatus, Arrays.asList(1, 2, 3, 4, 7, 8))
-                .eq(Order::getPayStatus, 2));
+                .eq(Order::getAppUserId, appUserId)
+                .in(Order::getOrderStatus, Arrays.asList(1, 2, 3, 4, 7, 8))
+                .eq(Order::getPayStatus, 2)
+        );
         return R.ok(count);
     }
 
 
+    /**
+     * 工作台统计
+     */
+    @PostMapping("/homeStatistics/getShopAnalysis")
+    @ApiOperation(value = "店铺分析", tags = {"后台-工作台-店铺统计"})
+    public R<ShopAnalysisVO> getShopAnalysis(@RequestBody ShopAnalysisDTO shopAnalysisDTO) {
+        ShopAnalysisVO shopAnalysisVO = new ShopAnalysisVO();
+        if (shopAnalysisDTO.getStartTime() == null || shopAnalysisDTO.getEndTime() == null) {
+            LocalDate now = LocalDate.now();
+            shopAnalysisDTO.setStartTime(now.minusDays(6)); // 7天前
+            shopAnalysisDTO.setEndTime(now);
+        }
+        else if (shopAnalysisDTO.getStartTime().isAfter(shopAnalysisDTO.getEndTime())) {
+            return R.fail("开始时间不能大于结束时间");
+        }
+       /* // 限制最大查询范围不超过3个月(可选)
+        else if (Duration.between(shopAnalysisDTO.getStartTime(), shopAnalysisDTO.getEndTime()).toDays() > 90) {
+            return R.fail("查询时间范围不能超过90天");
+        }*/
+        //订单统计
+        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("count(*) as total","SUM(total_amount) as total_money");
+        queryWrapper.eq("del_flag", 0);
+        queryWrapper.in("order_status", Arrays.asList(3,4,8));//待核销  已完成  已评价
+        queryWrapper.eq("pay_status",2);
+        queryWrapper.ge("create_time", shopAnalysisDTO.getStartTime().atStartOfDay());
+        queryWrapper.le("create_time", shopAnalysisDTO.getEndTime().atTime(LocalTime.MAX));
+
+        if (null!=shopAnalysisDTO.getShopId()){
+            queryWrapper.eq("shop_id", shopAnalysisDTO.getShopId());
+        }
+        Map<String, Object> result = orderService.getMap(queryWrapper);
+        if (result == null || result.get("total") == null) {
+            shopAnalysisVO.setTotal(0);
+        }else {
+            shopAnalysisVO.setTotal(Integer.valueOf(result.get("total").toString()));
+        }
+
+        if (result == null || result.get("total_money") == null) {
+            shopAnalysisVO.setTotalMoney(BigDecimal.ZERO);
+        }else {
+            shopAnalysisVO.setTotalMoney(new BigDecimal(result.get("total_money").toString()));
+        }
+
+
+        //收益分析
+        Map<String, Object> shopResult =shopClient.getIncomeAnalysis(shopAnalysisDTO).getData();
+        if (shopResult!=null){
+            if (shopResult.get("balance")==null||shopResult.get("canWithdrawMoney")==null){
+                shopAnalysisVO.setCanWithdrawMoney(BigDecimal.ZERO);
+                shopAnalysisVO.setFreezeMoney(BigDecimal.ZERO);
+            }else {
+                shopAnalysisVO.setCanWithdrawMoney(new BigDecimal(shopResult.get("canWithdrawMoney").toString()));
+                shopAnalysisVO.setFreezeMoney(new BigDecimal(shopResult.get("balance").toString()).subtract(shopAnalysisVO.getCanWithdrawMoney()));
+            }
+            if (shopResult.get("withdrawMoney")==null){
+                shopAnalysisVO.setWithdrawMoney(BigDecimal.ZERO);
+            }else {
+                shopAnalysisVO.setWithdrawMoney(new BigDecimal(shopResult.get("withdrawMoney").toString()));
+            }
+            if (shopResult.get("withdrawAuditMoney")==null){
+                shopAnalysisVO.setWithdrawAuditMoney(BigDecimal.ZERO);
+            }else {
+                shopAnalysisVO.setWithdrawAuditMoney(new BigDecimal(shopResult.get("withdrawAuditMoney").toString()));
+            }
+        }else {
+            shopAnalysisVO.setCanWithdrawMoney(BigDecimal.ZERO);
+            shopAnalysisVO.setFreezeMoney(BigDecimal.ZERO);
+            shopAnalysisVO.setWithdrawMoney(BigDecimal.ZERO);
+            shopAnalysisVO.setWithdrawAuditMoney(BigDecimal.ZERO);
+        }
+
+
+        //折线图
+        List<OrderStatisticsDetail> orderStatisticsDetailList=orderService.getOrderListGroupByDate(shopAnalysisDTO.getStartTime(), shopAnalysisDTO.getEndTime(),shopAnalysisDTO.getShopId());
+        shopAnalysisVO.setOrderStatisticsDetailList(orderStatisticsDetailList);
+        return R.ok(shopAnalysisVO);
+    }
+
+    /**
+     * 统计用户总消费积分数和现金支付金额
+     */
+    @GetMapping("/getConsumeScoreAndPayAmount")
+    R<Map<String ,Object>> getConsumeScoreAndPayAmount(@RequestParam(value = "userId",required = false) Long userId){
+        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
+        // 条件构造  统计充值积分
+        queryWrapper.select("SUM(point) as total_points","SUM(payment_amount) as payment_amounts");
+        queryWrapper.eq("del_flag", 0);
+        queryWrapper.in("order_status", Arrays.asList(3,4,8));//待核销  已完成  已评价
+        queryWrapper.eq("pay_status",2);
+        if (userId != null) {
+            queryWrapper.eq("app_user_id", userId);
+        }
+        return R.ok(orderService.getMap(queryWrapper));
+    }
+
+    /**
+     * 获取商户RSA加密公钥
+     */
+
+    @GetMapping("/getRsaPublicKey")
+    public R<Void> getRsaPublicKey(){
+        wechatPayService.getRsaPublicKey();
+        return R.ok();
+    }
+
 }
 

--
Gitblit v1.7.1