From 1f09f6daaf73bc83cceb4ae22b862b7b365635cf Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 03 四月 2025 19:59:17 +0800
Subject: [PATCH] 修改反馈文档bug

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java |  759 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 537 insertions(+), 222 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 9ed66d0..e0c937f 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,57 +1,79 @@
 package com.ruoyi.order.service.impl;
 
-import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
 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.*;
 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.HttpUtils;
 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;
+import com.ruoyi.order.event.ConfirmDeliveryEvent;
 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.model.RefundPass;
-import com.ruoyi.order.service.*;
+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.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.util.vo.QueryKD100Vo;
 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.context.ApplicationEventPublisher;
 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.OffsetDateTime;
 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
@@ -75,22 +97,23 @@
     private CommissionService commissionService;
     @Resource
     private BaseSettingClient baseSettingClient;
-    
+
     @Resource
     private SysUserClient sysUserClient;
-    
+
     @Resource
     private BalanceChangeRecordClient balanceChangeRecordClient;
     
+
     @Resource
     private UserPointClient userPointClient;
-    
+
     @Resource
     private OrderBalancePaymentService orderBalancePaymentService;
-    
+
     @Resource
     private VipSettingClient vipSettingClient;
-    
+
     @Resource
     private GoodsClient goodsClient;
 
@@ -100,20 +123,30 @@
     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;
+    @Resource
+    private ApplicationEventPublisher applicationEventPublisher;
 
 
     @Override
@@ -122,16 +155,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("获取门店信息失败");
         }
 
@@ -157,20 +188,20 @@
         // 收货地址
         String addressJson = order.getAddressJson();
         UserAddress userAddress = new UserAddress();
-        if (2 == order.getDistributionMode()){
+        if (2 == order.getDistributionMode()) {
             userAddress = JSONObject.parseObject(addressJson, UserAddress.class);
         }
         // 优惠券
         String couponJson = order.getCouponJson();
-        CouponInfo couponInfo = new CouponInfo();
-        if (StringUtils.isNotEmpty(couponJson)){
-            couponInfo = JSONObject.parseObject(couponJson, CouponInfo.class);
+        JSONObject jsonObject = new JSONObject();
+        if (StringUtils.isNotEmpty(couponJson)) {
+            jsonObject = JSONObject.parseObject(couponJson);
         }
 
         // 参与活动
         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();
@@ -187,7 +218,7 @@
         orderDetailVO.setOrderNumber(order.getOrderNumber());
         orderDetailVO.setCreateTime(order.getCreateTime());
         orderDetailVO.setTotalAmount(order.getTotalAmount());
-        orderDetailVO.setCouponName(couponInfo.getCouponName());
+        orderDetailVO.setCouponName(jsonObject.getString("couponName"));
         orderDetailVO.setActivityName(orderActivityInfo.getActivityName());
         orderDetailVO.setCouponAmount(order.getDiscountTotalAmount());
         orderDetailVO.setExpressAmount(order.getExpressAmount());
@@ -199,15 +230,15 @@
         orderDetailVO.setLongitude(shop.getLongitude());
         orderDetailVO.setLatitude(shop.getLatitude());
         orderDetailVO.setShopId(shop.getId());
-        if(StringUtils.isNotEmpty(order.getExpressResult())){
+        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){
+
+        if (order.getOrderType() == 1) {
             List<TechnicianSubscribe> data = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
-            if(data.size() > 0){
+            if (data.size() > 0) {
                 Long id = data.get(0).getId();
                 orderDetailVO.setTechnicianSubscribeId(id.toString());
                 Technician technician = technicianClient.shopdetail(order.getTechnicianId()).getData();
@@ -226,14 +257,15 @@
         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;
         }
 
@@ -241,12 +273,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("订单不存在");
         }
 
@@ -259,7 +291,7 @@
         LoginUser loginUserApplet = tokenService.getLoginUserApplet();
         Order order = orderMapper.selectById(id);
         boolean check = check(order, shopId, loginUserApplet.getUserid());
-        if (!check){
+        if (!check) {
             throw new ServiceException("该订单与当前扫码门店不一致");
         }
 
@@ -276,19 +308,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)){
+        if (StringUtils.isNotEmpty(technicianId) && !"null".equals(technicianId)) {
             order.setTechnicianId(Integer.valueOf(technicianId));
         }
         orderMapper.updateById(order);
+        commissionService.calculationCommissionShop(order.getId());
     }
-    
-    
+
+
     /**
      * 管理后台获取订单列表数据
+     *
      * @param orderPageList
      * @return
      */
@@ -296,41 +329,55 @@
     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);
-            if(null != appUser){
+            if (null != appUser) {
                 orderPageListVo.setUserName(appUser.getName());
                 orderPageListVo.setPhone(appUser.getPhone());
             }
@@ -341,162 +388,162 @@
             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
      * @return
      */
     @Override
     public R cancel(Long orderId) {
         Order order = this.getById(orderId);
-        if(null == order){
+        if (null == order) {
             return R.fail("取消失败");
         }
         Long userid = tokenService.getLoginUserApplet().getUserid();
-        if(!order.getAppUserId().equals(userid)){
+        if (!order.getAppUserId().equals(userid)) {
             return R.fail("取消失败");
         }
-        if(!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())){
+        if (!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())) {
             return R.fail("订单取消失败");
         }
-        if(null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())){
+        if (null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())) {
             return R.fail("订单取消失败");
         }
         order.setOrderStatus(5);
         R r = refundPayMoney(order);
-        if(200 == r.getCode()){
+        if (200 == r.getCode()) {
             this.updateById(order);
         }
         return r;
     }
 
-    /**
-     * 确认发货操作
-     * @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();
-    }
-    
-    
+
+
+
     /**
      * 取消订单操作
+     *
      * @param orderId
      * @return
      */
     @Override
     public R cancelOrder(Long orderId) {
         Order order = this.getById(orderId);
-        if(Arrays.asList(5, 6, 7).contains(order.getOrderStatus())){
+        if (Arrays.asList(5, 6, 7).contains(order.getOrderStatus())) {
             return R.fail("无效的操作");
         }
-        if(null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())){
+        if (null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())) {
             return R.fail("订单取消失败");
         }
         order.setOrderStatus(5);
         R r = refundPayMoney(order);
-        if(200 == r.getCode()){
+        if (200 == r.getCode()) {
             this.updateById(order);
         }
         return r;
     }
-    
-    
+
+
     /**
      * 返回订单支付金额和回退积分和会员等级
+     *
      * @param order
      */
-    public R 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())){
+            if ("100".equals(refund.getRa_Status())) {
                 order.setRefundStatus(1);
                 return R.ok();
-            }else{
+            } 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){
+            if (null != order1) {
                 appUser.setLastShopTime(order1.getCreateTime());
-            }else{
+            } 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);
-            balanceChangeRecord.setAfterAmount(appUser.getBalance());
             balanceChangeRecord.setDelFlag(0);
             balanceChangeRecord.setCreateTime(LocalDateTime.now());
+            balanceChangeRecord.setChangeDirection(1);
             balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
+
 
             //退回获得的消费积分
             //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
-            Integer lavePoint = appUser.getLavePoint();
-
             UserPoint userPoint1 = new UserPoint();
             userPoint1.setType(1);
             userPoint1.setAppUserId(appUser.getId());
@@ -510,69 +557,62 @@
             appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
             appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
             appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
-            if(null != transferablePoint){
+            if (null != transferablePoint) {
                 appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
             }
             appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
 
-            //构建积分流水明细
-            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);
-    
-            //降级检测
-            boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId());
-            if(vipDemotion){
-                appUserClient.vipDemotion(appUser.getId());
+            //构建积分流水明细(消费金额,不属于冻结数据)
+            if (shopPoint > 0) {
+                UserPoint userPoint = new UserPoint();
+                userPoint.setType(1);
+                userPoint.setVariablePoint(shopPoint);
+                userPoint.setCreateTime(LocalDateTime.now());
+                userPoint.setAppUserId(order.getAppUserId());
+                userPoint.setObjectId(order.getId());
+                userPoint.setChangeDirection(-1);
+                userPointClient.saveUserPoint(userPoint);
             }
+            appUserClient.editAppUserById(appUser);
             //回退优惠券状态
-            if(null != order.getUserCouponId()){
+            if (null != order.getUserCouponId()) {
                 UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
                 userCoupon.setUseTime(null);
                 userCouponClient.editReturnUse(userCoupon);
             }
         }
-        if(3 == payMethod){
+        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())){
+                    if ("100".equals(refund.getRa_Status())) {
                         order.setRefundStatus(1);
                         return R.ok();
-                    }else{
+                    } 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();
-                    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(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);
-                    balanceChangeRecord.setAfterAmount(appUser.getBalance());
                     balanceChangeRecord.setDelFlag(0);
                     balanceChangeRecord.setCreateTime(LocalDateTime.now());
+                    balanceChangeRecord.setChangeDirection(1);
                     balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
                 }
             }
@@ -586,40 +626,80 @@
             userPoint1.setObjectId(order.getId());
             List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
             Integer transferablePoint = order.getPoint();
-            if(data.size() > 0){
+            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);
+            //构建积分流水明细(支付的积分,不属于冻结数据)
+            if (order.getPoint() > 0) {
+                UserPoint userPoint = new UserPoint();
+                userPoint.setType(11);
+                userPoint.setVariablePoint(order.getPoint());
+                userPoint.setCreateTime(LocalDateTime.now());
+                userPoint.setAppUserId(order.getAppUserId());
+                userPoint.setObjectId(order.getId());
+                userPoint.setChangeDirection(1);
+                userPointClient.saveUserPoint(userPoint);
+            }
             appUserClient.editAppUserById(appUser);
         }
 
         order.setRefundStatus(2);
         order.setRefundTime(LocalDateTime.now());
+
+        //生成反向冻结流水数据
+        List<UserPointCopy> data2 = userPointClient.getUserPointCopy(order.getId(), Arrays.asList(2, 8, 9, 10, 14)).getData();
+        for (UserPointCopy userPointCopy : data2) {
+            userPointCopy.setId(null);
+            userPointCopy.setCreateTime(LocalDateTime.now());
+            userPointCopy.setChangeDirection(-1);
+            userPointClient.saveUserPointCopy(userPointCopy);
+        }
+        List<BalanceChangeRecordCopy> data3 = balanceChangeRecordClient.getBalanceChangeRecordCopy(order.getId(), Arrays.asList(4)).getData();
+        for (BalanceChangeRecordCopy balanceChangeRecordCopy : data3) {
+            balanceChangeRecordCopy.setId(null);
+            balanceChangeRecordCopy.setCreateTime(LocalDateTime.now());
+            balanceChangeRecordCopy.setChangeDirection(-1);
+            balanceChangeRecordClient.saveBalanceChangeRecordCopy(balanceChangeRecordCopy);
+        }
+        List<ShopPointCopy> data = shopPointClient.getShopPointCopy(order.getId(), Arrays.asList(1, 2, 3)).getData();
+        for (ShopPointCopy datum : data) {
+            datum.setId(null);
+            datum.setCreateTime(LocalDateTime.now());
+            datum.setChangeDirection(-1);
+            shopPointClient.saveShopPointCopy(datum);
+        }
+        List<ShopBalanceStatementCopy> data1 = shopBalanceStatementClient.getShopBalanceStatementCopy(order.getId(), Arrays.asList(1, 2, 3)).getData();
+        for (ShopBalanceStatementCopy shopBalanceStatementCopy : data1) {
+            shopBalanceStatementCopy.setId(null);
+            shopBalanceStatementCopy.setCreateTime(LocalDateTime.now());
+            shopBalanceStatementCopy.setChangeDirection(-1);
+            shopBalanceStatementClient.saveShopBalanceStatementCopy(shopBalanceStatementCopy);
+        }
+        //删除用户和门店添加的汇总数据(冻结数据)
+        appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(order.getId());
+        shopGiveawayTemporaryClient.delShopGiveawayTemporary(order.getId());
+    
+        //降级检测
+        if (1 < appUser.getVipId() && appUser.getVipId() < 4) {
+            appUserClient.vipDemotion(appUser.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){
+        if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
             return R.ok();
         }
         order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
@@ -643,34 +723,67 @@
         appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
         appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
         appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
-        if(null != transferablePoint){
+        if (null != transferablePoint) {
             appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
         }
         appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
 
         //构建积分流水明细
-        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);
-    
-        //降级检测
-        boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId());
-        if(vipDemotion){
-            appUserClient.vipDemotion(appUser.getId());
+        if (shopPoint > 0) {
+            UserPoint userPoint = new UserPoint();
+            userPoint.setType(1);
+            userPoint.setVariablePoint(shopPoint);
+            userPoint.setCreateTime(LocalDateTime.now());
+            userPoint.setAppUserId(order.getAppUserId());
+            userPoint.setObjectId(order.getId());
+            userPoint.setChangeDirection(-1);
+            userPointClient.saveUserPoint(userPoint);
         }
+        appUserClient.editAppUserById(appUser);
 
         //回退优惠券状态
-        if(null != order.getUserCouponId()){
+        if (null != order.getUserCouponId()) {
             UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
             userCoupon.setUseTime(null);
             userCouponClient.editReturnUse(userCoupon);
+        }
+    
+        //生成反向冻结流水数据
+        List<UserPointCopy> data2 = userPointClient.getUserPointCopy(order.getId(), Arrays.asList(2, 8, 9, 10, 14)).getData();
+        for (UserPointCopy userPointCopy : data2) {
+            userPointCopy.setId(null);
+            userPointCopy.setCreateTime(LocalDateTime.now());
+            userPointCopy.setChangeDirection(-1);
+            userPointClient.saveUserPointCopy(userPointCopy);
+        }
+        List<BalanceChangeRecordCopy> data3 = balanceChangeRecordClient.getBalanceChangeRecordCopy(order.getId(), Arrays.asList(4)).getData();
+        for (BalanceChangeRecordCopy balanceChangeRecordCopy : data3) {
+            balanceChangeRecordCopy.setId(null);
+            balanceChangeRecordCopy.setCreateTime(LocalDateTime.now());
+            balanceChangeRecordCopy.setChangeDirection(-1);
+            balanceChangeRecordClient.saveBalanceChangeRecordCopy(balanceChangeRecordCopy);
+        }
+        List<ShopPointCopy> data = shopPointClient.getShopPointCopy(order.getId(), Arrays.asList(1, 2, 3)).getData();
+        for (ShopPointCopy datum : data) {
+            datum.setId(null);
+            datum.setCreateTime(LocalDateTime.now());
+            datum.setChangeDirection(-1);
+            shopPointClient.saveShopPointCopy(datum);
+        }
+        List<ShopBalanceStatementCopy> data1 = shopBalanceStatementClient.getShopBalanceStatementCopy(order.getId(), Arrays.asList(1, 2, 3)).getData();
+        for (ShopBalanceStatementCopy shopBalanceStatementCopy : data1) {
+            shopBalanceStatementCopy.setId(null);
+            shopBalanceStatementCopy.setCreateTime(LocalDateTime.now());
+            shopBalanceStatementCopy.setChangeDirection(-1);
+            shopBalanceStatementClient.saveShopBalanceStatementCopy(shopBalanceStatementCopy);
+        }
+        //删除用户和门店添加的汇总数据(冻结数据)
+        appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(order.getId());
+        shopGiveawayTemporaryClient.delShopGiveawayTemporary(order.getId());
+        
+        //降级检测
+        if (1 < appUser.getVipId() && appUser.getVipId() < 4) {
+            appUserClient.vipDemotion(appUser.getId());
         }
         return R.ok();
     }
@@ -678,13 +791,14 @@
 
     /**
      * 取消订单快递费回退
+     *
      * @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){
+        if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
             return R.ok();
         }
         order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
@@ -702,48 +816,37 @@
         userPoint1.setObjectId(order.getId());
         List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
         Integer transferablePoint = order.getPoint();
-        if(data.size() > 0){
+        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);
+        if (order.getPoint() > 0) {
+            UserPoint userPoint = new UserPoint();
+            userPoint.setType(11);
+            userPoint.setVariablePoint(order.getPoint());
+            userPoint.setCreateTime(LocalDateTime.now());
+            userPoint.setAppUserId(order.getAppUserId());
+            userPoint.setObjectId(order.getId());
+            userPoint.setChangeDirection(1);
+            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){
+        if (order.getOrderStatus() != 2) {
             return R.fail("无效的操作");
         }
         order.setOrderStatus(4);
@@ -762,10 +865,11 @@
         this.updateById(order);
         return R.ok();
     }
-    
-    
+
+
     /**
      * 获取订单详情
+     *
      * @param orderId
      * @return
      */
@@ -778,18 +882,18 @@
         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){
+        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());
         }
@@ -797,7 +901,7 @@
         orderInfo.setExpressAmount(order.getExpressAmount());
         orderInfo.setPaymentAmount(order.getPaymentAmount());
         orderInfo.setGetPoint(order.getGetPoint());
-        if(2 == order.getDistributionMode()){
+        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());
@@ -805,6 +909,12 @@
             MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
             orderInfo.setExpress(mapTrackKD100Vo);
         }
+        if (StringUtils.isNotEmpty(order.getExpressJson()) && !order.getExpressJson().equals("NULL")){
+            JSONObject jsonObject = JSON.parseObject(order.getExpressJson());
+            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);
@@ -819,21 +929,21 @@
         }
         orderInfo.setGoodsJson(JSON.toJSONString(goodsJson));
         orderInfo.setPoint(order.getPoint());
-        if(null != order.getAfterSaleTime()){
+        if (null != order.getAfterSaleTime()) {
             orderInfo.setAfterSaleTime(order.getAfterSaleTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         }
-        if(StringUtils.isNotEmpty(order.getActivityJson())){
+        if (StringUtils.isNotEmpty(order.getActivityJson())) {
             OrderActivityInfo activityInfo = JSON.parseObject(order.getActivityJson(), OrderActivityInfo.class);
             orderInfo.setActivityName(activityInfo.getActivityName());
         }
-        if(null != order.getEndTime()){
+        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){
+        if (order.getOrderType() == 1) {
             List<TechnicianSubscribe> technicianSubscribes = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
-            if(technicianSubscribes.size() > 0){
+            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(",")));
@@ -848,6 +958,7 @@
 
     /**
      * 获取商品销售数量
+     *
      * @param goodsId
      * @return
      */
@@ -859,6 +970,7 @@
 
     /**
      * 获取店铺订单数量
+     *
      * @param shopId
      * @param type
      * @return
@@ -867,23 +979,27 @@
     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){
+        if (order_express.size() > 0) {
             for (Long id : order_express) {
                 Order order = this.getById(id);
-                if(order.getOrderStatus() != 2){
+                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)){
+                if (StringUtils.isEmpty(expressJson)) {
                     redisTemplate.opsForZSet().remove("order_express", id);
                     continue;
                 }
@@ -904,4 +1020,203 @@
             }
         }
     }
+
+    @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);
+
+        // 发布事件
+        applicationEventPublisher.publishEvent(new ConfirmDeliveryEvent(order.getId()));
+        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();
+    }
+    
+    
+    /**
+     * 查询给定用户在给定门店核销的订单
+     * @param shopId
+     * @param appUserId
+     * @return
+     */
+    @Override
+    public List<Order> getOrderByAppUserIdsAndWriteOffShop(Integer shopId, Set<Long> appUserId) {
+        return this.baseMapper.getOrderByAppUserIdsAndWriteOffShop(shopId, appUserId);
+    }
 }

--
Gitblit v1.7.1