feat:app流水通知显示备注

feat:咖啡机初步
This commit is contained in:
dzc committed 2026-09-18 12:53:39 +08:00
1 parent dcac6536ff
commit 79ebcec760
7 files changed
+82 -4

No files matched your search

+4 -4
View File
@@ -33,11 +33,11 @@ VITE_OAUTH2_SOCIAL_CLIENT='social:social'
# 是否开启websocket 消息接受,
VITE_WEBSOCKET_ENABLE = true
# --------------------------- start 开发环境 start ----------------------------------
VITE_APP_DEV_SERVICE = https://www.zianxin.com/api
# VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc
# VITE_APP_DEV_SERVICE = https://www.zianxin.com/api
VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc
# VITE_APP_DEV_SERVICE = http://127.0.0.1:9999
VITE_APP_DEV_SERVICE = https://www.zianxin.com/api
# VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc
# VITE_APP_DEV_SERVICE = https://www.zianxin.com/api
VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc
#VITE_APP_DEV_SERVICE = http://127.0.0.1:9999
VITE_IMAGE_DEV_PATH = https://www.zianxin.com/api
@@ -0,0 +1,67 @@
# 钱包变动通知携带流水备注(remark)实施计划
## 链路现状(已核实)
```
wallet_transaction 落库(remark 可在创建时写入,如充值导入审批)
→ WalletTransactionServiceImpl.save() 同事务 createMessageOutbox() 写 wallet_message_outbox(不可变快照,目前无 remark)
→ WalletMessageOutboxJob(10s, 2s归并) → buildDetail() → Feign /app-message/inner/wallet-event
→ ThirdAppMessageServiceImpl.receiveWalletEvent()
├─ walletContent() 用 i18n 模板拼 title/content(content 同时用于站内信正文和极光推送栏文案)
├─ serializeWalletPayload() → payloadJson(details=WalletMessageDetailDto 列表,App 拉取时按语言重渲染正文)
└─ insert third_app_message + 创建推送投递任务
→ ThirdAppMessagePushJob → JPush(直接透传 title/content,无需改)
```
方案采用**快照模式**:remark 随其他展示字段一起在 Outbox 落库时快照,与该表"不可变展示快照"的设计一致。
## 后端改动(biz-api-cloud-zax,6 个文件 + 1 个 DDL)
1. **新增 DDL** `db/20260918_add_wallet_outbox_remark.sql`:
```sql
ALTER TABLE `pjcloudx_wallet`.`wallet_message_outbox`
ADD COLUMN `remark` varchar(256) DEFAULT NULL COMMENT '流水备注快照,由后台操作人员补充业务说明,最多256字符' AFTER `balance`;
```
2. **`WalletMessageOutboxEntity.java`**(pjcloud-wallet-api,balance 字段后):加 `private String remark;` + 注释。
3. **`WalletTransactionServiceImpl.createMessageOutbox()`** L245 附近:`outbox.setRemark(transaction.getRemark());`
4. **`WalletMessageOutboxServiceImpl.buildDetail()`** L266 附近:`detail.setRemark(outbox.getRemark());`
5. **`WalletMessageDetailDto.java`**(pjcloud-thirdparty-api):加 `@Size(max = 256) private String remark;` —— 自动进入 payloadJson,支撑 App 端按语言重渲染正文。
6. **`ThirdAppMessageServiceImpl.walletContent()`** L442 后:remark 非空白时在每条明细后追加备注段:
```java
detailsText.append(MsgUtils.getMessage(detailCode, walletName, amount, balance));
if (StrUtil.isNotBlank(detail.getRemark())) {
detailsText.append(MsgUtils.getMessage(ErrorCodes.APP_MSG_WALLET_DETAIL_REMARK, detail.getRemark().trim()));
}
```
7. **`ErrorCodes.java`** L1342 附近:加 `String APP_MSG_WALLET_DETAIL_REMARK = "app.msg.wallet.detail.remark";`
8. **i18n 三份 properties**(messages_zh_CN / zh_HK / en,L446 后同步):
- zh_CN:`app.msg.wallet.detail.remark=(备注:{0})`
- zh_HK:`app.msg.wallet.detail.remark=(備註:{0})`
- en:`app.msg.wallet.detail.remark= (Note: {0})`
效果示例:`充值已到账:饭卡钱包增加100.00元,余额200.00元(备注:九月补贴发放)`。该 content 即为 App 列表正文(2 行截断)和极光推送通知栏文案。
## 前端改动(biz_zax_app_cloud,3 个文件)
1. **`src/sheep/api/app-message.ts`** `AppWalletMessageDetail`(L127-140):加 `remark?: string`。
2. **`src/pages/message/detail.vue`** 钱包变动行(L56-64):余额行下方按需追加备注行(`hasRemark` 判断空白,沿用 wallet/detail.vue 的 `Boolean(String(v?.remark || "").trim())` 模式),样式 `mt-6rpx text-22rpx color-#98a2b3 break-all`,不做行数截断(详情页展示完整备注)。
3. **`src/i18n/pages/message/{zh-cn,zh-hk,en}.ts`**:加 `transactionRemark`:zh-cn `"备注:{remark}"`、zh-hk `"備註:{remark}"`、en `"Remark: {remark}"`。
列表页 `list.vue` **不需要改**:正文来自服务端拼接的 content,remark 进模板后自动显示。
## 无需改动的环节(已核实)
- 极光推送侧(`ThirdPushDeliveryServiceImpl.processOne` / `JPushProvider` / `ThirdThirdJgPushServiceImpl`):直接透传消息 title/content,备注进 content 后自动到达通知栏。
- 监护人(RELATION)消息:包裹本人 title/content,自动携带。
- `WalletMessageEventDto`:details 列表元素加字段后自动携带。
## 已知限制(产品语义说明)
- Outbox 为交易时快照:流水创建**之后**再通过 `PUT /wallet-transaction/update-remark` 补写/修改的备注,不会同步到已发出的通知(通知已投递);创建时已带 remark 的场景(充值导入审批等)完整覆盖。
- 历史消息 payload 无 remark,多语言重渲染不追加备注段,行为不变。
## 验证
- 后端:在 biz-api-cloud-zax 仓库根目录 `mvn -pl pjcloud-wallet/pjcloud-wallet-biz,pjcloud-thirdparty/pjcloud-thirdparty-biz -am compile -DskipTests`
- 前端:`pnpm type-check`,与既有基线 17 个错误对比(不新增错误即通过)
- DDL 需要单独在数据库执行后才生效(部署时执行)
+1
View File
@@ -37,6 +37,7 @@ export default {
walletChange: "Wallet changes",
wallet: "Wallet",
balanceAfter: "Balance after change {balance}",
transactionRemark: "Remark: {remark}",
verifyInfo: "Redemption info",
mealContent: "Meal",
orderNo: "Order No.",
+1
View File
@@ -37,6 +37,7 @@ export default {
walletChange: "钱包变动",
wallet: "钱包",
balanceAfter: "变动后余额 {balance}",
transactionRemark: "备注:{remark}",
verifyInfo: "核销信息",
mealContent: "用餐内容",
orderNo: "订单编号",
+1
View File
@@ -37,6 +37,7 @@ export default {
walletChange: "錢包變動",
wallet: "錢包",
balanceAfter: "變動後餘額 {balance}",
transactionRemark: "備註:{remark}",
verifyInfo: "核銷信息",
mealContent: "用餐內容",
orderNo: "訂單編號",
+6
View File
@@ -57,6 +57,7 @@
<view class="min-w-0 flex-1">
<view class="show-line text-27rpx font-600 color-#344054">{{ detail.walletName || t("mobile.message.wallet") }}</view>
<view class="mt-6rpx text-22rpx color-#98a2b3">{{ t("mobile.message.balanceAfter", { balance: formatBalance(detail.balance) }) }}</view>
<view v-if="remarkText(detail)" class="mt-6rpx text-22rpx leading-34rpx color-#98a2b3 break-all">{{ remarkText(detail) }}</view>
</view>
<view class="shrink-0 text-30rpx font-700" :class="Number(detail.amount) >= 0 ? 'color-#15803d' : 'color-#dc2626'">
{{ formatAmount(detail.amount) }}
@@ -161,6 +162,11 @@ const formatAmount = (amount: number): string => {
const formatBalance = (balance: number): string => `¥${((Number(balance) || 0) / 100).toFixed(2)}`
const remarkText = (detail: AppWalletMessageDetail): string => {
const remark = String(detail.remark || "").trim()
return remark ? t("mobile.message.transactionRemark", { remark }) : ""
}
const loadMessage = async () => {
if (!state.messageId || state.loading) return
state.loading = true
+2
View File
@@ -135,6 +135,8 @@ export interface AppWalletMessageDetail {
amount: number
/** 变动完成后的余额,单位分。 */
balance: number
/** 流水备注快照,由后台操作人员补充业务说明,最多256字符,可为空。 */
remark?: string
/** 钱包业务类型持久化编码。 */
walletBizType: string
}