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