From 4f97bdbaadcdc19df9dfb0971b930d799c4aeddc Mon Sep 17 00:00:00 2001
From: luofl <1442745593@qq.com>
Date: 星期四, 13 三月 2025 14:52:26 +0800
Subject: [PATCH] 迭代版本:2.28

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java |  951 +++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 786 insertions(+), 165 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
index 8036557..4025706 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -1,17 +1,16 @@
 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.extension.service.impl.ServiceImpl;
-import com.ruoyi.account.api.feignClient.AppUserClient;
-import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient;
-import com.ruoyi.account.api.feignClient.UserPointClient;
+import com.ruoyi.account.api.feignClient.*;
 import com.ruoyi.account.api.model.*;
+import com.ruoyi.common.core.constant.ExpressCompanyMap;
 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.utils.uuid.QRCodeGenerator;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.order.enums.OrderStatus;
@@ -20,31 +19,54 @@
 import com.ruoyi.order.model.Order;
 import com.ruoyi.order.model.OrderBalancePayment;
 import com.ruoyi.order.model.OrderGood;
+import com.ruoyi.order.model.RefundPass;
 import com.ruoyi.order.service.CommissionService;
 import com.ruoyi.order.service.OrderBalancePaymentService;
 import com.ruoyi.order.service.OrderService;
+import com.ruoyi.order.service.RefundPassService;
 import com.ruoyi.order.util.ExpressDeliveryUtil;
-import com.ruoyi.order.util.vo.QueryKD100Vo;
+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.QueryKD100ListVo;
 import com.ruoyi.order.vo.*;
 import com.ruoyi.other.api.domain.*;
 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 lombok.SneakyThrows;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author luodangjia
@@ -68,29 +90,53 @@
     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 ShopPointClient shopPointClient;
+
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    @Resource
+    private SystemConfigClient systemConfigClient;
+
+    @Resource
+    private UserCouponClient userCouponClient;
+
+    @Resource
+    private UserChangeLogClient userChangeLogClient;
+
+    @Resource
+    private RegionClient regionClient;
+    @Resource
+    private AppUserGiveawayTemporaryClient appUserGiveawayTemporaryClient;
+    @Resource
+    private ShopGiveawayTemporaryClient shopGiveawayTemporaryClient;
 
 
     @Override
@@ -99,16 +145,14 @@
     }
 
 
-
-
     @Override
     public OrderDetailVO getOrderDetail(Long orderId) {
         Order order = orderMapper.selectById(orderId);
-        if (order == null){
+        if (order == null) {
             throw new ServiceException("订单不存在");
         }
         R<Shop> shopR = shopClient.getShopById(order.getShopId());
-        if (!R.isSuccess(shopR)){
+        if (!R.isSuccess(shopR)) {
             throw new ServiceException("获取门店信息失败");
         }
 
@@ -126,46 +170,32 @@
             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();
-        if (StringUtils.isNotEmpty(addressJson)){
+        if (2 == order.getDistributionMode()) {
             userAddress = JSONObject.parseObject(addressJson, UserAddress.class);
-
         }
         // 优惠券
         String couponJson = order.getCouponJson();
         CouponInfo couponInfo = new CouponInfo();
-        if (StringUtils.isNotEmpty(couponJson)){
+        if (StringUtils.isNotEmpty(couponJson)) {
             couponInfo = JSONObject.parseObject(couponJson, CouponInfo.class);
         }
 
         // 参与活动
         String activityJson = order.getActivityJson();
         OrderActivityInfo orderActivityInfo = new OrderActivityInfo();
-        if (StringUtils.isNotEmpty(activityJson)){
+        if (StringUtils.isNotEmpty(activityJson)) {
             orderActivityInfo = JSONObject.parseObject(activityJson, OrderActivityInfo.class);
         }
         OrderDetailVO orderDetailVO = new OrderDetailVO();
-
-        if (CollectionUtil.isNotEmpty(orderGoods)){
-            String goodJson = orderGoods.get(0).getGoodJson();
-            Goods goods = JSONObject.parseObject(goodJson, Goods.class);
-            orderDetailVO.setDistributionMode(goods.getDistributionMode());
-        }
-
-        Technician technician = new Technician();
-        if (order.getTechnicianId() != null){
-            R<Technician> shopdetail = technicianClient.shopdetail(order.getTechnicianId());
-            if (shopdetail.getCode() != R.SUCCESS){
-                throw new ServiceException("获取技师信息失败");
-            }
-            technician = shopdetail.getData();
-        }
+        orderDetailVO.setDistributionMode(order.getDistributionMode());
         Shop shop = shopR.getData();
         orderDetailVO.setId(order.getId());
         orderDetailVO.setOrderStatus(order.getOrderStatus());
@@ -173,6 +203,7 @@
         orderDetailVO.setAddressId(userAddress.getId());
         orderDetailVO.setRecieveName(userAddress.getRecieveName());
         orderDetailVO.setRecievePhone(userAddress.getRecievePhone());
+        userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress());
         orderDetailVO.setRecieveAddress(userAddress.getRecieveAddress());
         orderDetailVO.setOrderNumber(order.getOrderNumber());
         orderDetailVO.setCreateTime(order.getCreateTime());
@@ -189,18 +220,41 @@
         orderDetailVO.setLongitude(shop.getLongitude());
         orderDetailVO.setLatitude(shop.getLatitude());
         orderDetailVO.setShopId(shop.getId());
-        orderDetailVO.setTechnicianName(technician.getName());
+        if (StringUtils.isNotEmpty(order.getExpressResult())) {
+            MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
+            List<QueryKD100ListVo> data = mapTrackKD100Vo.getData();
+            orderDetailVO.setExpress(null != data && data.size() > 0 ? data.get(0).getContext() : "");
+        }
+
+        if (order.getOrderType() == 1) {
+            List<TechnicianSubscribe> data = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
+            if (data.size() > 0) {
+                Long id = data.get(0).getId();
+                orderDetailVO.setTechnicianSubscribeId(id.toString());
+                Technician technician = technicianClient.shopdetail(order.getTechnicianId()).getData();
+                orderDetailVO.setTechnicianName(technician.getName());
+                orderDetailVO.setTechnicianId(technician.getId());
+            }
+        }
+        // 生成核销码BASE64
+        try {
+            String base64 = QRCodeGenerator.generateQRCodeBase64(String.valueOf(order.getId()), 124, 124);
+            orderDetailVO.setWriteOffCode(base64);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("生成核销码失败");
+        }
         return orderDetailVO;
     }
 
     @Override
     public boolean check(Order order, Integer shopId, Long userId) {
         R<List<AppUserShop>> r = appUserClient.getAppUserShop(userId);
-        if (r.getCode() != R.SUCCESS){
+        if (r.getCode() != R.SUCCESS) {
             throw new ServiceException("获取用户门店信息失败");
         }
         List<AppUserShop> appUserShopList = r.getData();
-        if (appUserShopList == null || appUserShopList.isEmpty()){
+        if (appUserShopList == null || appUserShopList.isEmpty()) {
             return false;
         }
 
@@ -208,12 +262,12 @@
         List<AppUserShop> userShopList = appUserShopList.stream()
                 .filter(appUserShop -> appUserShop.getShopId().equals(shopId))
                 .collect(Collectors.toList());
-        if (userShopList.isEmpty()){
+        if (userShopList.isEmpty()) {
             return false;
         }
 
         // 判断订单是否属于该门店
-        if (order == null){
+        if (order == null) {
             throw new ServiceException("订单不存在");
         }
 
@@ -222,15 +276,13 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void writeOff(String code,Integer shopId) {
+    public void writeOff(String id, Integer shopId, String technicianId) {
         LoginUser loginUserApplet = tokenService.getLoginUserApplet();
-        Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
-                .eq(Order::getId, code));
+        Order order = orderMapper.selectById(id);
         boolean check = check(order, shopId, loginUserApplet.getUserid());
-        if (!check){
-            throw new ServiceException("订单不存在");
+        if (!check) {
+            throw new ServiceException("该订单与当前扫码门店不一致");
         }
-        Integer orderType = order.getOrderType();
 
         // 售后设置
         R<BaseSetting> baseSettingR = baseSettingClient.getBaseSetting(5);
@@ -245,14 +297,20 @@
         JSONObject jsonObject = JSONObject.parseObject(content);
         Long days = jsonObject.getLong("days");
         order.setOrderStatus(OrderStatus.COMPLETED.getCode());
-        order.setIsCommission(0);
         order.setAfterSaleTime(LocalDateTime.now().plusDays(days));
+        order.setEndTime(LocalDateTime.now());
+        order.setCancellerAppUserId(loginUserApplet.getUserid());
+        if (StringUtils.isNotEmpty(technicianId) && !"null".equals(technicianId)) {
+            order.setTechnicianId(Integer.valueOf(technicianId));
+        }
         orderMapper.updateById(order);
+        commissionService.calculationCommissionShop(order.getId());
     }
-    
-    
+
+
     /**
      * 管理后台获取订单列表数据
+     *
      * @param orderPageList
      * @return
      */
@@ -260,118 +318,224 @@
     public PageInfo<OrderPageListVo> getOrderPageList(OrderPageList orderPageList) {
         Long userid = tokenService.getLoginUser().getUserid();
         SysUser sysUser = sysUserClient.getSysUser(userid).getData();
-        if(2 == sysUser.getRoleType()){
+        if (2 == sysUser.getRoleType()) {
             orderPageList.setShopId(sysUser.getObjectId());
         }
         //搜索条件,用户姓名
-        if(StringUtils.isNotEmpty(orderPageList.getUserName())){
-            List<AppUser> data = appUserClient.getAppUserByName(orderPageList.getUserName()).getData();
+        if (StringUtils.isNotEmpty(orderPageList.getUserName())) {
+            List<AppUser> data = appUserClient.getAppUserByNameNoFilter(orderPageList.getUserName()).getData();
             List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
-            if(null != orderPageList.getAppUserIds()){
+            if (CollectionUtils.isEmpty(collect)) {
+                return new PageInfo<>();
+            }
+            if (null != orderPageList.getAppUserIds()) {
                 List<Long> appUserIds = orderPageList.getAppUserIds();
                 appUserIds.addAll(collect);
                 orderPageList.setAppUserIds(appUserIds);
-            }else{
+            } else {
                 orderPageList.setAppUserIds(collect);
             }
         }
         //搜索条件,用户电话
-        if(StringUtils.isNotEmpty(orderPageList.getPhone())){
-            List<AppUser> data = appUserClient.getAppUserByPhone(orderPageList.getPhone()).getData();
+        if (StringUtils.isNotEmpty(orderPageList.getPhone())) {
+            List<AppUser> data = appUserClient.getAppUserByPhoneNoFilter(orderPageList.getPhone()).getData();
             List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
-            if(null != orderPageList.getAppUserIds()){
+            if (CollectionUtils.isEmpty(collect)) {
+                return new PageInfo<>();
+            }
+
+            if (null != orderPageList.getAppUserIds()) {
                 List<Long> appUserIds = orderPageList.getAppUserIds();
+                if (!containsAny(appUserIds, collect)) {
+                    return new PageInfo<>();
+                }
                 appUserIds.addAll(collect);
                 orderPageList.setAppUserIds(appUserIds);
-            }else{
+            } else {
                 orderPageList.setAppUserIds(collect);
             }
         }
-        
-        PageInfo<OrderPageListVo> pageInfo = new PageInfo(orderPageList.getPageCurr(), orderPageList.getPageSize());
-        
+        if (null != orderPageList.getAppUserIds()) {
+            orderPageList.setAppUserIds(orderPageList.getAppUserIds().stream().distinct().collect(Collectors.toList()));
+        }
+
+
+        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);
-            orderPageListVo.setUserName(appUser.getName());
-            orderPageListVo.setPhone(appUser.getPhone());
+            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);
+
+            // 平台分佣
+            List<ShopBalanceStatement> data = shopBalanceStatementClient.getShopBalanceStatementList(Arrays.asList(1, 2, 3), Long.valueOf(orderPageListVo.getId())).getData();
+            BigDecimal reduce = data.stream().map(ShopBalanceStatement::getVariableAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            orderPageListVo.setGetCommission(reduce);
+
+            String expressJson = orderPageListVo.getExpressJson();
+            if (StringUtils.isNotEmpty(expressJson) && !expressJson.equals("NULL")) {
+                JSONObject jsonObject = null;
+                try {
+                    jsonObject = JSONObject.parseObject(expressJson);
+                    String companyName = ExpressCompanyMap.getCompanyNameByCode(jsonObject.getString("com"));
+                    orderPageListVo.setExpressCompany(companyName);
+                    orderPageListVo.setExpressNum(jsonObject.getString("num"));
+                } catch (Exception e) {
+                }
+
+            }
+
         }
         return pageInfo.setRecords(list);
     }
-    
-    
+
     /**
-     * 确认发货操作
+     * 判断 list1 是否包含 list2 中的至少一个元素
+     *
+     * @param list1 第一个列表
+     * @param list2 第二个列表
+     * @return 如果 list1 包含 list2 中的至少一个元素,返回 true;否则返回 false
+     */
+    private boolean containsAny(List<Long> list1, List<Long> list2) {
+        // 将 list1 转换为 HashSet 以提高查询效率
+        Set<Long> set1 = new HashSet<>(list1);
+
+        // 遍历 list2,检查是否有元素存在于 set1 中
+        for (Long element : list2) {
+            if (set1.contains(element)) {
+                return true;
+            }
+        }
+
+        // 如果没有找到共同元素,返回 false
+        return false;
+    }
+
+
+    /**
+     * 小程序取消订单
+     *
      * @param orderId
-     * @param code
      * @return
      */
     @Override
-    public R confirmDelivery(Long orderId, String code) {
+    public R cancel(Long orderId) {
         Order order = this.getById(orderId);
-        if(1 == order.getPayStatus()){
-            return R.fail("订单还未完成支付");
+        if (null == order) {
+            return R.fail("取消失败");
         }
-        if(1 == order.getOrderType() || null == order.getAddressJson()){
-            return R.fail("该订单不支付快递配送");
+        Long userid = tokenService.getLoginUserApplet().getUserid();
+        if (!order.getAppUserId().equals(userid)) {
+            return R.fail("取消失败");
         }
-        if(1 != order.getOrderStatus()){
-            return R.fail("无效的操作");
+        if (!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())) {
+            return R.fail("订单取消失败");
         }
-        //添加快递号和修改订单状态
-        order.setExpressJson(code);
-        order.setOrderStatus(2);
-        this.updateById(order);
-        return R.ok();
+        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);
+        }
+
+        R r1 = balanceChangeRecordClient.deleteBalanceChangeRecordCopy(orderId, Arrays.asList(4));
+        if (200 != r1.getCode()) { // 项目没有分布式事务,此处报错可能会导致数据不一致
+         throw new RuntimeException("订单取消失败");
+        }
+        R r2 = userPointClient.deleteUserPointCopy(orderId, Arrays.asList(2,8,9,10,14));
+        if (200 != r2.getCode()) { // 项目没有分布式事务,此处报错可能会导致数据不一致
+            throw new RuntimeException("订单取消失败");
+        }
+        R<Boolean> r3 = shopBalanceStatementClient.deleteShopBalanceStatementCopy(orderId, Arrays.asList(1,2,3));
+        if (200 != r3.getCode()) { // 项目没有分布式事务,此处报错可能会导致数据不一致
+            throw new RuntimeException("订单取消失败");
+        }
+        shopPointClient.deleteShopPointCopy(orderId, Arrays.asList(1,2,3));
+        appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(orderId);
+        shopGiveawayTemporaryClient.delShopGiveawayTemporary(orderId);
+        return r;
     }
-    
-    
+
+
+
+
     /**
      * 取消订单操作
+     *
      * @param orderId
      * @return
      */
     @Override
     public R cancelOrder(Long orderId) {
         Order order = this.getById(orderId);
-        if(Arrays.asList(4, 5, 6, 7, 8).contains(order.getOrderStatus())){
+        if (Arrays.asList(5, 6, 7).contains(order.getOrderStatus())) {
             return R.fail("无效的操作");
         }
+        if (null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())) {
+            return R.fail("订单取消失败");
+        }
         order.setOrderStatus(5);
-        this.updateById(order);
-        refundPayMoney(order);
-        return R.ok();
+        R r = refundPayMoney(order);
+        if (200 == r.getCode()) {
+            this.updateById(order);
+        }
+        return r;
     }
-    
-    
+
+
     /**
      * 返回订单支付金额和回退积分和会员等级
+     *
      * @param order
      */
-    public void refundPayMoney(Order order){
+    public R refundPayMoney(Order order) {
         //开始退款
         Integer payMethod = order.getPayMethod();
-        BigDecimal paymentAmount = order.getPaymentAmount();
+        BigDecimal expressAmount = order.getExpressAmount() == null ? BigDecimal.ZERO : order.getExpressAmount();
+        BigDecimal paymentAmount = order.getPaymentAmount().add(expressAmount);
         AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
-        if(1 == payMethod){
+        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){
+        if (2 == payMethod) {
             //余额退款
             OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
             BigDecimal balance = appUser.getBalance();
-            if(null != orderBalancePayment){
+            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.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(1, 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(null);
+            }
+
             //构建账户余额流水明细
             BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
             balanceChangeRecord.setOrderId(order.getId());
             balanceChangeRecord.setAppUserId(order.getAppUserId());
+            balanceChangeRecord.setVipId(appUser.getVipId());
             balanceChangeRecord.setChangeType(6);
             balanceChangeRecord.setBeforeAmount(balance);
             balanceChangeRecord.setChangeAmount(paymentAmount);
@@ -379,29 +543,82 @@
             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);
+
+            //构建积分流水明细
+            if (shopPoint > 0) {
+                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 (1 < appUser.getVipId() && appUser.getVipId() < 4) {
+                appUserClient.vipDemotion(appUser.getId());
+            }
+            //回退优惠券状态
+            if (null != order.getUserCouponId()) {
+                UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
+                userCoupon.setUseTime(null);
+                userCouponClient.editReturnUse(userCoupon);
+            }
         }
-        Integer lavePoint = appUser.getLavePoint();
-        if(3 == payMethod){
-            //积分退款
-            appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
-        
+        if (3 == payMethod) {
             //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款
-            if(null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0){
-                BigDecimal expressAmount = order.getExpressAmount();
-                if(1 == order.getExpressPayMethod()){
+            if (null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0) {
+                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()){
+                if (2 == order.getExpressPayMethod()) {
                     //余额退款
                     OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
                     BigDecimal balance = appUser.getBalance();
-                    appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN));
-                    appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN));
+                    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.setVipId(appUser.getVipId());
                     balanceChangeRecord.setChangeType(6);
                     balanceChangeRecord.setBeforeAmount(balance);
                     balanceChangeRecord.setChangeAmount(expressAmount);
@@ -411,71 +628,198 @@
                     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);
+
+            //构建积分流水明细
+            if (order.getPoint() > 0) {
+                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);
+            }
+            appUserClient.editAppUserById(appUser);
         }
+
+        order.setRefundStatus(2);
+        order.setRefundTime(LocalDateTime.now());
+
+        shopPointClient.deleteShopPointCopy(order.getId(), Arrays.asList(1,2,3));
+        shopBalanceStatementClient.deleteShopBalanceStatementCopy(order.getId(), Arrays.asList(1,2,3));
+        appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(order.getId());
+        shopGiveawayTemporaryClient.delShopGiveawayTemporary(order.getId());
+        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);
         //退回获得的消费积分
         //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
-        Integer getPoint = order.getGetPoint();
-        boolean vipDemotion = vipDemotion(appUser.getShopPoint() - getPoint, appUser.getVipId());
-        PointSetting pointSetting = pointSettingClient.getPointSetting(vipDemotion ? appUser.getVipId() - 1 : appUser.getVipId()).getData();
-        int earnPoint1 = getPoint;
-        if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){
-            earnPoint1 = getPoint / (100 - pointSetting.getBuyPoint());
+        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.setLavePoint(lavePoint - getPoint);
-        appUser.setShopPoint(appUser.getShopPoint() - earnPoint1);
-        appUser.setTotalPoint(appUser.getTotalPoint() - earnPoint1);
-        if(vipDemotion){
-            appUser.setVipId(appUser.getVipId() - 1);
-        }
+        appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
+
         //构建积分流水明细
-        UserPoint userPoint = new UserPoint();
-        userPoint.setType(11);
-        userPoint.setHistoricalPoint(lavePoint);
-        Integer point = appUser.getLavePoint() - lavePoint;
-        userPoint.setVariablePoint(point >= 0 ? point : point * -1);
-        userPoint.setBalance(appUser.getLavePoint());
-        userPoint.setCreateTime(LocalDateTime.now());
-        userPoint.setAppUserId(order.getAppUserId());
-        userPoint.setObjectId(order.getId());
-        userPointClient.saveUserPoint(userPoint);
-        appUserClient.editAppUserById(appUser);
-    }
-    
-    
-    
-    /**
-     * 会员降级检测
-     */
-    public boolean vipDemotion(Integer shopPoint, Integer vipId){
-        if(vipId == 1 || vipId > 3){
-            return false;
+        if (shopPoint > 0) {
+            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);
         }
-        VipSetting vipSetting = vipSettingClient.getVipSetting(vipId).getData();
-        Integer vipLevelUpShopRole = vipSetting.getVipLevelUpShopRole();
-        Integer vipLevelUpShop = vipSetting.getVipLevelUpShop();
-        return 1 == vipLevelUpShopRole && shopPoint < vipLevelUpShop;
+        appUserClient.editAppUserById(appUser);
+
+        //降级检测
+        if (1 < appUser.getVipId() && appUser.getVipId() < 4) {
+            appUserClient.vipDemotion(appUser.getId());
+        }
+
+        //回退优惠券状态
+        if (null != order.getUserCouponId()) {
+            UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
+            userCoupon.setUseTime(null);
+            userCouponClient.editReturnUse(userCoupon);
+        }
+        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);
+
+        //构建积分流水明细
+        if (order.getPoint() > 0) {
+            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();
+    }
+
+
     /**
      * 收货操作
+     *
      * @param orderId
      * @return
      */
     @Override
     public R receivingOperation(Long orderId) {
         Order order = this.getById(orderId);
-        if(order.getOrderStatus() != 2){
+        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);
+        commissionService.calculationCommissionShop(order.getId());
         return R.ok();
     }
-    
-    
+
+
     /**
      * 获取订单详情
+     *
      * @param orderId
      * @return
      */
@@ -488,35 +832,39 @@
         orderInfo.setOrderStatus(order.getOrderStatus());
         orderInfo.setCreateTime(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
-        orderInfo.setUserName(appUser.getName());
-        orderInfo.setPhone(appUser.getPhone());
-        orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getExpressJson()) ? "单品-快递配送" : "单品-自提"));
+        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){
+        if (null != shop) {
             orderInfo.setShopName(shop.getName());
         }
         orderInfo.setPaymentMethod(order.getPayMethod());
         orderInfo.setTotalAmount(order.getTotalAmount());
-        if(StringUtils.isNotEmpty(order.getCouponJson())){
+        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.setPoint(order.getGetPoint());
-        if(StringUtils.isNotEmpty(order.getAddressJson())){
+        orderInfo.setGetPoint(order.getGetPoint());
+        if (2 == order.getDistributionMode()) {
             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());
+            MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
+            orderInfo.setExpress(mapTrackKD100Vo);
         }
-        if(StringUtils.isNotEmpty(order.getExpressJson())){
+        if (StringUtils.isNotEmpty(order.getExpressJson()) && !order.getExpressJson().equals("NULL")){
             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);
+            orderInfo.setExpressCompany(jsonObject.getString("com"));
+            orderInfo.setExpressNumber(jsonObject.getString("num"));
         }
+
         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);
@@ -530,6 +878,279 @@
             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, Long userId) {
+        return this.baseMapper.getGoodsSaleNum(goodsId, type, userId);
+    }
+
+
+    /**
+     * 获取店铺订单数量
+     *
+     * @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 == null){
+                    redisTemplate.opsForZSet().remove("order_express", id);
+                    continue;
+                }
+                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, order.getDeliverProvince() + order.getDeliverCity(),
+                        userAddress.getProvince() + userAddress.getCity());
+                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));
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importExpress(String url) {
+        URL url1 = null;
+        try {
+            url1 = new URL(url);
+        } catch (MalformedURLException e) {
+            throw new RuntimeException(e);
+        }
+        try (InputStream fileInputStream = url1.openStream()) {
+            Workbook workbook = new XSSFWorkbook(fileInputStream);
+            Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
+            int lastRowNum = sheet.getLastRowNum();
+            for (int i = 1; i <= lastRowNum; i++) {
+                Row row = sheet.getRow(i);
+                // 订单编号
+                if (row.getCell(0) == null){
+                    throw new ServiceException("第" + i + "行订单编号为空", 500);
+                }
+                row.getCell(0).setCellType(CellType.STRING);
+                String orderNum = row.getCell(0).getStringCellValue();
+                // 快递单号
+                if (row.getCell(1) == null){
+                    throw new ServiceException("第" + i + "行快递单号为空", 500);
+                }
+                row.getCell(1).setCellType(CellType.STRING);
+                String expressNum = row.getCell(1).getStringCellValue();
+                // 快递公司名称
+                if (row.getCell(2) == null){
+                    throw new ServiceException("第" + i + "行快递公司为空", 500);
+                }
+                row.getCell(2).setCellType(CellType.STRING);
+                String expressName = row.getCell(2).getStringCellValue();
+                // 省区划代码
+                if (row.getCell(3) == null){
+                    throw new ServiceException("第" + i + "行省区划代码为空", 500);
+                }
+                row.getCell(3).setCellType(CellType.STRING);
+                String provinceCode = row.getCell(3).getStringCellValue();
+                // 市区划代码
+                if (row.getCell(4) == null){
+                    throw new ServiceException("第" + i + "行市区划代码为空", 500);
+                }
+                row.getCell(4).setCellType(CellType.STRING);
+                String cityCode = row.getCell(4).getStringCellValue();
+                Order order = this.getOne(new LambdaQueryWrapper<Order>()
+                        .eq(Order::getOrderNumber, orderNum)
+                );
+                if (order == null) {
+                    throw new ServiceException("订单不存在:" + orderNum, 500);
+                }
+
+                Integer orderType = order.getOrderType();
+                if (orderType != 2) {
+                    throw new ServiceException("该订单:" + orderNum + "类型不为单品订单", 500);
+                }
+                if (order.getDistributionMode() != 2) {
+                    throw new ServiceException("该订单:" + orderNum + "配送方式不为快递", 500);
+                }
+                Integer orderStatus = order.getOrderStatus();
+                if (orderStatus != 1) {
+                    throw new ServiceException("该订单:" + orderNum + "状态不为待发货", 500);
+                }
+
+                String companyNameByCode = ExpressCompanyMap.getCodeByCompanyName(expressName);
+                if (StringUtils.isEmpty(companyNameByCode)) {
+                    throw new ServiceException("快递公司名称错误:" + expressName, 500);
+                }
+
+                R<Region> regionBiCode = regionClient.getRegionBiCode(provinceCode);
+                if (regionBiCode.getData() == null) {
+                    throw new ServiceException("省份编码错误:" + provinceCode, 500);
+                }
+                R<Region> regionBiCode1 = regionClient.getRegionBiCode(cityCode);
+                if (regionBiCode1.getData() == null) {
+                    throw new ServiceException("城市编码错误:" + cityCode, 500);
+                }
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("com", companyNameByCode);
+                jsonObject.put("num", expressNum);
+                ConfirmDelivery confirmDelivery = new ConfirmDelivery();
+                confirmDelivery.setOrderId(order.getId());
+                confirmDelivery.setCode(jsonObject.toJSONString());
+                confirmDelivery.setDeliverProvince(regionBiCode.getData().getName());
+                confirmDelivery.setDeliverProvinceCode(regionBiCode.getData().getCode());
+                confirmDelivery.setDeliverCity(regionBiCode1.getData().getName());
+                confirmDelivery.setDeliverCityCode(regionBiCode1.getData().getCode());
+                R r = confirmDelivery(confirmDelivery);
+                if (R.isError(r)) {
+                    throw new ServiceException(r.getMsg(), 500);
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new ServiceException(e.getMessage());
+        }
+
+
+    }
+
+    /**
+     * 确认发货操作
+     *
+     * @return
+     */
+    @Override
+    public R confirmDelivery(ConfirmDelivery confirmDelivery) {
+        Order order = this.getById(confirmDelivery.getOrderId());
+        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(confirmDelivery.getCode());
+        order.setDeliverProvince(confirmDelivery.getDeliverProvince());
+        order.setDeliverProvinceCode(confirmDelivery.getDeliverProvinceCode());
+        order.setDeliverCity(confirmDelivery.getDeliverCity());
+        order.setDeliverCityCode(confirmDelivery.getDeliverCityCode());
+        order.setDeliverDistrict(confirmDelivery.getDeliverDistrict());
+        order.setDeliverDistrictCode(confirmDelivery.getDeliverDistrictCode());
+        order.setOrderStatus(2);
+        //添加查询快递信息队列
+        //一小时后定时查询快递信息
+        SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData();
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        Integer waitTime = jsonObject.getInteger("waitTime");
+        redisTemplate.opsForZSet().add("order_express", order.getId(), LocalDateTime.now().plusHours(waitTime).toEpochSecond(ZoneOffset.UTC));
+
+        JSONObject jsonObject1 = JSON.parseObject(confirmDelivery.getCode());
+        String com = jsonObject1.getString("com");
+        String num = jsonObject1.getString("num");
+        UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
+        MapTrackKD100Vo mapTrackKD100Vo = ExpressDeliveryUtil.kd100MapTrack(com, num, order.getDeliverProvince() + order.getDeliverCity(),
+                userAddress.getProvince() + userAddress.getCity());
+        order.setExpressResult(JSON.toJSONString(mapTrackKD100Vo));
+        this.updateById(order);
+        return R.ok();
+    }
+
+
+    public static void importExpress2(String filePath) throws MalformedURLException {
+        // 从网络地址读取
+        URL url = new URL(filePath);
+        try (InputStream fileInputStream = url.openStream()) {
+            Workbook workbook = new XSSFWorkbook(fileInputStream);
+
+            Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
+            int lastRowNum = sheet.getLastRowNum();
+
+            for (int i = 2; i <= lastRowNum; i++) {
+                Row row = sheet.getRow(i);
+                String orderNum = row.getCell(1).getStringCellValue();
+                // 快递单号
+                String expressNum = row.getCell(7).getStringCellValue();
+                // 快递公司名称
+                String expressName = row.getCell(8).getStringCellValue();
+                // 省区划代码
+                String provinceCode = row.getCell(10).getStringCellValue();
+                // 市区划代码
+                String cityCode = row.getCell(12).getStringCellValue();
+            }
+
+        } catch (IOException e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
+    @Override
+    public Integer getShopSaleNumByShopIds(List<Integer> shopIds, Integer type) {
+        return this.baseMapper.getShopSaleNumByShopIds(shopIds, type);
+    }
+
+    @Override
+    public List<OrderExport> getOrderExportList(OrderPageList orderPageList) {
+        return Collections.emptyList();
+    }
 }

--
Gitblit v1.7.1