feat:app流水通知显示备注

feat:咖啡机初步
This commit is contained in:
dzc committed 2026-09-18 12:53:17 +08:00
1 parent c3e6efe5bc
commit 8aa2cfa104
52 files changed
+2887 -2

No files matched your search

@@ -28,6 +28,8 @@ public enum HardTypeEnum {
YYX_WIFI("11", "wifi-云音响"),
/** 由绑定的超市或食堂 Android 终端代理驱动的无屏尔印 USB 打印机。 */
EY_PRINT("12", "尔印打印机器"),
/** 屋里咖啡扫码支付咖啡机,机器号写入 uniqueCode。 */
COFFEE("13", "咖啡机"),
;
private final String type;
private final String description;
@@ -0,0 +1,19 @@
package com.bsd.pjcloud.hard.api.constant.coffee;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 咖啡机日志交互方向
*/
@AllArgsConstructor
@Getter
public enum HardCoffeeLogDirectionEnum {
OUT("1", "我方调厂商"),
IN("2", "厂商调我方"),
;
private final String direction;
private final String description;
}
@@ -0,0 +1,33 @@
package com.bsd.pjcloud.hard.api.constant.coffee;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 咖啡机生命周期日志阶段
*/
@AllArgsConstructor
@Getter
public enum HardCoffeeLogStageEnum {
GET_ORDER("GET_ORDER", "扫码拉取厂商订单"),
CREATE_ORDER("CREATE_ORDER", "创建本地订单"),
WALLET_PAY("WALLET_PAY", "饭卡扣款"),
NOTIFY_PAY("NOTIFY_PAY", "通知厂商支付结果"),
QUERY("QUERY", "厂商查单"),
REFUND_NOTIFY("REFUND_NOTIFY", "通知厂商退款"),
;
private final String stage;
private final String title;
public static HardCoffeeLogStageEnum valueOfByStage(String stage) {
if (ObjectUtil.isEmpty(stage)) {
return null;
}
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(stage, v.getStage())).findFirst().orElse(null);
}
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.hard.api.constant.coffee;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 支付结果通知厂商状态
*/
@AllArgsConstructor
@Getter
public enum HardCoffeeNotifyStatusEnum {
NONE("0", "未通知"),
SUCCESS("1", "通知成功"),
FAIL("2", "通知失败"),
;
private final String status;
private final String description;
}
@@ -23,6 +23,7 @@ public enum HardOrderTypeEnum {
TOC_VISITOR("8", "toc访客购买(不记名用户)"),
XFJ("9", "消费机支付"),
TAKE_OUT("10", "外卖"),
COFFEE("13", "咖啡机支付"),
;
private final String type;
private final String description;
@@ -34,10 +35,11 @@ public enum HardOrderTypeEnum {
// 简单支付(没有购物车)
public static final List<HardOrderTypeEnum> isSimplePayList = List.of(
XFJ
XFJ,
COFFEE
);
public static final List<HardOrderTypeEnum> refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY, LB, FARMER, XFJ, TAKE_OUT);
public static final List<HardOrderTypeEnum> refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY, LB, FARMER, XFJ, TAKE_OUT, COFFEE);
public static final List<HardOrderTypeEnum> payList = List.of(BELOW, RESERVE);
@@ -0,0 +1,30 @@
package com.bsd.pjcloud.hard.api.dto.coffee;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
/**
* 咖啡机饭卡支付请求(H5匿名)
*/
@Data
@Schema(description = "咖啡机饭卡支付请求")
public class HardCoffeeCardPayDto {
/**
* 本地订单id(拉单接口返回)
*/
@NotNull(message = "订单id不能为空")
@Schema(description = "本地订单id")
private Long orderId;
/**
* 饭卡卡号
*/
@NotBlank(message = "卡号不能为空")
@Pattern(regexp = "^\\d{1,32}$", message = "卡号格式错误")
@Schema(description = "饭卡卡号")
private String cardNo;
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.hard.api.dto.coffee;
import com.bsd.pjcloud.hard.api.entity.coffee.HardCoffeeLogEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 咖啡机生命周期日志管理端分页查询
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HardCoffeeLogDto extends HardCoffeeLogEntity {
/**
* 开始时间范围
*/
private LocalDateTime[] startTimeList;
}
@@ -0,0 +1,30 @@
package com.bsd.pjcloud.hard.api.dto.coffee;
import com.bsd.pjcloud.hard.api.entity.coffee.HardCoffeeOrderEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 咖啡机订单管理端分页查询
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HardCoffeeOrderDto extends HardCoffeeOrderEntity {
/**
* 创建时间范围
*/
private LocalDateTime[] createTimeList;
/**
* 本地订单状态(hard_order.order_status)
*/
private String orderStatus;
/**
* 本地订单支付人id
*/
private Long userId;
}
@@ -0,0 +1,42 @@
package com.bsd.pjcloud.hard.api.dto.coffee;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 屋里咖啡查单请求(文档3.4 queryOrder,厂商调我方)
*/
@Data
@Schema(description = "屋里咖啡查单请求")
public class WuliQueryOrderDto {
/**
* 订单号(19位数字)
*/
@Schema(description = "订单号")
private String orderNo;
/**
* 应用id(我方分配给厂商)
*/
@Schema(description = "应用id")
private String appId;
/**
* 随机字符串
*/
@Schema(description = "随机字符串")
private String randstr;
/**
* Unix时间戳(秒)
*/
@Schema(description = "Unix时间戳")
private String timestamp;
/**
* 签名
*/
@Schema(description = "签名")
private String sign;
}
@@ -0,0 +1,154 @@
package com.bsd.pjcloud.hard.api.entity.coffee;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.bsd.pjcloud.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 咖啡机使用生命周期日志
*/
@Data
@TenantTable
@TableName("hard_coffee_log")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "咖啡机生命周期日志")
public class HardCoffeeLogEntity extends Model<HardCoffeeLogEntity> {
/**
* 编号
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "编号")
private Long id;
/**
* 厂商订单号
*/
@Schema(description = "厂商订单号")
private String orderNo;
/**
* 本地订单id
*/
@Schema(description = "本地订单id")
private Long orderId;
/**
* 设备id
*/
@Schema(description = "设备id")
private Long hardId;
/**
* 设备唯一编号(厂商机器号)
*/
@Schema(description = "设备唯一编号")
private String uniqueCode;
/**
* 生命周期阶段编码
*/
@Schema(description = "生命周期阶段编码")
private String stage;
/**
* 交互方向 1我方调厂商 2厂商调我方
*/
@Schema(description = "交互方向")
private String direction;
/**
* 阶段中文说明
*/
@Schema(description = "阶段说明")
private String title;
/**
* 请求头
*/
@Schema(description = "请求头")
private String headers;
/**
* 请求报文
*/
@Schema(description = "请求报文")
private String req;
/**
* 响应报文
*/
@Schema(description = "响应报文")
private String res;
/**
* 错误信息
*/
@Schema(description = "错误信息")
private String error;
/**
* 开始时间
*/
@Schema(description = "开始时间")
private LocalDateTime startTime;
/**
* 结束时间
*/
@Schema(description = "结束时间")
private LocalDateTime endTime;
/**
* 耗时(毫秒)
*/
@Schema(description = "耗时(毫秒)")
private Long cost;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -0,0 +1,154 @@
package com.bsd.pjcloud.hard.api.entity.coffee;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.bsd.pjcloud.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 咖啡机厂商订单扩展(屋里咖啡)
*/
@Data
@TenantTable
@TableName("hard_coffee_order")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "咖啡机厂商订单扩展")
public class HardCoffeeOrderEntity extends Model<HardCoffeeOrderEntity> {
/**
* 编号
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "编号")
private Long id;
/**
* 本地硬件订单id(hard_order.id)
*/
@Schema(description = "本地订单id")
private Long orderId;
/**
* 屋里咖啡订单号(19位数字)
*/
@Schema(description = "厂商订单号")
private String orderNo;
/**
* 咖啡机设备id
*/
@Schema(description = "设备id")
private Long hardId;
/**
* 厂商机器号快照
*/
@Schema(description = "厂商机器号")
private String machineName;
/**
* 产品名称
*/
@Schema(description = "产品名称")
private String product;
/**
* 产品图片链接
*/
@Schema(description = "产品图片链接")
private String img;
/**
* 1冷饮 0热饮
*/
@Schema(description = "1冷饮 0热饮")
private String isCold;
/**
* 厂商订单价格(分)
*/
@Schema(description = "厂商订单价格(分)")
private Integer price;
/**
* 支付者手机号
*/
@Schema(description = "支付者手机号")
private String phoneNo;
/**
* 支付结果通知厂商状态 0未通知 1成功 2失败
*/
@Schema(description = "通知厂商状态")
private String wuliNotifyStatus;
/**
* 最近一次通知厂商时间
*/
@Schema(description = "最近通知时间")
private LocalDateTime wuliNotifyTime;
/**
* 通知厂商累计尝试次数
*/
@Schema(description = "通知尝试次数")
private Integer wuliNotifyCount;
/**
* 累计已同步厂商退款金额(分)
*/
@Schema(description = "累计已同步退款金额(分)")
private Integer refundSyncAmount;
/**
* 最近一次退款同步时间
*/
@Schema(description = "最近退款同步时间")
private LocalDateTime refundSyncTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import com.bsd.pjcloud.hard.api.entity.coffee.HardCoffeeLogEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 咖啡机生命周期日志
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HardCoffeeLogVo extends HardCoffeeLogEntity {
/**
* 设备名称
*/
private String hardName;
}
@@ -0,0 +1,26 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 咖啡机订单详情(含生命周期时间线)
*/
@Data
@Schema(description = "咖啡机订单详情")
public class HardCoffeeOrderDetailVo {
/**
* 订单信息
*/
@Schema(description = "订单信息")
private HardCoffeeOrderVo order;
/**
* 生命周期日志(按时间正序)
*/
@Schema(description = "生命周期日志")
private List<HardCoffeeLogVo> logs;
}
@@ -0,0 +1,74 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 咖啡机订单信息(H5匿名拉单返回)
*/
@Data
@Builder
@Schema(description = "咖啡机订单信息")
public class HardCoffeeOrderInfoVo {
/**
* 本地订单id(支付时回传)
*/
@Schema(description = "本地订单id")
private Long orderId;
/**
* 厂商订单号
*/
@Schema(description = "厂商订单号")
private String orderNo;
/**
* 产品名称
*/
@Schema(description = "产品名称")
private String product;
/**
* 产品图片链接
*/
@Schema(description = "产品图片链接")
private String img;
/**
* 1冷饮 0热饮
*/
@Schema(description = "1冷饮 0热饮")
private String isCold;
/**
* 价格(分)
*/
@Schema(description = "价格(分)")
private Integer price;
/**
* 价格(元,两位小数)
*/
@Schema(description = "价格(元)")
private String priceYuan;
/**
* 厂商机器号
*/
@Schema(description = "厂商机器号")
private String machineName;
/**
* 是否已支付(已支付时禁止重复支付)
*/
@Schema(description = "是否已支付")
private Boolean paid;
/**
* 支付剩余秒数(超时后不可支付)
*/
@Schema(description = "支付剩余秒数")
private Long remainSeconds;
}
@@ -0,0 +1,50 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import com.bsd.pjcloud.hard.api.entity.coffee.HardCoffeeOrderEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 咖啡机订单管理端分页/详情
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HardCoffeeOrderVo extends HardCoffeeOrderEntity {
/**
* 设备名称
*/
private String hardName;
/**
* 支付人姓名
*/
private String userName;
/**
* 本地订单状态
*/
private String orderStatus;
/**
* 本地订单支付方式
*/
private String payType;
/**
* 支付时间
*/
private LocalDateTime payTime;
/**
* 本地订单退款金额(分)
*/
private Integer refundPrice;
/**
* 本地订单退款状态
*/
private String refundStatus;
}
@@ -0,0 +1,44 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 咖啡机饭卡支付结果(H5匿名)
*/
@Data
@Builder
@Schema(description = "咖啡机饭卡支付结果")
public class HardCoffeePayResultVo {
/**
* 本地订单id
*/
@Schema(description = "本地订单id")
private Long orderId;
/**
* 厂商订单号
*/
@Schema(description = "厂商订单号")
private String orderNo;
/**
* 支付人姓名
*/
@Schema(description = "支付人姓名")
private String name;
/**
* 饭卡卡号
*/
@Schema(description = "饭卡卡号")
private String cardNo;
/**
* 支付后余额(元,两位小数)
*/
@Schema(description = "支付后余额(元)")
private String balanceYuan;
}
@@ -0,0 +1,42 @@
package com.bsd.pjcloud.hard.api.vo.coffee;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 屋里咖啡查单响应(文档3.4 queryOrder)。
* 厂商协议字段为蛇形命名(return_code/return_msg/phone_no),序列化必须保持一致
*/
@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Schema(description = "屋里咖啡查单响应")
public class WuliQueryOrderVo {
/**
* SUCCESS/FAIL
*/
@Schema(description = "SUCCESS/FAIL")
private String returnCode;
/**
* 失败原因
*/
@Schema(description = "失败原因")
private String returnMsg;
/**
* 支付状态 SUCCESS支付成功/USERPAYING支付中/FAIL失败或关闭
*/
@Schema(description = "支付状态")
private String status;
/**
* 支付者手机号
*/
@Schema(description = "支付者手机号")
private String phoneNo;
}