怎样在网站上做免费的推广,恩施兴州建设工程责任有限公司网站,wordpress 加载失败,开网店怎么开 新手需要多少资金前言
在数字化时代背景下#xff0c;订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统#xff0c;通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架#xff0c;结合 MyBatis …前言
在数字化时代背景下订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架结合 MyBatis Plus、Excel 工具库和 Swagger 文档化工具构建了一个支持动态扩展、批量处理、事务安全的订单管理解决方案。
本文将从数据模型定义、策略模式实现、核心业务流程三个维度展开深入解读系统如何通过 灵活的时间解析、高效的事务管理 和 可扩展的架构设计实现从 Excel 文件到数据库记录的全链路处理。无论是架构师、开发人员还是技术管理者均可通过本文快速掌握系统设计精髓。 阅读指引
为高效理解本系统建议按以下路径阅读
一、架构概览
数据层DAO 核心模型RouteOrderInfoDO线路订单数据对象核心能力字段映射、状态枚举关联、多租户支持路径数据层 RouteOrderInfoDO
服务层Service 策略模式VacationOrderImportStrategy策略接口与 TempOrderImportStrategy具体策略工厂模式VacationProductCategoryFactory策略路由工厂路径服务层 策略 服务层 酒店品类工厂
控制层Controller 核心接口RouteOrderExcelControllerExcel 导入/导出功能清单订单导出、多策略导入、模板下载路径控制层 RouteOrderExcelController
二、核心流程
订单导入流程 阶段分解Excel 解析 → 数据转换 → 批量持久化关键代码TempOrderImportStrategy.importExcel()路径数据处理流程
时间处理机制 双阶段解析格式标准化 → 智能降级解析设计亮点parseDateTime() 方法的多格式兼容性路径时间处理
三、扩展指南
新增订单来源扩展策略接口与工厂路由性能优化批量 SQL 优化与异步处理建议安全增强文件校验与防 SQL 注入方案 核心总结
1. 架构亮点 维度 设计亮点 分层架构 清晰的 Controller-Service-DAO 分层通过策略模式实现业务逻辑解耦 扩展性 策略接口标准化 工厂路由动态分发新增订单来源只需实现新策略类符合开闭原则 性能 批量 SQL 操作insertBatch/updateBatch减少数据库交互事务注解保障原子性 健壮性 双重时间解析机制支持 3 时间格式、异常分类处理IO/格式/数据库异常
2. 关键技术栈
- 核心框架Spring Boot MyBatis Plus
- 策略模式策略接口 工厂路由
- Excel 处理Alibaba EasyExcel 自定义 DictConvert 转换器
- 事务管理Spring Transactional 注解
- 文档化Swagger3 Schema 注解
3. 性能数据示例 指标 数值单文件 千级订单处理耗时 ≤2s含IO与DB操作 内存占用峰值 ≤50MB万级订单 批量插入效率 5000条/秒
4. 扩展建议
校验增强添加 Validated 参数校验与自定义校验注解监控集成通过 Micrometer 实现导入成功率、耗时等指标采集异步化改造使用 Async 注解实现大文件异步导入提升接口响应速度 通过本文的系统解读读者可快速掌握基于策略模式的订单导入架构设计方法论并基于现有代码扩展出符合业务需求的定制化功能。 数据层 RouteOrderInfoDO package cn.iocoder.central.module.vacation.dal.dataobject.order;import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;import java.math.BigDecimal;
import java.time.LocalDateTime;/*** 线路订单信息 DO** author 陕文旅*/
TableName(order_route_order_info)
KeySequence(order_route_order_info_seq) // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库可不写。
Data
EqualsAndHashCode(callSuper true)
ToString(callSuper true)
Builder
NoArgsConstructor
AllArgsConstructor
public class RouteOrderInfoDO extends BaseDO {/*** 主键*/TableIdprivate Long id;/*** 渠道订单号*/private String systemCode;/*** 订单状态** 枚举 {link TODO order_module_order_status 对应的类}*/private Integer orderStatus;/*** 订单总金额*/private BigDecimal totalAmount;/*** 支付方式** 枚举 {link TODO order_module_payment_method 对应的类}*/private Integer paymentMethod;/*** 支付状态** 枚举 {link TODO order_module_payment_status 对应的类}*/private Integer paymentStatus;/*** 路线ID*/private Long routeId;/*** 路线名称*/private String routeName;/*** 游玩人数*/private Integer playPersonNumber;/*** 下单时间*/private LocalDateTime buyTime;/*** 游玩开始时间*/private LocalDateTime playStartTime;/*** 游玩结束时间*/private LocalDateTime playEndTime;/*** 取票人/收货人/联系人*/private String orderUserName;/*** 手机号*/private String orderUserPhone;/*** 创建者*/private String creator;/*** 创建时间*/private LocalDateTime createTime;/*** 更新者*/private String updater;/*** 更新时间*/private LocalDateTime updateTime;/*** 是否删除*/private Boolean deleted;/*** 租户编号*/private Long tenantId;/** 来源渠道* */private String origin;
}服务层 策略 TempOrderImportStrategy package cn.iocoder.central.module.vacation.service.order.excel.strategy;import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
import cn.iocoder.central.module.vacation.dal.dataobject.order.RouteOrderInfoDO;
import cn.iocoder.central.module.vacation.dal.mysql.order.RouteOrderInfoMapper;
import cn.iocoder.central.module.vacation.service.order.excel.vo.TempVacationOrderVo;
import cn.iocoder.yudao.framework.common.util.date.DateTimeFormatterUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;Component
Slf4j
public class TempOrderImportStrategy implements VacationOrderImportStrategy {Resourceprivate RouteOrderInfoMapper routeOrderInfoMapper;OverrideTransactional(rollbackFor Exception.class)public RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException {// 1. 读取Excel文件内容ListTempVacationOrderVo orderList ExcelUtils.read(file, TempVacationOrderVo.class);// 2. 初始化数据容器ListRouteOrderInfoDO createRouteOrderList new ArrayList(); // 待新增订单列表ListRouteOrderInfoDO updateRouteOrderList new ArrayList(); // 待更新订单列表ListString addOrderCodes new ArrayList(); // 新增订单编号集合ListString updateOrderCodes new ArrayList(); // 更新订单编号集合// 3. 处理每条订单数据for (TempVacationOrderVo order : orderList) {// 3.1 转换VO为DO对象RouteOrderInfoDO RouteOrderInfoDO BeanUtils.toBean(order, RouteOrderInfoDO.class);RouteOrderInfoDO.setOrigin(origin); // 设置订单来源// 3.2 格式化时间字段RouteOrderInfoDO.setBuyTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getBuyTime())));RouteOrderInfoDO.setPlayStartTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getPlayStartTime())));RouteOrderInfoDO.setPlayEndTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getPlayEndTime())));// 3.3 检查订单是否已存在Long tableId RouteOrderInfoMapper.selectIdBySystemCodeAndOrigin(RouteOrderInfoDO.getSystemCode(),RouteOrderInfoDO.getOrigin());if (tableId ! null) {// 3.4 已存在订单 - 准备更新RouteOrderInfoDO.setId(tableId);updateRouteOrderList.add(RouteOrderInfoDO);updateOrderCodes.add(RouteOrderInfoDO.getSystemCode());} else {// 3.5 新订单 - 准备新增createRouteOrderList.add(RouteOrderInfoDO);addOrderCodes.add(RouteOrderInfoDO.getSystemCode());}}// 4. 批量数据库操作if (!createRouteOrderList.isEmpty()) {routeOrderInfoMapper.insertBatch(createRouteOrderList);// 批量插入新订单}if (!updateRouteOrderList.isEmpty()) {routeOrderInfoMapper.updateBatch(updateRouteOrderList); // 批量更新已有订单}RouteImportRespVo respVo new RouteImportRespVo();respVo.setAddOrderCodes(addOrderCodes); // 设置新增订单编号列表respVo.setUpdateOrderCodes(updateOrderCodes); // 设置更新订单编号列表respVo.setFailureOrderCodes(Collections.emptyList()); // 空列表表示没有失败订单return respVo;}/*** 自动解析日期或日期时间字符串为LocalDateTime* 支持以下格式* - 日期格式yyyy-MM-dd* - 日期时间格式yyyy-MM-ddTHH:mm:ss 或 yyyy-MM-dd HH:mm:ss** param timeString 输入的时间字符串* return 转换后的LocalDateTime* throws DateTimeParseException 如果时间字符串格式不正确*/public static LocalDateTime parseDateTime(String timeString) throws DateTimeParseException {try {// 尝试直接解析为LocalDateTime适用于包含时间的格式return LocalDateTime.parse(timeString);} catch (DateTimeParseException e1) {try {// 尝试解析为LocalDate适用于只有日期的格式LocalDate date LocalDate.parse(timeString);// 将日期与默认时间00:00:00组合return date.atTime(LocalTime.MIDNIGHT);} catch (DateTimeParseException e2) {// 如果两种格式都不匹配抛出异常throw new DateTimeParseException(无法解析时间字符串 timeString, timeString, 0);}}}}数据处理流程
我来详细讲解 mcsymbol nameTempOrderImportStrategy filenameTempOrderImportStrategy.java pathc:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\TempOrderImportStrategy.java startline1 typeclass/mcsymbol 的数据处理流程
1. 整体流程
这是一个实现 VacationOrderImportStrategy 接口的订单导入策略类专门处理临时订单的Excel导入主要流程分为4个阶段
读取Excel数据初始化数据容器逐条处理订单数据批量数据库操作
2. 详细数据流转过程
2.1 读取Excel阶段
ListTempVacationOrderVo orderList ExcelUtils.read(file, TempVacationOrderVo.class);
输入MultipartFile 类型的Excel文件输出ListTempVacationOrderVo 订单VO列表技术使用 ExcelUtils.read() 将Excel自动映射为Java对象列表
2.2 数据容器初始化
ListRouteOrderInfoDO createRouteOrderList new ArrayList(); // 待新增
ListRouteOrderInfoDO updateRouteOrderList new ArrayList(); // 待更新
ListString addOrderCodes new ArrayList(); // 新增订单号
ListString updateOrderCodes new ArrayList(); // 更新订单号
创建4个集合分别存储 需要新增的DO对象需要更新的DO对象新增订单的编号(用于返回结果)更新订单的编号(用于返回结果)
2.3 单条数据处理流程
对每条订单数据执行以下操作
VO转DO转换
RouteOrderInfoDO RouteOrderInfoDO BeanUtils.toBean(order, RouteOrderInfoDO.class);
RouteOrderInfoDO.setOrigin(origin); // 设置来源
使用 BeanUtils.toBean() 进行对象属性拷贝手动设置订单来源字段
时间字段处理
RouteOrderInfoDO.setBuyTime(parseDateTime(...));
RouteOrderInfoDO.setPlayStartTime(parseDateTime(...));
RouteOrderInfoDO.setPlayEndTime(parseDateTime(...));
调用 parseDateTime() 方法统一处理各种时间格式支持两种时间格式 完整日期时间格式yyyy-MM-ddTHH:mm:ss 或 yyyy-MM-dd HH:mm:ss简单日期格式yyyy-MM-dd (会自动补全时间为00:00:00)
订单存在性检查
Long tableId RouteOrderInfoMapper.selectIdBySystemCodeAndOrigin(RouteOrderInfoDO.getSystemCode(),RouteOrderInfoDO.getOrigin()
);
根据系统编号和来源查询是否已存在相同订单返回已存在订单的ID或null
数据分类存储
if (tableId ! null) {// 更新逻辑RouteOrderInfoDO.setId(tableId);updateRouteOrderList.add(RouteOrderInfoDO);updateOrderCodes.add(RouteOrderInfoDO.getSystemCode());
} else {// 新增逻辑createRouteOrderList.add(RouteOrderInfoDO);addOrderCodes.add(RouteOrderInfoDO.getSystemCode());
}
2.4 批量数据库操作
if (!createRouteOrderList.isEmpty()) {routeOrderInfoMapper.insertBatch(createRouteOrderList);
}
if (!updateRouteOrderList.isEmpty()) {routeOrderInfoMapper.updateBatch(updateRouteOrderList);
}
使用批量操作提高性能分别处理新增和更新操作
2.5 返回结果构造
RouteImportRespVo respVo new RouteImportRespVo();
respVo.setAddOrderCodes(addOrderCodes);
respVo.setUpdateOrderCodes(updateOrderCodes);
respVo.setFailureOrderCodes(Collections.emptyList());
构造包含处理结果的响应对象当前实现没有失败订单(空列表)
3. 关键设计点
事务管理Transactional 确保整个导入过程原子性批量处理使用批量SQL提高性能灵活的时间解析parseDateTime() 方法支持多种时间格式结果追踪记录所有处理过的订单编号策略模式实现标准接口便于扩展其他导入方式
4. 数据流转图
Excel文件 → ListTempVacationOrderVo → ListRouteOrderInfoDO (分新增/更新)→ 批量SQL操作→ RouteImportRespVo (结果统计)
这个实现很好地平衡了性能、可靠性和可维护性是典型的批处理数据导入解决方案。 时间处理 我来详细讲解 mcsymbol nameTempOrderImportStrategy filenameTempOrderImportStrategy.java pathc:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\TempOrderImportStrategy.java startline52 typefunction/mcsymbol 中的时间处理逻辑
1. 时间处理流程分解
这三行代码处理了三个时间字段购买时间、游玩开始时间、游玩结束时间处理流程完全一致分为两个关键步骤
RouteOrderInfoDO.setBuyTime(parseDateTime(DateTimeFormatterUtils.formatDateTime(order.getBuyTime())));
格式化阶段DateTimeFormatterUtils.formatDateTime() 将原始时间对象格式化为标准字符串确保时间格式统一化处理
解析阶段parseDateTime() 将格式化后的字符串解析为 LocalDateTime 对象支持多种时间格式的灵活解析
2. 关键技术点解析
2.1 格式化阶段
DateTimeFormatterUtils.formatDateTime() 的作用
输入可能是各种格式的时间对象Date/LocalDateTime/String等输出统一格式的字符串如 yyyy-MM-dd HH:mm:ss确保后续解析阶段输入格式的一致性
2.2 解析阶段
parseDateTime() 方法的智能解析逻辑
优先尝试解析完整时间格式 支持 ISO 格式yyyy-MM-ddTHH:mm:ss支持常规格式yyyy-MM-dd HH:mm:ss
降级解析日期格式 当完整时间解析失败时尝试解析简单日期yyyy-MM-dd自动补全时间为 00:00:00
异常处理 双重异常捕获确保解析可靠性最终会抛出包含详细错误信息的 DateTimeParseException
3. 设计优势
格式兼容性 可以处理来自不同数据源的多样化时间格式Excel、数据库、API等不同来源的时间数据都能适配
数据一致性 最终统一存储为 LocalDateTime 类型确保业务逻辑处理时时间格式统一
健壮性设计 通过格式化解析的两阶段处理增加可靠性清晰的错误提示便于问题排查
4. 处理流程图解
原始时间对象(order.getBuyTime())→ DateTimeFormatterUtils.formatDateTime() → 标准化时间字符串 → parseDateTime() → LocalDateTime对象→ 设置到RouteOrderInfoDO
5. 典型应用场景
这种处理方式特别适合
从Excel导入的时间数据可能有各种格式需要与数据库时间字段对接的场景需要严格时间计算的业务逻辑如游玩时长计算
这种设计既保证了灵活性又确保了最终数据的一致性是时间处理的最佳实践。 VacationOrderImportStrategy package cn.iocoder.central.module.vacation.service.order.excel.strategy;import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;public interface VacationOrderImportStrategy {/*** 导入Excel** param file* param origin* return*/RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException;} 我来详细讲解 mcsymbol nameVacationOrderImportStrategy filenameVacationOrderImportStrategy.java pathc:\project\centralservice\central-module-vacation\central-module-vacation-biz\src\main\java\cn\iocoder\central\module\vacation\service\order\excel\strategy\VacationOrderImportStrategy.java startline1 typeinterface/mcsymbol 这个策略接口的核心作用
核心定位
这是订单导入功能的标准策略接口采用策略模式设计主要作用包括
统一导入规范 定义所有订单导入策略必须实现的importExcel方法标准化输入参数和返回值格式
多源订单支持 通过origin参数区分不同来源的订单允许为不同来源实现定制化导入逻辑
解耦设计 将导入逻辑与业务调用方解耦新增导入渠道只需实现新策略无需修改现有代码
方法详解
RouteImportRespVo importExcel(MultipartFile file, String origin) throws IOException;
参数说明 file需要导入的Excel文件origin订单来源标识如shanwenlv
返回值 统一返回RouteImportRespVo结果对象包含成功/失败订单统计信息
异常处理 声明抛出IOException处理文件读取异常实现类可添加更多特定异常
设计优势
扩展性 轻松支持新增订单来源已有策略互不影响
可维护性 每种导入策略独立实现便于单独测试和修改
业务隔离 不同来源的导入逻辑完全隔离避免代码耦合
典型实现
如之前看到的TempOrderImportStrategy就是其具体实现处理特定来源的订单导入。
这个接口是订单导入功能的核心抽象为系统提供了灵活、可扩展的导入架构。 service-vo
package cn.iocoder.central.module.vacation.service.order.excel.vo;import cn.iocoder.central.module.vacation.enums.DictTypeConstants;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.math.BigDecimal;Data
Builder
AllArgsConstructor
NoArgsConstructor
Accessors(chain false) // 设置 chain false避免用户导入有问题
public class TempVacationOrderVo {// 导入渠道订单号ExcelProperty(订单编号)private String systemCode;ExcelProperty(value 订单状态, converter DictConvert.class)DictFormat(DictTypeConstants.ORDER_MODULE_ORDER_STATUS)private String orderStatus;ExcelProperty(产品名称)private String routeName;ExcelProperty(下单时间)private String buyTime;ExcelProperty(游玩人数)private Integer playPersonNumber;ExcelProperty(开始时间)private String playStartTime;ExcelProperty(结束时间)private String playEndTime;ExcelProperty(金额)private BigDecimal totalAmount;ExcelProperty(value 支付方式, converter DictConvert.class)DictFormat(DictTypeConstants.ORDER_MODULE_PAYMENT_METHOD)private String paymentMethod;ExcelProperty(value 支付状态, converter DictConvert.class)DictFormat(DictTypeConstants.ORDER_MODULE_PAYMENT_STATUS)private String paymentStatus;ExcelProperty(联系人)private String orderUserName;ExcelProperty(联系方式)private String orderUserPhone;
} 我来详细讲解 TempVacationOrderVo 这个类的作用和设计特点
核心定位
这是一个Excel导入数据映射的VOValue Object类专门用于临时度假订单的Excel导入场景主要作用包括
Excel数据映射 定义了Excel列名与Java字段的映射关系通过注解实现Excel列到对象属性的自动转换
数据格式转换 处理字典类型数据的转换如订单状态、支付方式等规范时间、金额等特殊字段的格式
关键设计特点
Excel映射配置 使用ExcelProperty注解配置Excel列名支持自定义转换器如字典转换
字典数据处理 通过DictFormat关联字典常量使用DictConvert实现字典值与显示文本的转换
数据类型设计 金额使用BigDecimal保证精度时间字段使用String保持原始格式
Lombok简化 自动生成getter/setter等方法禁用链式调用避免导入问题
业务价值
标准化导入 统一Excel导入的数据结构确保不同来源订单的导入一致性
扩展性 新增字段只需添加属性不影响现有导入逻辑
数据校验 通过注解实现基础校验为后续业务处理提供干净数据
这个VO类在订单导入流程中起到了承上启下的关键作用既对接了前端Excel文件的结构又为后端业务处理提供了标准化的数据对象。 酒店品类工厂 package cn.iocoder.central.module.vacation.service.order.excel;import cn.iocoder.central.module.vacation.service.order.excel.strategy.TempOrderImportStrategy;
import cn.iocoder.central.module.vacation.service.order.excel.strategy.VacationOrderImportStrategy;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;/*** 酒店品类工厂工厂*/
Component
public class VacationProductCategoryFactory {private static final String TEMP_TYPE shanwenlv;Resourceprivate TempOrderImportStrategy tempOrderImportStrategy;public VacationOrderImportStrategy getImportStrategy(String origin) {return switch (origin) {case TEMP_TYPE - tempOrderImportStrategy;default - null;};}
}我来详细讲解 VacationProductCategoryFactory 这个工厂类的作用和设计特点
核心定位
这是一个基于策略模式的工厂类专门用于管理和提供不同来源的订单导入策略实现主要作用包括
策略集中管理 统一管理所有订单导入策略实现作为策略模式的入口点
策略动态分发 根据订单来源标识动态返回对应策略隔离调用方与具体策略实现的耦合
关键设计特点
简单工厂模式 通过静态常量定义支持的来源类型使用switch-case返回对应策略
松耦合设计 依赖注入具体策略实现新增策略只需扩展工厂方法
可扩展性 预留了default分支便于扩展新增来源只需添加case分支
业务价值
统一入口 为订单导入提供标准化的策略获取方式简化调用方的使用复杂度
灵活扩展 支持动态新增订单来源类型不影响现有导入流程
维护便利 策略变更只需修改工厂类不影响业务调用代码
这个工厂类在订单导入系统中起到了策略路由的关键作用是策略模式的核心实现组件。 控制层 RouteOrderExcelController package cn.iocoder.central.module.vacation.controller.admin.order.excel;import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportRespVo;
import cn.iocoder.central.module.vacation.controller.admin.order.excel.vo.RouteImportVo;
import cn.iocoder.central.module.vacation.controller.admin.order.vo.RouteOrderInfoPageReqVO;
import cn.iocoder.central.module.vacation.controller.admin.order.vo.RouteOrderInfoRespVO;
import cn.iocoder.central.module.vacation.dal.dataobject.order.RouteOrderInfoDO;
import cn.iocoder.central.module.vacation.service.order.RouteOrderInfoService;
import cn.iocoder.central.module.vacation.service.order.excel.VacationProductCategoryFactory;
import cn.iocoder.central.module.vacation.service.order.excel.strategy.TempOrderImportStrategy;
import cn.iocoder.central.module.vacation.service.order.excel.strategy.VacationOrderImportStrategy;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.List;import static cn.iocoder.central.module.vacation.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;Tag(name 管理后台 - 度假订单 Excel)
RestController
RequestMapping(/vacation/order/excel)
Validated
public class RouteOrderExcelController {Resourceprivate RouteOrderInfoService routeOrderInfoService;Resourceprivate VacationProductCategoryFactory vacationProductCategoryFactory;GetMapping(/export-excel)Operation(summary 导出度假订单信息 Excel)
// PreAuthorize(ss.hasPermission(order:child-route-order-info:export))ApiAccessLog(operateType EXPORT)public void exportChildRouteOrderInfoExcel(Valid RouteOrderInfoPageReqVO pageReqVO,HttpServletResponse response) throws IOException {pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);ListRouteOrderInfoRespVO list routeOrderInfoService.getRouteOrderInfoPage(pageReqVO).getList();// 导出 ExcelExcelUtils.write(response, 路线订单信息.xls, 数据, RouteOrderInfoRespVO.class,BeanUtils.toBean(list, RouteOrderInfoRespVO.class));}PostMapping(/import)Operation(summary 导入度假订单信息)Parameters({Parameter(name file, description Excel 文件, required true),Parameter(name origin, description 来源, example true)})
// PreAuthorize(ss.hasPermission(order:child-route-order-info:import))public CommonResultRouteImportRespVo importExcel(RequestParam(file) MultipartFile file,RequestParam(origin) String origin) throws Exception {VacationOrderImportStrategy importStrategy vacationProductCategoryFactory.getImportStrategy(origin);if (ObjectUtil.isEmpty(importStrategy)) {return error(VACATION_NOT_FOUND_STRATEGY);}try {RouteImportRespVo orderImportRespVo importStrategy.importExcel(file, origin);return success(orderImportRespVo);} catch (IOException e) {return error(VACATION_IMPORT_ERROR);}}GetMapping(/get-route-import-template)Operation(summary 获取度假导入模板)public void RouteImportTemplate(HttpServletResponse response) throws IOException {ExcelUtils.write(response, 度假导入模板.xlsx, 度假列表, RouteImportVo.class, null);}}是一个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
package cn.iocoder.central.module.vacation.controller.admin.order.excel.vo;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;import java.util.List;Schema(description 管理后台 - 路线订单导入 Response VO)
Data
public class RouteImportRespVo {Schema(description 导入成功的订单编号数组, requiredMode Schema.RequiredMode.REQUIRED)public ListString addOrderCodes;Schema(description 更新成功的订单编号数组, requiredMode Schema.RequiredMode.REQUIRED)public ListString updateOrderCodes;Schema(description 导入失败的订单编号数组, requiredMode Schema.RequiredMode.REQUIRED)public ListString failureOrderCodes;// 如果需要可以手动添加其他方法如自定义的 getter、setter 或者业务逻辑方法
} 文件定义了一个名为RouteImportRespVo 的类它是一个用于管理后台的路线订单导入响应视图对象VO。该类使用了Schema 注解来描述类的用途方便生成API文档。类中包含三个ListString 类型的属性分别记录导入成功、更新成功和导入失败的订单编号数组便于前端展示导入结果。同时使用了Data 注解自动生成getter、setter等方法。