feat:钱包操作、被监护人操作消费消息提醒、增加消息模块

This commit is contained in:
dzc committed 2026-08-14 19:49:06 +08:00
1 parent 6e1af7c84d
commit f7ff135416
104 files changed
+6734 -88

No files matched your search

@@ -0,0 +1,40 @@
package com.bsd.pjcloud.thirdparty.api.feign;
import com.bsd.pjcloud.common.core.constant.ServiceNameConstants;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.feign.annotation.NoToken;
import com.bsd.pjcloud.thirdparty.dto.appmessage.MealVerifiedEventDto;
import com.bsd.pjcloud.thirdparty.dto.appmessage.WalletMessageEventDto;
import jakarta.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* App业务消息中心内部Feign契约。
*
* <p>来源服务只能提交已在本地事务中持久化的Outbox事件,返回成功后才允许把Outbox标记为完成。</p>
*/
@FeignClient(contextId = "remoterThirdAppMessageService", value = ServiceNameConstants.THIRDPARTY_SERVICE)
public interface RemoterThirdAppMessageService {
/**
* 幂等接收聚合钱包事件并生成本人及符合条件的关系消息。
*
* @param dto Wallet Outbox聚合后的事件快照
* @return true表示消息中心已幂等接收,来源Outbox可以标记成功
*/
@NoToken
@PostMapping("/app-message/inner/wallet-event")
R<Boolean> receiveWalletEvent(@Valid @RequestBody WalletMessageEventDto dto);
/**
* 幂等接收用餐核销事件并生成本人及符合条件的关系消息。
*
* @param dto Hardware Outbox保存的核销事件快照
* @return true表示消息中心已幂等接收,来源Outbox可以标记成功
*/
@NoToken
@PostMapping("/app-message/inner/meal-verified-event")
R<Boolean> receiveMealVerifiedEvent(@Valid @RequestBody MealVerifiedEventDto dto);
}
@@ -0,0 +1,81 @@
package com.bsd.pjcloud.thirdparty.constant.appmessage;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* App业务消息事件协议。
*
* <p>事件编码会持久化到消息、策略、订阅和Outbox表,并由PC与App共同使用,禁止随意改名或复用。</p>
*/
@Getter
@AllArgsConstructor
public enum AppMessageEventEnum {
/** 钱包人工更新余额,对应WalletBizEnum编码1。 */
WALLET_UPDATE("WALLET_UPDATE", "余额更新", "1", "wallet"),
/** 钱包批量更新余额,对应WalletBizEnum编码2。 */
WALLET_BATCH("WALLET_BATCH", "批量余额更新", "2", "wallet"),
/** 钱包充值到账,对应WalletBizEnum编码3。 */
WALLET_RECHARGE("WALLET_RECHARGE", "充值到账", "3", "wallet"),
/** 钱包支付或钱包订单支付,对应WalletBizEnum编码4。 */
WALLET_PAYMENT("WALLET_PAYMENT", "消费支付", "4", "wallet"),
/** 钱包退款到账,对应WalletBizEnum编码5。 */
WALLET_REFUND("WALLET_REFUND", "退款到账", "5", "wallet"),
/** 钱包转账支出,对应WalletBizEnum编码6。 */
WALLET_TRANSFER("WALLET_TRANSFER", "钱包转账", "6", "wallet"),
/** 钱包转账退款,对应WalletBizEnum编码7。 */
WALLET_TRANSFER_REFUND("WALLET_TRANSFER_REFUND", "转账退款", "7", "wallet"),
/** 余额退回各自食堂,对应WalletBizEnum编码8。 */
WALLET_RETURN_CANTEEN("WALLET_RETURN_CANTEEN", "退还食堂", "8", "wallet"),
/** 钱包余额重置,对应WalletBizEnum编码9。 */
WALLET_RESET("WALLET_RESET", "余额重置", "9", "wallet"),
/** 预约用餐核销成功,由Hardware真实核销状态转换产生。 */
MEAL_VERIFIED("MEAL_VERIFIED", "用餐核销", null, "meal");
/** 持久化及跨端传输使用的稳定事件编码。 */
private final String code;
/** PC和App展示的事件名称。 */
private final String label;
/** 对应的钱包业务持久化编码,非钱包事件为空。 */
private final String walletBizCode;
/** App展示分组编码,wallet为钱包类,meal为用餐类。 */
private final String category;
/**
* 按钱包业务编码解析消息事件。
*
* @param walletBizCode WalletBizEnum持久化编码
* @return 对应消息事件,不支持的编码返回空
*/
public static AppMessageEventEnum fromWalletBizCode(String walletBizCode) {
return Arrays.stream(values())
.filter(value -> value.walletBizCode != null && value.walletBizCode.equals(walletBizCode))
.findFirst()
.orElse(null);
}
/**
* 按稳定事件编码解析枚举。
*
* @param code 数据库或接口中的事件编码
* @return 对应事件,不支持的编码返回空
*/
public static AppMessageEventEnum fromCode(String code) {
return Arrays.stream(values()).filter(value -> value.code.equals(code)).findFirst().orElse(null);
}
}
@@ -0,0 +1,24 @@
package com.bsd.pjcloud.thirdparty.constant.appmessage;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* App业务消息接收类型协议。
*/
@Getter
@AllArgsConstructor
public enum AppMessageRecipientTypeEnum {
/** 事件主体本人,收件箱始终创建。 */
OWNER("OWNER", "本人"),
/** 通过有效用户关系和主动订阅生成的关系接收人。 */
RELATION("RELATION", "关系人");
/** 数据库存储和接口传输使用的稳定编码。 */
private final String code;
/** PC投递记录使用的展示名称。 */
private final String label;
}
@@ -0,0 +1,31 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 商户单个业务事件的App消息策略。
*/
@Data
public class AppPushPolicyItemDto implements Serializable {
/** 固定业务事件编码。 */
@NotBlank(message = "消息事件编码不能为空")
private String eventCode;
/** 本人系统Push是否开启;不影响本人收件箱。 */
@NotNull(message = "本人Push开关不能为空")
private Boolean ownerPushEnabled;
/** 关系收件箱及系统Push是否开启。 */
@NotNull(message = "关系消息开关不能为空")
private Boolean relationMessageEnabled;
/** 关系消息允许的UPMS关系类型编码;关系消息关闭时应为空。 */
private List<String> relationCodes = new ArrayList<>();
}
@@ -0,0 +1,25 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* PC批量保存指定商户App业务消息策略的请求。
*/
@Data
public class AppPushPolicySaveDto implements Serializable {
/** 需要独立配置的商户ID。 */
@NotNull(message = "商户ID不能为空")
private Long mchId;
/** 全部支持事件的策略;服务端拒绝重复或未知事件编码。 */
@Valid
@NotEmpty(message = "商户消息策略不能为空")
private List<AppPushPolicyItemDto> policies;
}
@@ -0,0 +1,17 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* PC向当前管理员发送Push测试的请求。
*/
@Data
public class AppPushTestDto implements Serializable {
/** 当前正在配置的商户ID,仅用于测试文案和权限上下文,不创建收件箱。 */
@NotNull(message = "商户ID不能为空")
private Long mchId;
}
@@ -0,0 +1,26 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* App保存当前用户单个关系事件订阅的请求。
*/
@Data
public class AppRelationSubscriptionSaveDto implements Serializable {
/** UPMS具体关系记录ID,服务端会复核其当前归属和有效期。 */
@NotNull(message = "用户关系ID不能为空")
private Long relationId;
/** 固定业务事件编码。 */
@NotBlank(message = "消息事件编码不能为空")
private String eventCode;
/** 订阅开关;关闭后不再生成关系收件箱或系统Push。 */
@NotNull(message = "关系订阅开关不能为空")
private Boolean enabled;
}
@@ -0,0 +1,22 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* 当前用户单个本人事件的系统Push偏好。
*/
@Data
public class AppUserEventSettingDto implements Serializable {
/** 固定业务事件编码。 */
@NotBlank(message = "消息事件编码不能为空")
private String eventCode;
/** 本人事件系统Push开关。 */
@NotNull(message = "事件Push开关不能为空")
private Boolean pushEnabled;
}
@@ -0,0 +1,24 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* App保存当前用户业务系统Push偏好的请求。
*/
@Data
public class AppUserPushSettingSaveDto implements Serializable {
/** 业务系统Push总开关;关闭不影响收件箱生成。 */
@NotNull(message = "业务Push总开关不能为空")
private Boolean pushEnabled;
/** 本人各事件的系统Push开关。 */
@Valid
private List<AppUserEventSettingDto> eventSettings = new ArrayList<>();
}
@@ -0,0 +1,49 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* Hardware服务提交给消息中心的用餐核销事件。
*/
@Data
public class MealVerifiedEventDto implements Serializable {
/** 跨服务幂等事件ID,由Hardware Outbox主键稳定生成。 */
@NotBlank(message = "消息事件ID不能为空")
private String eventId;
/** 固定事件编码,首期必须为MEAL_VERIFIED。 */
@NotBlank(message = "消息事件编码不能为空")
private String eventCode;
/** 事件所属租户ID,内部调用时用于恢复租户上下文。 */
@NotNull(message = "租户ID不能为空")
private Long tenantId;
/** 实际用餐用户ID,也是本人消息接收人。 */
@NotNull(message = "用餐用户ID不能为空")
private Long subjectUserId;
/** 被核销的硬件预约订单ID。 */
@NotNull(message = "核销订单ID不能为空")
private Long orderId;
/** 订单实际所属商户ID。 */
@NotNull(message = "核销商户ID不能为空")
private Long sourceMchId;
/** 订单商户名称快照;无法取得时允许为空。 */
private String sourceMchName;
/** 餐段、菜谱或核销内容摘要快照;无法取得时使用通用核销模板。 */
private String mealName;
/** 核销状态成功提交的实际时间。 */
@NotNull(message = "核销时间不能为空")
private LocalDateTime occurredTime;
}
@@ -0,0 +1,33 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serializable;
/**
* App通用推送设备绑定或解绑参数。
*/
@Data
public class PushDeviceBindingDto implements Serializable {
/** App安装实例的稳定逻辑设备ID,不得使用用户ID替代。 */
@NotBlank(message = "逻辑设备ID不能为空")
private String clientDeviceId;
/** 推送供应商编码,首期只接受JPUSH。 */
@NotBlank(message = "推送供应商编码不能为空")
private String providerCode;
/** 供应商为当前安装实例分配的设备令牌或Registration ID。 */
@NotBlank(message = "推送设备令牌不能为空")
private String providerRegistrationId;
/** 客户端应用编码,用于同供应商多应用隔离。 */
@NotBlank(message = "客户端应用编码不能为空")
private String appCode;
/** 客户端平台,ANDROID或IOS;H5不会调用本接口。 */
@NotBlank(message = "客户端平台不能为空")
private String platform;
}
@@ -0,0 +1,37 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* 钱包业务消息中的单个钱包变动快照。
*/
@Data
public class WalletMessageDetailDto implements Serializable {
/** 钱包流水ID,用于消息详情追溯但不直接暴露为跨服务写入入口。 */
@NotNull(message = "钱包流水ID不能为空")
private Long walletTransactionId;
/** 发生变化的钱包ID。 */
@NotNull(message = "钱包ID不能为空")
private Long walletId;
/** 钱包名称或别名快照;无法解析时使用“钱包”。 */
private String walletName;
/** 本次变动金额,单位分,收入为正、支出为负。 */
@NotNull(message = "钱包变动金额不能为空")
private Integer amount;
/** 本次变动完成后的余额,单位分。 */
@NotNull(message = "钱包结果余额不能为空")
private Integer balance;
/** WalletBizEnum持久化编码,用于服务端再次校验聚合明细一致性。 */
@NotBlank(message = "钱包业务类型不能为空")
private String walletBizType;
}
@@ -0,0 +1,61 @@
package com.bsd.pjcloud.thirdparty.dto.appmessage;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* Wallet服务提交给消息中心的聚合钱包事件。
*/
@Data
public class WalletMessageEventDto implements Serializable {
/** 跨服务幂等事件ID,来源于本批Outbox最小主键,重试期间保持不变。 */
@NotBlank(message = "消息事件ID不能为空")
private String eventId;
/** 固定消息事件编码,必须属于九种钱包事件之一。 */
@NotBlank(message = "消息事件编码不能为空")
private String eventCode;
/** 事件所属租户ID,内部调用时用于恢复租户上下文。 */
@NotNull(message = "租户ID不能为空")
private Long tenantId;
/** 钱包所有人用户ID,也是本人消息接收人。 */
@NotNull(message = "钱包用户ID不能为空")
private Long subjectUserId;
/** 来源商户ID快照;为空时消息中心仅生成本人收件箱并跳过系统Push和关系扩散。 */
private Long sourceMchId;
/** 来源商户名称快照;来源商户为空时同步为空。 */
private String sourceMchName;
/** 来源场景,WALLET表示普通钱包变化,ORDER表示钱包订单支付。 */
@NotBlank(message = "钱包消息来源场景不能为空")
private String sourceScene;
/** 钱包业务类型编码快照。 */
@NotBlank(message = "钱包业务类型不能为空")
private String sourceBizType;
/** 钱包业务ID快照,同一用户和业务ID的多钱包明细会合并。 */
@NotBlank(message = "钱包业务ID不能为空")
private String sourceBizId;
/** 业务事件实际发生时间。 */
@NotNull(message = "钱包事件时间不能为空")
private LocalDateTime occurredTime;
/** 同一业务操作内的全部钱包变动快照。 */
@Valid
@NotEmpty(message = "钱包变动明细不能为空")
private List<WalletMessageDetailDto> details;
}
@@ -2,17 +2,29 @@ package com.bsd.pjcloud.thirdparty.dto.jg;
import lombok.Data;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 极光通知栏推送参数,兼容既有定时广播并支持业务消息内部路由。
*/
@Data
public class JgPusDto {
/** 通知栏标题。 */
private String title;
/** 通知栏副标题或正文。 */
private String subtitle;
/** 目标用户ID,服务端按既有约定转换为极光alias。 */
private List<Long> userIds;
/** 极光标签集合,定时广播可继续按标签发送。 */
private List<String> tagList;
/** 通知附加字段,只允许非敏感的消息ID和App内部路由。 */
private Map<String, String> extras = new HashMap<>();
}
@@ -0,0 +1,49 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* App消息模块租户表通用审计字段。
*
* <p>只收敛所有新表都具备的审计语义,不包含任何业务字段或跨表行为。</p>
*/
@Data
public abstract class AppMessageBaseEntity implements Serializable {
/** 记录创建人;系统异步任务统一写system。 */
@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_UPDATE)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/** 逻辑删除标记,0有效,1删除。 */
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "逻辑删除标记")
private String delFlag;
/** 记录所属租户ID,由租户拦截器负责隔离。 */
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -0,0 +1,92 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
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;
/**
* App业务消息收件箱持久化对象,每个接收人保存一条不可变业务快照。
*/
@Data
@TenantTable
@TableName("third_app_message")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "App业务消息")
public class ThirdAppMessageEntity extends AppMessageBaseEntity {
/** 消息主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 跨服务业务事件幂等ID。 */
private String eventId;
/** 固定业务事件编码。 */
private String eventCode;
/** 收件箱所属用户ID。 */
private Long recipientUserId;
/** 事件主体用户ID。 */
private Long subjectUserId;
/** 接收类型,OWNER本人或RELATION关系人。 */
private String recipientType;
/** 命中的具体关系记录ID,本人消息为空。 */
private Long relationId;
/** 关系类型编码快照,本人消息为空。 */
private String relationCode;
/** 关系类型名称快照,本人消息为空。 */
private String relationName;
/** 事件主体姓名快照。 */
private String subjectUserName;
/** 来源服务编码,首期为WALLET或HARDWARE。 */
private String sourceService;
/** 来源业务类型快照。 */
private String sourceBizType;
/** 来源业务ID快照。 */
private String sourceBizId;
/** 来源商户ID快照;为空表示无法可靠归属商户。 */
private Long sourceMchId;
/** 来源商户名称快照。 */
private String sourceMchName;
/** 服务端固定模板渲染后的标题。 */
private String title;
/** 服务端固定模板渲染后的正文。 */
private String content;
/** 消息详情展示快照JSON,不包含凭证或设备令牌。 */
private String payloadJson;
/** App内部深链路径。 */
private String deepLinkPath;
/** App内部深链参数JSON。 */
private String deepLinkParamsJson;
/** 已读状态,0未读,1已读。 */
private String readStatus;
/** 用户首次标记已读时间,未读时为空。 */
private LocalDateTime readTime;
/** 业务事件实际发生时间。 */
private LocalDateTime occurredTime;
}
@@ -0,0 +1,34 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 商户按业务事件配置的App消息策略。
*/
@Data
@TenantTable
@TableName("third_app_push_policy")
@EqualsAndHashCode(callSuper = true)
public class ThirdAppPushPolicyEntity extends AppMessageBaseEntity {
/** 策略主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 策略所属商户ID,父店和子店独立。 */
private Long mchId;
/** 固定业务事件编码。 */
private String eventCode;
/** 本人系统Push开关,0关闭,1开启。 */
private String ownerPushEnabled;
/** 关系消息开关,0关闭,1开启。 */
private String relationMessageEnabled;
}
@@ -0,0 +1,28 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 商户事件策略允许的UPMS关系类型。
*/
@Data
@TenantTable
@TableName("third_app_push_policy_relation")
@EqualsAndHashCode(callSuper = true)
public class ThirdAppPushPolicyRelationEntity extends AppMessageBaseEntity {
/** 策略关系主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 所属商户事件策略ID。 */
private Long policyId;
/** UPMS关系类型稳定编码。 */
private String relationCode;
}
@@ -0,0 +1,40 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* App用户按具体关系记录订阅业务事件的持久化对象。
*/
@Data
@TenantTable
@TableName("third_app_relation_subscription")
@EqualsAndHashCode(callSuper = true)
public class ThirdAppRelationSubscriptionEntity extends AppMessageBaseEntity {
/** 订阅主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** UPMS具体关系记录ID,新关系不会继承旧订阅。 */
private Long relationId;
/** 主动订阅用户ID,通常为监护人。 */
private Long subscriberUserId;
/** 被订阅事件主体用户ID,通常为被监护人。 */
private Long subjectUserId;
/** 订阅时的关系类型编码快照。 */
private String relationCode;
/** 固定业务事件编码。 */
private String eventCode;
/** 订阅开关,0关闭,1开启。 */
private String enabled;
}
@@ -0,0 +1,31 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* App用户本人事件系统Push设置。
*/
@Data
@TenantTable
@TableName("third_app_user_event_setting")
@EqualsAndHashCode(callSuper = true)
public class ThirdAppUserEventSettingEntity extends AppMessageBaseEntity {
/** 事件设置主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 设置所属用户ID。 */
private Long userId;
/** 固定业务事件编码。 */
private String eventCode;
/** 本人事件系统Push开关,0关闭,1开启。 */
private String pushEnabled;
}
@@ -0,0 +1,28 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* App用户业务系统Push总设置。
*/
@Data
@TenantTable
@TableName("third_app_user_push_setting")
@EqualsAndHashCode(callSuper = true)
public class ThirdAppUserPushSettingEntity extends AppMessageBaseEntity {
/** 设置主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 设置所属用户ID。 */
private Long userId;
/** 业务系统Push总开关,0关闭,1开启。 */
private String pushEnabled;
}
@@ -0,0 +1,51 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* Push供应商单次调用尝试日志。
*/
@Data
@TenantTable
@TableName("third_push_delivery_attempt")
@EqualsAndHashCode(callSuper = true)
public class ThirdPushDeliveryAttemptEntity extends AppMessageBaseEntity {
/** 尝试日志主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 所属Push投递任务ID。 */
private Long deliveryId;
/** 投递任务内递增的供应商调用序号。 */
private Integer attemptNo;
/** 本次调用的推送供应商编码。 */
private String providerCode;
/** 调用结果,ACCEPTED、RETRYABLE_FAILED或PERMANENT_FAILED。 */
private String resultStatus;
/** 供应商返回的消息ID。 */
private String providerMessageId;
/** 供应商错误码或系统错误分类。 */
private String errorCode;
/** 脱敏后的失败诊断信息。 */
private String errorMessage;
/** 本次供应商调用开始时间。 */
private LocalDateTime startedTime;
/** 本次供应商调用完成时间。 */
private LocalDateTime finishedTime;
}
@@ -0,0 +1,60 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* App业务消息系统Push投递任务。
*/
@Data
@TenantTable
@TableName("third_push_delivery")
@EqualsAndHashCode(callSuper = true)
public class ThirdPushDeliveryEntity extends AppMessageBaseEntity {
/** 投递任务主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 对应App业务消息ID,一条消息最多一个投递任务。 */
private Long messageId;
/** 系统Push目标用户ID。 */
private Long recipientUserId;
/** 来源商户ID快照。 */
private Long sourceMchId;
/** 固定业务事件编码。 */
private String eventCode;
/** 投递状态,PENDING、PROCESSING、RETRY、SUCCESS、SKIPPED或FAILED。 */
private String status;
/** 被策略跳过的稳定原因编码,未跳过时为空。 */
private String skipReason;
/** 已执行供应商调用次数,最多8次。 */
private Integer attemptCount;
/** 下次允许重试时间,非RETRY状态为空。 */
private LocalDateTime nextRetryTime;
/** 最终受理消息的供应商编码。 */
private String finalProviderCode;
/** 供应商返回的消息ID。 */
private String providerMessageId;
/** 供应商明确受理时间。 */
private LocalDateTime successTime;
/** 最近一次脱敏后的失败诊断信息。 */
private String lastError;
}
@@ -0,0 +1,51 @@
package com.bsd.pjcloud.thirdparty.entity.appmessage;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bsd.pjcloud.common.core.util.TenantTable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 供应商无关的App推送设备绑定。
*/
@Data
@TenantTable
@TableName("third_push_device_binding")
@EqualsAndHashCode(callSuper = true)
public class ThirdPushDeviceBindingEntity extends AppMessageBaseEntity {
/** 设备绑定主键,由MyBatis-Plus雪花算法生成。 */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 当前绑定用户ID。 */
private Long userId;
/** App安装实例的稳定逻辑设备ID。 */
private String clientDeviceId;
/** 推送供应商编码,首期为JPUSH。 */
private String providerCode;
/** 供应商设备令牌或Registration ID。 */
private String providerRegistrationId;
/** 客户端应用编码。 */
private String appCode;
/** 客户端平台,ANDROID或IOS。 */
private String platform;
/** 绑定有效状态,0停用,1有效。 */
private String enabled;
/** App最近成功上报绑定或活跃时间。 */
private LocalDateTime lastActiveTime;
/** 退出登录、账号切换或令牌失效后的解绑时间。 */
private LocalDateTime unbindTime;
}
@@ -0,0 +1,21 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
/**
* PC和App共用的固定消息事件选项。
*/
@Data
public class AppMessageEventOptionVo implements Serializable {
/** 固定业务事件编码。 */
private String eventCode;
/** 事件展示名称。 */
private String label;
/** 事件展示分组,wallet或meal。 */
private String category;
}
@@ -0,0 +1,46 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* App消息列表和详情的安全展示模型。
*/
@Data
public class AppMessageVo implements Serializable {
/** 消息ID,雪花长整型在前端按字符串处理。 */
private Long id;
/** 固定业务事件编码。 */
private String eventCode;
/** 事件展示分组,wallet或meal。 */
private String category;
/** 接收类型,OWNER本人或RELATION关系人。 */
private String recipientType;
/** 服务端固定模板渲染后的标题。 */
private String title;
/** 服务端固定模板渲染后的正文。 */
private String content;
/** 事件来源商户名称快照。 */
private String sourceMchName;
/** 事件主体姓名快照,关系消息用于展示被监护人。 */
private String subjectUserName;
/** 消息详情快照JSON。 */
private String payloadJson;
/** 是否已读。 */
private Boolean read;
/** 业务事件实际发生时间。 */
private LocalDateTime occurredTime;
}
@@ -0,0 +1,37 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* PC查看的单次供应商调用诊断详情。
*/
@Data
public class AppPushDeliveryAttemptVo implements Serializable {
/** 尝试日志ID。 */
private Long id;
/** 投递任务内递增序号。 */
private Integer attemptNo;
/** 本次调用的供应商编码。 */
private String providerCode;
/** 标准化调用结果。 */
private String resultStatus;
/** 供应商错误码或系统错误分类。 */
private String errorCode;
/** 脱敏后的失败摘要。 */
private String errorMessage;
/** 调用开始时间。 */
private LocalDateTime startedTime;
/** 调用完成时间。 */
private LocalDateTime finishedTime;
}
@@ -0,0 +1,46 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* PC业务消息投递记录展示模型,不包含设备令牌和供应商密钥。
*/
@Data
public class AppPushDeliveryVo implements Serializable {
/** 投递任务ID,前端按字符串处理。 */
private Long id;
/** 对应收件箱消息ID。 */
private Long messageId;
/** 固定业务事件编码。 */
private String eventCode;
/** 目标用户ID。 */
private Long recipientUserId;
/** 投递状态。 */
private String status;
/** 跳过原因编码,未跳过时为空。 */
private String skipReason;
/** 已执行的供应商调用次数。 */
private Integer attemptCount;
/** 最终受理供应商编码。 */
private String finalProviderCode;
/** 最近一次脱敏失败摘要。 */
private String lastError;
/** 投递任务创建时间。 */
private LocalDateTime createTime;
/** 供应商明确受理时间。 */
private LocalDateTime successTime;
}
@@ -0,0 +1,32 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* PC展示的商户单个业务事件策略。
*/
@Data
public class AppPushPolicyVo implements Serializable {
/** 固定业务事件编码。 */
private String eventCode;
/** 事件展示名称。 */
private String eventLabel;
/** 事件展示分组,wallet或meal。 */
private String category;
/** 本人系统Push是否开启。 */
private Boolean ownerPushEnabled;
/** 关系收件箱及系统Push是否开启。 */
private Boolean relationMessageEnabled;
/** 允许接收的关系类型编码。 */
private List<String> relationCodes = new ArrayList<>();
}
@@ -0,0 +1,24 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
/**
* App单个关系事件的订阅状态。
*/
@Data
public class AppRelationEventSettingVo implements Serializable {
/** 固定业务事件编码。 */
private String eventCode;
/** 事件展示名称。 */
private String eventLabel;
/** 事件展示分组,wallet或meal。 */
private String category;
/** 当前关系是否主动订阅该事件,缺少持久化记录时为false。 */
private Boolean enabled;
}
@@ -0,0 +1,36 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* App按具体有效关系展示的全部事件订阅状态。
*/
@Data
public class AppRelationSubscriptionVo implements Serializable {
/** UPMS具体关系记录ID。 */
private Long relationId;
/** 被订阅事件主体用户ID。 */
private Long subjectUserId;
/** 被订阅事件主体姓名。 */
private String subjectUserName;
/** 关系类型稳定编码。 */
private String relationCode;
/** 关系类型展示名称。 */
private String relationName;
/** 关系失效时间;为空表示未设置失效时间。 */
private LocalDateTime expireTime;
/** 全部支持事件的订阅状态,默认均为关闭。 */
private List<AppRelationEventSettingVo> eventSettings = new ArrayList<>();
}
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
/**
* PC商户消息策略可选择的UPMS稳定关系类型。
*/
@Data
public class AppRelationTypeOptionVo implements Serializable {
/** UPMS关系稳定编码。 */
private String relationCode;
/** 关系类型展示名称。 */
private String relationName;
}
@@ -0,0 +1,24 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
/**
* App当前用户单个本人事件的系统Push偏好。
*/
@Data
public class AppUserEventSettingVo implements Serializable {
/** 固定业务事件编码。 */
private String eventCode;
/** 事件展示名称。 */
private String eventLabel;
/** 事件展示分组,wallet或meal。 */
private String category;
/** 本人事件系统Push是否开启,缺少持久化记录时为true。 */
private Boolean pushEnabled;
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* App当前用户的业务系统Push偏好。
*/
@Data
public class AppUserPushSettingVo implements Serializable {
/** 业务系统Push总开关,缺少持久化记录时返回true。 */
private Boolean pushEnabled;
/** 全部支持事件及当前用户本人Push开关。 */
private List<AppUserEventSettingVo> eventSettings = new ArrayList<>();
}
@@ -0,0 +1,30 @@
package com.bsd.pjcloud.thirdparty.vo.appmessage;
import lombok.Data;
import java.io.Serializable;
/**
* PC只读展示的推送供应商运行状态,不包含任何密钥或设备令牌。
*/
@Data
public class PushProviderStatusVo implements Serializable {
/** 推送供应商稳定编码。 */
private String providerCode;
/** 供应商展示名称。 */
private String providerName;
/** 部署配置是否启用该供应商。 */
private Boolean enabled;
/** 当前配置是否完整且可用于投递。 */
private Boolean available;
/** 部署级故障切换优先级,数值越小越优先。 */
private Integer priority;
/** 不含敏感信息的状态说明。 */
private String statusMessage;
}