feat:增加人员预约统计和导出

This commit is contained in:
dzc committed 2026-08-18 20:15:07 +08:00
1 parent cb5fdc54d8
commit 5910c5ab7c
24 files changed
+3446 -75

No files matched your search

@@ -0,0 +1,59 @@
package com.bsd.pjcloud.hard.api.dto.order;
import com.bsd.pjcloud.admin.api.vo.base.BaseIsIncludeTreeInterface;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
/**
* 食堂用户预约查询条件。
*
* <p>查询以用户全集为主数据源,再关联指定用餐日期范围内的有效预约订单,并按用户和日期逐日生成结果,
* 因此每天没有预约记录的用户也会返回。</p>
*/
@Data
@Schema(description = "食堂用户预约查询条件")
public class HardCanteenUserApptQueryDto implements BaseIsIncludeTreeInterface {
/** 用餐日期闭区间,固定为开始、结束两个服务端本地日期,业务层限制跨度最多为两个自然月。 */
@NotNull(message = "用餐日期范围不能为空")
@Size(min = 2, max = 2, message = "用餐日期范围必须包含开始和结束日期")
@Schema(description = "用餐日期范围,固定为开始日期和结束日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate[] apptUseDateList;
/** 用户姓名、登录账号或手机号的模糊查询关键字;为空时不限制。 */
@Schema(description = "用户姓名、登录账号或手机号")
private String nameOrPhone;
/** 部门树选中的部门主键集合;为空时使用当前操作者完整的数据权限范围。 */
@Schema(description = "部门主键集合")
private List<Long> deptIds;
/** 是否包含所选部门;true 为包含,false 为排除,空值按包含处理。 */
@Schema(description = "是否包含所选部门")
private Boolean isInclude;
/** 食堂商户主键;为空时查询所有食堂的预约。 */
@Schema(description = "食堂商户主键")
private Long merchantId;
/** 用餐时间段字典编码;为空时查询日期范围内的所有餐段。 */
@Schema(description = "用餐时间段字典编码")
private String hourType;
/** 订餐状态筛选,支持 RESERVED(已订餐)和 NOT_RESERVED(未订餐);为空时不限制。 */
@Schema(description = "订餐状态:RESERVED-已订餐,NOT_RESERVED-未订餐")
private String reservationStatus;
/** 核销状态筛选,支持 NONE、UNVERIFIED、PARTIAL、VERIFIED;为空时不限制。 */
@Schema(description = "核销状态:NONE-无需核销,UNVERIFIED-待核销,PARTIAL-部分核销,VERIFIED-已核销")
private String verificationStatus;
/** 指定用户主键集合,仅用于导出当前勾选人员;仍会叠加当前操作者的数据权限。 */
@Schema(description = "指定导出的用户主键集合")
private List<Long> userIds;
}
@@ -0,0 +1,46 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 用户指定日期内的一笔有效食堂预约订单明细。
*/
@Data
@Schema(description = "食堂用户预约订单明细")
public class HardCanteenUserApptOrderVo {
/** 预约订单主键,用于同一用户多笔预约的稳定标识。 */
@Schema(description = "预约订单主键")
private Long id;
/** 用餐时间段字典编码,来源于订单快照。 */
@Schema(description = "用餐时间段字典编码")
private String hourType;
/** 下单时保存的商品描述;历史数据未记录时为空。 */
@Schema(description = "订餐内容")
private String productDesc;
/** 预约所属食堂名称;商户信息不可用时为空。 */
@Schema(description = "食堂名称")
private String merchantName;
/** 订单商品总价,单位为分;历史数据为空时由服务层按零元参与汇总。 */
@Schema(description = "订单商品总价,单位为分")
private Integer totalPrice;
/** 订单状态协议编码,5 表示待核销,20 表示已核销。 */
@Schema(description = "订单状态协议编码")
private String orderStatus;
/** 订单最近更新时间;已核销订单中作为核销时间展示。 */
@Schema(description = "核销时间")
private LocalDateTime updateTime;
/** 订单最近更新人;已核销订单中作为核销操作人展示。 */
@Schema(description = "核销操作人")
private String updateBy;
}
@@ -0,0 +1,255 @@
package com.bsd.pjcloud.hard.api.vo.order;
import com.bsd.pjcloud.admin.api.dto.user.SysUserStudentDto;
import com.bsd.pjcloud.admin.api.dto.user.SysUserTeacherDto;
import com.bsd.pjcloud.admin.api.entity.SysPost;
import com.bsd.pjcloud.admin.api.entity.SysRole;
import com.bsd.pjcloud.admin.api.vo.base.BaseUserDeptInterface;
import com.bsd.pjcloud.admin.api.vo.base.BaseUserIdentityInterface;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 用户和用餐日期维度的食堂预约汇总。
*/
@Data
@Schema(description = "食堂用户预约汇总")
public class HardCanteenUserApptVo implements BaseUserDeptInterface, BaseUserIdentityInterface {
/** 系统用户主键,来源于 UPMS 权限用户列表。 */
@Schema(description = "用户主键")
private Long userId;
/** 页面展示姓名,依次取姓名、昵称和登录账号。 */
@Schema(description = "用户姓名")
private String userName;
/** 用户登录账号,用于人员识别和导出。 */
@Schema(description = "登录账号")
private String username;
/** 用户手机号;未维护时为空。 */
@Schema(description = "手机号")
private String phone;
/** 用户头像地址;未维护时为空。 */
@Schema(description = "头像地址")
private String avatar;
/** 用户当前所属部门名称;未维护时为空。 */
@Schema(description = "部门名称")
private String deptName;
/** 用户当前所属部门主键;未分配部门时为空。 */
@Schema(description = "部门主键")
private Long deptId;
/** 用户昵称,完整用户导出分页返回;普通列表轻量查询时可为空。 */
@Schema(description = "用户昵称")
private String nickname;
/** 用户性别协议编码:0 未知、1 男、2 女;普通列表轻量查询时可为空。 */
@Schema(description = "用户性别协议编码")
private Integer gender;
/** 用户邮箱;未维护或普通列表轻量查询时为空。 */
@Schema(description = "用户邮箱")
private String email;
/** 用户账号创建时间;普通列表轻量查询时可为空。 */
@Schema(description = "用户创建时间")
private LocalDateTime createTime;
/** 用户岗位列表,仅完整用户导出分页返回;没有岗位时为空集合或空值。 */
@Schema(description = "用户岗位列表")
private List<SysPost> postList;
/** 用户角色列表,仅完整用户导出分页返回;没有角色时为空集合或空值。 */
@Schema(description = "用户角色列表")
private List<SysRole> roleList;
/** 用户编制协议编码,完整用户导出分页返回;未维护时为空。 */
@Schema(description = "用户编制协议编码")
private String staffingType;
/** 用户账号锁定标记:0 启用、9 禁用;完整用户导出分页返回。 */
@Schema(description = "用户账号锁定标记")
private String lockFlag;
/** 用户拥有的身份协议编码,来源于 UPMS 用户身份批量查询;没有身份时为空集合。 */
@Schema(description = "用户身份类型集合")
private List<String> identityTypes;
/** 学生身份扩展资料;用户没有学生身份时为空。 */
@Schema(description = "学生身份扩展信息")
private SysUserStudentDto studentInfo;
/** 老师身份扩展资料;用户没有老师身份时为空。 */
@Schema(description = "老师身份扩展信息")
private SysUserTeacherDto teacherInfo;
/** 本行对应的用餐日期。 */
@Schema(description = "用餐日期")
private LocalDate apptUseDate;
/** 订餐状态,RESERVED 表示当前筛选口径存在有效预约,NOT_RESERVED 表示不存在。 */
@Schema(description = "订餐状态")
private String reservationStatus;
/** 整体核销状态,取值为 NONE、UNVERIFIED、PARTIAL 或 VERIFIED。 */
@Schema(description = "整体核销状态")
private String verificationStatus;
/** 用户在本行日期及当前食堂、餐段筛选范围内的有效预约商品总价,单位为分。 */
@Schema(description = "当日有效预约商品总价,单位为分")
private Long totalPrice;
/** 用户在指定日期、食堂和餐段筛选范围内的有效预约订单。 */
@Schema(description = "有效预约订单")
private List<HardCanteenUserApptOrderVo> orders;
/**
* 获取页面展示姓名。
*
* <p>类中同时存在 {@code userName} 和 {@code username},两组访问器均需显式声明,避免 Lombok
* 因 JavaBean 方法名相近而跳过其中一组。</p>
*
* @return 页面展示姓名;用户资料均未维护时由服务层返回兜底文案
*/
public String getUserName() {
return userName;
}
/**
* 设置页面展示姓名。
*
* @param userName 服务层按姓名、昵称和登录账号顺序解析出的展示姓名
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 获取用户登录账号。
*
* <p>显式声明该访问器以保证接口序列化和业务赋值均使用 {@code username} 字段。</p>
*
* @return 用户登录账号;未维护时为空
*/
public String getUsername() {
return username;
}
/**
* 设置用户登录账号。
*
* @param username UPMS 返回的用户登录账号,未维护时可为空
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取公共用户信息组件使用的标准姓名字段。
*
* @return 服务层解析后的用户展示姓名
*/
@Override
public String getName() {
return userName;
}
/**
* 设置公共用户信息组件使用的标准姓名字段。
*
* @param name 服务层解析后的用户展示姓名
*/
@Override
public void setName(String name) {
this.userName = name;
}
/**
* 获取历史用户部门契约中的手机号字段。
*
* @return 用户手机号;未绑定时为空
*/
@Override
public String getUserMobile() {
return phone;
}
/**
* 设置历史用户部门契约中的手机号字段。
*
* @param userMobile 用户手机号,未绑定时可为空
*/
@Override
public void setUserMobile(String userMobile) {
this.phone = userMobile;
}
/**
* 获取历史用户部门契约中的头像字段。
*
* @return 用户头像地址;未维护时为空
*/
@Override
public String getUserAvatar() {
return avatar;
}
/**
* 设置历史用户部门契约中的头像字段。
*
* @param userAvatar 用户头像地址,未维护时可为空
*/
@Override
public void setUserAvatar(String userAvatar) {
this.avatar = userAvatar;
}
/**
* 获取历史用户部门契约中的部门主键字段。
*
* @return 用户当前所属部门主键;未分配部门时为空
*/
@Override
public Long getUserDeptId() {
return deptId;
}
/**
* 设置历史用户部门契约中的部门主键字段。
*
* @param userDeptId 用户当前所属部门主键,未分配部门时可为空
*/
@Override
public void setUserDeptId(Long userDeptId) {
this.deptId = userDeptId;
}
/**
* 获取历史用户部门契约中的部门名称字段。
*
* @return 用户当前所属部门名称;未分配部门时为空
*/
@Override
public String getUserDeptName() {
return deptName;
}
/**
* 设置历史用户部门契约中的部门名称字段。
*
* @param userDeptName 用户当前所属部门名称,未分配部门时可为空
*/
@Override
public void setUserDeptName(String userDeptName) {
this.deptName = userDeptName;
}
}
@@ -0,0 +1,136 @@
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(22)
public class HardCanteenUserApptExcelVo {
/** 系统用户主键,作为同名用户的稳定识别信息。 */
@ExcelProperty({"基础信息", "用户编号"})
private Long userId;
/** 用户姓名,便于按人员核对预约结果。 */
@ExcelProperty({"基础信息", "姓名"})
private String userName;
/** 用户邮箱;未维护时为空。 */
@ExcelProperty({"基础信息", "邮箱"})
private String email;
/** 用户当前所属部门名称。 */
@ExcelProperty({"组织与账号", "部门名称"})
private String deptName;
/** 用户岗位名称,多个岗位使用中文逗号分隔。 */
@ExcelProperty({"组织与账号", "岗位名称"})
private String postNames;
/** 用户默认身份使用的手机号;未维护时为空。 */
@ExcelProperty({"默认身份", "手机号"})
private String phone;
/** 用户拥有的身份中文名称,多个身份使用中文逗号分隔。 */
@ExcelProperty({"身份信息", "身份类型"})
private String identityTypeNames;
/** 学生身份学号;没有学生身份时为空。 */
@ExcelProperty({"学生身份", "学号"})
private String studentNo;
/** 学生身份学校名称;没有学生身份时为空。 */
@ExcelProperty({"学生身份", "学校名称"})
private String schoolName;
/** 学生身份班级名称;没有学生身份时为空。 */
@ExcelProperty({"学生身份", "班级名称"})
private String className;
/** 学生身份监护人手机号,多个号码沿用业务存储的英文逗号分隔格式。 */
@ExcelProperty({"学生身份", "监护人手机号"})
private String guardianPhones;
/** 老师身份学号;没有老师身份时为空。 */
@ExcelProperty({"老师身份", "老师学号"})
private String teacherNo;
/** 查询指定的用餐日期。 */
@ExcelProperty({"预约信息", "用餐日期"})
private LocalDate apptUseDate;
/** 是否存在符合当前食堂、餐段筛选的有效预约。 */
@ExcelProperty({"预约信息", "是否订餐"})
private String reservationStatus;
/** 有效预约涉及的餐段名称,多个值使用中文分号分隔。 */
@ExcelProperty({"预约信息", "用餐时间段"})
private String hourTypes;
/** 有效预约的商品描述,多个值使用中文分号分隔。 */
@ExcelProperty({"预约信息", "订餐内容"})
private String productDescriptions;
/** 有效预约所属食堂,多个值使用中文分号分隔。 */
@ExcelProperty({"预约信息", "食堂"})
private String merchantNames;
/** 早餐预约状态;查询排除早餐时显示“未查询”。 */
@ExcelProperty({"餐段预约", "早餐"})
private String breakfastReservation;
/** 午餐预约状态;查询排除午餐时显示“未查询”。 */
@ExcelProperty({"餐段预约", "午餐"})
private String lunchReservation;
/** 晚餐预约状态;查询排除晚餐时显示“未查询”。 */
@ExcelProperty({"餐段预约", "晚餐"})
private String dinnerReservation;
/** 夜间餐预约状态;查询排除夜间餐时显示“未查询”。 */
@ExcelProperty({"餐段预约", "夜间餐"})
private String lateNightReservation;
/** 各餐段有效预约商品总价,按餐段输出元金额并使用中文分号分隔。 */
@ExcelProperty({"金额统计", "餐段总金额(元)"})
private String mealSegmentTotalPrices;
/** 用户本行日期内有效预约商品总价,单位为元并保留两位小数。 */
@ExcelProperty({"金额统计", "当日总金额(元)"})
@NumberFormat("#,##0.00")
private BigDecimal totalPrice;
/** 用户当天有效预约的整体核销状态。 */
@ExcelProperty({"核销信息", "核销状态"})
private String verificationStatus;
/** 已核销订单的核销时间,多个值使用中文分号分隔。 */
@ExcelProperty({"核销信息", "核销时间"})
private String verificationTimes;
/**
* 获取导出行中的用户姓名。
*
* @return 导出展示的用户姓名
*/
public String getUserName() {
return userName;
}
/**
* 设置导出行中的用户姓名。
*
* @param userName 服务层解析出的用户展示姓名
*/
public void setUserName(String userName) {
this.userName = userName;
}
}