feat:商品预约导出

feat:个人菜谱预约统计
feat:预定扣库存
feat:过期订单自动退款
This commit is contained in:
dzc committed 2026-08-23 11:00:02 +08:00
1 parent e1cf5d5b90
commit e4d8b4f354
11 files changed
+637

No files matched your search

@@ -0,0 +1,33 @@
package com.bsd.pjcloud.hard.api.constant.refund;
import lombok.Getter;
/**
* 自动退款任务场景;编码持久化到任务表并用于区分不同的配置和售后创建规则。
*/
@Getter
public enum HardAutoRefundTaskTypeEnum {
/** 用户申请免审退款后创建的技术自动退款任务。 */
AFTER_SALE("10", "售后申请自动退款"),
/** 每日菜谱预约餐段结束后创建的系统过期退款任务。 */
EXPIRED_RESERVE("20", "过期预约自动退款");
/** 数据库存储的稳定任务场景编码。 */
private final String type;
/** 管理端展示名称。 */
private final String description;
/**
* 构造任务场景协议项。
*
* @param type 数据库存储编码
* @param description 展示名称
*/
HardAutoRefundTaskTypeEnum(String type, String description) {
this.type = type;
this.description = description;
}
}
@@ -0,0 +1,42 @@
package com.bsd.pjcloud.hard.api.vo.order;
import lombok.Data;
/**
* 食堂预约菜品导出聚合记录。
*
* <p>同一模型承载商户部门聚合和商品聚合两种查询结果,商品聚合时额外填充商品字段;金额统一使用分。</p>
*/
@Data
public class HardCanteenProductApptExportRecord {
/** 预约使用日期,格式为 yyyy-MM-dd。 */
private String apptDate;
/** 用餐时间段协议编码。 */
private String hourType;
/** 食堂商户主键。 */
private Long merchantId;
/** 预约用户所属部门主键。 */
private Long userDeptId;
/** 商品主键;商户部门聚合记录为空。 */
private Long productId;
/** 订单快照中的商品名称;商户部门聚合记录为空。 */
private String productName;
/** 去重预约人数。 */
private Long payUserCount;
/** 去重预约次数。 */
private Long timeCount;
/** 预约商品总数量。 */
private Long payCount;
/** 预约商品总价,单位为分。 */
private Long totalPrice;
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
/**
* 指定用餐日期的用户预约统计。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "食堂用户每日预约统计")
public class HardCanteenUserApptDailyStatisticsVo extends HardCanteenUserApptStatisticsSummaryVo {
/** 统计对应的用餐日期,格式由接口序列化器输出为 yyyy-MM-dd。 */
@Schema(description = "用餐日期")
private LocalDate date;
}
@@ -0,0 +1,32 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 用户预约按餐段和菜品快照聚合的统计数据。
*/
@Data
@Schema(description = "食堂用户预约菜品统计")
public class HardCanteenUserApptDishStatisticsVo {
/** 餐段字典编码,空值表示历史订单未记录餐段。 */
@Schema(description = "餐段编码")
private String hourType;
/** 下单时固化的菜品名称;历史空值由服务层归一为未命名菜品。 */
@Schema(description = "菜品名称")
private String productName;
/** 菜品快照的总份数。 */
@Schema(description = "菜品份数")
private Long productCount = 0L;
/** 包含该菜品的去重预约订单数。 */
@Schema(description = "涉及订单数")
private Long orderCount = 0L;
/** 该菜品快照总价,单位为分。 */
@Schema(description = "菜品总价,单位为分")
private Long totalPrice = 0L;
}
@@ -0,0 +1,32 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 用户预约按餐段聚合的统计数据。
*/
@Data
@Schema(description = "食堂用户预约餐段统计")
public class HardCanteenUserApptMealStatisticsVo {
/** 餐段字典编码,属于 PC、App 与后端共用协议。 */
@Schema(description = "餐段编码")
private String hourType;
/** 该餐段去重后的用户-用餐日期数;每日表示人数,范围总计表示可与每日相加的订餐人次。 */
@Schema(description = "预约人数或人次")
private Long reservedUserCount = 0L;
/** 该餐段的有效预约订单数。 */
@Schema(description = "预约订单数")
private Long orderCount = 0L;
/** 该餐段购物车快照中的菜品总份数。 */
@Schema(description = "菜品份数")
private Long dishCount = 0L;
/** 该餐段有效预约商品总价,单位为分。 */
@Schema(description = "预约总价,单位为分")
private Long totalPrice = 0L;
}
@@ -0,0 +1,53 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 用户预约统计的通用汇总数据。
*
* <p>金额字段统一使用分;用户数量按“用户-用餐日期”记录累计,避免多日查询把同一用户重复隐藏。</p>
*/
@Data
@Schema(description = "食堂用户预约统计汇总")
public class HardCanteenUserApptStatisticsSummaryVo {
/** 当前统计范围内的用户-用餐日期记录数。 */
@Schema(description = "用户日期记录数")
private Long userCount = 0L;
/** 当前统计范围内去重后的用户数。 */
@Schema(description = "去重用户数")
private Long uniqueUserCount = 0L;
/** 有效预约记录的用户-用餐日期数。 */
@Schema(description = "已订餐记录数")
private Long reservedUserCount = 0L;
/** 没有有效预约记录的用户-用餐日期数。 */
@Schema(description = "未订餐记录数")
private Long unreservedUserCount = 0L;
/** 有效预约订单数。 */
@Schema(description = "预约订单数")
private Long orderCount = 0L;
/** 购物车快照中的菜品总份数。 */
@Schema(description = "菜品总份数")
private Long dishCount = 0L;
/** 有效预约订单商品总价,单位为分。 */
@Schema(description = "预约总价,单位为分")
private Long totalPrice = 0L;
/** 按餐段聚合的预约人数、订单数和菜品份数。 */
@Schema(description = "餐段统计")
private List<HardCanteenUserApptMealStatisticsVo> meals = new ArrayList<>();
/** 按餐段和菜品名称聚合的菜品份数。 */
@Schema(description = "菜品统计")
private List<HardCanteenUserApptDishStatisticsVo> dishes = new ArrayList<>();
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 用户预约统计响应,包含查询范围总计和逐日统计。
*/
@Data
@Schema(description = "食堂用户预约统计")
public class HardCanteenUserApptStatisticsVo {
/** 当前查询条件下所有用餐日期的汇总结果。 */
@Schema(description = "查询范围总计")
private HardCanteenUserApptStatisticsSummaryVo total = new HardCanteenUserApptStatisticsSummaryVo();
/** 当前查询条件下按用餐日期升序排列的每日结果。 */
@Schema(description = "每日统计")
private List<HardCanteenUserApptDailyStatisticsVo> daily = new ArrayList<>();
}
@@ -0,0 +1,93 @@
package com.bsd.pjcloud.hard.api.vo.order.excel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 食堂预约菜品统计自定义导出行。
*
* <p>一组日期和餐段按汇总行、商户部门行、商品明细行组织;不同层级只填写所属列,配合自定义合并处理器形成树形报表。</p>
*/
@Data
public class HardCanteenProductApptExcelVo {
/** 日期餐段汇总中的预约日期。 */
@ExcelProperty({"日期餐段汇总", "预约时间"})
private LocalDate summaryDate;
/** 日期餐段汇总中的餐段编码或字典名称。 */
@ExcelProperty({"日期餐段汇总", "预约时间段"})
private String summaryHourType;
/** 日期餐段汇总中的去重预约人数。 */
@ExcelProperty({"日期餐段汇总", "预约人数"})
private Long summaryPayUserCount;
/** 日期餐段汇总中的预约次数。 */
@ExcelProperty({"日期餐段汇总", "预约次数"})
private Long summaryTimeCount;
/** 日期餐段汇总中的商品总数量。 */
@ExcelProperty({"日期餐段汇总", "预约商品数量"})
private Long summaryPayCount;
/** 日期餐段汇总中的总价,单位为元。 */
@ExcelProperty({"日期餐段汇总", "总价"})
@NumberFormat("#,##0.00")
private BigDecimal summaryTotalPrice;
/** 商户部门统计中的食堂名称。 */
@ExcelProperty({"商户部门统计", "商户"})
private String merchantName;
/** 商户部门统计中的用户部门名称。 */
@ExcelProperty({"商户部门统计", "部门"})
private String departmentName;
/** 商户部门统计中的预约日期。 */
@ExcelProperty({"商户部门统计", "预约时间"})
private LocalDate merchantDate;
/** 商户部门统计中的餐段名称。 */
@ExcelProperty({"商户部门统计", "预约时间段"})
private String merchantHourType;
/** 商户部门统计中的去重预约人数。 */
@ExcelProperty({"商户部门统计", "预约人数"})
private Long merchantPayUserCount;
/** 商户部门统计中的预约次数。 */
@ExcelProperty({"商户部门统计", "预约次数"})
private Long merchantTimeCount;
/** 商户部门统计中的商品总数量。 */
@ExcelProperty({"商户部门统计", "预约商品数量"})
private Long merchantPayCount;
/** 商户部门统计中的总价,单位为元。 */
@ExcelProperty({"商户部门统计", "总价"})
@NumberFormat("#,##0.00")
private BigDecimal merchantTotalPrice;
/** 商品明细中的商品名称。 */
@ExcelProperty({"商品明细", "商品"})
private String productName;
/** 商品明细中的商品数量。 */
@ExcelProperty({"商品明细", "数量"})
private Long productCount;
/** 商品明细中的商品总价,单位为元。 */
@ExcelProperty({"商品明细", "总价"})
@NumberFormat("#,##0.00")
private BigDecimal productTotalPrice;
/** 导出行层级,仅供合并处理器识别,不写入 Excel。 */
@ExcelIgnore
private String rowLevel;
}