feat:重构"食堂菜品购买统计"+"食堂菜品部门统计"菜单统计预约核销订单+线下购买订单

feat:增加机器的每日菜谱库存扣款
feat:增加订单"退回到核销前"按钮
This commit is contained in:
dzc committed 2026-08-24 18:39:59 +08:00
1 parent 8d31f20cec
commit d1cd86dfa4
92 files changed
+9628 -454

No files matched your search

@@ -0,0 +1,44 @@
package com.bsd.pjcloud.hard.api.constant.order;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 食堂销售统计展示层级协议。
*
* <p>该编码仅用于接口返回和管理端组织多维统计行,不对应数据库字段;调用方不得将名称作为稳定判断条件。</p>
*/
@Getter
@AllArgsConstructor
public enum HardCanteenStatisticsLevelEnum {
/** 按自然日汇总全部餐段和当前来源筛选范围。 */
DATE_TOTAL("DATE_TOTAL", "当日合计"),
/** 按自然日和餐段汇总当前来源筛选范围。 */
HOUR_TOTAL("HOUR_TOTAL", "餐段合计"),
/** 按自然日拆分来源,供当日合计行横向比较。 */
DATE_SOURCE("DATE_SOURCE", "当日来源"),
/** 按自然日、餐段拆分来源,供餐段合计行横向比较。 */
HOUR_SOURCE("HOUR_SOURCE", "餐段来源");
/** 前后端接口使用的稳定层级编码,不写入数据库。 */
private final String code;
/** 层级的中文展示名称,仅用于界面说明。 */
private final String description;
/**
* 根据接口层级编码查找枚举。
*
* @param code 管理端统计接口返回的层级编码;为空或未知时不匹配
* @return 匹配的层级枚举,未匹配时返回 {@code null}
*/
public static HardCanteenStatisticsLevelEnum valueOfCode(String code) {
return Arrays.stream(values()).filter(value -> value.code.equals(code)).findFirst().orElse(null);
}
}
@@ -0,0 +1,57 @@
package com.bsd.pjcloud.hard.api.constant.order;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
/**
* 食堂销售统计来源。
*
* <p>编码只用于统计查询和管理端展示,不写入订单表;来源由订单类型、预约关联、订单状态以及对应业务时间计算得到。</p>
*/
@Getter
public enum HardSaleSourceEnum {
/** 订单类型 1 的线下购买,统计时间取订单支付时间。 */
OFFLINE_PURCHASE("OFFLINE_PURCHASE", "线下购买"),
/** 订单类型 2 且已完成核销的预约,统计时间取订单核销时间。 */
RESERVATION_VERIFIED("RESERVATION_VERIFIED", "预约核销");
/** 统计接口和前端标签页使用的来源编码。 */
private final String code;
/** 来源中文名称。 */
private final String description;
/**
* 创建稳定的统计来源协议项;编码只用于接口筛选,不对应数据库持久化值。
*
* @param code 前后端共同使用的来源编码
* @param description 管理端与导出使用的中文名称
*/
HardSaleSourceEnum(String code, String description) {
this.code = code;
this.description = description;
}
/**
* 返回全部可筛选来源编码。
*
* @return 来源编码列表,顺序与管理端标签页一致
*/
public static List<String> getCodes() {
return Arrays.stream(values()).map(HardSaleSourceEnum::getCode).toList();
}
/**
* 按统计来源编码解析枚举。
*
* @param code 统计接口传入的来源编码
* @return 匹配的来源;为空或未知编码返回 {@code null}
*/
public static HardSaleSourceEnum valueOfCode(String code) {
return Arrays.stream(values()).filter(item -> item.code.equals(code)).findFirst().orElse(null);
}
}
@@ -37,6 +37,12 @@ public class HardCarDto extends HardCarEntity implements BaseIsIncludeTreeInterf
/** 预计使用日期范围。 */
private LocalDateTime[] apptUseDateTimeList;
/** 菜品销售统计日期范围,线下按支付时间、预约按核销时间过滤;不落库。 */
private LocalDateTime[] statisticsDateTimeList;
/** 菜品销售统计来源编码集合,取值来自 HardSaleSourceEnum;为空表示全部来源。 */
private List<String> saleSourceCodes;
/**
* 前端树搜索
*/
@@ -46,6 +46,16 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn
private LocalDateTime[] payTimeList;
/**
* 食堂销售统计日期范围,线下来源按支付时间、预约来源按核销时间过滤;不落库。
*/
private LocalDateTime[] statisticsDateTimeList;
/**
* 食堂销售统计来源编码集合,取值来自 HardSaleSourceEnum;为空表示同时查询两种来源。
*/
private List<String> saleSourceCodes;
private LocalDateTime[] refundTimeList;
/** 预计使用日期范围。 */
@@ -42,9 +42,31 @@ public class HardCanteenProductTotalVo {
@Schema(description = "购买次数")
private Long timeCount;
/** 统计来源编码,来源于 HardSaleSourceEnum,不对应数据库字段。 */
private String saleSource;
/** 统计来源名称,用于管理端和导出展示,不对应数据库字段。 */
private String saleSourceName;
/**
* 统计展示层级,取值来自 HardCanteenStatisticsLevelEnum,不对应数据库字段。
* 空值表示兼容旧统计接口返回结构。
*/
private String statisticsLevel;
/** 统计展示层级中文名称,用于管理端说明当前行为日期合计或餐段合计。 */
private String statisticsLevelName;
/**
* 当前合计行的来源拆分结果;管理端用它在同一行比较线下购买与预约核销。
* 空集合表示当前筛选范围没有来源明细或属于旧统计接口。
*/
private List<HardCanteenProductTotalVo> sourceRows;
@Schema(description = "用餐部门总数")
private Integer deptCount;
/** 菜品统计中承载餐段合计行,部门统计中承载部门餐段行;空值表示无下一级统计。 */
private List<HardCanteenProductTotalVo> children;
}
@@ -9,6 +9,12 @@ import lombok.Data;
@Data
public class HardCarVo extends HardCarEntity {
/** 统计明细来源编码,来源于 HardSaleSourceEnum,不对应购物车持久化字段。 */
private String saleSource;
/** 统计明细来源名称,用于管理端展示,不对应购物车持久化字段。 */
private String saleSourceName;
/** 超市商品 SPU ID,仅超市统计和展示场景赋值。 */
private Long spuId;
@@ -13,6 +13,12 @@ import java.util.List;
@Data
public class HardOrderVo extends HardOrderEntity implements BaseUserDeptInterface, BaseMchInterface, BaseHardInterface {
/** 统计明细来源编码;线下订单为 OFFLINE_PURCHASE,预约已核销订单为 RESERVATION_VERIFIED。 */
private String saleSource;
/** 统计明细来源名称,用于管理端明确区分支付和核销来源。 */
private String saleSourceName;
/**
* 用户相关
*/
@@ -0,0 +1,54 @@
package com.bsd.pjcloud.hard.api.vo.order.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 食堂菜品部门销售统计导出行,按日期、食堂、来源、部门和餐段拆分。
*/
@Data
@ColumnWidth(20)
public class HardCanteenDeptTotalExcelVo {
/** 业务发生日期;线下取支付日期,预约取核销日期。 */
@ExcelProperty("日期")
private LocalDate statisticsDate;
/** 当前用户商户权限范围内的食堂名称。 */
@ExcelProperty("食堂")
private String merchantName;
/** 销售来源中文名称,取值为线下购买或预约核销。 */
@ExcelProperty("来源")
private String saleSourceName;
/** 下单用户所属部门名称;无法解析时为空。 */
@ExcelProperty("部门")
private String userDeptName;
/** 餐段字典名称,来源于 daily_menu。 */
@ExcelProperty("餐段")
private String hourTypeName;
/** 当前部门餐段内去重后的交易用户数量,单位为人。 */
@ExcelProperty("交易人数")
private Long payUserCount;
/** 当前部门餐段内去重后的订单数量,单位为次。 */
@ExcelProperty("交易次数")
private Long timeCount;
/** 退款扣减口径下的有效商品数量,单位为份。 */
@ExcelProperty("商品数量")
private Long payCount;
/** 有效商品总金额,单位由分转换为元。 */
@ExcelProperty("总价(元)")
@NumberFormat("#,##0.00")
private BigDecimal totalPrice;
}
@@ -0,0 +1,46 @@
package com.bsd.pjcloud.hard.api.vo.order.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 食堂菜品销售统计导出行,按统计日期、餐段和销售来源拆分。
*/
@Data
@ColumnWidth(20)
public class HardCanteenProductTotalExcelVo {
/** 业务发生日期;线下取支付日期,预约取核销日期。 */
@ExcelProperty("日期")
private LocalDate statisticsDate;
/** 餐段字典名称,来源于 daily_menu。 */
@ExcelProperty("餐段")
private String hourTypeName;
/** 销售来源中文名称,取值为线下购买或预约核销。 */
@ExcelProperty("来源")
private String saleSourceName;
/** 来源内去重后的交易用户数量,单位为人。 */
@ExcelProperty("交易人数")
private Long payUserCount;
/** 来源内去重后的订单数量,单位为次。 */
@ExcelProperty("交易次数")
private Long timeCount;
/** 退款扣减口径下的有效商品数量,单位为份。 */
@ExcelProperty("商品数量")
private Long payCount;
/** 有效商品总金额,单位由分转换为元。 */
@ExcelProperty("总价(元)")
@NumberFormat("#,##0.00")
private BigDecimal totalPrice;
}