feat:增加人员预约统计和导出
This commit is contained in:
1 parent
cb5fdc54d8
commit
5910c5ab7c
24 files changed
+3446
-75
No files matched your search
+59
@@ -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;
|
||||
}
|
||||
+46
@@ -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;
|
||||
}
|
||||
+255
@@ -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;
|
||||
}
|
||||
}
|
||||
+136
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user