puzhibing
2025-01-13 acccff9860b271d55c55dc87486f7c20b9896e6c
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -1,39 +1,51 @@
package com.ruoyi.order.service.impl;
import cn.hutool.core.collection.CollectionUtil;
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.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUserShop;
import com.ruoyi.account.api.model.UserAddress;
import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient;
import com.ruoyi.account.api.feignClient.UserPointClient;
import com.ruoyi.account.api.model.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.enums.OrderStatus;
import com.ruoyi.order.enums.OrderType;
import com.ruoyi.order.mapper.OrderGoodMapper;
import com.ruoyi.order.mapper.OrderMapper;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.model.OrderBalancePayment;
import com.ruoyi.order.model.OrderGood;
import com.ruoyi.order.service.CommissionService;
import com.ruoyi.order.service.OrderService;
import com.ruoyi.order.vo.OrderDetailVO;
import com.ruoyi.order.vo.OrderGoodsVO;
import com.ruoyi.order.vo.OrderVO;
import com.ruoyi.order.model.RefundPass;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.ExpressDeliveryUtil;
import com.ruoyi.order.util.payment.PaymentUtil;
import com.ruoyi.order.util.payment.model.RefundCallbackResult;
import com.ruoyi.order.util.payment.model.RefundResult;
import com.ruoyi.order.util.vo.MapTrackKD100Vo;
import com.ruoyi.order.util.vo.QueryKD100Vo;
import com.ruoyi.order.vo.*;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.api.feignClient.BaseSettingClient;
import com.ruoyi.other.api.feignClient.ShopClient;
import com.ruoyi.other.api.feignClient.TechnicianClient;
import com.ruoyi.other.api.feignClient.*;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -62,6 +74,42 @@
    private CommissionService commissionService;
    @Resource
    private BaseSettingClient baseSettingClient;
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private BalanceChangeRecordClient balanceChangeRecordClient;
    @Resource
    private UserPointClient userPointClient;
    @Resource
    private PointSettingClient pointSettingClient;
    @Resource
    private OrderBalancePaymentService orderBalancePaymentService;
    @Resource
    private VipSettingClient vipSettingClient;
    @Resource
    private GoodsClient goodsClient;
    @Resource
    private RefundPassService refundPassService;
    @Resource
    private TechnicianSubscribeClient technicianSubscribeClient;
    @Resource
    private ShopBalanceStatementClient shopBalanceStatementClient;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private SystemConfigClient systemConfigClient;
    @Override
@@ -97,13 +145,11 @@
            orderGoodsVO.setGoodsName(goods.getName());
            orderGoodsVO.setType(goods.getType());
            orderGoodsVO.setGoodsPic(goods.getHomePagePicture());
            orderGoodsVO.setSellingPrice(goods.getSellingPrice());
            orderGoodsVO.setSellingPrice(orderGood.getSellingPrice());
            orderGoodsVO.setIntegral(orderGood.getIntegral());
            orderGoodsVO.setOriginalPrice(goods.getOriginalPrice());
            goodsList.add(orderGoodsVO);
        }
        // 收货地址
        String addressJson = order.getAddressJson();
        UserAddress userAddress = new UserAddress();
@@ -111,7 +157,6 @@
            userAddress = JSONObject.parseObject(addressJson, UserAddress.class);
        }
        // 优惠券
        String couponJson = order.getCouponJson();
        CouponInfo couponInfo = new CouponInfo();
@@ -125,7 +170,6 @@
        if (StringUtils.isNotEmpty(activityJson)){
            orderActivityInfo = JSONObject.parseObject(activityJson, OrderActivityInfo.class);
        }
        OrderDetailVO orderDetailVO = new OrderDetailVO();
        if (CollectionUtil.isNotEmpty(orderGoods)){
@@ -198,28 +242,12 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void writeOff(String code,Integer shopId) {
    public void writeOff(String id,Integer shopId) {
        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
        Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
                .eq(Order::getOrderNumber, code));
        Order order = orderMapper.selectById(id);
        boolean check = check(order, shopId, loginUserApplet.getUserid());
        if (!check){
            throw new ServiceException("订单不存在");
        }
        order.setOrderStatus(OrderStatus.COMPLETED.getCode());
        orderMapper.updateById(order);
        Integer orderType = order.getOrderType();
        if (orderType.equals(OrderType.SERVICE.getCode())){
            R<TechnicianSubscribe> subscribeR = technicianClient.getSubscribeByOrderId(order.getId());
            if (R.isError(subscribeR)){
                throw new ServiceException("获取预约信息失败");
            }
            TechnicianSubscribe subscribe = subscribeR.getData();
            subscribe.setStatus(2);
            R<Void> r = technicianClient.updateStatus(subscribe.getStatus(), subscribe.getId());
            if (R.isError(r)){
                throw new ServiceException("更新预约状态失败");
            }
        }
        // 售后设置
@@ -234,6 +262,591 @@
        String content = baseSetting.getContent();
        JSONObject jsonObject = JSONObject.parseObject(content);
        Long days = jsonObject.getLong("days");
        commissionService.addToCommissionDelayQueue(order.getId(), LocalDateTime.now().plusDays(days));
        order.setOrderStatus(OrderStatus.COMPLETED.getCode());
        order.setIsCommission(0);
        order.setAfterSaleTime(LocalDateTime.now().plusDays(days));
        order.setEndTime(LocalDateTime.now());
        order.setCancellerAppUserId(loginUserApplet.getUserid());
        orderMapper.updateById(order);
    }
    /**
     * 管理后台获取订单列表数据
     * @param orderPageList
     * @return
     */
    @Override
    public PageInfo<OrderPageListVo> getOrderPageList(OrderPageList orderPageList) {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userid).getData();
        if(2 == sysUser.getRoleType()){
            orderPageList.setShopId(sysUser.getObjectId());
        }
        //搜索条件,用户姓名
        if(StringUtils.isNotEmpty(orderPageList.getUserName())){
            List<AppUser> data = appUserClient.getAppUserByName(orderPageList.getUserName()).getData();
            List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
            if(null != orderPageList.getAppUserIds()){
                List<Long> appUserIds = orderPageList.getAppUserIds();
                appUserIds.addAll(collect);
                orderPageList.setAppUserIds(appUserIds);
            }else{
                orderPageList.setAppUserIds(collect);
            }
        }
        //搜索条件,用户电话
        if(StringUtils.isNotEmpty(orderPageList.getPhone())){
            List<AppUser> data = appUserClient.getAppUserByPhone(orderPageList.getPhone()).getData();
            List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
            if(null != orderPageList.getAppUserIds()){
                List<Long> appUserIds = orderPageList.getAppUserIds();
                appUserIds.addAll(collect);
                orderPageList.setAppUserIds(appUserIds);
            }else{
                orderPageList.setAppUserIds(collect);
            }
        }
        PageInfo<OrderPageListVo> pageInfo = new PageInfo(orderPageList.getPageCurr(), orderPageList.getPageSize());
        List<OrderPageListVo> list = this.baseMapper.getOrderPageList(pageInfo, orderPageList);
        for (OrderPageListVo orderPageListVo : list) {
            Long appUserId = orderPageListVo.getAppUserId();
            AppUser appUser = appUserClient.getAppUserById(appUserId);
            if(null != appUser){
                orderPageListVo.setUserName(appUser.getName());
                orderPageListVo.setPhone(appUser.getPhone());
            }
            RefundPass one = refundPassService.getOne(new LambdaQueryWrapper<RefundPass>().eq(RefundPass::getOrderId, orderPageListVo.getId()).eq(RefundPass::getDelFlag, 0).last(" order by create_time desc limit 0, 1"));
            orderPageListVo.setRefundPassId(null != one ? one.getId().toString() : null);
        }
        return pageInfo.setRecords(list);
    }
    /**
     * 小程序取消订单
     * @param orderId
     * @return
     */
    @Override
    public R cancel(Long orderId) {
        Order order = this.getById(orderId);
        if(null == order){
            return R.fail("取消失败");
        }
        Long userid = tokenService.getLoginUserApplet().getUserid();
        if(!order.getAppUserId().equals(userid)){
            return R.fail("取消失败");
        }
        if(!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())){
            return R.fail("订单取消失败");
        }
        if(null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())){
            return R.fail("订单取消失败");
        }
        order.setOrderStatus(5);
        R r = refundPayMoney(order);
        if(200 == r.getCode()){
            this.updateById(order);
        }
        return r;
    }
    /**
     * 确认发货操作
     * @param orderId
     * @param code
     * @return
     */
    @Override
    public R confirmDelivery(Long orderId, String code) {
        Order order = this.getById(orderId);
        if(1 == order.getPayStatus()){
            return R.fail("订单还未完成支付");
        }
        if(1 == order.getOrderType() || null == order.getAddressJson()){
            return R.fail("该订单不支付快递配送");
        }
        if(1 != order.getOrderStatus()){
            return R.fail("无效的操作");
        }
        //添加快递号和修改订单状态
        order.setExpressJson(code);
        order.setOrderStatus(2);
        this.updateById(order);
        return R.ok();
    }
    /**
     * 取消订单操作
     * @param orderId
     * @return
     */
    @Override
    public R cancelOrder(Long orderId) {
        Order order = this.getById(orderId);
        if(Arrays.asList(5, 6, 7).contains(order.getOrderStatus())){
            return R.fail("无效的操作");
        }
        if(LocalDateTime.now().isAfter(order.getAfterSaleTime())){
            return R.fail("订单取消失败");
        }
        order.setOrderStatus(5);
        R r = refundPayMoney(order);
        if(200 == r.getCode()){
            this.updateById(order);
        }
        return r;
    }
    /**
     * 返回订单支付金额和回退积分和会员等级
     * @param order
     */
    public R refundPayMoney(Order order){
        //开始退款
        Integer payMethod = order.getPayMethod();
        BigDecimal paymentAmount = order.getPaymentAmount();
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if(1 == payMethod){
            //微信退款
            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback");
            if("100".equals(refund.getRa_Status())){
                order.setRefundStatus(1);
                return R.ok();
            }else{
                return R.fail(refund.getRc_CodeMsg());
            }
        }
        if(2 == payMethod){
            //余额退款
            OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
            BigDecimal balance = appUser.getBalance();
            if(null != orderBalancePayment){
                appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN));
                appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN));
            }
            appUser.setBalance(balance.add(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setShopAmount(appUser.getShopAmount().subtract(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
            //查询最后一次的消费订单
            Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1"));
            if(null != order1){
                appUser.setLastShopTime(order1.getCreateTime());
            }else{
                appUser.setLastShopTime(LocalDateTime.MIN);
            }
            //构建账户余额流水明细
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
            balanceChangeRecord.setOrderId(order.getId());
            balanceChangeRecord.setAppUserId(order.getAppUserId());
            balanceChangeRecord.setChangeType(6);
            balanceChangeRecord.setBeforeAmount(balance);
            balanceChangeRecord.setChangeAmount(paymentAmount);
            balanceChangeRecord.setAfterAmount(appUser.getBalance());
            balanceChangeRecord.setDelFlag(0);
            balanceChangeRecord.setCreateTime(LocalDateTime.now());
            balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
            //退回获得的消费积分
            //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
            Integer lavePoint = appUser.getLavePoint();
            UserPoint userPoint1 = new UserPoint();
            userPoint1.setType(1);
            userPoint1.setAppUserId(appUser.getId());
            userPoint1.setObjectId(order.getId());
            UserPoint userPoint2 = userPointClient.getUserPointList(userPoint1).getData().get(0);
            JSONObject jsonObject = JSON.parseObject(userPoint2.getExtention());
            Integer shopPoint = jsonObject.getInteger("shopPoint");
            Integer availablePoint = jsonObject.getInteger("availablePoint");
            Integer transferablePoint = jsonObject.getInteger("transferablePoint");
            appUser.setShopPoint(appUser.getShopPoint() - shopPoint);
            appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
            appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
            appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
            if(null != transferablePoint){
                appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
            }
            appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
            boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId());
            if(vipDemotion){
                appUser.setVipId(appUser.getVipId() - 1);
            }
            //构建积分流水明细
            UserPoint userPoint = new UserPoint();
            userPoint.setType(1);
            userPoint.setHistoricalPoint(lavePoint);
            userPoint.setVariablePoint(shopPoint);
            userPoint.setBalance(appUser.getLavePoint());
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(order.getAppUserId());
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
            appUserClient.editAppUserById(appUser);
        }
        if(3 == payMethod){
            //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款
            if(null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0){
                BigDecimal expressAmount = order.getExpressAmount();
                if(1 == order.getExpressPayMethod()){
                    //微信退款
                    RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), expressAmount.doubleValue(), "/order/order/refundExpressPayMoneyCallback");
                    if("100".equals(refund.getRa_Status())){
                        order.setRefundStatus(1);
                        return R.ok();
                    }else{
                        return R.fail(refund.getRc_CodeMsg());
                    }
                }
                if(2 == order.getExpressPayMethod()){
                    //余额退款
                    OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
                    BigDecimal balance = appUser.getBalance();
                    if(null != orderBalancePayment){
                        appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN));
                        appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN));
                    }
                    appUser.setBalance(balance.add(expressAmount).setScale(2, RoundingMode.HALF_EVEN));
                    //构建账户余额流水明细
                    BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
                    balanceChangeRecord.setOrderId(order.getId());
                    balanceChangeRecord.setAppUserId(order.getAppUserId());
                    balanceChangeRecord.setChangeType(6);
                    balanceChangeRecord.setBeforeAmount(balance);
                    balanceChangeRecord.setChangeAmount(expressAmount);
                    balanceChangeRecord.setAfterAmount(appUser.getBalance());
                    balanceChangeRecord.setDelFlag(0);
                    balanceChangeRecord.setCreateTime(LocalDateTime.now());
                    balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
                }
            }
            Integer lavePoint = appUser.getLavePoint();
            //积分退款
            appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
            appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
            UserPoint userPoint1 = new UserPoint();
            userPoint1.setType(11);
            userPoint1.setObjectId(order.getId());
            List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
            Integer transferablePoint = order.getPoint();
            if(data.size() > 0){
                UserPoint userPoint = data.get(0);
                transferablePoint = Integer.valueOf(userPoint.getExtention());
            }
            appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
            //构建积分流水明细
            UserPoint userPoint = new UserPoint();
            userPoint.setType(11);
            userPoint.setHistoricalPoint(lavePoint);
            userPoint.setVariablePoint(order.getPoint());
            userPoint.setBalance(appUser.getLavePoint());
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(order.getAppUserId());
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
        }
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        return R.ok();
    }
    /**
     * 取消订单后回调处理
     * @return
     */
    @Override
    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        this.updateById(order);
        //退回获得的消费积分
        //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        Integer lavePoint = appUser.getLavePoint();
        UserPoint userPoint1 = new UserPoint();
        userPoint1.setType(1);
        userPoint1.setAppUserId(appUser.getId());
        userPoint1.setObjectId(order.getId());
        UserPoint userPoint2 = userPointClient.getUserPointList(userPoint1).getData().get(0);
        JSONObject jsonObject = JSON.parseObject(userPoint2.getExtention());
        Integer shopPoint = jsonObject.getInteger("shopPoint");
        Integer availablePoint = jsonObject.getInteger("availablePoint");
        Integer transferablePoint = jsonObject.getInteger("transferablePoint");
        appUser.setShopPoint(appUser.getShopPoint() - shopPoint);
        appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
        if(null != transferablePoint){
            appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
        }
        appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
        boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId());
        if(vipDemotion){
            appUser.setVipId(appUser.getVipId() - 1);
        }
        //构建积分流水明细
        UserPoint userPoint = new UserPoint();
        userPoint.setType(1);
        userPoint.setHistoricalPoint(lavePoint);
        userPoint.setVariablePoint(shopPoint);
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        appUserClient.editAppUserById(appUser);
        return R.ok();
    }
    /**
     * 取消订单快递费回退
     * @return
     */
    @Override
    public R refundExpressPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        this.updateById(order);
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        Integer lavePoint = appUser.getLavePoint();
        //积分退款
        appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
        appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
        UserPoint userPoint1 = new UserPoint();
        userPoint1.setType(11);
        userPoint1.setObjectId(order.getId());
        List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
        Integer transferablePoint = order.getPoint();
        if(data.size() > 0){
            UserPoint userPoint = data.get(0);
            transferablePoint = Integer.valueOf(userPoint.getExtention());
        }
        appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
        //构建积分流水明细
        UserPoint userPoint = new UserPoint();
        userPoint.setType(11);
        userPoint.setHistoricalPoint(lavePoint);
        userPoint.setVariablePoint(order.getPoint());
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        return R.ok();
    }
    /**
     * 会员降级检测
     */
    public boolean vipDemotion(Integer shopPoint, Integer vipId){
        if(vipId == 1 || vipId > 3){
            return false;
        }
        VipSetting vipSetting = vipSettingClient.getVipSetting(vipId).getData();
        Integer vipLevelUpShopRole = vipSetting.getVipLevelUpShopRole();
        Integer vipLevelUpShop = vipSetting.getVipLevelUpShop();
        return 1 == vipLevelUpShopRole && shopPoint < vipLevelUpShop;
    }
    /**
     * 收货操作
     * @param orderId
     * @return
     */
    @Override
    public R receivingOperation(Long orderId) {
        Order order = this.getById(orderId);
        if(order.getOrderStatus() != 2){
            return R.fail("无效的操作");
        }
        order.setOrderStatus(4);
        R<BaseSetting> baseSettingR = baseSettingClient.getBaseSetting(5);
        if (R.isError(baseSettingR)) {
            return R.fail("售后设置获取失败");
        }
        BaseSetting baseSetting = baseSettingR.getData();
        if (baseSetting == null) {
            return R.fail("售后设置获取失败");
        }
        String content = baseSetting.getContent();
        JSONObject jsonObject = JSONObject.parseObject(content);
        Long days = jsonObject.getLong("days");
        order.setAfterSaleTime(LocalDateTime.now().plusDays(days));
        this.updateById(order);
        return R.ok();
    }
    /**
     * 获取订单详情
     * @param orderId
     * @return
     */
    @Override
    public OrderInfoVo getOrderInfo(Long orderId) {
        Order order = this.getById(orderId);
        OrderInfoVo orderInfo = new OrderInfoVo();
        orderInfo.setId(orderId.toString());
        orderInfo.setOrderNumber(order.getOrderNumber());
        orderInfo.setOrderStatus(order.getOrderStatus());
        orderInfo.setCreateTime(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if(null != appUser){
            orderInfo.setUserName(appUser.getName());
            orderInfo.setPhone(appUser.getPhone());
        }
        orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getAddressJson()) ? "单品-快递配送" : "单品-上门自提"));
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        if(null != shop){
            orderInfo.setShopName(shop.getName());
        }
        orderInfo.setPaymentMethod(order.getPayMethod());
        orderInfo.setTotalAmount(order.getTotalAmount());
        if(StringUtils.isNotEmpty(order.getCouponJson())){
            CouponInfo couponInfo = JSON.parseObject(order.getCouponJson(), CouponInfo.class);
            orderInfo.setCouponName(couponInfo.getCouponName());
        }
        orderInfo.setDiscountAmount(order.getDiscountTotalAmount());
        orderInfo.setExpressAmount(order.getExpressAmount());
        orderInfo.setPaymentAmount(order.getPaymentAmount());
        orderInfo.setGetPoint(order.getGetPoint());
        if(StringUtils.isNotEmpty(order.getAddressJson())){
            UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
            orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone());
            orderInfo.setAddress(userAddress.getRecieveAddress());
        }
        if(StringUtils.isNotEmpty(order.getExpressJson()) && !"NULL".equals(order.getExpressJson())){
            JSONObject jsonObject = JSON.parseObject(order.getExpressJson());
            String com = jsonObject.getString("com");
            String num = jsonObject.getString("num");
            QueryKD100Vo queryKD100Vo = ExpressDeliveryUtil.kd100QueryTrack(com, num);
            orderInfo.setExpress(queryKD100Vo);
        }
        List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0));
        int sum = orderGoods.stream().mapToInt(OrderGood::getNum).sum();
        orderInfo.setGoodsNum(sum);
        List<Object> goodsJson = new ArrayList<>();
        for (OrderGood orderGood : orderGoods) {
            Goods goods = JSON.parseObject(orderGood.getGoodJson(), Goods.class);
            Map<String, Object> map = new HashMap<>();
            map.put("name", goods.getName());
            map.put("imgUrl", goods.getHomePagePicture());
            map.put("number", orderGood.getNum());
            goodsJson.add(map);
        }
        orderInfo.setGoodsJson(JSON.toJSONString(goodsJson));
        orderInfo.setPoint(order.getPoint());
        if(null != order.getAfterSaleTime()){
            orderInfo.setAfterSaleTime(order.getAfterSaleTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(StringUtils.isNotEmpty(order.getActivityJson())){
            OrderActivityInfo activityInfo = JSON.parseObject(order.getActivityJson(), OrderActivityInfo.class);
            orderInfo.setActivityName(activityInfo.getActivityName());
        }
        if(null != order.getEndTime()){
            AppUser user = appUserClient.getAppUserById(order.getCancellerAppUserId());
            orderInfo.setCanceller(user.getName());
            orderInfo.setWriteOffTime(order.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(order.getOrderType() == 1){
            List<TechnicianSubscribe> technicianSubscribes = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
            if(technicianSubscribes.size() > 0){
                Set<Integer> collect = technicianSubscribes.stream().map(TechnicianSubscribe::getTechnicianId).collect(Collectors.toSet());
                List<Technician> data = technicianClient.getTechnicianByIds(collect).getData();
                orderInfo.setTechnicianName(data.stream().map(Technician::getName).collect(Collectors.joining(",")));
            }
        }
        List<ShopBalanceStatement> data = shopBalanceStatementClient.getShopBalanceStatementList(Arrays.asList(1, 2, 3), order.getId()).getData();
        BigDecimal reduce = data.stream().map(ShopBalanceStatement::getVariableAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        orderInfo.setSubcommission(reduce);
        return orderInfo;
    }
    /**
     * 获取商品销售数量
     * @param goodsId
     * @return
     */
    @Override
    public Integer getGoodsSaleNum(Integer goodsId, Integer type) {
        return this.baseMapper.getGoodsSaleNum(goodsId, type);
    }
    /**
     * 获取店铺订单数量
     * @param shopId
     * @param type
     * @return
     */
    @Override
    public Integer getShopSaleNum(Integer shopId, Integer type) {
        return this.baseMapper.getShopSaleNum(shopId, type);
    }
    /**
     * 定时查询快递信息
     */
    @Override
    public void taskExpress() {
        Set<Long> order_express = redisTemplate.opsForZSet().rangeByScore("order_express", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
        if(order_express.size() > 0){
            for (Long id : order_express) {
                Order order = this.getById(id);
                if(order.getOrderStatus() != 2){
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
                String expressJson = order.getExpressJson();
                if(StringUtils.isEmpty(expressJson)){
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
                //{"com":"jd","num":"JDV016336234367"}
                JSONObject jsonObject = JSON.parseObject(expressJson);
                String com = jsonObject.getString("com");
                String num = jsonObject.getString("num");
                UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
                MapTrackKD100Vo mapTrackKD100Vo = ExpressDeliveryUtil.kd100MapTrack(com, num, "", userAddress.getRecieveAddress());
                order.setExpressResult(JSON.toJSONString(mapTrackKD100Vo));
                this.updateById(order);
                //延长时间x小时
                SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData();
                JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
                Integer waitTime = jsonObject1.getInteger("waitTime");
                redisTemplate.opsForZSet().add("order_express", order.getId(), LocalDateTime.now().plusHours(waitTime).toEpochSecond(ZoneOffset.UTC));
            }
        }
    }
}