IT评测·应用市场-qidao123.com技术社区

标题: 《Spring Boot+计谋模式:企业级度假订单Excel导入系统的架构演进与技能实现》 [打印本页]

作者: 万有斥力    时间: 2025-4-18 21:57
标题: 《Spring Boot+计谋模式:企业级度假订单Excel导入系统的架构演进与技能实现》
前言

在数字化期间背景下,订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细分析了一个基于 计谋模式 的度假订单导入系统,通过分层架构计划实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架,结合 MyBatis Plus、Excel 工具库和 Swagger 文档化工具,构建了一个支持动态扩展、批量处理、事务安全的订单管明白决方案。
本文将从数据模型界说、计谋模式实现、核心业务流程三个维度展开,深入解读系统怎样通过 灵活的时间解析高效的事务管理可扩展的架构计划,实现从 Excel 文件到数据库记录的全链路处理。无论是架构师、开辟职员还是技能管理者,均可通过本文快速掌握系统计划精华。

阅读指引

为高效明白本系统,建议按以下路径阅读:
一、架构概览




二、核心流程



三、扩展指南



核心总结

1. 架构亮点

维度
计划亮点
分层架构
清楚的 Controller-Service-DAO 分层,通过计谋模式实现业务逻辑解耦
扩展性
计谋接口标准化 + 工厂路由动态分发,新增订单来源只需实现新计谋类,符合开闭原则
性能
批量 SQL 操作(insertBatch/updateBatch)减少数据库交互,事务注解保障原子性
健壮性
双重时间解析机制(支持 3+ 时间格式)、非常分类处理(IO/格式/数据库非常)
2. 关键技能栈

  1. - 核心框架:Spring Boot + MyBatis Plus  
  2. - 策略模式:策略接口 + 工厂路由  
  3. - Excel 处理:Alibaba EasyExcel + 自定义 DictConvert 转换器  
  4. - 事务管理:Spring @Transactional 注解  
  5. - 文档化:Swagger3 + @Schema 注解  
复制代码
3. 性能数据(示例)

指标
数值(单文件)
千级订单处理耗时
≤2s(含IO与DB操作)
内存占用峰值
≤50MB(万级订单)
批量插入效率
5000条/秒
4. 扩展建议



通过本文的系统解读,读者可快速掌握基于计谋模式的订单导入架构计划方法论,并基于现有代码扩展出符合业务需求的定制化功能。


数据层


RouteOrderInfoDO

  1. package cn.iocoder.central.module.vacation.dal.dataobject.order;
  2. import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  3. import com.baomidou.mybatisplus.annotation.KeySequence;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import lombok.*;
  7.         import java.math.BigDecimal;
  8. import java.time.LocalDateTime;
  9. /**
  10. * 线路订单信息 DO
  11. *
  12. * @author 陕文旅
  13. */
  14. @TableName("order_route_order_info")
  15. @KeySequence("order_route_order_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  16. @Data
  17. @EqualsAndHashCode(callSuper = true)
  18. @ToString(callSuper = true)
  19. @Builder
  20. @NoArgsConstructor
  21. @AllArgsConstructor
  22. public class RouteOrderInfoDO extends BaseDO {
  23.     /**
  24.      * 主键
  25.      */
  26.     @TableId
  27.     private Long id;
  28.     /**
  29.      * 渠道订单号
  30.      */
  31.     private String systemCode;
  32.     /**
  33.      * 订单状态
  34.      *
  35.      * 枚举 {@link TODO order_module_order_status 对应的类}
  36.      */
  37.     private Integer orderStatus;
  38.     /**
  39.      * 订单总金额
  40.      */
  41.     private BigDecimal totalAmount;
  42.     /**
  43.      * 支付方式
  44.      *
  45.      * 枚举 {@link TODO order_module_payment_method 对应的类}
  46.      */
  47.     private Integer paymentMethod;
  48.     /**
  49.      * 支付状态
  50.      *
  51.      * 枚举 {@link TODO order_module_payment_status 对应的类}
  52.      */
  53.     private Integer paymentStatus;
  54.     /**
  55.      * 路线ID
  56.      */
  57.     private Long routeId;
  58.     /**
  59.      * 路线名称
  60.      */
  61.     private String routeName;
  62.     /**
  63.      * 游玩人数
  64.      */
  65.     private Integer playPersonNumber;
  66.     /**
  67.      * 下单时间
  68.      */
  69.     private LocalDateTime buyTime;
  70.     /**
  71.      * 游玩开始时间
  72.      */
  73.     private LocalDateTime playStartTime;
  74.     /**
  75.      * 游玩结束时间
  76.      */
  77.     private LocalDateTime playEndTime;
  78.     /**
  79.      * 取票人/收货人/联系人
  80.      */
  81.     private String orderUserName;
  82.     /**
  83.      * 手机号
  84.      */
  85.     private String orderUserPhone;
  86.     /**
  87.      * 创建者
  88.      */
  89.     private String creator;
  90.     /**
  91.      * 创建时间
  92.      */
  93.     private LocalDateTime createTime;
  94.     /**
  95.      * 更新者
  96.      */
  97.     private String updater;
  98.     /**
  99.      * 更新时间
  100.      */
  101.     private LocalDateTime updateTime;
  102.     /**
  103.      * 是否删除
  104.      */
  105.     private Boolean deleted;
  106.     /**
  107.      * 租户编号
  108.      */
  109.     private Long tenantId;
  110.     /*
  111.      * 来源渠道
  112.      * */
  113.     private String origin;
  114. }
复制代码





服务层


计谋




TempOrderImportStrategy


  1. package cn.iocoder.central.module.vacation.service.order.excel.strategy;
  2. import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
  3. import cn.iocoder.central.module.vacation.dal.dataobject.order.RouteOrderInfoDO;
  4. import cn.iocoder.central.module.vacation.dal.mysql.order.RouteOrderInfoMapper;
  5. import cn.iocoder.central.module.vacation.service.order.excel.vo.TempVacationOrderVo;
  6. import cn.iocoder.yudao.framework.common.util.date.DateTimeFormatterUtils;
  7. import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8. import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  9. import jakarta.annotation.Resource;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.web.multipart.MultipartFile;
  14. import java.io.IOException;
  15. import java.time.LocalDate;
  16. import java.time.LocalDateTime;
  17. import java.time.LocalTime;
  18. import java.time.format.DateTimeParseException;
  19. import java.util.ArrayList;
  20. import java.util.Collections;
  21. import java.util.List;
  22. @Component
  23. @Slf4j
  24. public class TempOrderImportStrategy implements VacationOrderImportStrategy {
  25.     @Resource
  26.     private RouteOrderInfoMapper routeOrderInfoMapper;
  27.     @Override
  28.     @Transactional(rollbackFor = Exception.class)
  29.     public RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException {
  30.         // 1. 读取Excel文件内容
  31.         List<TempVacationOrderVo> orderList = ExcelUtils.read(file, TempVacationOrderVo.class);
  32.         // 2. 初始化数据容器
  33.         List<RouteOrderInfoDO> createRouteOrderList = new ArrayList<>();  // 待新增订单列表
  34.         List<RouteOrderInfoDO> updateRouteOrderList = new ArrayList<>();  // 待更新订单列表
  35.         List<String> addOrderCodes = new ArrayList<>();  // 新增订单编号集合
  36.         List<String> updateOrderCodes = new ArrayList<>();  // 更新订单编号集合
  37.         // 3. 处理每条订单数据
  38.         for (TempVacationOrderVo order : orderList) {
  39.             // 3.1 转换VO为DO对象
  40.             RouteOrderInfoDO RouteOrderInfoDO = BeanUtils.toBean(order, RouteOrderInfoDO.class);
  41.             RouteOrderInfoDO.setOrigin(origin);  // 设置订单来源
  42.             // 3.2 格式化时间字段
  43.             RouteOrderInfoDO.setBuyTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getBuyTime())));
  44.             RouteOrderInfoDO.setPlayStartTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getPlayStartTime())));
  45.             RouteOrderInfoDO.setPlayEndTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getPlayEndTime())));
  46.             // 3.3 检查订单是否已存在
  47.             Long tableId = RouteOrderInfoMapper.selectIdBySystemCodeAndOrigin(
  48.                     RouteOrderInfoDO.getSystemCode(),
  49.                     RouteOrderInfoDO.getOrigin()
  50.             );
  51.             if (tableId != null) {
  52.                 // 3.4 已存在订单 - 准备更新
  53.                 RouteOrderInfoDO.setId(tableId);
  54.                 updateRouteOrderList.add(RouteOrderInfoDO);
  55.                 updateOrderCodes.add(RouteOrderInfoDO.getSystemCode());
  56.             } else {
  57.                 // 3.5 新订单 - 准备新增
  58.                 createRouteOrderList.add(RouteOrderInfoDO);
  59.                 addOrderCodes.add(RouteOrderInfoDO.getSystemCode());
  60.             }
  61.         }
  62.         // 4. 批量数据库操作
  63.         if (!createRouteOrderList.isEmpty()) {
  64.             routeOrderInfoMapper.insertBatch(createRouteOrderList);// 批量插入新订单
  65.         }
  66.         if (!updateRouteOrderList.isEmpty()) {
  67.             routeOrderInfoMapper.updateBatch(updateRouteOrderList);  // 批量更新已有订单
  68.         }
  69.         RouteImportRespVo respVo = new RouteImportRespVo();
  70.         respVo.setAddOrderCodes(addOrderCodes);  // 设置新增订单编号列表
  71.         respVo.setUpdateOrderCodes(updateOrderCodes);  // 设置更新订单编号列表
  72.         respVo.setFailureOrderCodes(Collections.emptyList());  // 空列表表示没有失败订单
  73.         return respVo;
  74.     }
  75.     /**
  76.      * 自动解析日期或日期时间字符串为LocalDateTime
  77.      * 支持以下格式:
  78.      * - 日期格式:yyyy-MM-dd
  79.      * - 日期时间格式:yyyy-MM-dd'T'HH:mm:ss 或 yyyy-MM-dd HH:mm:ss
  80.      *
  81.      * @param timeString 输入的时间字符串
  82.      * @return 转换后的LocalDateTime
  83.      * @throws DateTimeParseException 如果时间字符串格式不正确
  84.      */
  85.     public static LocalDateTime parseDateTime(String timeString) throws DateTimeParseException {
  86.         try {
  87.             // 尝试直接解析为LocalDateTime(适用于包含时间的格式)
  88.             return LocalDateTime.parse(timeString);
  89.         } catch (DateTimeParseException e1) {
  90.             try {
  91.                 // 尝试解析为LocalDate(适用于只有日期的格式)
  92.                 LocalDate date = LocalDate.parse(timeString);
  93.                 // 将日期与默认时间00:00:00组合
  94.                 return date.atTime(LocalTime.MIDNIGHT);
  95.             } catch (DateTimeParseException e2) {
  96.                 // 如果两种格式都不匹配,抛出异常
  97.                 throw new DateTimeParseException("无法解析时间字符串:" + timeString, timeString, 0);
  98.             }
  99.         }
  100.     }
  101. }
复制代码


数据处理流程

我来详细讲解 <mcsymbol name="TempOrderImportStrategy" filename="TempOrderImportStrategy.java" path="c:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\TempOrderImportStrategy.java" startline="1" type="class"></mcsymbol> 的数据处理流程:
1. 整体流程

这是一个实现 VacationOrderImportStrategy 接口的订单导入计谋类,专门处理临时订单的Excel导入,主要流程分为4个阶段:
2. 详细数据流转过程

2.1 读取Excel阶段

  1. List<TempVacationOrderVo> orderList = ExcelUtils.read(file, TempVacationOrderVo.class);
复制代码

2.2 数据容器初始化

  1. List<RouteOrderInfoDO> createRouteOrderList = new ArrayList<>();  // 待新增
  2. List<RouteOrderInfoDO> updateRouteOrderList = new ArrayList<>();  // 待更新
  3. List<String> addOrderCodes = new ArrayList<>();  // 新增订单号
  4. List<String> updateOrderCodes = new ArrayList<>();  // 更新订单号
复制代码


2.3 单条数据处理流程

对每条订单数据实行以下操作:
  1. RouteOrderInfoDO RouteOrderInfoDO = BeanUtils.toBean(order, RouteOrderInfoDO.class);
  2. RouteOrderInfoDO.setOrigin(origin);  // 设置来源
复制代码

  1. RouteOrderInfoDO.setBuyTime(parseDateTime(...));
  2. RouteOrderInfoDO.setPlayStartTime(parseDateTime(...));
  3. RouteOrderInfoDO.setPlayEndTime(parseDateTime(...));
复制代码


  1. Long tableId = RouteOrderInfoMapper.selectIdBySystemCodeAndOrigin(
  2.         RouteOrderInfoDO.getSystemCode(),
  3.         RouteOrderInfoDO.getOrigin()
  4. );
复制代码

  1. if (tableId != null) {
  2.     // 更新逻辑
  3.     RouteOrderInfoDO.setId(tableId);
  4.     updateRouteOrderList.add(RouteOrderInfoDO);
  5.     updateOrderCodes.add(RouteOrderInfoDO.getSystemCode());
  6. } else {
  7.     // 新增逻辑
  8.     createRouteOrderList.add(RouteOrderInfoDO);
  9.     addOrderCodes.add(RouteOrderInfoDO.getSystemCode());
  10. }
复制代码
2.4 批量数据库操作

  1. if (!createRouteOrderList.isEmpty()) {
  2.     routeOrderInfoMapper.insertBatch(createRouteOrderList);
  3. }
  4. if (!updateRouteOrderList.isEmpty()) {
  5.     routeOrderInfoMapper.updateBatch(updateRouteOrderList);
  6. }
复制代码

2.5 返回结果构造

  1. RouteImportRespVo respVo = new RouteImportRespVo();
  2. respVo.setAddOrderCodes(addOrderCodes);
  3. respVo.setUpdateOrderCodes(updateOrderCodes);
  4. respVo.setFailureOrderCodes(Collections.emptyList());
复制代码

3. 关键计划点

4. 数据流转图

  1. Excel文件
  2.   → List<TempVacationOrderVo>
  3.     → List<RouteOrderInfoDO> (分新增/更新)
  4.       → 批量SQL操作
  5.         → RouteImportRespVo (结果统计)
复制代码
这个实现很好地平衡了性能、可靠性和可维护性,是典型的批处理数据导入解决方案。


!!时间处理



我来详细讲解 <mcsymbol name="TempOrderImportStrategy" filename="TempOrderImportStrategy.java" path="c:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\TempOrderImportStrategy.java" startline="52" type="function"></mcsymbol> 中的时间处理逻辑:
1. 时间处理流程分解

这三行代码处理了三个时间字段(购买时间、游玩开始时间、游玩竣事时间),处理流程完全同等,分为两个关键步调:
  1. RouteOrderInfoDO.setBuyTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getBuyTime())));
复制代码


2. 关键技能点解析

2.1 格式化阶段

DateTimeFormatterUtils.formatDateTime() 的作用:

2.2 解析阶段

parseDateTime() 方法的智能解析逻辑:



3. 计划上风




4. 处理流程图解

  1. 原始时间对象(order.getBuyTime())
  2.   → DateTimeFormatterUtils.formatDateTime()
  3.     → 标准化时间字符串
  4.       → parseDateTime()
  5.         → LocalDateTime对象
  6.           → 设置到RouteOrderInfoDO
复制代码
5. 典型应用场景

这种处理方式特别适合:

这种计划既包管了灵活性,又确保了最终数据的同等性,是时间处理的最佳实践。



VacationOrderImportStrategy



  1. package cn.iocoder.central.module.vacation.service.order.excel.strategy;
  2. import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
  3. import org.springframework.web.multipart.MultipartFile;
  4. import java.io.IOException;
  5. public interface VacationOrderImportStrategy {
  6.     /**
  7.      * 导入Excel
  8.      *
  9.      * @param file
  10.      * @param origin
  11.      * @return
  12.      */
  13.     RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException;
  14. }
复制代码

我来详细讲解 <mcsymbol name="VacationOrderImportStrategy" filename="VacationOrderImportStrategy.java" path="c:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\VacationOrderImportStrategy.java" startline="1" type="interface"></mcsymbol> 这个计谋接口的核心作用:
核心定位

这是订单导入功能的标准计谋接口,采取计谋模式计划,主要作用包括:



方法详解

  1. RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException;
复制代码






计划上风




典型实现

如之前看到的TempOrderImportStrategy就是其具体实现,处理特定来源的订单导入。
这个接口是订单导入功能的核心抽象,为系统提供了灵活、可扩展的导入架构。


service-vo

  1. package cn.iocoder.central.module.vacation.service.order.excel.vo;
  2. import cn.iocoder.central.module.vacation.enums.DictTypeConstants;
  3. import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4. import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5. import com.alibaba.excel.annotation.ExcelProperty;
  6. import io.swagger.v3.oas.annotations.media.Schema;
  7. import lombok.AllArgsConstructor;
  8. import lombok.Builder;
  9. import lombok.Data;
  10. import lombok.NoArgsConstructor;
  11. import lombok.experimental.Accessors;
  12. import java.math.BigDecimal;
  13. @Data
  14. @Builder
  15. @AllArgsConstructor
  16. @NoArgsConstructor
  17. @Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
  18. public class TempVacationOrderVo {
  19.     //    导入渠道订单号
  20.     @ExcelProperty("订单编号")
  21.     private String systemCode;
  22.     @ExcelProperty(value = "订单状态", converter = DictConvert.class)
  23.     @DictFormat(DictTypeConstants.ORDER_MODULE_ORDER_STATUS)
  24.     private String orderStatus;
  25.     @ExcelProperty("产品名称")
  26.     private String routeName;
  27.     @ExcelProperty("下单时间")
  28.     private String buyTime;
  29.     @ExcelProperty("游玩人数")
  30.     private Integer playPersonNumber;
  31.     @ExcelProperty("开始时间")
  32.     private String playStartTime;
  33.     @ExcelProperty("结束时间")
  34.     private String playEndTime;
  35.     @ExcelProperty("金额")
  36.     private BigDecimal totalAmount;
  37.     @ExcelProperty(value = "支付方式", converter = DictConvert.class)
  38.     @DictFormat(DictTypeConstants.ORDER_MODULE_PAYMENT_METHOD)
  39.     private String paymentMethod;
  40.     @ExcelProperty(value = "支付状态", converter = DictConvert.class)
  41.     @DictFormat(DictTypeConstants.ORDER_MODULE_PAYMENT_STATUS)
  42.     private String paymentStatus;
  43.     @ExcelProperty("联系人")
  44.     private String orderUserName;
  45.     @ExcelProperty("联系方式")
  46.     private String orderUserPhone;
  47. }
复制代码


我来详细讲解 TempVacationOrderVo 这个类的作用和计划特点:
核心定位

这是一个Excel导入数据映射的VO(Value Object)类,专门用于临时度假订单的Excel导入场景,主要作用包括:


关键计划特点





业务代价




这个VO类在订单导入流程中起到了承上启下的关键作用,既对接了前端Excel文件的布局,又为后端业务处理提供了标准化的数据对象。

酒店品类工厂


  1. package cn.iocoder.central.module.vacation.service.order.excel;
  2. import cn.iocoder.central.module.vacation.service.order.excel.strategy.TempOrderImportStrategy;
  3. import cn.iocoder.central.module.vacation.service.order.excel.strategy.VacationOrderImportStrategy;
  4. import jakarta.annotation.Resource;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * 酒店品类工厂工厂
  8. */
  9. @Component
  10. public class VacationProductCategoryFactory {
  11.     private static final String TEMP_TYPE = "shanwenlv";
  12.     @Resource
  13.     private TempOrderImportStrategy tempOrderImportStrategy;
  14.     public VacationOrderImportStrategy getImportStrategy(String origin) {
  15.         return switch (origin) {
  16.             case TEMP_TYPE -> tempOrderImportStrategy;
  17.             default -> null;
  18.         };
  19.     }
  20. }
复制代码

我来详细讲解 VacationProductCategoryFactory 这个工厂类的作用和计划特点:
核心定位

这是一个基于计谋模式的工厂类,专门用于管理和提供差异来源的订单导入计谋实现,主要作用包括:


关键计划特点




业务代价




这个工厂类在订单导入系统中起到了计谋路由的关键作用,是计谋模式的核心实现组件。

控制层







RouteOrderExcelController



  1. package cn.iocoder.central.module.vacation.controller.admin.order.excel;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
  4. import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportVo;
  5. import cn.iocoder.central.module.vacation.controller.admin.order.vo.RouteOrderInfoPageReqVO;
  6. import cn.iocoder.central.module.vacation.controller.admin.order.vo.RouteOrderInfoRespVO;
  7. import cn.iocoder.central.module.vacation.dal.dataobject.order.RouteOrderInfoDO;
  8. import cn.iocoder.central.module.vacation.service.order.RouteOrderInfoService;
  9. import cn.iocoder.central.module.vacation.service.order.excel.VacationProductCategoryFactory;
  10. import cn.iocoder.central.module.vacation.service.order.excel.strategy.TempOrderImportStrategy;
  11. import cn.iocoder.central.module.vacation.service.order.excel.strategy.VacationOrderImportStrategy;
  12. import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  13. import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  14. import cn.iocoder.yudao.framework.common.pojo.PageParam;
  15. import cn.iocoder.yudao.framework.common.pojo.PageResult;
  16. import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  17. import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  18. import io.swagger.v3.oas.annotations.Operation;
  19. import io.swagger.v3.oas.annotations.Parameter;
  20. import io.swagger.v3.oas.annotations.Parameters;
  21. import io.swagger.v3.oas.annotations.tags.Tag;
  22. import jakarta.annotation.Resource;
  23. import jakarta.servlet.http.HttpServletResponse;
  24. import jakarta.validation.Valid;
  25. import org.springframework.validation.annotation.Validated;
  26. import org.springframework.web.bind.annotation.*;
  27. import org.springframework.web.multipart.MultipartFile;
  28. import java.io.IOException;
  29. import java.util.List;
  30. import static cn.iocoder.central.module.vacation.enums.ErrorCodeConstants.*;
  31. import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  32. import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
  33. import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34. @Tag(name = "管理后台 - 度假订单 Excel")
  35. @RestController
  36. @RequestMapping("/vacation/order/excel")
  37. @Validated
  38. public class RouteOrderExcelController {
  39.     @Resource
  40.     private RouteOrderInfoService routeOrderInfoService;
  41.     @Resource
  42.     private VacationProductCategoryFactory vacationProductCategoryFactory;
  43.     @GetMapping("/export-excel")
  44.     @Operation(summary = "导出度假订单信息 Excel")
  45. //    @PreAuthorize("@ss.hasPermission('order:child-route-order-info:export')")
  46.     @ApiAccessLog(operateType = EXPORT)
  47.     public void exportChildRouteOrderInfoExcel(@Valid RouteOrderInfoPageReqVO pageReqVO,
  48.                                                HttpServletResponse response) throws IOException {
  49.         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  50.         List<RouteOrderInfoRespVO> list = routeOrderInfoService.getRouteOrderInfoPage(pageReqVO).getList();
  51.         // 导出 Excel
  52.         ExcelUtils.write(response, "路线订单信息.xls", "数据", RouteOrderInfoRespVO.class,
  53.                 BeanUtils.toBean(list, RouteOrderInfoRespVO.class));
  54.     }
  55.     @PostMapping("/import")
  56.     @Operation(summary = "导入度假订单信息")
  57.     @Parameters({
  58.             @Parameter(name = "file", description = "Excel 文件", required = true),
  59.             @Parameter(name = "origin", description = "来源", example = "true")
  60.     })
  61. //    @PreAuthorize("@ss.hasPermission('order:child-route-order-info:import')")
  62.     public CommonResult<RouteImportRespVo> importExcel(@RequestParam("file") MultipartFile file,
  63.                                                        @RequestParam("origin") String origin) throws Exception {
  64.         VacationOrderImportStrategy importStrategy = vacationProductCategoryFactory.getImportStrategy(origin);
  65.         if (ObjectUtil.isEmpty(importStrategy)) {
  66.             return error(VACATION_NOT_FOUND_STRATEGY);
  67.         }
  68.         try {
  69.             RouteImportRespVo orderImportRespVo = importStrategy.importExcel(file, origin);
  70.             return success(orderImportRespVo);
  71.         } catch (IOException e) {
  72.             return error(VACATION_IMPORT_ERROR);
  73.         }
  74.     }
  75.     @GetMapping("/get-route-import-template")
  76.     @Operation(summary = "获取度假导入模板")
  77.     public void RouteImportTemplate(HttpServletResponse response) throws IOException {
  78.         ExcelUtils.write(response, "度假导入模板.xlsx", "度假列表", RouteImportVo.class, null);
  79.     }
  80. }
复制代码

是一个Spring Boot的RESTful控制器,用于处理与度假订单Excel文件相关的操作。具体功能如下:1. 提供导出度假订单信息到Excel文件的接口。2. 提供导入度假订单信息的接口,根据差异来源选择差异的导入计谋。3. 提供获取度假导入模板的接口。



`@Tag(name = "管理后台 - 度假订单 Excel")` :这是Swagger的注解,用于为API文档添加标签,方便在API文档工具(如Swagger UI)中对接口进行分组和展示。这里将该控制器下的所有接口归为“管理后台 - 度假订单 Excel”这一类别。2.`@RestController` :这是Spring框架的注解,它是`@Controller` 和`@ResponseBody` 的组合注解。表示该类是一个控制器,而且其方法返回的对象会自动序列化为JSON格式的相应体,用于构建RESTful风格的API。3.`@RequestMapping("/vacation/order/excel")` :这也是Spring框架的注解,用于映射HTTP请求的URL路径。它将该控制器下的所有处理方法的URL前缀都设置为`/vacation/order/excel` ,即访问该控制器中的任何接口时,URL都必要以这个前缀开头。4.`@Validated` :这是Spring框架的注解,用于开启方法级别的数据验证。当控制器的方法参数使用了`@Valid` 注解进行验证时,`@Validated` 注解会确保验证逻辑收效。

RouteImportRespVo

  1. package cn.iocoder.central.module.vacation.controller.admin.order.excel.vo;
  2. import io.swagger.v3.oas.annotations.media.Schema;
  3. import lombok.Builder;
  4. import lombok.Data;
  5. import java.util.List;
  6. @Schema(description = "管理后台 - 路线订单导入 Response VO")
  7. @Data
  8. public class RouteImportRespVo {
  9.     @Schema(description = "导入成功的订单编号数组", requiredMode = Schema.RequiredMode.REQUIRED)
  10.     public List<String> addOrderCodes;
  11.     @Schema(description = "更新成功的订单编号数组", requiredMode = Schema.RequiredMode.REQUIRED)
  12.     public List<String> updateOrderCodes;
  13.     @Schema(description = "导入失败的订单编号数组", requiredMode = Schema.RequiredMode.REQUIRED)
  14.     public List<String> failureOrderCodes;
  15.     // 如果需要,可以手动添加其他方法,如自定义的 getter、setter 或者业务逻辑方法
  16. }
复制代码


文件界说了一个名为`RouteImportRespVo` 的类,它是一个用于管理后台的路线订单导入相应视图对象(VO)。该类使用了`@Schema` 注解来形貌类的用途,方便生成API文档。类中包含三个`List<String>` 类型的属性,分别记录导入乐成、更新乐成和导入失败的订单编号数组,便于前端展示导入结果。同时,使用了`@Data` 注解自动生成getter、setter等方法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4