huliguo
21 小时以前 3348eda2c33469e9935ae6afcf83ea5c52cea906
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,20 +16,27 @@
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.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.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -39,7 +47,10 @@
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,6 +80,49 @@
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private ShopClient shopClient;
    @ResponseBody
    @PostMapping("/confirmOrder")
    @ApiOperation(value = "确定订单", tags = {"商城-订单-小程序"})
    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
    @GetMapping("/orderPaymentCallback")
    public void orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult, HttpServletResponse response){
        String jsonString = JSONObject.toJSONString(uniPayCallbackResult);
        System.out.println("1111111111111111111111");
        System.out.println(jsonString);
        R callback = orderService.orderPaymentCallback(uniPayCallbackResult);
        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();
        }
    }
    /**
     * 我的订单列表
@@ -108,14 +162,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()));
    }
@@ -123,14 +174,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);
    }
    /**
     * 取消订单
@@ -189,17 +255,6 @@
    }
    /**
     * 预约技师
     */
    @PostMapping("/subscribe")
    public R<Void> subscribe(@RequestParam(value = "id", required = false) Long id, @RequestParam(value = "technicianId", required = false) Integer technicianId) {
        Order order = orderService.getById(id);
        order.setTechnicianId(technicianId);
        orderService.updateById(order);
        return R.ok();
    }
    @PostMapping("/getLastOrder")
    public R<Order> getLastOrder(@RequestParam("appUserId") Long appUserId) {
        Order one = orderService.lambdaQuery().eq(Order::getAppUserId, appUserId).orderByDesc(Order::getCreateTime).last("limit 1").one();
@@ -241,7 +296,7 @@
    @PutMapping("/cancelOrder/{orderId}")
    @ApiOperation(value = "取消订单操作", tags = {"管理后台-订单管理"})
    @ApiOperation(value = "取消订单操作", tags = {"后台-订单管理"})
    public R cancelOrder(@PathVariable("orderId") Long orderId) {
        return orderService.cancelOrder(orderId);
    }
@@ -262,15 +317,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,7 +403,7 @@
        return R.ok(orderStatistics);
    }
*/
    /**
     * 订单取消支付回退
     *
@@ -434,12 +489,12 @@
    }
    /**
  /*  *//**
     * 获取订单快递明细
     *
     * @param id
     * @return
     */
     *//*
    @GetMapping("/getOrderExpress/{id}")
    @ApiOperation(value = "获取订单快递明细", tags = {"小程序-订单管理"})
    public R<MapTrackKD100Vo> getOrderExpress(@PathVariable("id") Long id) {
@@ -451,7 +506,7 @@
        }
        return R.ok();
    }
*/
    /**
     * 根据id获取订单详情
@@ -485,7 +540,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 +554,7 @@
            } else {
                orderPage.setAppUserIds(collect);
            }
        }
        }*/
        //搜索条件,用户电话
        if (StringUtils.isNotEmpty(orderPage.getPhone())) {
            List<AppUser> data = appUserClient.getAppUserByPhoneNoFilter(orderPage.getPhone()).getData();
@@ -523,11 +578,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 +611,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 +642,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 +674,109 @@
    @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));
    }
}