浏览代码

feat: 增加用户近期使用地址查询;

hanchaolong 21 小时之前
父节点
当前提交
7c4acceed0

+ 31 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/AddressBookController.java

@@ -5,12 +5,16 @@ import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.logistics.constant.RedisCacheConstants;
 import com.ruoyi.logistics.domain.BizAddressBook;
+import com.ruoyi.logistics.domain.dto.RecentAddressDto;
 import com.ruoyi.logistics.service.IBizAddressBookService;
+import com.ruoyi.common.redis.service.RedisService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -26,6 +30,9 @@ public class AddressBookController extends BaseController
     @Autowired
     private IBizAddressBookService bizAddressBookService;
 
+    @Autowired
+    private RedisService redisService;
+
     /**
      * 查询地址簿管理列表
      */
@@ -83,4 +90,27 @@ public class AddressBookController extends BaseController
     public AjaxResult getDefaultAddress() {
         return success(bizAddressBookService.selectDefaultAddressBook());
     }
+
+    /**
+     * 获取用户最近使用的地址
+     * @return 最近使用的地址列表
+     */
+    @GetMapping("/getRecentAddresses")
+    public AjaxResult getRecentAddresses() {
+        // 获取当前登录用户ID
+        Long userId = SecurityUtils.getLoginUser().getUserid();
+
+        // 构造Redis key
+        String redisKey = RedisCacheConstants.USER_RECENT_ADDRESS_CACHE_KEY + userId;
+
+        // 从Redis获取最近使用的地址列表
+        List<RecentAddressDto> addressList =
+            redisService.getCacheList(redisKey);
+
+        if (addressList == null) {
+            addressList = new ArrayList<>();
+        }
+
+        return success(addressList);
+    }
 }

+ 5 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/constant/RedisCacheConstants.java

@@ -17,4 +17,9 @@ public class RedisCacheConstants {
      * 月结二维码缓存KEY
      */
     public static final String MONTH_QRCODE_CACHE_KEY = "month:qrcode:cache:";
+
+    /**
+     * 用户近期使用地址缓存
+     */
+    public static final String USER_RECENT_ADDRESS_CACHE_KEY = "user:recent:address:cache:";
 }

+ 28 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/dto/RecentAddressDto.java

@@ -0,0 +1,28 @@
+package com.ruoyi.logistics.domain.dto;
+
+import com.ruoyi.common.core.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class RecentAddressDto {
+
+
+    /** 联系人姓名 */
+    private String contactName;
+
+    /** 联系人电话 */
+    private String contactPhone;
+
+    /** 省 */
+    private String provinceName;
+
+    /** 市 */
+    private String cityName;
+
+    /** 区/县 */
+    private String countyName;
+
+    /** 详细地址 */
+    private String detailedAddress;
+
+}

+ 97 - 6
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizWaybillOrderServiceImpl.java

@@ -3,13 +3,11 @@ package com.ruoyi.logistics.service.impl;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.concurrent.TimeUnit;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -19,29 +17,32 @@ import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.logistics.constant.RedisCacheConstants;
+import com.ruoyi.logistics.domain.BizAddressBook;
 import com.ruoyi.logistics.domain.BizWaybillCostDetails;
 import com.ruoyi.logistics.domain.dto.OrderStatisticsDto;
+import com.ruoyi.logistics.domain.dto.RecentAddressDto;
 import com.ruoyi.logistics.enums.OrderStatusEnum;
 import com.ruoyi.logistics.mapper.BizWaybillCostDetailsMapper;
 import com.ruoyi.logistics.service.LogisticsOrderService;
 import com.ruoyi.system.api.model.LoginUser;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.time.DateFormatUtils;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.logistics.mapper.BizWaybillOrderMapper;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
 import com.ruoyi.logistics.domain.dto.DailyOrderStatisticsDto;
 import com.ruoyi.logistics.service.IBizWaybillOrderService;
 
-import java.util.List;
-
 /**
  * 运单管理Service业务层处理
  * 
  * @author RuiJing
  * @date 2026-01-29
  */
+@Slf4j
 @Service
 public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService 
 {
@@ -56,6 +57,9 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
     @Autowired
     private BizWaybillCostDetailsMapper bizWaybillCostDetailsMapper;
 
+    @Autowired
+    private RedisService redisService;
+
     /**
      * 查询运单管理
      * 
@@ -116,10 +120,16 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 }
             }
         }
+
+
         bizWaybillOrder.setPickupType(1);
         bizWaybillOrder.setCreateTime(DateUtils.getNowDate());
         bizWaybillOrder.setUserId(loginUser.getUserid());
         bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
+        
+        // 保存寄件地址和收件地址到Redis作为用户最近使用地址
+        saveRecentAddresses(bizWaybillOrder, loginUser.getUserid());
+        
         return bizWaybillOrderMapper.insertBizWaybillOrder(bizWaybillOrder);
     }
 
@@ -228,4 +238,85 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
         
         return result;
     }
+
+    /**
+     * 保存寄件地址和收件地址到Redis作为用户最近使用地址
+     * @param userId 用户ID
+     */
+    private void saveRecentAddresses(BizWaybillOrder bizWaybillOrder, Long userId) {
+        try {
+            // 保存寄件地址
+            saveRecentAddressToRedis(bizWaybillOrder.getSenderProvince(),
+                    bizWaybillOrder.getSenderCity(),
+                    bizWaybillOrder.getSenderCounty(),
+                    bizWaybillOrder.getSenderAddress(),
+                    bizWaybillOrder.getSenderName(),
+                    bizWaybillOrder.getSenderPhone(),
+                    "sender", userId);
+            
+            // 保存收件地址
+            saveRecentAddressToRedis(bizWaybillOrder.getReceiverProvince(),
+                    bizWaybillOrder.getReceiverCity(),
+                    bizWaybillOrder.getReceiverCounty(),
+                    bizWaybillOrder.getReceiverAddress(),
+                    bizWaybillOrder.getReceiverName(),
+                    bizWaybillOrder.getReceiverPhone(),
+                    "receiver", userId);
+        } catch (Exception e) {
+            //记录日志但不影响主流程
+            log.info("保存最近使用地址到Redis失败: ", e);
+        }
+    }
+
+    /**
+     * 保存单个地址到Redis
+     * @param userId 用户ID
+     */
+    private void saveRecentAddressToRedis(String provinceName, String cityName, String countyName,
+                                         String detailedAddress, String contactName, String contactPhone,
+                                         String addressType, Long userId) {
+        if (provinceName == null || cityName == null || contactName == null || contactPhone == null) {
+            return; //基信息不完整,不保存
+        }
+        
+        //构造Redis key
+        String redisKey = RedisCacheConstants.USER_RECENT_ADDRESS_CACHE_KEY + userId;
+        
+        // 创建地址对象
+        RecentAddressDto addressDto = new RecentAddressDto();
+        addressDto.setProvinceName(provinceName);
+        addressDto.setCityName(cityName);
+        addressDto.setCountyName(countyName);
+        addressDto.setDetailedAddress(detailedAddress);
+        addressDto.setContactName(contactName);
+        addressDto.setContactPhone(contactPhone);
+        
+        // 获取当前列表
+        List<RecentAddressDto> addressList = redisService.getCacheList(redisKey);
+        if (addressList == null) {
+            addressList = new ArrayList<>();
+        }
+        
+        //移除相同的地址(如果已存在)
+        addressList.removeIf(addr -> 
+            addr.getProvinceName().equals(provinceName) &&
+            addr.getCityName().equals(cityName) &&
+            addr.getCountyName().equals(countyName) &&
+            addr.getDetailedAddress().equals(detailedAddress) &&
+            addr.getContactName().equals(contactName) &&
+            addr.getContactPhone().equals(contactPhone)
+        );
+        
+        //将新地址添加到列表开头
+        addressList.add(0, addressDto);
+        
+        // 保持最多5个地址
+        if (addressList.size() > 5) {
+            addressList = addressList.subList(0, 5);
+        }
+        
+        // 保存到Redis,设置过期时间30天
+        redisService.setCacheList(redisKey, addressList);
+        redisService.expire(redisKey, 30, TimeUnit.DAYS);
+    }
 }