KKSU
2025-01-22 d7f01edd56f2f8a822ceffa9240fa22e4763d7e4
refactor(mall): 重构订单发货相关代码

- 移除重复代码和注释
- 使用 ValidateEntityUtils 工具类进行数据验证和实体查询
- 优化代码结构,提高可读性和可维护性
3 files modified
154 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java 107 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java 39 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 8 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java
@@ -5,12 +5,116 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * 实体验证工具类
 */
public class ValidateEntityUtils {
    /**
     * 确保指定列的有效性,并返回相应的实体对象
     * 此方法用于验证数据库中某列的值是否存在,并返回包含该值的实体对象
     * 如果指定的值不存在或为null,将抛出异常
     *
     * @param valueToCheck 需要验证的值
     * @param columnExtractor 列值提取器,用于指定需要验证的列
     * @param queryWrapperExtractor 查询包装器提取器,用于执行数据库查询
     * @param errMsg 错误消息格式字符串
     * @param <T> 实体类类型
     * @param <R> 列值类型
     * @param <V> 需要验证的值的类型
     * @return 返回包含指定列值的实体对象
     * @throws IllegalArgumentException 如果需要验证的值为null
     * @throws FebsException 如果查询结果为空或列值为null,或查询过程中发生异常
     */
    public static <T, R, V> T ensureColumnReturnEntity(
            V valueToCheck,
            SFunction<T, R> columnExtractor,
            SFunction<LambdaQueryWrapper<T>, T> queryWrapperExtractor,
            String errMsg) {
        // 检查需要验证的值是否为null
        if (valueToCheck == null) {
            throw new IllegalArgumentException("The value to check cannot be null while ensureColumnReturnEntity column");
        }
        T entity = null;
        try {
            // 创建LambdaQueryWrapper并配置查询条件
            LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
            wrapper.select(columnExtractor)
                    .eq(columnExtractor, valueToCheck);
            // 执行查询并获取结果实体
            entity = queryWrapperExtractor.apply(wrapper);
        } catch (Exception e) {
            // 记录异常日志
            throw new FebsException(StrUtil.format("An error occurred while ensureColumnReturnEntity column: {}", valueToCheck));
        }
        // 如果查询结果为空,则抛出异常
        if (entity == null) {
            throw new FebsException(StrUtil.format(errMsg, valueToCheck));
        }
        // 提取查询结果中的列值
        R columnValue = columnExtractor.apply(entity);
        // 如果列值为null,则抛出异常
        if (columnValue == null) {
            throw new FebsException(StrUtil.format(errMsg, valueToCheck));
        }
        // 返回查询到的实体类对象
        return entity;
    }
    /**
     * 确保指定列的有效性,并返回相应的实体对象列表
     * 此方法用于验证数据库中某列的值是否存在,并返回包含该值的实体对象列表
     * 如果指定的值不存在或为null,将抛出异常
     *
     * @param valueToCheck 需要验证的值
     * @param columnExtractor 列值提取器,用于指定需要验证的列
     * @param queryWrapperExtractor 查询包装器提取器,用于执行数据库查询
     * @param errMsg 错误消息格式字符串
     * @param <T> 实体类类型
     * @param <R> 列值类型
     * @param <V> 需要验证的值的类型
     * @return 返回包含指定列值的实体对象列表
     * @throws IllegalArgumentException 如果需要验证的值为null
     * @throws FebsException 如果查询结果为空或列值为null,或查询过程中发生异常
     */
    public static <T, R, V> List<T> ensureColumnReturnEntityList(
            V valueToCheck,
            SFunction<T, R> columnExtractor,
            SFunction<LambdaQueryWrapper<T>, List<T>> queryWrapperExtractor,
            String errMsg) {
        // 检查需要验证的值是否为null
        if (valueToCheck == null) {
            throw new IllegalArgumentException("The value to check cannot be null while ensureColumnReturnEntityList column");
        }
        List<T> entities = new ArrayList<>();
        try {
            // 创建LambdaQueryWrapper并配置查询条件
            LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
            wrapper.select(columnExtractor)
                    .eq(columnExtractor, valueToCheck);
            // 执行查询并获取结果实体列表
            entities = queryWrapperExtractor.apply(wrapper);
        } catch (Exception e) {
            // 记录异常日志
            throw new FebsException(StrUtil.format("An error occurred while ensureColumnReturnEntityList column: {}", valueToCheck));
        }
        // 如果查询结果为空,则抛出异常
        if (entities == null || entities.isEmpty()) {
            throw new FebsException(StrUtil.format(errMsg, valueToCheck));
        }
        // 返回查询到的实体类对象列表
        return entities;
    }
    /**
     * 确保指定列的值在数据库中是存在的,
@@ -100,8 +204,7 @@
        } catch (Exception e) {
            // 记录异常日志
            // 如果在检查过程中发生异常,抛出FebsException异常
            throw new FebsException(StrUtil.format("An error occurred while ensuring unique column: {}", valueToCheck));
            throw new FebsException(StrUtil.format("An error occurred while ensureUnique column: {}", valueToCheck));
        }
        // 如果结果数量大于0,说明值已存在,抛出FebsException异常
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
@@ -104,22 +104,13 @@
    @Override
    public FebsResponse deliverGoods(DeliverGoodsDto deliverGoodsDto) {
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(deliverGoodsDto.getId());
        ValidateEntityUtils.ensureColumnValid(deliverGoodsDto.getId(), MallOrderInfo::getId, mallOrderInfoMapper::selectOne, "订单{}不存在");
//        if(ObjectUtil.isEmpty(mallOrderInfo)){
//            return new FebsResponse().fail().message("订单不存在,刷新后重试");
//        }
        MallOrderInfo mallOrderInfo = ValidateEntityUtils.ensureColumnReturnEntity(
                deliverGoodsDto.getId(),
                MallOrderInfo::getId,
                mallOrderInfoMapper::selectOne,
                "订单{}不存在");
        ValidateEntityUtils.ensureEqual(mallOrderInfo.getStatus(), OrderStatusEnum.WAIT_SHIPPING.getValue(), "订单状态不是待发货状态");
//        Integer status = mallOrderInfo.getStatus();
//        if(2 != status){
//            return new FebsResponse().fail().message("订单不是待发货状态");
//        }
        ValidateEntityUtils.ensureEqual(mallOrderInfo.getDeliveryType(), 2, "订单的配送方式不是快递");
//        Integer deliveryType = mallOrderInfo.getDeliveryType();
//        if(2 != deliveryType){
//            return new FebsResponse().fail().message("订单的配送方式不是快递");
//        }
//        String expressNo = deliverGoodsDto.getExpressNo();
//        if(StrUtil.isEmpty(expressNo)){
//            return new FebsResponse().fail().message("请输入物流单号");
@@ -463,19 +454,13 @@
    @Override
    public FebsResponse deliverGoodsUpdate(DeliverGoodsDto deliverGoodsDto) {
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(deliverGoodsDto.getId());
        if(ObjectUtil.isEmpty(mallOrderInfo)){
            return new FebsResponse().fail().message("订单不存在,刷新后重试");
        }
        Integer status = mallOrderInfo.getStatus();
        if(3 != status){
            return new FebsResponse().fail().message("订单不是待收货状态");
        }
        Integer deliveryType = mallOrderInfo.getDeliveryType();
        if(2 != deliveryType){
            return new FebsResponse().fail().message("订单的配送方式不是快递");
        }
        MallOrderInfo mallOrderInfo = ValidateEntityUtils.ensureColumnReturnEntity(
                deliverGoodsDto.getId(),
                MallOrderInfo::getId,
                mallOrderInfoMapper::selectOne,
                "订单{}不存在");
        ValidateEntityUtils.ensureEqual(mallOrderInfo.getStatus(), OrderStatusEnum.WAIT_FINISH.getValue(), "订单不是待收货状态");
        ValidateEntityUtils.ensureEqual(mallOrderInfo.getDeliveryType(), 2, "订单的配送方式不是快递");
        mallOrderInfo.setStatus(OrderStatusEnum.FINISH.getValue());
        mallOrderInfo.setReceivingTime(new Date());
        mallOrderInfoMapper.updateById(mallOrderInfo);
src/test/java/cc/mrbird/febs/AgentTest.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs;
import cc.mrbird.febs.common.utils.ValidateEntityUtils;
import cc.mrbird.febs.mall.entity.MallMemberCoupon;
import cc.mrbird.febs.mall.mapper.MallMemberCouponMapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@@ -8,6 +9,7 @@
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.List;
/**
 * @author wzy
@@ -22,8 +24,10 @@
    MallMemberCouponMapper mallMemberCouponMapper;
    @Test
    public void getCouponAmountMap() {
//        ValidateEntityUtils.ensureColumnValid(205L, MallMemberCoupon::getId, mallMemberCouponMapper::selectOne, "id{}不存在");
//        ValidateEntityUtils.ensureUnique(205L, MallMemberCoupon::getId, mallMemberCouponMapper::selectCount, "id{}已存在");
        MallMemberCoupon mallMemberCoupon = ValidateEntityUtils.ensureColumnReturnEntity(209L, MallMemberCoupon::getId, mallMemberCouponMapper::selectOne, "id{}不存在");
        List<MallMemberCoupon> mallMemberCoupons = ValidateEntityUtils.ensureColumnReturnEntityList(209L, MallMemberCoupon::getId, mallMemberCouponMapper::selectList, "id{}不存在");
        ValidateEntityUtils.ensureColumnValid(205L, MallMemberCoupon::getId, mallMemberCouponMapper::selectOne, "id{}不存在");
        ValidateEntityUtils.ensureUnique(205L, MallMemberCoupon::getId, mallMemberCouponMapper::selectCount, "id{}已存在");
        ValidateEntityUtils.ensureEqual(205L, 206L, "{},{},值不相等");
//        // 使用未编码的经纬度字符串