wallet 映射说明:自选购买 ≈ src/views/wallet/business/;无 i18n,messageCode 填 FE_LITERAL:文案 或 API 字段路径,未实现标「未实现」。
| # | 展示位 | 我们看到的(待核实) | 预期后端字段 / API | 代码位置(文件·函数·配置 key) | 技术确认结果 |
|---|---|---|---|---|---|
| A1 | 顶栏余额 | ¥ 999,999 | 商户可用余额(分转元) | components/counter/header-title.vue · handleRefresh · formatNumberToThousand(utils/base.js)API: GET /counter/front/merchant/getAvailableBalance · getAvailableBalance(api/counter.js) | 前端格式化 接口返回 number(分),展示 Math.floor(res / 100) 后 ¥{{ formatNumberToThousand(balance) }},有 ¥ 前缀 + 千分位,整数无小数。用于存款/取款页 CounterHeaderTitle showType="balance";本地缓存 counterBalanceRC。 |
| A2 | 筛选标签「100C以内」 | 区间文案带 C | sellPageAmountRangeConfig | filter-sort.vue · parseAmountRangeConfigAPI: GET /order/front/buyOrder/v2/buyTradeType兜底: amount-select-popup.vue · DEFAULT_AMOUNT_RANGE_LIST | API 配置 标签为 ${startAmount}-${endAmount}(如 1-100),不带 C 后缀;接口空时用前端默认 0-1000 等。 |
| A3 | 列表「可售 105」 | 整数、无单位后缀 | amount | business/com/card.vue L21-22API: POST .../buyOrder/v2/sellPage · getBuyLists | API 原值 展示 {{ info.amount }} C,整数 raw number + 前端字面量 C(DINPro 字体)。 |
| A4 | 成单量 99+ | 成单量99+ | historyChildFinishCount | business/com/card.vue L13 | 前端封顶 >= 99 显示 99+,否则原值;字段来自 sellPage 列表。 |
| A5 | 购买成功弱反馈内金额 | 可售 105(无 C) | 锁单响应 | business/index.vue · proceedDepositBuydeposit-popup.vue(购买前弹窗) | 无对应 Toast 购买成功不弹「已选择…可售…」类 Toast;成功走 uiType 外跳或 jumpToIMWithEmbeddedToUrl。金额仅在购买弹窗内 {{ info.amount }}元 展示。 |
| A6 | 卖方 IM「可售 105 C」 | 句末带 C | IM 推送 | utils/wallet/index.js · jumpToIM / buildJumpToIMWalletUrl | 外站 IM 聊天室为独立 H5 域名,本仓库无卖方首条话术模板;wallet 买单 uiType=3 仅拼 tid 跳转,不像 counter deposit 那样 post chatMsgInit。 |
| A7 | 沟通页订单卡大字 | 105 + 小字「元」 | 订单 amount | 外跳 IM(不在本仓库) 本仓近似: components/order-cashier-card.vue L18-20 | IM 内订单卡不在 wallet 项目。订单收银台列表为 {{ item.amount }}元(raw + 前端「元」),无大小字分层。 |
| A8 | 订单列表 | +¥105 | 账单/订单 API | bill/com/card.vue · handleGetSymbolorder-cashier-card.vue | API 账单列表: +/- + amount + currency(如 +105 C),非 +¥;收银台存单卡为 amount + 元。 |
| A9 | 订单详情 · 申请金额 | 整数 105 | 订单详情 | bill/com/details.vue L11 · 头部 h2 | API 原值 购买/出售详情标题区 {{ amount }} {{ currency }},无单独「申请金额」字段名;手续费 feeQuantity.toFixed(2)。 |
| A10 | 订单详情 · 实际到账 | 105.00 / 0.00 | actualAmount | bill/com/details.vue L45-46、L50 | API 原值 actualAmount 直接渲染(后端决定小数位);退回金额 reimburseAmount.toFixed(2) 前端固定 2 位(四舍五入)。 |
| A11 | 倒计时条内时间 | 04:30 MM:SS | 过期时间戳 | components/countdown.vueorders-accepted-dialog.vue | 前端 通用倒计时为剩余秒数 + 可选 unit(默认 Ns),非 MM:SS。卖家接单弹窗: endTimestamp = sendTime + limitTime*1000(WS ToConfirmOrder)。 |
| A12 | 赠送语内金额 | 赠送 3 元 | rebateRatio/giftRatio | deposit-popup.vue L10-14 · floatNumCut(multiplyAllFloat(ratio, amount), 2)card.vue · 送X% | 前端计算 弹窗: 「赠送 N 元」= 比例×amount 截断 2 位;列表卡片: 「送 X%」= multiplyOnlyFloat(ratio,100)。 |
| A13 | stock 与订单 amount 关系 | 1:1 锁单? | buyFromSellList | business/index.vue · proceedDepositBuy · quantity: depositInfo.amountAPI: POST .../buyOrder/v2/buyFromSellList | 1:1 列表 amount 原样作为 quantity 下单,前端无 C→CNY 换算;mergeCodes 内 payType 走撮合 IM(utils/counter/index.js)。 |
| 问题 | 技术回答 |
|---|---|
| C 币 decimalPlaces | 列表库存/下单 quantity:整数 raw,后缀 C 由前端拼接;余额/折合用 floatNumCut 默认 2 位截断(不四舍五入)。 |
| CNY 展示是否 always 2 位小数 | 否。弹窗主金额整数 +「元」;fee/gift 用 2 位截断;账单 actualAmount 跟 API;仅 feeQuantity/reimburseAmount 用 toFixed(2)。 |
| 列表库存 vs 订单金额是否同币种 | 是,同为 C 币数量(amount/quantity);订单收银台/账单展示「元」或 currency 字段由 API 决定。 |
| 格式化在前端还是后端(或各半) | 各半:列表/订单主金额为 API 原值;比例衍生金额、余额、限额千分位在前端(utils/base.js)。 |
| 统一工具类 / 方法名 | floatNumCut、formatMinTwoDecimals、formatNumberToThousand、multiplyAllFloat、multiplyOnlyFloat(均在 src/utils/base.js)。 |
| # | 触发场景 | 类型 | 我们看到的文案(待核实) | messageCode / key(待填) | 代码位置 | 技术确认结果 |
|---|---|---|---|---|---|---|
| B1 | 切换自选 Tab | Toast | 已切换自选报价 | wallet.business.tab.selfSelect(未实现) | business/index.vue(无 Tab 切换) | 未实现 wallet business 页无「自选/快捷」Tab;counter 侧 methods-deposit.vue 切换通道也无 Toast。 |
| B2 | 切换快捷 Tab | Toast | 已切换快捷存款 | wallet.business.tab.quickDeposit(未实现) | 同上 | 未实现 |
| B3 | 付款方式筛选变更 | Toast | 付款方式:{选项} | wallet.business.filter.payTypeChanged(未实现;{选项}=tradeTypeListChecked 展示名) | filter-sort.vue · handlePaymentSelect → handleChange | 未实现 仅触发 handleFilterSortChange 静默刷新列表,无 Toast。 |
| B4 | 金额筛选变更 | Toast | 金额筛选:{选项} | wallet.business.filter.amountRangeChanged(未实现;{选项}=amountText / 区间 label) | filter-sort.vue · handleAmountSelect | 未实现 同上,静默刷新。 |
| B5 | 可售数量排序 | Toast | 按可售数量从高到低… | wallet.business.sort.residualQty(未实现;三态:''/true/false) | filter-sort.vue · handleResidualQuantitySortAsc | 未实现 三态排序(默认/升/降)仅 emit 刷新,无 Toast。 |
| B6 | 筛选无结果 | 页内空态 | 暂无符合当前条件的报价 | FE_LITERAL:暂无数据(pull-refresh.emptyText) | components/pull-refresh.vue L25business/index.vue · dataStatus='empty' | 前端常量 通用文案 「暂无数据」,非 PRD 定制句。 |
| B7 | 报价失效 · 点购买 | Toast | 当前报价已失效… | buyFromSellList.response.msg + response.code(动态;前端拼接 ${msg}【${code}】);实名拦截 code=6286 | business/index.vue · proceedDepositBuy L1064-1068 | API message 失败时 toast 接口 msg,无固定「报价失效」messageKey。 |
| B8 | 购买成功 | Toast | 已选择{label},可售 {stock} | wallet.business.buy.selected(未实现;{label}=支付方式名,{stock}=amount) | proceedDepositBuy 成功分支 | 未实现 成功不 Toast,直接外跳/进 IM/关弹窗。 |
| B9 | 付款人姓名为空 | Toast | 请填写付款人姓名 | wallet.business.payerName.required(未实现) | 全仓库 grep 无匹配 | 未实现 wallet 购买流无「付款人姓名」字段;仅有卖出绑卡「收款人姓名」(payment-account)。 |
| B10 | 付款人姓名已提交 | Toast | 付款人姓名已确认 | wallet.business.payerName.confirmed(未实现) | 全仓库 grep 无匹配 | 未实现 |
| B11 | 锁单成功 | Toast | 已创建存款订单… | wallet.business.order.created(未实现;成功走 uiType 分支无 Toast) | proceedDepositBuy / IM 跳转 | 未实现 撮合单创建成功无该 Toast;未完成单用 ConfirmTip 强提示(见 C5)。 |
| B12 | 复制订单号 | Toast | 已复制订单号:{orderNo} | FE_LITERAL:复制成功(utils/base.js#copyToClipboard;无 orderNo 拼接) | utils/base.js · copyToClipboardbill/details.vue · 订单号复制 | 前端常量 Toast 为 「复制成功」,不含订单号;风控横幅复制走同一方法。 |
| B13 | 取消成功 | Toast | 存款订单已取消… | 卖家:wallet.seller.adCancelOrder.silent(刻意无 Toast);买家拒单:WS:HaveRejectedOrder → FE_LITERAL:支付商家未接单,请更换通道尝试. | layout/wallet.vue · handleCloseOrdersAcceptedDialoginit-ws.js · HaveRejectedOrder | 刻意无 Toast 卖家拒单/取消不弹成功提示;买家侧 WS 触发未接单 Toast。 |
| B14 | 回单驳回 | Toast | 回单已驳回… | wallet.order.receiptRejected(未实现);近似:WS:WALLET_ORDER_END.content(API 直出) | init-ws.js → order-status-notification.vue | wallet 未实现 无固定驳回 Toast;订单结束通知用 WS payload title/content。 |
| B15 | 存款成功 | Toast | 存款已到账 | WS:WALLET_ORDER_END → payload.title + payload.content(type=success|partialsuccess) | init-ws.js · global.vue · order-status-notification.vue | API 推送 文案来自 WS JSON,非前端写死「存款已到账」。 |
wallet 购买流已有 Toast 补充:请先勾选同意后下单(deposit-popup)、您还未完成实名认证(ConfirmTip)、支付商家未接单,请更换通道尝试【code】(proceedDepositBuy catch / WS)、手机号绑定相关(DepositPhoneVerifyPopup)。
| # | 场景 / 状态 | 我们看到的文案 | 来源猜测 | 代码位置 | 技术确认结果 |
|---|---|---|---|---|---|
| C1 | 自选锁定 · 卖方首条 IM | 已锁定自选报价… | IM 推送 | 外跳聊天室(utils/wallet/index.js · jumpToIM) | 不在本仓库 IM 消息体由聊天室服务/后端推送,wallet 前端无该模板字符串。 |
| C2 | 待付款 · 倒计时条 | 请 {MM:SS} 内付款… | 前端模板 | 外跳 IM;本仓 countdown.vue 仅秒数 | IM 内文案不在本仓库 wallet 通用倒计时非 MM:SS 模板句。 |
| C3 | 已付款 · 锁层 | 已付款 / 请等待对方查收 | API | order-cashier-card.vue · viewStatusDesc \|\| statusDesc | 订单收银台状态文案跟 API 字段,前端只渲染;具体「已付款」等字取决于后端返回。 |
| C4 | 已付款 · 底栏 | 请等待 09:59 对方发货中… | — | 外跳 IM | 不在本仓库 wallet 卖出底栏固定文案为「请保持在线,离开页面将暂停受理订单」(order-cashier.vue L41-43)。 |
| C5 | 强制退出弹窗 | 充值订单未完成… | 前端常量 | wallet: business/index.vue L931-936 · 购买订单未完成,请尽快查看!counter: methods-deposit.vue L517 · 充值订单未完成,请尽快查看! | wallet C2C 未完成撮合单用 ConfirmTip;文案写死,按钮「查看」跳 IM。 |
| C6 | 赠送语 | 5分钟内上传回单… | 活动配置 | deposit-popup.vue · 赠送/手续费行order-cashier-card.vue · 限时赠送N元 | 无「5分钟回单」句;现有为比例算出的「赠送 N 元」或列表「送 X%」,数据来自 buyOrderConfig 的 ratio 字段。 |
| C7 | 回单驳回 · 原因 | 图片未显示完整… | 审核返回 | WS → order-status-notification.vue · infos.content | 驳回原因若展示,走订单结束/风控 WS 的 API content,非前端枚举;wallet 无单独「回单驳回原因」组件。 |
IM 聊天室回填(c-play · c:\newProject\c-play · 2026-09-01) — 对应上文 A6/A7/A11/A12、B8–B15、C1–C7 等「外跳 IM / 不在本仓库」条目。messageCode 规则:无 i18n;已实现 FE_LITERAL:文案 或 WS msgObject.text;未做标注「未实现」。
| # | 展示位 | 我们看到的(待核实) | 预期后端字段 / API | 代码位置(c-play) | 技术确认结果 |
|---|---|---|---|---|---|
| A6 | 卖方 IM「可售 105 C」 | 句末带 C | WS 文本 / order-info | msg/order-info/index.tsx L58-62msg/index.tsx disPlayType 1 · msgObject.text | 前端 代码无「可售」字面。订单信息卡(disPlayType 2):{quantity} c + 标签「交易数量」,quantity 为 API 整数原值。文本话术(disPlayType 1):msgObject.text HTML 直出,无写死「可售 XXX C」;若 PRD 可见该句,来自后端 WS 推送。 |
| A7 | 沟通页订单卡大字 | 105 + 小字「元」 | amount | msg/payment/index.tsx L396-398msg/c-info/index.tsx L62-66status-mask/index.tsx L283-286 | 前端 floor 支付卡(dt3):{Math.floor(amount)}元 — 整数大字 + 小字「元」。卖方放币卡(dt8/CInfo)同模式 +「交易金额」。完成蒙层:±{Math.floor(Number(amount))} 整数无「元」。订单号:支付卡 mchOrderNo 后 10 位;蒙层 后 12 位。 |
| A11 | 倒计时条内时间 | 04:30 MM:SS | endTimestamp 等 | app/components/count-down.tsxmsg/payment/index.tsx L545-549msg/c-info/index.tsx L86-90 | MM:SS CountDown(isStatic=false)格式化为 MM:SS(小时并入分钟)。deadline 来自 init 映射(container.tsx · adExpireTimeout/orderConfirmTimeout/releaseConfirmTimeout,秒级 ×1000)。另 CountDownSeconds 为纯整数秒(提醒他/接单按钮)。 |
| A12 | 赠送语内金额 | 赠送 3 元 | rebateRatio · rebateTimeLimit | msg/btn-list/index.tsx · RebateTag L11-57msg/c-info/index.tsx L69-75 | 前端计算 ① RebateTag:{ceil(rebateTimeLimit/60)}分钟内 +(checkEmail?「发送邮件完成付款」:「上传回单订单到账」)+「,赠送」+ formatRebateAmount(accMul(rebateRatio,amount)) +「元」(截断 2 位)。② CInfo:{sellOrderRebate}元 API 原值 +「限时奖励/奖励过期」。无 PRD 固定「5分钟」句。 |
| 问题 | 技术回答 |
|---|---|
| C 币 decimalPlaces | order-info 卡 quantity:整数 raw + 前端 c。 |
| CNY 展示是否 always 2 位小数 | 否。支付卡/CInfo 主金额 Math.floor 整数 +「元」;蒙层实际到账/手续费/赠送用 2 位(截断或 toFixed)。 |
| 格式化在前端还是后端 | 各半:主金额/quantity/rebate 来自 API/WS;floor、截断 2 位、MM:SS、文案拼接在前端。 |
| 统一工具 / 方法 | formatRebateAmount(btn-list)、accMul/addMul(serviceClient)、truncateMoney2Display/formatAmount(status-mask)、Math.floor(payment/c-info)。 |
| # | 触发场景 | 类型 | 文案(待核实) | messageCode / key | 代码位置(c-play) | 技术确认结果 |
|---|---|---|---|---|---|---|
| B8 | 购买成功 | Toast | 已选择{label},可售 {stock} | im.buy.selected(未实现) | msg-container/index.tsx(进 IM 后) | 未实现 进入聊天室无「已选择…可售…」Toast;状态靠支付卡 UI 更新。 |
| B9 | 付款人姓名为空 | Toast | 请填写付款人姓名 | FE_LITERAL:请输入2-20位中文或英文字符 | payer-name-panel/index.tsx L91-95API: backfillPayerName | 前端常量 校验失败 Toast 「请输入2-20位中文或英文字符」(非 PRD「请填写付款人姓名」)。API 失败:dataObj.msg 或 FE_LITERAL:提交失败。条件:init payerNamePopup + tradeType===2。 |
| B10 | 付款人姓名已提交 | Toast | 付款人姓名已确认 | im.payerName.confirmed(未实现) | msg-container/index.tsx · handlePayerNameSubmit | 未实现 API 成功后无成功 Toast,关面板 + sessionStorage 标记。 |
| B11 | 锁单成功 | Toast | 已创建存款订单… | im.order.created(未实现) | — | 不适用 锁单在 wallet;IM 仅接收已创建订单的 init/历史。 |
| B12 | 复制订单号 | Toast | 已复制订单号:{orderNo} | FE_LITERAL:复制成功 | lib/client.ts · copyToClipboardpayment / order-info / c-info / status-mask | 前端常量 Toast 「复制成功」/「复制失败」,不含订单号。 |
| B13 | 取消成功 | Toast | 存款订单已取消… | — | msg-container/index.tsx · Accept 面板 | 混合 取消结果多为 status-mask「已取消」强提示,或 WS disPlayType 9 warning toast(msgObject.text)。Accept 取消:FE_LITERAL:取消成功/取消失败。 |
| B14 | 回单驳回 | Toast | 回单已驳回… | WS disPlayType 9 → msgObject.text | msg-container/index.tsx L969-974 | API/WS 动态 disPlayType===9 时 toast msgObject.text,无固定「回单已驳回」key。 |
| B15 | 存款成功 | Toast | 存款已到账 | FE_LITERAL:已完成(蒙层,非 Toast) | status-mask/index.tsx · showOrderFinished | 强提示 完成走 disPlayType 5/12 → StatusMask 全屏「已完成」(tradeSceneType 6/7),非「存款已到账」Toast。 |
IM Toast 补充:提醒成功(btn 5)、正在连接...(WS 重连)、群聊已解散、您正在与客服沟通,请勿重复操作、验证不通过/checkPayPass 返回 msg。邮件「发送完成」:普通回单发 WS 5008/买单确认付款;「我要催单」仅关面板无 WS。
| # | 场景 / 状态 | 文案 | 来源 | 代码位置(c-play) | 技术确认结果 |
|---|---|---|---|---|---|
| C1 | 自选锁定 · 卖方首条 IM | 已锁定自选报价… | WS/API | msg/index.tsx disPlayType 1 | API 直出 msgObject.text HTML 渲染,前端无写死模板。快捷指令:getChatConfig → commandList[].msgContent。 |
| C2 | 待付款 · 倒计时条 | 请 {MM:SS} 内付款… | 前端模板 | msg/payment/index.tsx L543-555 | 前端模板 请 [CountDown MM:SS] 内付款,超时将自动取消订单。(tips/index.tsx 另有状态条模板但 container 未挂载。) |
| C3 | 已付款 · 锁层 | 已付款 / 请等待对方查收 | 前端+状态 | msg/payment/index.tsx L277-311msg/index.tsx errText | 前端推导 tradeStatus∈[3,4,6,7,8] 或买家发过含「我已支付,请查收,谢谢」文本 → 锁层「已付款」 + 「请等待对方查收」。 |
| C4 | 已付款 · 底栏 | 请等待 09:59 对方发货中… | 前端模板 | msg/payment/index.tsx L543-554msg/c-info/index.tsx L84-92 | 前端模板 买家已付:请等待 [MM:SS] 对方发货中...(动态非固定 09:59)。卖家:请 [MM:SS] 内发货,超时将自动发货 / c-info「超时官方自动确认」。 |
| C5 | 强制退出弹窗 | 充值订单未完成… | — | lib/iframe-fullscreen-helper.ts | 未实现 无 wallet 式 ConfirmTip「订单未完成」;仅有 beforeunload 监听,无 PRD 定制文案。 |
| C6 | 赠送语 | 5分钟内上传回单… | 活动配置 | msg/btn-list/index.tsx RebateTagmsg/c-info/index.tsx | 前端计算 RebateTag:{ceil(rebateTimeLimit/60)}分钟内 + 上传/邮件文案 + 赠送 N元。CInfo:{sellOrderRebate}元 +「限时奖励」。无固定「5分钟」句。 |
| C7 | 回单驳回 · 原因 | 图片未显示完整… | 审核返回 | msg-container/index.tsx disPlayType 9 / disPlayType 1 | API 直出 无独立驳回原因组件;走 WS 文本 msgObject.text 或 disPlayType 9 toast,前端不枚举。 |
BuyOrderV2Controller / BuyCounterInfoServiceImpl、WalletSellOrderPageVO、PayConstants.PayModel、CounterUITypeEnum,以及前端回填结论(A13/B7/B11)。
| # | 问题 | 技术回答 |
|---|---|---|
| D1 | 自选购买创建的订单类型(撮合 / CTC / 其他) |
按支付方式分流,不是单一类型。 入口:wallet business 页(C2C 卖单列表)→ POST /front/buyOrder/v2/buyFromSellList → 资金侧 placePayOrder。返回 PlacePayOrderVO.uiType(CounterUITypeEnum)决定后续:
payModel / payTypeCode 决定。
|
| D2 | 报价列表 API 路径 + 主要 DTO 字段名 |
列表:POST /front/buyOrder/v2/sellPage返回 TradeCommonPageResult<WalletSellOrderPageVO>,主要字段:
amount、quantity、tradeType、accountType/accountTypeName、
historyChildFinishCount、matchPayLevel、currency、
feeRatio、giftRatio、rebateRatio、
payTypeCode、payTypeName、url、customTypeName、dzqbPinned。筛选项/区间配置: GET /front/buyOrder/v2/buyTradeType返回 BuyOrderConfigVO:支付方式列表 + sellPageAmountRangeConfig(JSON:startAmount/endAmount/sort)。点击购买前配置: POST /front/buyOrder/v2/buyOrderConfig(手续费/返利/赠送)。
|
| D3 | 购买/锁单 API 路径 + 失败码列表 |
路径:POST /front/buyOrder/v2/buyFromSellList入参 WalletBuyDTO:payTypeCode(必填)、quantity(必填,= 列表 amount 1:1)、可选 channelId/channelCode(电子钱包)、可选 phoneNo/smsCode(撮合通道命中手机校验时)。成功:返回 PlacePayOrderVO(含 orderNo、uiType、payModel、typeCode 等),前端按 uiType 跳转,无购买成功 Toast。与金额/提示相关的失败码(wallet 6000–6999 段 + 特殊码):
GET /front/buyOrder/v2/getInProgressMatchOrder → 触发 C5 强提示。
|
| D4 | 是否与老板口径「C 币非撮合」冲突?代码里如何区分 |
不直接冲突,口径需拆开说: 1)列表上的「C」是库存/数量展示单位(前端拼 C),下单 quantity 与列表 amount 1:1,不存在「因单位叫 C 就判定非撮合」。2)是否撮合看通道模型,不看币种字面:
uiType(3=聊天室撮合;1/2=浏览器;4/5=USDT/OTC 页)。后端区分:看返回的 payModel + typeCode。结论:「自选列表购买」可以下出撮合单;「C 币展示」≠「非撮合」。若老板指 ZHOTC/余额 C,那是另一条产品线,勿与 business 卖单列表混为一谈。 |
| 链路节点 | 金额 | 提示 |
|---|---|---|
| sellPage 列表 | API amount + 前端 C | 筛选项变更无 Toast;空态「暂无数据」 |
| buyFromSellList | quantity = amount 1:1 | 失败 API msg;成功无 Toast,按 uiType 跳 |
| uiType=3 → IM | 支付卡 floor(amount)+「元」;quantity+「 c」 | WS 文本/锁层/倒计时模板;完成 StatusMask |
| 账单/详情 | amount+currency / actualAmount | 复制「复制成功」;结束态 WS content |