feat: 语言切换功能页面推进

This commit is contained in:
hzj 2026-05-08 10:46:56 +08:00
parent d20e922a2c
commit bbe82fe55a
65 changed files with 6974 additions and 1524 deletions

View File

@ -10,7 +10,8 @@
- 本文件中的菜单层级不默认限制为“父级 > 子级”两层,若实际菜单存在三级结构,则按真实父链整理
- 路由是否记为独立菜单,先以原始接口返回为准;若入口页再直接引用同目录多个 `.vue` 文件,则这些文件记为页面内功能文件,不单独记成并列主路由
- 后续所有线程领取新任务前,除了读取 `线程协作.md``翻译进度.md``翻译清单.md`,还应先读取本文件
- 其他文档不再重复维护完整主路由树,最多保留摘要并引用本文件
- 其他文档不再重复维护完整主路由树或已完成主要路由索引,最多保留引用本文件的说明
- “当前已完成主要路由摘要”只在本文件维护;完成主要路由页面时必须同步更新本文件,不再去 `docs/i18n/翻译清单.md` 维护第二份主路由索引
- 下方保留原始接口返回,顶部摘要用于实际执行
### 全线程统一优先级
@ -57,7 +58,7 @@
### 当前进行中的主要路由
- 当前无进行中主要路由
- 当前无
### 当前跨已完成页面的公共组件联动复查
@ -441,19 +442,56 @@
- 区域关联支付国家 / Region-Payment Country Relations
- 路由别名:`region:pay:country`
- 路径:`cnf/pay/region-relation/index`
- 状态:待处理
- 已完成文件:
- `src/views/cnf/pay/region-relation/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 开通支付国家 / Enabled Payment Countries
- 路由别名:`open:pay:country`
- 路径:`cnf/pay/country/index`
- 状态:待处理
- 已完成文件:
- `src/views/cnf/pay/country/index.vue`
- `src/views/cnf/pay/country/associated-channels.vue`
- `src/views/cnf/pay/country/country-select.vue`
- 页面私有组件状态:
- `src/views/cnf/pay/country/associated-channels.vue` 已随页面同步完成
- `src/views/cnf/pay/country/country-select.vue` 已随页面同步完成
- `src/views/cnf/pay/comp/transfer-channel.vue` 历史已完成,本轮复核通过
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 应用管理 / Application Management
- 路由别名:`pay:application`
- 路径:`cnf/pay/application/index`
- 状态:待处理
- 已完成文件:
- `src/views/cnf/pay/application/index.vue`
- `src/views/cnf/pay/application/app-navigation.vue`
- `src/views/cnf/pay/application/app-manager/index.vue`
- `src/views/cnf/pay/application/app-manager/edit-form.vue`
- `src/views/cnf/pay/application/commodity/index.vue`
- `src/views/cnf/pay/application/commodity/edit-form.vue`
- `src/views/cnf/pay/application/commodity-v2/index.vue`
- `src/views/cnf/pay/application/commodity-v2/edit-form.vue`
- `src/views/cnf/pay/application/order-manager/index.vue`
- 页面私有组件状态:
- 已随页面同步完成或复核
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- 备注:`order-manager` 当前在 tab 配置中被注释,本轮仅处理其可见开发中提示与未使用 prompt 文案;注释掉的历史表格按规则保留
- 状态已完成线程一2026-05-07
- Google/Apple-V2 / Google/Apple V2
- 路由别名:`google:apple:product:config`
- 路径:`cnf/product-v2/index`
- 状态:待处理
- 已完成文件:
- `src/views/cnf/product-v2/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 活动配置 / Activity Configuration
- 路由别名:`Activity:Config`
- 状态:部分完成
@ -481,7 +519,11 @@
- 活动规则配置 / Activity Rule Configuration
- 路由别名:`Props:Activity:Rule:Config`
- 路径:`props/props-activity-rule-config/index`
- 状态:待处理
- 已完成文件:
- `src/views/props/props-activity-rule-config/index.vue`
- `src/views/props/props-activity-rule-config/edit-rule-drawer.vue`
- `src/views/props/props-activity-rule-config/components/*.vue`
- 状态:已完成
- 消息推送 / Message Push
- 路由别名:`MessageManagerPush`
- 路径:`message/push/index`
@ -565,10 +607,118 @@
- 状态:已完成
- 用户银行 / User Bank
- 路由别名:`UserBankBalance`
- 状态:待处理
- 状态:部分完成
- 用户银行流水 / User Bank Transactions
- 路由别名:`UserBankRunningWater`
- 路径:`user/bank-balance/running-water/index`
- 已完成文件:
- `src/views/user/bank-balance/running-water/index.vue`
- 页面私有组件状态:无同目录私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核通过
- 状态已完成线程三2026-05-07
- 用户银行账户 / User Bank Accounts
- 路由别名:`UserBankBalance`
- 路径:`user/bank-balance/table/index`
- 已完成文件:
- `src/views/user/bank-balance/table/index.vue`
- `src/views/user/bank-balance/table/form-edit.vue`
- `src/views/user/bank-balance/table/running-water.vue`
- 页面私有组件状态:已随页面同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核通过
- 状态已完成线程三2026-05-07
- 美金兑换金币记录 / USD-to-Gold Exchange Records
- 路由别名:`UserBankWithdrawGoldApply`
- 路径:`user/bank-balance/withdraw-gold-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-gold-apply/index.vue`
- 页面私有组件状态:当前目录仅包含 `index.vue`,无页面私有组件
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 现金提现申请 / Cash Withdrawal Applications
- 路由别名:`UserBankWithdrawMoneyApply`
- 路径:`user/bank-balance/withdraw-money-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 页面私有组件状态:
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- `src/components/upload-image/index.vue`:复核通过,仅剩注释中文
- 备注:
- 复制银行卡信息时使用的剪贴板文本中文标签按“不改复制内容结构”保留,不属于页面可见展示文案
- 状态已完成线程一2026-05-07
- 自动支付工资凭据 / Automatic Salary Payment Vouchers
- 路由别名:`AutomaticSalaryPaymentRecord`
- 路径:`user/bank-balance/auto-salary-pay-record/index`
- 已完成文件:
- `src/views/user/bank-balance/auto-salary-pay-record/index.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/policy-details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/remark-details-drawer.vue`
- 页面私有组件状态:
- `details-drawer.vue``policy-details-drawer.vue``remark-details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- `src/components/data/PropsRow/index.vue`:复核通过,仅剩注释中文
- 状态已完成线程一2026-05-07
- 用户工资钻石 / User Salary Diamonds
- 路由别名:`UserSalaryDiamondBalance`
- 状态:待处理
- 已完成文件:
- `src/views/user/salary-diamond-balance/running-water/index.vue`
- `src/views/user/salary-diamond-balance/table/index.vue`
- `src/views/user/salary-diamond-balance/table/form-edit.vue`
- `src/views/user/salary-diamond-balance/table/running-water.vue`
- 页面私有组件状态:
- `table/form-edit.vue``table/running-water.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核通过
- 状态已完成线程一2026-05-07
- 钻石提现申请 / Diamond Withdrawal Applications
- 路由别名:`UserBankWithdrawDiamondApply`
- 路径:`user/bank-balance/withdraw-diamond-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-diamond-apply/index.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/details-drawer.vue`
- 页面私有组件状态:
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/upload-image/index.vue`:本轮复核中文扫描无命中
- 状态已完成线程一2026-05-07
- 钻石兑换金币记录 / Diamond-to-Gold Exchange Records
- 路由别名:`UserBankDiamondWithdrawGoldApply`
- 路径:`user/bank-balance/diamond-withdraw-gold-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- 页面私有组件状态:
- 当前目录仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 语音房间 / Voice Rooms
- 路由别名:`VoiceRoom`
@ -659,11 +809,26 @@
- 道具赠送 / Prop Gift
- 路由别名:`PropsSendTool`
- 路径:`props/props-send-tool/index`
- 状态:待处理
- 已完成文件:
- `src/views/props/props-send-tool/index.vue`
- `src/views/props/props-send-tool/send-props.vue`
- `src/views/props/props-send-tool/send-badge.vue`
- `src/views/props/props-send-tool/send-ticket.vue`
- 页面私有组件状态:已随页面同步完成
- 直接公共组件状态:
- `src/components/data/PropsSourceSelectPopover/index.vue`:历史已完成,本轮复核中文扫描无命中
- 状态已完成线程二2026-05-07
- 道具商店 / Prop Store
- 路由别名:`props:store`
- 路径:`props/props-store/index`
- 状态:待处理
- 已完成文件:
- `src/views/props/props-store/index.vue`
- `src/views/props/props-store/form-edit.vue`
- 页面私有组件状态:`form-edit.vue` 已随入口页同步完成
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- 状态已完成线程一2026-05-07
- 主播中心 / Broadcaster Center
- 路由别名:`team:manaber`
@ -692,7 +857,15 @@
- BD工作统计 / BD Work Statistics
- 路由别名:`WorkStatistics`
- 路径:`team/work-statistics/index`
- 状态:待处理
- 已完成文件:
- `src/views/team/work-statistics/index.vue`
- 页面私有组件状态:无同目录私有组件
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SelectSystemRegion/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 状态已完成线程二2026-05-07
- BD列表 / BD List
- 路由别名:`BusinessDevelopment`
- 路径:`team/business-development/index`
@ -711,7 +884,21 @@
- 主播成员 / Broadcaster Members
- 路由别名:`team:member`
- 路径:`team/team-member/index`
- 状态:待处理
- 已完成文件:
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- 页面私有组件状态:
- 同目录 4 个私有弹窗/抽屉已随入口页同步完成
- `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核中文扫描无命中
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/Avatar/index.vue`:本轮复核中文扫描无命中
- 状态已完成线程二2026-05-07
- 账单列表 / Bill List
- 路由别名:`team:bill`
- 路径:`team/team-bill/index`
@ -719,7 +906,22 @@
- 主播工作 / Broadcaster Work
- 路由别名:`team:member:work`
- 路径:`team/team-member-work/index`
- 状态:待处理
- 已完成文件:
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 页面私有组件状态:同目录 3 个私有弹窗/抽屉与入口页直接引用的 `TeamDetailsDrawer/index.vue` 已随页面同步完成
- 直接公共组件状态:
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- `src/components/data/GiftHistoryDetailsDrawer/index.vue`:复核通过,仅剩注释中文
- `src/components/data/PropsRow/index.vue`:复核通过,仅剩注释中文
- `src/components/data/RoomDeatilsDrawer/index.vue`:复核通过
- `src/views/common/user_deatils.vue`:复核通过,仅剩注释块中文
- `src/components/SysOriginIcon/index.vue`:复核通过
- 状态已完成线程二2026-05-07
### 当前已完成主要路由摘要
@ -743,29 +945,75 @@
- 数据配置 / Data Configuration
- 参数配置 / Parameter Settings
- 幸运礼物规则配置 / Lucky Gift Rule Configuration
- 国家管理 / Country Management
- 幸运礼物规格配置 / Lucky Gift Specification Configuration
- 靓号管理(角色) / Special ID Management (Role)
- 礼物管理 / Gift Management
- IM账号管理 / IM Account Management
- Banner管理 / Banner Management
- 房间主题管理 / Room Theme Management
- 国家管理 / Country Management
- 徽章配置管理 / Badge Configuration Management
- 表情管理 / Emoji Management
- 靓号管理 / Special ID Management
- 邀请用户配置 / Invite User Configuration
- 游戏列表 / Game List
- 运营日志 / Operations Logs
- 礼物赠送记录 / Gift Sending Records
- 用户道具流水 / User Prop Transactions
- 邀请用户 / Invite Users
- 幸运礼物送礼记录 / Lucky Gift Sending Records
- 用户签到 / User Check-ins
- 登录日志 / Login Logs
- Ludo飞行棋 / Ludo
- CP申请日志 / CP Application Logs
- 用户密码日志 / User Password Logs
- 内购配置 / In-App Purchase Configuration
- 渠道管理 / Channel Management
- 厂商管理 / Provider Management
- 区域关联支付国家 / Region-Payment Country Relations
- 开通支付国家 / Enabled Payment Countries
- 应用管理 / Application Management
- Google/Apple-V2 / Google/Apple V2
- 活动配置 / Activity Configuration
- 活动管理 / Activity Management
- 活动模版 / Activity Templates
- 活动规则配置 / Activity Rule Configuration
- 消息推送 / Message Push
- APP管理员 / App Administrators
- 系统公告管理 / System Notice Management
- 金币代理 / Gold Agents
- 申请靓号 / Apply for Special ID
- App启动页 / App Launch Page
- 客服列表 / Customer Service List
- 金币余额榜 / Gold Balance Leaderboard
- 区域配置 / Region Configuration
- 用户银行 / User Bank
- 用户银行流水 / User Bank Transactions
- 用户银行账户 / User Bank Accounts
- 美金兑换金币记录 / USD-to-Gold Exchange Records
- 现金提现申请 / Cash Withdrawal Applications
- 自动支付工资凭据 / Automatic Salary Payment Vouchers
- 用户工资钻石 / User Salary Diamonds
- 语音房间 / Voice Rooms
- 在线房间 / Online Rooms
- 房间资料列表 / Room Profile List
- 置顶房间 / Pinned Rooms
- 房间黑名单 / Room Blacklist
- 家族管理 / Family Management
- 家族配置 / Family Configuration
- 家族列表 / Family List
- 道具管理 / Prop Management
- 资源组配置 / Resource Group Configuration
- 道具赠送 / Prop Gift
- 道具商店 / Prop Store
- 主播中心 / Broadcaster Center
- 代理钻石政策 / Agent Diamond Policy
- BD Lead / BD Lead
- 代理政策 / Agent Policy
- BD工作统计 / BD Work Statistics
- BD列表 / BD List
- 家族管理 / Family Management
- 家族配置 / Family Configuration
- 家族列表 / Family List
- 主播成员 / Broadcaster Members
- 主播工作 / Broadcaster Work
### 已部分完成但入口页仍需复核的主要路由

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,8 @@
## 文档定位
- 本文件只负责维护文件级待办、进行中、已完成与当前认领状态
- 需要看主要路由的完整父子级结构、路由别名、路径和入口文件时,统一查看 `docs/i18n/主要路由.md`
- 需要看主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态与已完成主要路由摘要时,统一查看 `docs/i18n/主要路由.md`
- 本文件不再重复维护“已完成主要路由索引”,避免和 `docs/i18n/主要路由.md` 的主路由摘要在多线程写入时漂移
- 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准
- 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖
- 需要看阶段成果、构建验证与时间线时,统一查看 `docs/i18n/翻译进度.md`
@ -64,71 +65,9 @@
### 已完成主要路由索引
- 详细父子级结构、路由别名、路径与入口文件统一见 `docs/i18n/主要路由.md`
- 以下索引已按 `docs/i18n/主要路由.md` 当前父子级顺序同步更新
- 系统管理 / System Management
- 用户管理 / User Management
- 角色管理 / Role Management
- 菜单管理 / Menu Management
- 资源管理 / Resource Management
- App系统 / App System
- 版本管理 / Version Management
- 请求黑名单 / Request Blacklist
- 用户管理 / User Management
- 用户列表 / User List页面本体已完成直接公共组件待联动复核
- 用户专属礼物制作 / Custom User Gift Creation
- 封禁设备列表 / Blocked Device List
- 最新登记设备 / Latest Registered Devices
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 消费商品订单 / Purchase Orders
- 金币收支记录 / Gold Transaction Records
- 内购配置 / In-App Purchase Configuration
- 渠道管理 / Channel Management
- 厂商管理 / Provider Management
- 运营日志 / Operations Logs
- 礼物赠送记录 / Gift Sending Records
- 用户道具流水 / User Prop Transactions
- 用户签到 / User Check-ins
- 邀请用户 / Invite Users
- 幸运礼物送礼记录 / Lucky Gift Sending Records
- 登录日志 / Login Logs
- CP申请日志 / CP Application Logs
- 用户密码日志 / User Password Logs
- 数据配置 / Data Configuration
- 参数配置 / Parameter Settings
- 幸运礼物规则配置 / Lucky Gift Rule Configuration
- 幸运礼物规格配置 / Lucky Gift Specification Configuration
- 靓号管理(角色) / Special ID Management (Role)
- 游戏列表 / Game List
- 房间主题管理 / Room Theme Management
- 国家管理 / Country Management
- IM账号管理 / IM Account Management
- 活动配置 / Activity Configuration
- 活动管理 / Activity Management
- 活动模版 / Activity Templates
- 消息推送 / Message Push
- APP管理员 / App Administrators
- App启动页 / App Launch Page
- 客服列表 / Customer Service List
- 系统公告管理 / System Notice Management
- 金币代理 / Gold Agents
- 申请靓号 / Apply for Special ID
- 区域配置 / Region Configuration
- 语音房间 / Voice Rooms
- 在线房间 / Online Rooms
- 房间资料列表 / Room Profile List
- 置顶房间 / Pinned Rooms
- 道具管理 / Prop Management
- 资源组配置 / Resource Group Configuration
- 主播中心 / Broadcaster Center
- 代理钻石政策 / Agent Diamond Policy
- BD Lead / BD Lead
- 代理政策 / Agent Policy
- BD列表 / BD List
- 家族管理 / Family Management
- 家族配置 / Family Configuration
- 家族列表 / Family List
- 本段不再重复维护主路由完成索引。
- 已完成主要路由摘要、父子级结构、路由别名、路径、入口文件与完成状态,统一以 `docs/i18n/主要路由.md` 为准。
- 本文件只继续维护下方“已完成文件平铺清单”、进行中任务、最新同步记录和文件级保留项。
### 已完成文件平铺清单
@ -243,6 +182,17 @@
- `src/views/team/bd-lead/index.vue`
- `src/views/team/bd-lead/add-bd-lead.vue`
- `src/views/team/bd-lead/bind-bd.vue`
- `src/views/team/work-statistics/index.vue`
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- `src/views/team/components/TeamCreate/index.vue`
- `src/views/team/diamond-policy/index.vue`
- `src/views/team/diamond-policy/props-form-edit.vue`
@ -346,13 +296,522 @@
- `src/views/sys/game-config/match/form-edit.vue`
- `src/views/sys/game-config/room/index.vue`
- `src/views/sys/game-config/room/form-edit.vue`
- `src/views/cnf/pay/region-relation/index.vue`
- `src/views/cnf/pay/country/index.vue`
- `src/views/cnf/pay/country/associated-channels.vue`
- `src/views/cnf/pay/country/country-select.vue`
- `src/views/cnf/pay/application/index.vue`
- `src/views/cnf/pay/application/app-navigation.vue`
- `src/views/cnf/pay/application/app-manager/index.vue`
- `src/views/cnf/pay/application/app-manager/edit-form.vue`
- `src/views/cnf/pay/application/commodity/index.vue`
- `src/views/cnf/pay/application/commodity/edit-form.vue`
- `src/views/cnf/pay/application/commodity-v2/index.vue`
- `src/views/cnf/pay/application/commodity-v2/edit-form.vue`
- `src/views/cnf/pay/application/order-manager/index.vue`
- `src/views/cnf/product-v2/index.vue`
- `src/views/props/props-store/index.vue`
- `src/views/props/props-store/form-edit.vue`
- `src/views/user/salary-diamond-balance/running-water/index.vue`
- `src/views/user/salary-diamond-balance/table/index.vue`
- `src/views/user/salary-diamond-balance/table/form-edit.vue`
- `src/views/user/salary-diamond-balance/table/running-water.vue`
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 表格展示适配:表头自动换行 + 默认最小宽度补齐
- 表格展示适配:表头 `.cell` 高度自适应 + 纵向居中修正
- 表单展示适配:标题纵向居中
## 进行中
- 当前无进行中任务
- 线程一:待分配
- 主要路由:钻石提现申请 / Diamond Withdrawal Applications
- 路由别名:`UserBankWithdrawDiamondApply`
- 路径:`user/bank-balance/withdraw-diamond-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-diamond-apply/index.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/details-drawer.vue`
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/upload-image/index.vue`
- 验证结果:
- 中文残留仅剩银行卡复制文本,不属于可见展示文案
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构或接口返回动态数据
- 线程二:当前无进行中任务,待分配
- 线程三:当前无进行中任务,待分配
## 2026-05-07 最新同步
- 线程二已完成:主要路由页面 / 主播中心 / 主播成员
- 路由别名:`team:member`
- 路径:`team/team-member/index`
- 已完成文件:
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- 页面私有组件状态:
- 同目录 4 个私有弹窗/抽屉已随入口页同步完成
- `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核中文扫描无命中
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/Avatar/index.vue`:本轮复核中文扫描无命中
- 已补充页面级语言 key`pages.teamMember`
- 验证结果:语言文件语法校验通过;本轮源码未使用 `$te``src/views/team/team-member/*.vue` 中文残留仅剩注释或注释掉的历史代码块;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 未修改:接口参数、查询字段、路由路径、权限码、团队/成员/代理 ID、成员角色实际值、批量删除提交值、目标重置提交值或接口返回动态数据
- 状态:已完成,线程二已切回待分配
- 线程一已完成:主要路由页面 / 钻石提现申请
- 路由别名:`UserBankWithdrawDiamondApply`
- 路径:`user/bank-balance/withdraw-diamond-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-diamond-apply/index.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/details-drawer.vue`
- 页面私有组件状态:
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/upload-image/index.vue`:本轮复核中文扫描无命中
- 已补充页面级语言 key`pages.userBankWithdrawDiamondApply`
- 验证结果:语言文件语法校验通过;本轮源码未使用 `$te``src/views/user/bank-balance/withdraw-diamond-apply/*.vue` 中文残留仅剩银行卡复制文本;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 模块预检查结果:
- 已按模块级规则核对入口页与目录文件列表
- `approval-drawer.vue``details-drawer.vue` 为入口页直接渲染私有抽屉,纳入同轮处理
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue``src/components/upload-image/index.vue` 纳入本轮复核
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构或接口返回动态数据
- 线程二已新认领:主要路由页面 / 主播中心 / 主播成员
- 路由别名:`team:member`
- 路径:`team/team-member/index`
- 已认领文件:
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- 模块预检查结果:
- 已按模块级规则核对入口页 import 与目录文件列表
- 入口页直接渲染同目录 4 个私有弹窗/抽屉,纳入同轮处理
- 入口页直接渲染的 `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue``src/components/data/Avatar/index.vue` 纳入本轮复核
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、团队/成员/代理 ID、成员角色实际值、批量删除提交值、目标重置提交值或接口返回动态数据
- 领取时线程二状态:进行中;本轮随后已完成,见上方完成记录
- 线程一已完成:主要路由页面 / 钻石兑换金币记录
- 路由别名:`UserBankDiamondWithdrawGoldApply`
- 路径:`user/bank-balance/diamond-withdraw-gold-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- 模块复核结果:
- 已按模块级规则核对入口页与目录文件列表
- 当前目录仅包含入口页,无同目录私有组件
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue` 复核通过
- 本模块中文残留扫描通过
- 说明:
- 新增 `pages.userBankDiamondWithdrawGoldApply`
- 未修改接口参数、查询字段、路由路径、权限码、`amountType` 实际值、`acceptAccount` 实际值或接口返回动态数据
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程一本轮完成后切回待分配
- 线程一已新认领:主要路由页面 / 钻石兑换金币记录
- 路由别名:`UserBankDiamondWithdrawGoldApply`
- 路径:`user/bank-balance/diamond-withdraw-gold-apply/index`
- 已认领文件:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- 模块预检查结果:
- 已按模块级规则核对入口页与目录文件列表
- 当前目录仅包含入口页,无同目录私有组件
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue` 纳入本轮复核
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、`amountType` 实际值、`acceptAccount` 实际值或接口返回动态数据
- 线程一已完成:主要路由页面 / 自动支付工资凭据
- 路由别名:`AutomaticSalaryPaymentRecord`
- 路径:`user/bank-balance/auto-salary-pay-record/index`
- 已完成文件:
- `src/views/user/bank-balance/auto-salary-pay-record/index.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/policy-details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/remark-details-drawer.vue`
- 模块复核结果:
- 已按模块级规则核对入口页与目录文件列表
- `details-drawer.vue``policy-details-drawer.vue``remark-details-drawer.vue` 已随入口页同步完成
- 直接公共组件 `src/components/Pagination/index.vue``src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue` 复核通过
- `src/components/data/PropsRow/index.vue` 中文命中仅为注释,不属于可见展示文案
- 本模块递归中文扫描通过
- 说明:
- 新增 `pages.automaticSalaryPaymentRecord`
- 未修改接口参数、查询字段、路由路径、权限码、政策值、布尔值或接口返回动态数据
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程一本轮完成后切回待分配
- 线程一已新认领:主要路由页面 / 自动支付工资凭据
- 路由别名:`AutomaticSalaryPaymentRecord`
- 路径:`user/bank-balance/auto-salary-pay-record/index`
- 已认领文件:
- `src/views/user/bank-balance/auto-salary-pay-record/index.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/policy-details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/remark-details-drawer.vue`
- 模块预检查结果:
- 已按模块级规则核对入口页与目录文件列表
- `details-drawer.vue``policy-details-drawer.vue``remark-details-drawer.vue` 为入口页直接渲染私有抽屉,纳入同轮处理
- 直接公共组件 `src/components/Pagination/index.vue``src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue``src/components/data/PropsRow/index.vue` 纳入本轮复核
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、政策值、布尔值或接口返回动态数据
- 线程一已完成:主要路由页面 / 美金兑换金币记录
- 路由别名:`UserBankWithdrawGoldApply`
- 路径:`user/bank-balance/withdraw-gold-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-gold-apply/index.vue`
- 模块复核结果:
- 已按模块级规则核对入口页与目录文件列表;当前目录仅包含 `index.vue`
- 筛选区、日期范围、表格列头、创建日期文案、加载更多与已加载全部文案已国际化
- `GOLD``FREIGHT` 仅在页面展示层做本地映射,未修改查询值、接口参数与接口返回动态数据
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue` 复核通过
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 已补 `pages.userBankWithdrawGoldApply`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程一已新认领:主要路由页面 / 现金提现申请
- 路由别名:`UserBankWithdrawMoneyApply`
- 路径:`user/bank-balance/withdraw-money-apply/index`
- 已认领文件:
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 模块预检查结果:
- 已按模块级规则核对入口页与目录文件列表
- `approval-drawer.vue``details-drawer.vue` 为入口页直接渲染私有抽屉,纳入同轮处理
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue``src/components/UploadImage/index.vue` 纳入本轮复核
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、状态实际值、复制内容结构或接口返回动态数据
- 线程一当前状态:进行中
- 线程一已完成:主要路由页面 / 现金提现申请
- 路由别名:`UserBankWithdrawMoneyApply`
- 路径:`user/bank-balance/withdraw-money-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 模块复核结果:
- 已按模块级规则核对入口页与目录文件列表
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件 `src/components/SysOriginIcon/index.vue``src/components/data/AccountInput/index.vue``src/components/data/UserInfo/UserTableExhibit/index.vue` 复核通过
- `src/components/upload-image/index.vue` 中文命中仅为文件注释
- 本模块递归中文扫描后,仅剩复制银行卡信息时使用的剪贴板文本中文,不属于页面可见展示文案
- 说明:
- 新增 `pages.userBankWithdrawMoneyApply`
- 未修改接口参数、查询字段、路由路径、权限码、状态实际值、复制内容结构、导出参数或接口返回动态数据
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程一本轮完成后切回待分配
- 线程二已完成:主要路由页面 / 主播中心 / 主播工作
- 路由别名:`team:member:work`
- 路径:`team/team-member-work/index`
- 已完成文件:
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 页面私有组件状态:
- 同目录 3 个私有弹窗/抽屉与入口页直接引用的 `TeamDetailsDrawer/index.vue` 已随页面同步完成
- 直接公共组件状态:
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/GiftHistoryDetailsDrawer/index.vue`:历史已完成,本轮复核仅剩注释中文
- `src/components/data/PropsRow/index.vue`:历史已完成,本轮复核仅剩注释中文
- `src/components/data/RoomDeatilsDrawer/index.vue`:历史已完成,本轮复核无新增可见中文
- `src/views/common/user_deatils.vue`:历史已完成,本轮复核仅剩注释块中文
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- 模块复核结果:
- 已完成筛选区、表格、工作详情抽屉、礼物流水弹窗、房间流水弹窗与团队详情抽屉静态展示文本国际化
- 新增 `pages.teamMemberWork``pages.teamDetailsDrawer`
- 递归中文扫描后仅剩模板注释和既有公共组件注释块,不属于可见展示文案
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、礼物流水类型实际值、团队/成员/代理 ID、系统来源、工资结算模式实际值、账单状态实际值或接口返回内容
- 验证结果:语言文件语法检查通过;本轮源码未使用 `$te``npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程二已切回待分配
- 线程三已新认领:主要路由页面 / 运营管理 / 用户银行 / 用户银行账户
- 路由别名:`UserBankBalance`
- 路径:`user/bank-balance/table/index`
- 认领范围:
- `src/views/user/bank-balance/table/index.vue`
- `src/views/user/bank-balance/table/form-edit.vue`
- `src/views/user/bank-balance/table/running-water.vue`
- 页面私有组件状态:
- `form-edit.vue``running-water.vue` 已纳入本轮同步处理
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 已完成文件:
- `src/views/user/bank-balance/table/index.vue`
- `src/views/user/bank-balance/table/form-edit.vue`
- `src/views/user/bank-balance/table/running-water.vue`
- 模块复核结果:
- 已完成账户列表、发送/扣除、转账、创建账户、导入数据、账户流水弹窗静态展示文案国际化
- 收入/支出与 `userBankWaterEvent` 仅在页面展示层做本地翻译映射,接口参数、查询字段、分页字段、提交值与接口返回账户/流水数据保持原样
- 语言文件新增 `pages.userBankAccounts`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程三已切回待分配
- 线程二已新认领:主要路由页面 / 主播中心 / 主播工作
- 路由别名:`team:member:work`
- 路径:`team/team-member-work/index`
- 认领范围:
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 页面私有组件状态:
- 同目录 3 个私有弹窗/抽屉与入口页直接引用的 `TeamDetailsDrawer/index.vue` 已纳入本轮同步处理
- 直接公共组件复核:
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/GiftHistoryDetailsDrawer/index.vue`
- `src/components/data/PropsRow/index.vue`
- `src/components/data/RoomDeatilsDrawer/index.vue`
- `src/views/common/user_deatils.vue`
- `src/components/SysOriginIcon/index.vue`
- 状态:领取时进行中;本轮随后已完成,见上方完成记录
- 线程三已完成:主要路由页面 / 运营管理 / 用户银行 / 用户银行流水
- 路由别名:`UserBankRunningWater`
- 路径:`user/bank-balance/running-water/index`
- 已完成文件:
- `src/views/user/bank-balance/running-water/index.vue`
- 页面私有组件状态:无同目录私有组件
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 模块复核结果:
- 已完成筛选区、日期范围、搜索按钮、金额汇总提示、表格加载文案、表格列头、加载更多、全部加载完成、收款人/付款人标识国际化
- 收入/支出与 `userBankWaterEvent` 仅在页面展示层做本地翻译映射,接口参数、查询字段、分页字段、实际常量值与接口返回流水数据保持原样
- 语言文件新增 `pages.userBankRunningWater`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程三已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 用户工资钻石
- 路由别名:`UserSalaryDiamondBalance`
- 路径:`user/salary-diamond-balance/table/index`
- 已完成文件:
- `src/views/user/salary-diamond-balance/running-water/index.vue`
- `src/views/user/salary-diamond-balance/table/index.vue`
- `src/views/user/salary-diamond-balance/table/form-edit.vue`
- `src/views/user/salary-diamond-balance/table/running-water.vue`
- 页面私有组件状态:
- `table/form-edit.vue``table/running-water.vue` 已随入口页同步完成
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 模块复核结果:
- 已完成筛选区、表格列头、弹窗标题、表单标签、placeholder、按钮与校验提示国际化
- 收入/支出、事件名称与转账标签仅在页面展示层做本地翻译映射,未修改常量值、查询字段、提交值或接口返回动态数据
- 递归中文扫描后仅剩注释,不属于可见展示文案
- 已补充 `pages.userSalaryDiamond`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 道具管理 / 道具商店
- 路由别名:`props:store`
- 路径:`props/props-store/index`
- 已完成文件:
- `src/views/props/props-store/index.vue`
- `src/views/props/props-store/form-edit.vue`
- 同步复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- 模块复核结果:
- 已完成筛选区、展开详情、表格列头、上下架展示、道具类型/付费类型展示映射、按钮、弹窗标题、表单标签、placeholder、校验提示、贵族能力字段与资源更换按钮国际化
- 道具类型、付费类型、有效天数、上下架、贵族类型等实际 `value` 均保持不变,仅做展示层映射
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、资源 ID、接口返回资源名称、资源图片、SVGA 地址或提交值
- 页面私有组件状态:`src/views/props/props-store/form-edit.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 验证结果:`src/views/props/props-store/*.vue` 中文残留扫描通过;`src` 中无 `$te(` 命中;语言文件语法检查通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 线程二已完成:主要路由页面 / 主播中心 / BD工作统计
- 路由别名:`WorkStatistics`
- 路径:`team/work-statistics/index`
- 已完成文件:
- `src/views/team/work-statistics/index.vue`
- 页面私有组件状态:无同目录私有组件
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SelectSystemRegion/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 模块复核结果:
- 筛选区、日期范围、筛选时间汇总、表格加载文案与统计表头已国际化
- 新增 `pages.workStatistics`
- `src/views/team/work-statistics/index.vue` 中文残留仅剩注释,不属于可见展示文本
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、排序值、分页字段、用户 ID / 短账号查询值、区域值、系统值与接口返回统计数据保持原样
- 验证结果:语言文件语法校验通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程二已切回待分配
- 线程二已完成:主要路由页面 / 道具管理 / 道具赠送
- 路由别名:`PropsSendTool`
- 路径:`props/props-send-tool/index`
- 已完成文件:
- `src/views/props/props-send-tool/index.vue`
- `src/views/props/props-send-tool/send-props.vue`
- `src/views/props/props-send-tool/send-badge.vue`
- `src/views/props/props-send-tool/send-ticket.vue`
- 模块复核结果:
- 赠送道具、赠送徽章、赠送道具券三块表单的标题、表单标签、placeholder、按钮、校验提示、贵族来源展示与无效短账号提示已国际化
- 道具类型、道具券类型、徽章类型仅在页面展示层按 value 做本地翻译映射,未修改 `propsTypes``propsTicket``badgeTypes` 常量值
- 接口参数、路由路径、权限码、表单提交字段、道具/徽章/道具券实际类型值、贵族来源实际值、资源 ID、接收人提交内容、接口返回资源名称与接口错误内容保持原样
- `src/views/props/props-send-tool/**/*.vue` 中文残留仅剩注释,不属于可见展示文本
- 页面私有组件状态:
- `send-props.vue``send-badge.vue``send-ticket.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/data/PropsSourceSelectPopover/index.vue`:历史已完成,本轮复核中文扫描无命中
- 验证结果:
- 语言文件语法校验通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程二已切回待分配
- 线程三已完成:主要路由页面 / 运营管理 / 活动配置 / 活动规则配置
- 路由别名:`Props:Activity:Rule:Config`
- 路径:`props/props-activity-rule-config/index`
- 已完成文件:
- `src/views/props/props-activity-rule-config/index.vue`
- `src/views/props/props-activity-rule-config/edit-rule-drawer.vue`
- `src/views/props/props-activity-rule-config/components/crystal.vue`
- `src/views/props/props-activity-rule-config/components/first-charge-reward.vue`
- `src/views/props/props-activity-rule-config/components/game-fruit.vue`
- `src/views/props/props-activity-rule-config/components/game-weekly-tasks.vue`
- `src/views/props/props-activity-rule-config/components/input-quantity-mark.vue`
- `src/views/props/props-activity-rule-config/components/input-quantity.vue`
- `src/views/props/props-activity-rule-config/components/lucky-box.vue`
- 模块复核结果:
- 已完成页面筛选区、卡片操作、规则信息、资源信息、删除确认、编辑抽屉、子规则表单、上传提示、placeholder、按钮与校验提示国际化
- 活动类型与上下架采用本地展示映射,活动类型 `value`、布尔值、表单提交字段、资源组/规则接口返回动态数据保持原样
- `src/views/props/props-activity-rule-config/**/*.vue` 中文残留仅剩注释,不属于可见展示文本
- 页面私有组件状态:`edit-rule-drawer.vue``components/*.vue` 已随页面同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/data/AssociatedResources/index.vue`:历史已完成,本轮复核通过
- `src/components/data/PropsRow/index.vue`:历史已完成,本轮复核通过,中文命中仅剩注释
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 验证结果:语言文件语法随构建校验通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程三已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 内购配置 / Google/Apple-V2
- 路由别名:`google:apple:product:config`
- 路径:`cnf/product-v2/index`
- 已完成文件:
- `src/views/cnf/product-v2/index.vue`
- 同步复核:
- `src/components/SysOriginIcon/index.vue`
- 模块复核结果:
- 已完成筛选区、搜索/添加按钮、表格加载文案、表格列头、状态展示、弹窗标题、表单标签、placeholder、按钮与校验提示国际化
- 上下架采用本地展示映射,`true/false` 实际值保持不变
- 平台 `AppStore``Google``Huawei` 等实际值保持不变,仅保留展示原文
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、平台实际值、上下架实际值、区域/系统接口返回动态数据或提交值
- 页面私有组件状态:`src/views/cnf/product-v2` 目录当前仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 验证结果:`src/views/cnf/product-v2/index.vue` 中文残留扫描通过;`src` 中无 `$te(` 命中;语言文件语法检查通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 内购配置 / 应用管理
- 路由别名:`pay:application`
- 路径:`cnf/pay/application/index`
- 已完成文件:
- `src/views/cnf/pay/application/index.vue`
- `src/views/cnf/pay/application/app-navigation.vue`
- `src/views/cnf/pay/application/app-manager/index.vue`
- `src/views/cnf/pay/application/app-manager/edit-form.vue`
- `src/views/cnf/pay/application/commodity/index.vue`
- `src/views/cnf/pay/application/commodity/edit-form.vue`
- `src/views/cnf/pay/application/commodity-v2/index.vue`
- `src/views/cnf/pay/application/commodity-v2/edit-form.vue`
- `src/views/cnf/pay/application/order-manager/index.vue`
- 同步复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- 模块复核结果:
- 已完成应用卡片操作下拉、支付链接、编辑、创建应用、创建时间、返回按钮、商品管理 tab、筛选区、表格列头、商品编辑弹窗、按钮、placeholder 与校验提示国际化
- 商品类型与上下架采用本地展示映射,`GOLD``FREIGHT_GOLD``FREIGHT_GOLD_SUPER``true/false` 实际值保持不变
- `order-manager` 当前在 tab 配置中被注释,本轮仅处理其可见开发中提示与未使用 prompt 文案;注释掉的历史表格按规则保留
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、商品类型/上下架实际值、应用/国家/区域/渠道接口返回动态数据或提交值
- 页面私有组件状态:目录内入口导航、应用卡片、应用编辑、商品管理、商品编辑、商品管理 V2、商品编辑 V2 与订单管理文件已随页面同步完成或复核
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 验证结果:中文残留仅剩注释、注释掉的历史表格与注释掉的历史表单块;`src` 中无 `$te(` 命中;语言文件语法检查通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 内购配置 / 开通支付国家
- 路由别名:`open:pay:country`
- 路径:`cnf/pay/country/index`
- 已完成文件:
- `src/views/cnf/pay/country/index.vue`
- `src/views/cnf/pay/country/associated-channels.vue`
- `src/views/cnf/pay/country/country-select.vue`
- 同步复核:
- `src/views/cnf/pay/comp/transfer-channel.vue`
- `src/components/Pagination/index.vue`
- 模块复核结果:
- 已完成筛选区、添加/刷新/关联渠道按钮、表格加载文案、表格列头、行内可点击提示、prompt 标题/按钮/校验提示、关联渠道弹窗、国家选择弹窗、Transfer 标题/按钮国际化
- `shelfStatus` 采用本地展示映射,`true/false` 实际值保持不变
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、国家/渠道实际值、开通/删除提交值或接口返回动态数据
- 页面私有组件状态:`associated-channels.vue``country-select.vue` 已随页面同步完成;`comp/transfer-channel.vue` 历史已完成,本轮复核通过
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:扫描无中文命中
- 验证结果:中文残留仅剩注释与注释掉的历史按钮;`src` 中无 `$te(` 命中;语言文件语法检查通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
- 线程一已记录兼容问题:
- 本项目自定义 i18n 插件不支持 `$te`
- 渠道管理 / 厂商管理相关渠道类型展示已改为用 `$t(key)` 返回值是否等于原 key 做兜底判断
- 涉及文件:
- `src/views/cnf/pay/channel/index.vue`
- `src/views/cnf/pay/channel/edit-form.vue`
- `src/views/cnf/pay/factory/associated-channel.vue`
- 说明:避免页面运行时报 `this.$te is not a function` 导致空白页
- 线程一已完成:主要路由页面 / 运营管理 / 内购配置 / 区域关联支付国家
- 路由别名:`region:pay:country`
- 路径:`cnf/pay/region-relation/index`
- 已完成文件:
- `src/views/cnf/pay/region-relation/index.vue`
- 模块复核结果:
- 已完成筛选区、搜索/添加/编辑按钮、表格加载文案、表格列头、状态展示、弹窗标题、表单标签、placeholder、校验提示与弹窗按钮国际化
- 状态下拉与状态列采用本地展示映射,`productConfigShowcase` 原常量值、接口参数和提交值保持不变
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、布尔提交值或接口返回动态数据
- 页面私有组件状态:无页面私有组件
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:扫描无中文命中
- `src/components/SysOriginIcon/index.vue`:扫描无中文命中
- 验证结果:中文残留扫描通过;`src` 中无 `$te(` 命中;语言文件语法检查通过;`npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程一已切回待分配
## 2026-05-06 最新同步
@ -938,6 +1397,12 @@
- `src/views/tools/other/user-swap-user.vue`
- 当前保留注释掉的“用户id不可相同”原样
- 原因:该内容仅存在于注释中,不属于可见展示文案
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- 当前保留复制银行卡信息时的中文标签原样
- 原因:该内容只用于复制到剪贴板的文本结构,不属于页面可见展示文案;本轮按“不改复制内容结构”保留
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 当前保留复制银行卡信息时的中文标签原样
- 原因:该内容只用于复制到剪贴板的文本结构,不属于页面可见展示文案;本轮按“不改复制内容结构”保留
## 需持续关注

View File

@ -3,7 +3,8 @@
## 文档定位
- 本文件只负责记录全局进展、阶段成果、构建验证结果与下一步目标
- 主要路由的完整父子级结构、路由别名、路径、入口文件与主路由优先级,以 `docs/i18n/主要路由.md` 为准
- 主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态、已完成主要路由摘要与主路由优先级,以 `docs/i18n/主要路由.md` 为准
- `docs/i18n/翻译清单.md` 不再重复维护已完成主要路由索引,只维护文件级清单与任务状态
- 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准
- 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖
- 文件级待办、进行中、已完成与认领状态,以 `docs/i18n/翻译清单.md` 为准
@ -19,9 +20,689 @@
## 当前认领线程
- 线程一:待分配,上一轮已完成 `src/views/cnf/pay/factory/**``src/views/cnf/pay/comp/transfer-channel.vue` 厂商管理页面国际化、直接公共组件复核、语言文件校验与构建验证
- 线程二:待分配,上一轮已完成 `src/views/log/login-logger/index.vue` 登录日志页面国际化、直接公共组件复核、语言文件校验与构建验证
- 线程三:待分配,上一轮已完成 `src/views/log/invite-user-log/index.vue` 邀请用户页面国际化、直接公共组件复核、语言文件校验与构建验证
- 线程一:待分配,上一轮已完成 `src/views/user/bank-balance/withdraw-diamond-apply/**` 钻石提现申请页面入口、同目录私有抽屉、直接公共组件复核、语言文件校验与构建验证
- 线程二:待分配,上一轮已完成 `src/views/team/team-member/**` 主播成员页面入口、同目录私有组件、直接引用的团队详情抽屉与直接公共组件复核、语言文件校验与构建验证
- 线程三:待分配,上一轮已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面入口、同目录私有组件、直接公共组件复核、语言文件校验与构建验证
## 2026-05-07 最新同步
- 线程二已完成:
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 主播成员 / Broadcaster Members
- 已完成模块级复核:
- 筛选区系统、角色、代理 ID、成员 ID、未活跃天数、日期范围、搜索/新增/删除按钮已国际化
- 表格加载文案、代理/成员/备注/创建人/时间/操作列头、创建/活跃前缀、加载更多与已加载全部文案已国际化
- 添加成员、变更团队、编辑备注、目标重置等同目录 4 个私有弹窗/抽屉的标题、表单标签、placeholder、按钮、校验、确认框和提示文案已国际化
- 新增 `pages.teamMember`
- 页面私有组件状态:
- 同目录 4 个私有弹窗/抽屉已随入口页同步完成
- `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核中文扫描无命中
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/Avatar/index.vue`:本轮复核中文扫描无命中
- 已完成验证:
- `src/views/team/team-member/*.vue` 中文残留仅剩注释或注释掉的历史代码块,不属于可见展示文本
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、团队/成员/代理 ID、成员角色实际值、批量删除提交值、目标重置提交值或接口返回动态数据
- 线程二当前状态:待分配
- 线程一已完成:
- `src/views/user/bank-balance/withdraw-diamond-apply/index.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/details-drawer.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户工资钻石 / User Salary Diamonds
- 钻石提现申请 / Diamond Withdrawal Applications
- 已完成模块级复核:
- 筛选区系统、卡片类型、提交用户、类型、状态、日期范围、搜索/导出按钮已国际化
- 表格列头、金额类型展示、接收方式展示、审核状态展示、加载更多与已加载全部文案已国际化
- 导出抽屉、审核抽屉、详情抽屉的标题、标签、按钮、提示文案已国际化
- 新增 `pages.userBankWithdrawDiamondApply`
- 页面私有组件状态:
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/upload-image/index.vue`:本轮复核中文扫描无命中
- 已完成验证:
- `src/views/user/bank-balance/withdraw-diamond-apply/*.vue` 中文残留仅剩银行卡复制文本,不属于可见展示文本
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮源码未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构、导出参数或接口返回动态数据
- 线程一当前状态:待分配
- 线程二已新认领:
- `src/views/team/team-member/index.vue`
- `src/views/team/team-member/team-member-add.vue`
- `src/views/team/team-member/team-member-change.vue`
- `src/views/team/team-member/team-member-remark.vue`
- `src/views/team/team-member/team-member-target-reset.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 主播成员 / Broadcaster Members
- 认领前已复查:
- 当前没有其他线程认领 `src/views/team/team-member/**`
- `src/views/team/team-member` 目录包含入口页与 4 个同目录私有组件,均由入口页直接渲染
- `src/views/team/components/TeamDetailsDrawer/index.vue` 为入口页直接渲染的团队详情抽屉,历史已完成,本轮复核
- 直接公共组件 `SysOriginIcon``AccountInput``UserTableExhibit``src/components/data/Avatar/index.vue` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、团队/成员/代理 ID、成员角色实际值、批量删除提交值、目标重置提交值或接口返回动态数据
- 领取时线程二状态:进行中;本轮随后已完成,见上方完成记录
- 线程一已完成:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户工资钻石 / User Salary Diamonds
- 钻石兑换金币记录 / Diamond-to-Gold Exchange Records
- 已完成模块级复核:
- 筛选区系统、提交用户 ID、接收用户 ID、接收方式、日期范围、搜索按钮已国际化
- 表格列头、创建日期前缀、加载更多与已加载全部文案已国际化
- `GOLD``FREIGHT` 仅在页面展示层做本地映射,未修改查询值、接口参数、`amountType` 实际值或接口返回动态数据
- 页面私有组件状态:
- 当前目录仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userBankDiamondWithdrawGoldApply`
- 已完成验证:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue` 中文残留扫描通过
- 直接公共组件中文扫描无命中
- 语言文件语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、`amountType` 实际值、`acceptAccount` 实际值、`lastId` 分页逻辑或接口返回动态数据
- 线程一当前状态:待分配
- 线程一已新认领:
- `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户工资钻石 / User Salary Diamonds
- 钻石兑换金币记录 / Diamond-to-Gold Exchange Records
- 认领前已复查:
- 当前没有其他线程认领 `src/views/user/bank-balance/diamond-withdraw-gold-apply/index.vue`
- `src/views/user/bank-balance/diamond-withdraw-gold-apply` 目录当前仅包含入口页,无同目录私有组件
- 直接公共组件 `SysOriginIcon``AccountInput``UserTableExhibit` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、`amountType` 实际值、`acceptAccount` 实际值、`lastId` 分页逻辑或接口返回动态数据
- 线程一当前状态:进行中
- 线程一已完成:
- `src/views/user/bank-balance/auto-salary-pay-record/index.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/policy-details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/remark-details-drawer.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 自动支付工资凭据 / Automatic Salary Payment Vouchers
- 已完成模块级复核:
- 筛选区系统、用户 ID、月份选择、搜索按钮、表格列头、查看明细/查看备注操作已国际化
- 自动发送工资详情抽屉、政策详情抽屉、内部备注抽屉的标题、分组标题、字段标签与展示状态已国际化
- 团长/成员/代收/已收回/账户类型仅在页面展示层做本地映射,未修改布尔值、政策值或接口返回动态数据
- 页面私有组件状态:
- `details-drawer.vue``policy-details-drawer.vue``remark-details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/PropsRow/index.vue`:历史已完成,本轮复核中文命中仅为注释
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.automaticSalaryPaymentRecord`
- 已完成验证:
- `src/views/user/bank-balance/auto-salary-pay-record/*.vue` 中文残留扫描通过
- 直接公共组件中文扫描仅命中 `PropsRow` 注释,不属于可见展示文案
- 语言文件语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、`dateNumber` 值、政策等级值、工资数值、是否代收/是否回收布尔值、时间格式值或接口返回动态数据
- 线程一当前状态:待分配
- 线程一已新认领:
- `src/views/user/bank-balance/auto-salary-pay-record/index.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/policy-details-drawer.vue`
- `src/views/user/bank-balance/auto-salary-pay-record/remark-details-drawer.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 自动支付工资凭据 / Automatic Salary Payment Vouchers
- 认领前已复查:
- 当前没有其他线程认领 `src/views/user/bank-balance/auto-salary-pay-record/**`
- `src/views/user/bank-balance/auto-salary-pay-record` 目录包含入口页、`details-drawer.vue``policy-details-drawer.vue``remark-details-drawer.vue`
- 直接公共组件 `Pagination``SysOriginIcon``AccountInput``UserTableExhibit``PropsRow` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、`dateNumber` 值、政策等级值、工资数值、是否代收/是否回收布尔值、时间格式值或接口返回动态数据
- 线程一当前状态:进行中
- 线程一已完成:
- `src/views/user/bank-balance/withdraw-gold-apply/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 美金兑换金币记录 / USD-to-Gold Exchange Records
- 已完成模块级复核:
- 筛选区、日期范围、表格列头、创建日期文案、加载更多与已加载全部文案已国际化
- `GOLD``FREIGHT` 仅在页面展示层做本地映射,未修改查询值、接口参数与接口返回动态数据
- 页面私有组件状态:
- 当前目录仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userBankWithdrawGoldApply`
- 已完成验证:
- `src/views/user/bank-balance/withdraw-gold-apply/index.vue` 中文残留扫描通过
- 直接公共组件中文扫描无命中
- 本轮改动未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程一当前状态:待分配
- 线程一已新认领:
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 现金提现申请 / Cash Withdrawal Applications
- 认领前已复查:
- 当前没有其他线程认领 `src/views/user/bank-balance/withdraw-money-apply/**`
- `src/views/user/bank-balance/withdraw-money-apply` 目录包含入口页、`approval-drawer.vue``details-drawer.vue`
- 直接公共组件 `SysOriginIcon``AccountInput``UserTableExhibit``UploadImage` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、提现状态实际值、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构、导出参数或接口返回动态数据
- 线程一当前状态:进行中
- 线程一已完成:
- `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 现金提现申请 / Cash Withdrawal Applications
- 已完成模块级复核:
- 筛选区、表格列头、导出条件抽屉、详情抽屉、审核抽屉、按钮、placeholder、tooltip 与审核记录展示已国际化
- 审核状态、接收方式、金额类型仅在页面展示层做本地映射,未修改实际值、查询字段、导出参数或接口返回动态数据
- 页面私有组件状态:
- `approval-drawer.vue``details-drawer.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/upload-image/index.vue`:本轮复核仅剩注释中文
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userBankWithdrawMoneyApply`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/user/bank-balance/withdraw-money-apply/*.vue` 中文残留仅剩复制银行卡信息的剪贴板文本,不属于页面可见展示文案
- `src/components/upload-image/index.vue` 中文残留仅为文件注释,不属于可见展示文案
- 本轮改动未使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、提现状态实际值、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构、导出参数或接口返回动态数据
- 线程一当前状态:待分配
- 线程二已完成:
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 主播工作 / Broadcaster Work
- 已完成模块级复核:
- 筛选区系统、账单 ID、代理 ID、成员 ID、搜索/删除按钮已国际化
- 表格加载文案、表头、工资/钻石/礼物/时长/时间字段、详情入口、加载更多与已加载全部文案已国际化
- 工作详情抽屉、礼物流水弹窗、房间流水弹窗与团队详情抽屉的标题、分组、字段标签、状态展示和操作按钮已国际化
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、礼物流水类型实际值、团队/成员/代理 ID、系统来源、工资结算模式实际值、账单状态实际值与接口返回动态数据保持原样
- 页面私有组件状态:
- `details-drawer.vue``gift-running-water-dialog.vue``room-gift-dialog.vue``TeamDetailsDrawer/index.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/GiftHistoryDetailsDrawer/index.vue`:历史已完成,本轮复核仅剩注释中文
- `src/components/data/PropsRow/index.vue`:历史已完成,本轮复核仅剩注释中文
- `src/components/data/RoomDeatilsDrawer/index.vue`:历史已完成,本轮复核无新增可见中文
- `src/views/common/user_deatils.vue`:历史已完成,本轮复核仅剩注释块中文
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.teamMemberWork``pages.teamDetailsDrawer`
- 已完成验证:
- 语言文件语法校验通过
- 本轮源码中文残留仅剩注释,不属于可见展示文本
- 未发现本轮改动使用 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程二当前状态:待分配
- 线程三已新认领:
- `src/views/user/bank-balance/table/index.vue`
- `src/views/user/bank-balance/table/form-edit.vue`
- `src/views/user/bank-balance/table/running-water.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 用户银行账户 / User Bank Accounts
- 认领前已复查:
- 线程一当前进行中范围为 `src/views/user/salary-diamond-balance/**`,线程三主动避让
- 线程二当前进行中范围为 `src/views/team/team-member-work/**`,线程三主动避让
- 当前无其他线程认领 `src/views/user/bank-balance/table/**`
- `src/views/user/bank-balance/table` 目录包含入口页、`form-edit.vue``running-water.vue`
- 直接公共组件 `SysOriginIcon``AccountInput``UserTableExhibit` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、银行账户金额实际值、发送/扣除/转账实际提交值、用户 ID、系统来源、导入文件内容或接口返回账户/流水数据
- 线程三已完成:
- `src/views/user/bank-balance/table/index.vue`
- `src/views/user/bank-balance/table/form-edit.vue`
- `src/views/user/bank-balance/table/running-water.vue`
- 已完成模块级复核:
- 账户列表筛选区、操作按钮、表格加载文案、表格列头、操作下拉、加载更多/全部加载完成已国际化
- 发送/扣除弹窗、转账弹窗、创建账户弹窗、导入弹窗、上传提示、校验提示、导入/下载反馈已国际化
- 账户流水弹窗复用 `pages.userBankRunningWater` 事件名、收入/支出与转账收付款人展示映射,未修改事件常量值或接口返回数据
- 页面私有组件状态:
- `form-edit.vue``running-water.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userBankAccounts`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/user/bank-balance/table/*.vue` 中文残留仅剩注释,不属于可见展示文本
- 直接公共组件中文扫描无命中
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程三当前状态:待分配
- 线程二已新认领:
- `src/views/team/team-member-work/index.vue`
- `src/views/team/team-member-work/details-drawer.vue`
- `src/views/team/team-member-work/gift-running-water-dialog.vue`
- `src/views/team/team-member-work/room-gift-dialog.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 主播工作 / Broadcaster Work
- 认领前已复查:
- 线程一当前进行中范围为 `src/views/user/salary-diamond-balance/**`,线程二主动避让
- 当前没有其他线程认领 `src/views/team/team-member-work/**`
- 已核对入口页直接渲染 `details-drawer.vue``gift-running-water-dialog.vue``room-gift-dialog.vue``src/views/team/components/TeamDetailsDrawer/index.vue`
- 直接公共组件 `AccountInput``UserTableExhibit``GiftHistoryDetailsDrawer``PropsRow``RoomDeatilsDrawer``user_deatils.vue``SysOriginIcon` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、分页字段、礼物流水类型实际值、团队/成员/代理 ID、系统来源、工资结算模式实际值、账单状态实际值或接口返回动态数据
- 领取时线程二状态:进行中;本轮随后已完成,见上方完成记录
- 线程三已完成:
- `src/views/user/bank-balance/running-water/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户银行 / User Bank
- 用户银行流水 / User Bank Transactions
- 已完成模块级复核:
- 筛选区系统、用户 ID、类型、事件、日期范围 placeholder 与搜索按钮已国际化
- 金额汇总提示、表格加载文案、表格列头、加载更多、全部加载完成、收款人/付款人标识已国际化
- 收入/支出与 `userBankWaterEvent` 仅在页面展示层做本地翻译映射,未修改 `0/1`、事件常量值、查询字段、分页字段或接口返回流水数据
- 页面私有组件状态:
- `src/views/user/bank-balance/running-water` 目录当前仅包含入口页,无同目录私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userBankRunningWater`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/user/bank-balance/running-water/index.vue` 中文残留仅剩注释,不属于可见展示文本
- 直接公共组件中文扫描无命中
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程三当前状态:待分配
- 线程二已完成:
- `src/views/team/work-statistics/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- BD工作统计 / BD Work Statistics
- 已完成模块级复核:
- 筛选区系统、长 UID、短账号、区域、日期范围 tooltip、日期选择器 placeholder 与搜索按钮已国际化
- 筛选时间汇总、表格加载文案、BD、邀请人数、充值、客单价、有效人数、区域与区域排名表头已国际化
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、排序值、分页字段、用户 ID / 短账号查询值、区域值、系统值与接口返回统计数据保持原样
- 页面私有组件状态:
- `src/views/team/work-statistics` 目录当前仅包含入口页,无同目录私有组件
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SelectSystemRegion/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.workStatistics`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/team/work-statistics/index.vue` 中文残留仅剩注释,不属于可见展示文本
- 直接公共组件中文扫描无命中
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程二当前状态:待分配
- 线程一已完成:
- `src/views/user/salary-diamond-balance/running-water/index.vue`
- `src/views/user/salary-diamond-balance/table/index.vue`
- `src/views/user/salary-diamond-balance/table/form-edit.vue`
- `src/views/user/salary-diamond-balance/table/running-water.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 用户工资钻石 / User Salary Diamonds
- 已完成模块级复核:
- 筛选区系统、用户 ID、类型、事件、日期范围 placeholder 与搜索按钮已国际化
- 账户列表与流水列表的表格列头、转账附属标签、弹窗标题、表单标签、placeholder、按钮与校验提示已国际化
- 收入/支出、事件名称与转账标签仅在页面展示层做本地翻译映射,未修改事件常量值、查询字段、提交值或接口返回动态数据
- 页面私有组件状态:
- `table/form-edit.vue``table/running-water.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.userSalaryDiamond`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/user/salary-diamond-balance/**` 中文残留仅剩注释,不属于可见展示文本
- 直接公共组件中文扫描无命中
- 项目中未发现 `$te`
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、收支类型实际值、事件实际值、用户账号查询值、金额提交值、备注提交值或接口返回动态数据
- 线程一当前状态:待分配
- 线程二已新认领:
- `src/views/team/work-statistics/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- BD工作统计 / BD Work Statistics
- 认领前已复查:
- 线程一当前进行中范围为 `src/views/props/props-store/**`,线程二主动避让
- 线程三当前待分配,当前没有其他线程认领 `src/views/team/work-statistics/index.vue`
- `src/views/team/work-statistics` 目录当前仅包含入口页,无同目录私有组件
- 直接公共组件 `Pagination``SysOriginIcon``SelectSystemRegion``UserTableExhibit` 纳入本轮复核
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、排序值、分页字段、用户 ID / 短账号查询值、区域值、系统值或接口返回统计数据
- 线程二当前状态:进行中
- 线程二已完成:
- `src/views/props/props-send-tool/index.vue`
- `src/views/props/props-send-tool/send-props.vue`
- `src/views/props/props-send-tool/send-badge.vue`
- `src/views/props/props-send-tool/send-ticket.vue`
- 对应主要路由:
- 道具管理 / Prop Management
- 道具赠送 / Prop Gift
- 已完成模块级复核:
- 赠送道具、赠送徽章、赠送道具券三块表单的标题、表单标签、placeholder、按钮、校验提示、贵族来源展示与无效短账号提示已国际化
- 道具类型、道具券类型、徽章类型仅在页面展示层按 value 做本地翻译映射,未修改 `propsTypes``propsTicket``badgeTypes` 常量值
- 接口参数、路由路径、权限码、表单提交字段、道具/徽章/道具券实际类型值、贵族来源实际值、资源 ID、接收人提交内容、接口返回资源名称与接口错误内容保持原样
- 页面私有组件状态:
- `send-props.vue``send-badge.vue``send-ticket.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/data/PropsSourceSelectPopover/index.vue`:历史已完成,本轮复核中文扫描无命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.propsSendTool`
- 已完成验证:
- 语言文件语法校验通过
- `src/views/props/props-send-tool/**/*.vue` 中文残留仅剩注释,不属于可见展示文本
- `src/components/data/PropsSourceSelectPopover/index.vue` 中文扫描无命中
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 线程二当前状态:待分配
- 线程三已完成:
- `src/views/props/props-activity-rule-config/index.vue`
- `src/views/props/props-activity-rule-config/edit-rule-drawer.vue`
- `src/views/props/props-activity-rule-config/components/crystal.vue`
- `src/views/props/props-activity-rule-config/components/first-charge-reward.vue`
- `src/views/props/props-activity-rule-config/components/game-fruit.vue`
- `src/views/props/props-activity-rule-config/components/game-weekly-tasks.vue`
- `src/views/props/props-activity-rule-config/components/input-quantity-mark.vue`
- `src/views/props/props-activity-rule-config/components/input-quantity.vue`
- `src/views/props/props-activity-rule-config/components/lucky-box.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 活动配置 / Activity Configuration
- 活动规则配置 / Activity Rule Configuration
- 已完成模块级复核:
- 页面筛选区、卡片操作、规则信息、资源信息、删除确认、保存/删除提示已国际化
- 编辑抽屉与全部同目录规则子组件静态展示文本、placeholder、按钮、上传提示与校验提示已国际化
- 活动类型与上下架仅翻译展示文案,实际提交值、布尔值、接口参数、路由路径、权限码与接口返回动态数据保持原样
- 直接公共组件 `Pagination``AssociatedResources``PropsRow``SysOriginIcon` 已复核,当前中文命中仅剩注释
- 页面私有组件状态:
- `edit-rule-drawer.vue``components/*.vue` 已随页面同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/data/AssociatedResources/index.vue`:历史已完成,本轮复核通过
- `src/components/data/PropsRow/index.vue`:历史已完成,本轮复核通过,中文命中仅剩注释
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.propsActivityRuleConfig`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 线程三当前状态:待分配
- 线程一已完成:
- `src/views/props/props-store/index.vue`
- `src/views/props/props-store/form-edit.vue`
- 对应主要路由:
- 道具管理 / Prop Management
- 道具商店 / Prop Store
- 认领前已复查:
- `src/views/props/props-send-tool/**` 当前由线程二进行中,线程一避让
- `src/views/props/props-activity-rule-config/**` 当前由线程三进行中,线程一避让
- `src/views/props/props-store` 目录仅包含入口页和同目录私有表单组件
- 直接公共组件 `Pagination``SysOriginIcon` 纳入本轮复核
- 已完成模块级复核:
- 筛选区、展开详情、表格列头、上下架展示、道具类型/付费类型展示映射、按钮已国际化
- 弹窗标题、表单标签、placeholder、按钮、校验提示、贵族能力字段与资源更换按钮已国际化
- 道具类型、付费类型、有效天数、上下架、贵族类型等实际 `value` 均保持不变,仅做展示层映射
- 接口返回资源名称、资源图片、SVGA 地址、资源 ID 与提交值保持原样
- `src/views/props/props-store/*.vue` 中文残留扫描通过
- 页面私有组件状态:
- `src/views/props/props-store/form-edit.vue` 已随入口页同步完成
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.propsStore`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、表格 `prop`、道具类型实际值、付费类型实际值、有效天数实际值、上下架实际值、资源 ID、接口返回资源名称或提交值
- 线程一当前状态:待分配
- 线程一已完成:
- `src/views/cnf/product-v2/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 内购配置 / In-App Purchase Configuration
- Google/Apple-V2 / Google/Apple V2
- 已完成模块级复核:
- 筛选区、搜索/添加按钮、表格加载文案、表格列头、状态展示、弹窗标题、表单标签、placeholder、按钮与校验提示已国际化
- 上下架采用本地展示映射,`true/false` 实际值保持不变
- 平台 `AppStore``Google``Huawei` 等实际值保持不变,仅保留展示原文
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、平台实际值、上下架实际值、区域/系统接口返回动态数据或提交值
- `src/views/cnf/product-v2/index.vue` 中文残留扫描通过
- 页面私有组件状态:
- `src/views/cnf/product-v2` 目录当前仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.productV2`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 线程一当前状态:待分配
- 线程二已新认领:
- `src/views/props/props-send-tool/index.vue`
- `src/views/props/props-send-tool/send-props.vue`
- `src/views/props/props-send-tool/send-badge.vue`
- `src/views/props/props-send-tool/send-ticket.vue`
- 对应主要路由:
- 道具管理 / Prop Management
- 道具赠送 / Prop Gift
- 认领前已复查:
- `src/views/cnf/product-v2/index.vue` 当前由线程一进行中,线程二避让
- `src/views/props/props-activity-rule-config/**` 当前由线程三进行中,线程二避让
- `src/components/data/PropsSourceSelectPopover/index.vue` 当前中文扫描无命中,作为直接公共组件复核纳入记录
- 本轮不修改:
- 接口参数、路由路径、权限码、表单提交字段、道具/徽章/道具券实际类型值、贵族来源实际值、资源 ID、接收人提交内容、接口返回资源名称或接口错误内容
- 线程二当前状态:进行中
- 线程一已完成:
- `src/views/cnf/pay/application/index.vue`
- `src/views/cnf/pay/application/app-navigation.vue`
- `src/views/cnf/pay/application/app-manager/index.vue`
- `src/views/cnf/pay/application/app-manager/edit-form.vue`
- `src/views/cnf/pay/application/commodity/index.vue`
- `src/views/cnf/pay/application/commodity/edit-form.vue`
- `src/views/cnf/pay/application/commodity-v2/index.vue`
- `src/views/cnf/pay/application/commodity-v2/edit-form.vue`
- `src/views/cnf/pay/application/order-manager/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 内购配置 / In-App Purchase Configuration
- 应用管理 / Application Management
- 已完成模块级复核:
- 应用卡片操作下拉、支付链接、编辑、创建应用、创建时间、返回按钮、商品管理 tab 标题已国际化
- 应用编辑弹窗标题、类型/Android 链接/iOS 链接表单项、placeholder、按钮与必填校验已国际化
- 商品管理与商品管理 V2 的筛选区、商品类型展示映射、上下架展示映射、搜索/添加/编辑按钮、表格列头、商品编辑弹窗、价格/限额展示与校验提示已国际化
- `order-manager` 当前在 tab 配置中被注释,本轮仅处理其可见开发中提示与未使用 prompt 文案;注释掉的历史表格按规则保留
- 商品类型与上下架采用本地展示映射,`GOLD``FREIGHT_GOLD``FREIGHT_GOLD_SUPER``true/false` 实际值保持不变
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、商品类型/上下架实际值、应用/国家/区域/渠道接口返回动态数据或提交值
- `src/views/cnf/pay/application/**/*.vue` 中文残留仅剩注释、注释掉的历史表格与注释掉的历史表单块,不属于可见展示文本
- 页面私有组件状态:
- `app-navigation.vue``app-manager/index.vue``app-manager/edit-form.vue``commodity/index.vue``commodity/edit-form.vue``commodity-v2/index.vue``commodity-v2/edit-form.vue``order-manager/index.vue` 已随页面同步完成或复核
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:历史已完成,本轮复核通过
- `src/components/SysOriginIcon/index.vue`:历史已完成,本轮复核通过
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.payApplication`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 线程一当前状态:待分配
- 线程一已完成:
- `src/views/cnf/pay/country/index.vue`
- `src/views/cnf/pay/country/associated-channels.vue`
- `src/views/cnf/pay/country/country-select.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 内购配置 / In-App Purchase Configuration
- 开通支付国家 / Enabled Payment Countries
- 已完成模块级复核:
- 筛选区、添加/刷新/关联渠道按钮、表格加载文案、表格列头、行内可点击提示、prompt 标题/按钮/校验提示已国际化
- 关联渠道弹窗标题、国家货币/美元汇率标签、渠道额度表单标签、placeholder、开关文案与本地校验提示已国际化
- 国家选择弹窗标题、Transfer 标题与按钮已国际化
- `shelfStatus` 采用本地展示映射,`true/false` 实际值保持不变
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、国家/渠道实际值、开通/删除提交值或接口返回动态数据
- `src/views/cnf/pay/country/**/*.vue` 中文残留仅剩注释与注释掉的历史按钮,不属于可见展示文本
- 页面私有组件状态:
- `src/views/cnf/pay/country/associated-channels.vue` 已随页面同步完成
- `src/views/cnf/pay/country/country-select.vue` 已随页面同步完成
- `src/views/cnf/pay/comp/transfer-channel.vue` 历史已完成,本轮复核通过
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:扫描无中文命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.payOpenCountry`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 线程一当前状态:待分配
- 线程一已记录兼容问题:
- 本项目自定义 i18n 插件不支持 `$te`
- 渠道管理 / 厂商管理相关渠道类型展示已改为用 `$t(key)` 返回值是否等于原 key 做兜底判断
- 涉及文件:
- `src/views/cnf/pay/channel/index.vue`
- `src/views/cnf/pay/channel/edit-form.vue`
- `src/views/cnf/pay/factory/associated-channel.vue`
- 说明:该修复用于避免页面运行时报 `this.$te is not a function` 导致空白页
- 线程一已完成:
- `src/views/cnf/pay/region-relation/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 内购配置 / In-App Purchase Configuration
- 区域关联支付国家 / Region-Payment Country Relations
- 已完成模块级复核:
- 筛选区、按钮、表格列头、状态展示、弹窗标题、表单标签、placeholder、校验提示与弹窗按钮已国际化
- 状态下拉与状态列采用本地展示映射,`productConfigShowcase` 原常量值与接口提交值保持不变
- 未修改接口参数、查询字段、路由路径、权限码、表格 `prop`、布尔提交值或接口返回动态数据
- `src/views/cnf/pay/region-relation/index.vue` 中文残留扫描通过
- 页面私有组件状态:
- `src/views/cnf/pay/region-relation` 目录当前仅包含 `index.vue`,无页面私有组件
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:扫描无中文命中
- `src/components/SysOriginIcon/index.vue`:扫描无中文命中
- 已完成语言文件校验:
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 说明:新增 `pages.payRegionRelation`
- 已完成构建验证:
- `npm run build:prod`
- 构建通过,仍为项目既有 `17` 条 warning
- 线程一当前状态:待分配
## 2026-05-06 最新同步
@ -2049,9 +2730,9 @@
- `npm run build:prod`
- 说明:当前环境直接执行构建通过,仍保留项目既有 `17` 条 warning未新增阻塞错误
- 当前认领线程:
- 线程一:待分配,当前未认领新任务;已完成 `src/views/sys/emoji-config/**` 表情管理模块国际化、中文残留扫描、语言文件校验与构建验证
- 线程二:待分配,当前未认领新任务;已完成 `src/views/sys/invite-user-rule/**` 邀请用户配置模块国际化、语言文件校验与构建验证
- 线程三:待分配,当前未认领新任务;已完成 `src/views/room/theme/index.vue` 房间主题管理页面国际化、中文残留扫描、语言文件校验与构建验证
- 线程一:待分配,已完成 `src/views/user/bank-balance/withdraw-diamond-apply/**` 钻石提现申请页面与同目录私有抽屉
- 线程二:待分配,当前未认领新任务;已完成 `src/views/team/team-member/**` 主播成员页面国际化、直接组件复核、语言文件校验与构建验证
- 线程三:待分配,当前未认领新任务;已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面国际化、直接组件复核、语言文件校验与构建验证
## 扫描概况

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -16,12 +16,12 @@
v-loading="submitLoading"
style="width: 400px; margin-left:50px;"
:model="form"
:rules="rules"
:rules="localizedRules"
>
<el-form-item v-if="!isEdit" label="类型" prop="appCode">
<el-form-item v-if="!isEdit" :label="$t('pages.payApplication.form.type')" prop="appCode">
<el-select
v-model="form.appCode"
placeholder="系统"
:placeholder="$t('pages.payApplication.placeholder.system')"
style="width: 100%"
class="filter-item"
collapse-tags
@ -41,16 +41,16 @@
<!-- <el-form-item label="app名称" prop="appName">
<el-input v-model.trim="form.appName" type="primary" placeholder="请输入app名称" :disabled="true" />
</el-form-item> -->
<el-form-item label="Android链接" prop="androidLink">
<el-input v-model.trim="form.androidLink" type="primary" placeholder="请输入Android链接" />
<el-form-item :label="$t('pages.payApplication.form.androidLink')" prop="androidLink">
<el-input v-model.trim="form.androidLink" type="primary" :placeholder="$t('pages.payApplication.placeholder.androidLink')" />
</el-form-item>
<el-form-item label="iOS链接" prop="iosLink">
<el-input v-model.trim="form.iosLink" type="primary" placeholder="请输入iOS链接" />
<el-form-item :label="$t('pages.payApplication.form.iosLink')" prop="iosLink">
<el-input v-model.trim="form.iosLink" type="primary" :placeholder="$t('pages.payApplication.placeholder.iosLink')" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.payApplication.action.cancel') }}</el-button>
<el-button type="primary" @click="submitForm()">{{ $t('pages.payApplication.action.save') }}</el-button>
</div>
</el-dialog>
</div>
@ -71,7 +71,6 @@ export default {
}
},
data() {
var commonRequiredParams = [{ required: true, message: '必填参数不可为空', trigger: 'blur' }]
return {
payChannelGroups,
form: {
@ -81,12 +80,6 @@ export default {
androidLink: '',
iosLink: ''
},
rules: {
appName: commonRequiredParams,
appCode: commonRequiredParams,
androidLink: commonRequiredParams,
iosLink: commonRequiredParams
},
submitLoading: false,
iconUploadLoading: false,
iconFileList: []
@ -98,7 +91,16 @@ export default {
return !!(this.form && this.form.id)
},
title() {
return this.form && this.form.id ? '修改渠道' : '添加渠道'
return this.form && this.form.id ? this.$t('pages.payApplication.dialog.editApplication') : this.$t('pages.payApplication.dialog.addApplication')
},
localizedRules() {
const requiredRule = { required: true, message: this.$t('pages.payApplication.validation.requiredField'), trigger: 'blur' }
return {
appName: [requiredRule],
appCode: [requiredRule],
androidLink: [requiredRule],
iosLink: [requiredRule]
}
},
formChannelIconNotEmpty() {
return !!(this.form.channelIcon && this.form.channelIcon.length > 0)

View File

@ -12,11 +12,11 @@
<div class="text-center" @click.stop>
<el-dropdown>
<span class="el-dropdown-link">
操作<i class="el-icon-arrow-down el-icon--right" />
{{ $t('pages.payApplication.action.actions') }}<i class="el-icon-arrow-down el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="copyPayLink(item)"><i class="el-icon-document-copy">支付链接</i></el-dropdown-item>
<el-dropdown-item @click.native="clickEdit(item)"><i class="el-icon-edit">编辑</i></el-dropdown-item>
<el-dropdown-item @click.native="copyPayLink(item)"><i class="el-icon-document-copy">{{ $t('pages.payApplication.action.paymentLink') }}</i></el-dropdown-item>
<el-dropdown-item @click.native="clickEdit(item)"><i class="el-icon-edit">{{ $t('pages.payApplication.action.edit') }}</i></el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
@ -30,7 +30,7 @@
</div>
</div>
<div class="bottom nowrap-ellipsis">
创建时间: {{ item.createTime | dateFormat }}
{{ $t('pages.payApplication.table.createdAt') }}: {{ item.createTime | dateFormat }}
</div>
</div>
</div>
@ -38,7 +38,7 @@
<div class="app-block">
<div class="app-item flex-c app-create" @click="selectedRow={};appEditFormVisible=true;">
<i class="el-icon-circle-plus" /> 创建新的应用
<i class="el-icon-circle-plus" /> {{ $t('pages.payApplication.action.createApplication') }}
</div>
</div>
</div>

View File

@ -2,17 +2,17 @@
<div class="app-navigation">
<div class="operation">
<el-button class="el-icon-back" size="mini" @click="clickBack">
返回
{{ $t('pages.payApplication.action.back') }}
</el-button>
</div>
<el-tabs v-model="activeName">
<el-tab-pane
v-for="item in tables"
:key="item.component"
:label="item.title"
:label="getTabTitle(item)"
:name="item.component"
>
<span slot="label"><i :class="item.icon" /> {{ item.title }}</span>
<span slot="label"><i :class="item.icon" /> {{ getTabTitle(item) }}</span>
</el-tab-pane>
<component :is="activeName" :app-info="appInfo" />
</el-tabs>
@ -37,12 +37,12 @@ export default {
activeName: 'Commodity',
tables: [
{
title: '商品管理',
titleKey: 'pages.payApplication.tabs.commodity',
icon: 'el-icon-shopping-bag-1',
component: 'Commodity'
},
{
title: '商品管理V2',
titleKey: 'pages.payApplication.tabs.commodityV2',
icon: 'el-icon-shopping-bag-1',
component: 'CommodityV2'
}
@ -55,6 +55,9 @@ export default {
}
},
methods: {
getTabTitle(item) {
return item.titleKey ? this.$t(item.titleKey) : item.title
},
clickBack() {
this.$emit('back')
}

View File

@ -12,12 +12,12 @@
<div slot="title">
<div class="flex-l">
<sys-origin-icon :icon="row.selectApp.appCode" :desc="row.selectApp.appName" />
{{ isUpdate ? '修改商品' : '创建商品' }}
{{ isUpdate ? $t('pages.payApplication.dialog.editProduct') : $t('pages.payApplication.dialog.createProduct') }}
</div>
</div>
<div class="form-edit">
<el-form ref="form" :model="form" :rules="formRules" label-width="100px">
<el-form-item v-if="row.selectApp.appCode === 'ASWAT'" label="区域">
<el-form ref="form" :model="form" :rules="localizedRules" label-width="100px">
<el-form-item v-if="row.selectApp.appCode === 'ASWAT'" :label="$t('pages.payApplication.form.region')">
<div class="flex-l">{{ regionName }}</div>
</el-form-item>
<!-- <el-form-item label="售卖国家">
@ -25,36 +25,36 @@
<img v-if="row.country.icon" :src="row.country.icon" width="40"> {{ row.country.countryName }}
</div>
</el-form-item> -->
<el-form-item label="状态" prop="shelf">
<el-form-item :label="$t('pages.payApplication.form.status')" prop="shelf">
<el-select
v-model="form.shelf"
style="width:100%"
>
<el-option
v-for="(item, index ) in shelfStatus"
v-for="(item, index ) in shelfStatusOptions"
:key="index"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="!isUpdate" label="商品类型" prop="type">
<el-form-item v-if="!isUpdate" :label="$t('pages.payApplication.form.productType')" prop="type">
<el-select v-model="form.type" style="width:100%">
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="item.name" :value="item.value" />
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="getProductTypeName(item)" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="金币数" prop="content">
<el-input v-model="form.content" v-number placeholder="请输入金币数量" />
<el-form-item :label="$t('pages.payApplication.form.goldAmount')" prop="content">
<el-input v-model="form.content" v-number :placeholder="$t('pages.payApplication.placeholder.goldAmount')" />
</el-form-item>
<el-form-item label="奖励数" prop="awardContent">
<el-input v-model="form.awardContent" v-number placeholder="请输入奖励金币数量" />
<el-form-item :label="$t('pages.payApplication.form.rewardAmount')" prop="awardContent">
<el-input v-model="form.awardContent" v-number :placeholder="$t('pages.payApplication.placeholder.rewardAmount')" />
</el-form-item>
<el-form-item label="售卖价格" prop="amountUsd">
<el-input v-model.trim="form.amountUsd" placeholder="请输入商品价格" class="input-with-select" maxlength="10" @change="changeAmount">
<el-form-item :label="$t('pages.payApplication.form.salePrice')" prop="amountUsd">
<el-input v-model.trim="form.amountUsd" :placeholder="$t('pages.payApplication.placeholder.salePrice')" class="input-with-select" maxlength="10" @change="changeAmount">
<template slot="append">USD</template>
</el-input>
</el-form-item>
<el-form-item v-if="false" label="支付渠道">
<el-form-item v-if="false" :label="$t('pages.payApplication.form.paymentChannel')">
<div v-loading="associateLoading" />
<el-collapse v-if="supportAmounts && supportAmounts.length > 0" v-model="activeNames">
<el-collapse-item v-for="(item,index) in supportAmounts" :key="index" :name="item.channel.channelCode">
@ -72,19 +72,19 @@
</div>
</el-col>
<el-col :md="8" class="col" style="text-align: left;">
<div>售卖价格: <strong>{{ computedAmount }}</strong> {{ row.country.currency }}</div>
<div>售卖价格: <strong>{{ amountUsd }}</strong> USD</div>
<div>{{ $t('pages.payApplication.form.salePrice') }}: <strong>{{ computedAmount }}</strong> {{ row.country.currency }}</div>
<div>{{ $t('pages.payApplication.form.salePrice') }}: <strong>{{ amountUsd }}</strong> USD</div>
</el-col>
<el-col :md="8" class="col" style="text-align: left;">
<div>
最小限额: <strong>{{ aItem.countryChannelDetails.computedMinLimit }}</strong> {{ row.country.currency }}
最大限额: <strong>{{ aItem.countryChannelDetails.computedMaxLimit }} </strong>{{ row.country.currency }}
每日限额: <strong>{{ aItem.countryChannelDetails.computedDailyLimit }} </strong>{{ row.country.currency }}
{{ $t('pages.payApplication.form.minLimit') }}: <strong>{{ aItem.countryChannelDetails.computedMinLimit }}</strong> {{ row.country.currency }}{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.maxLimit') }}: <strong>{{ aItem.countryChannelDetails.computedMaxLimit }} </strong>{{ row.country.currency }}{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.dailyLimit') }}: <strong>{{ aItem.countryChannelDetails.computedDailyLimit }} </strong>{{ row.country.currency }}
</div>
<div>
最小限额: <strong>{{ aItem.countryChannelDetails.factoryMinLimit }}</strong> USD
最大限额: <strong>{{ aItem.countryChannelDetails.factoryMaxLimit }}</strong> USD
每日限额: <strong>{{ aItem.countryChannelDetails.factoryDailyLimit }}</strong> USD
{{ $t('pages.payApplication.form.minLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryMinLimit }}</strong> USD{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.maxLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryMaxLimit }}</strong> USD{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.dailyLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryDailyLimit }}</strong> USD
</div>
</el-col>
</el-row>
@ -95,8 +95,8 @@
</div>
<div slot="footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" :loading="submitLoading" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.payApplication.action.cancel') }}</el-button>
<el-button type="primary" :loading="submitLoading" @click="submitForm()">{{ $t('pages.payApplication.action.save') }}</el-button>
</div>
</el-dialog>
@ -117,14 +117,10 @@ export default {
}
},
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
]
return {
shelfStatus: [
{ value: true, name: '上架' },
{ value: false, name: '下架' }
{ value: true, labelKey: 'pages.payApplication.shelfStatus.true' },
{ value: false, labelKey: 'pages.payApplication.shelfStatus.false' }
],
productTypeConfs,
form: {
@ -136,23 +132,6 @@ export default {
regionId: '',
shelf: ''
},
formRules: {
applicationId: commonRules,
content: commonRules,
awardContent: commonRules,
type: commonRules,
shelf: commonRules,
amountUsd: {
required: true,
trigger: 'blur',
validator: (rule, value, callback) => {
if (validPositiveNumberPointTwo(value)) {
return callback()
}
return callback(new Error('请输入正确的正数/小数最多两位小数点'))
}
}
},
regionName: '',
activeNames: '',
submitLoading: false,
@ -165,6 +144,34 @@ export default {
computed: {
isUpdate() {
return this.row && this.row.id
},
shelfStatusOptions() {
return this.shelfStatus.map(item => ({
...item,
label: this.$t(item.labelKey)
}))
},
localizedRules() {
const commonRules = [
{ required: true, message: this.$t('pages.payApplication.validation.requiredField'), trigger: 'blur' }
]
return {
applicationId: commonRules,
content: commonRules,
awardContent: commonRules,
type: commonRules,
shelf: commonRules,
amountUsd: {
required: true,
trigger: 'blur',
validator: (rule, value, callback) => {
if (validPositiveNumberPointTwo(value)) {
return callback()
}
return callback(new Error(this.$t('pages.payApplication.validation.positiveNumberPointTwo')))
}
}
}
}
},
watch: {
@ -181,6 +188,11 @@ export default {
}
},
methods: {
getProductTypeName(item) {
const key = `pages.payApplication.productTypes.${item.value}`
const label = this.$t(key)
return label === key ? item.name : label
},
handleClose() {
this.$emit('close')
},

View File

@ -7,11 +7,11 @@
class="filter-item"
@change="changeType"
>
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="item.name" :value="item.value" />
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="getProductTypeName(item)" :value="item.value" />
</el-select>
<el-select
v-model="listQuery.applicationId"
placeholder="应用"
:placeholder="$t('pages.payApplication.placeholder.application')"
style="width: 200px"
class="filter-item"
collapse-tags
@ -31,7 +31,7 @@
v-if="selectedApp.appCode === 'ASWAT'"
v-model="listQuery.regionId"
v-loading="loading"
placeholder="区域"
:placeholder="$t('pages.payApplication.placeholder.region')"
style="width:120px;"
class="filter-item"
@change="changeRegion"
@ -50,16 +50,16 @@
@change="handleSearch"
>
<el-option
v-for="(item, index ) in shelfStatus"
v-for="(item, index ) in shelfStatusOptions"
:key="index"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input
v-model.trim="listQuery.id"
v-number
placeholder="商品ID"
:placeholder="$t('pages.payApplication.placeholder.productId')"
style="width: 200px;"
class="filter-item"
/>
@ -69,7 +69,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.payApplication.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -78,7 +78,7 @@
:disabled="!listQuery.regionId"
@click="createCommodity"
>
添加
{{ $t('pages.payApplication.action.add') }}
</el-button>
</div>
@ -90,11 +90,11 @@
highlight-current-row
>
<el-table-column label="ID" prop="id" align="center" />
<el-table-column label="区域" prop="regionName" align="center" />
<el-table-column label="金币数" prop="content" align="center" />
<el-table-column label="奖励数" prop="awardContent" align="center" />
<el-table-column label="价格$" prop="amountUsd" align="center" />
<el-table-column label="上/下架" prop="shelf" align="center">
<el-table-column :label="$t('pages.payApplication.table.region')" prop="regionName" align="center" />
<el-table-column :label="$t('pages.payApplication.table.goldAmount')" prop="content" align="center" />
<el-table-column :label="$t('pages.payApplication.table.rewardAmount')" prop="awardContent" align="center" />
<el-table-column :label="$t('pages.payApplication.table.priceUsd')" prop="amountUsd" align="center" />
<el-table-column :label="$t('pages.payApplication.table.shelf')" prop="shelf" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.shelf"
@ -104,9 +104,9 @@
/>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="80">
<el-table-column fixed="right" :label="$t('pages.payApplication.table.actions')" align="center" width="80">
<template slot-scope="scope">
<el-button type="text" @click="clickEditCommodity(scope.row)">编辑</el-button>
<el-button type="text" @click="clickEditCommodity(scope.row)">{{ $t('pages.payApplication.action.edit') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -148,8 +148,8 @@ export default {
return {
productTypeConfs,
shelfStatus: [
{ value: true, name: '上架' },
{ value: false, name: '下架' }
{ value: true, labelKey: 'pages.payApplication.shelfStatus.true' },
{ value: false, labelKey: 'pages.payApplication.shelfStatus.false' }
],
appCommodityEditFormVisible: false,
selectedEditFrom: {},
@ -173,6 +173,14 @@ export default {
loading: false
}
},
computed: {
shelfStatusOptions() {
return this.shelfStatus.map(item => ({
...item,
label: this.$t(item.labelKey)
}))
}
},
watch: {
appInfo: {
handler(newVal) {
@ -189,6 +197,11 @@ export default {
this.listRegion()
},
methods: {
getProductTypeName(item) {
const key = `pages.payApplication.productTypes.${item.value}`
const label = this.$t(key)
return label === key ? item.name : label
},
handleSwitchChange(row) {
switchShelfCommodity(row.id, row.shelf)
.then((res) => {})

View File

@ -12,33 +12,33 @@
<div slot="title">
<div class="flex-l">
<sys-origin-icon :icon="row.selectApp.appCode" :desc="row.selectApp.appName" />
{{ isUpdate ? '修改商品' : '创建商品' }}
{{ isUpdate ? $t('pages.payApplication.dialog.editProduct') : $t('pages.payApplication.dialog.createProduct') }}
</div>
</div>
<div class="form-edit">
<el-form ref="form" :model="form" :rules="formRules" label-width="100px">
<el-form-item label="售卖国家">
<el-form ref="form" :model="form" :rules="localizedRules" label-width="100px">
<el-form-item :label="$t('pages.payApplication.form.saleCountry')">
<div class="flex-l">
<img v-if="row.country.icon" :src="row.country.icon" width="40"> {{ row.country.countryName }}
</div>
</el-form-item>
<el-form-item v-if="!isUpdate" label="商品类型" prop="type">
<el-form-item v-if="!isUpdate" :label="$t('pages.payApplication.form.productType')" prop="type">
<el-select v-model="form.type" style="width:100%">
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="item.name" :value="item.value" />
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="getProductTypeName(item)" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="金币数" prop="content">
<el-input v-model="form.content" v-number placeholder="请输入金币数量" />
<el-form-item :label="$t('pages.payApplication.form.goldAmount')" prop="content">
<el-input v-model="form.content" v-number :placeholder="$t('pages.payApplication.placeholder.goldAmount')" />
</el-form-item>
<el-form-item label="奖励数" prop="awardContent">
<el-input v-model="form.awardContent" v-number placeholder="请输入奖励金币数量" />
<el-form-item :label="$t('pages.payApplication.form.rewardAmount')" prop="awardContent">
<el-input v-model="form.awardContent" v-number :placeholder="$t('pages.payApplication.placeholder.rewardAmount')" />
</el-form-item>
<el-form-item label="售卖价格" prop="amountUsd">
<el-input v-model.trim="form.amountUsd" placeholder="请输入商品价格" class="input-with-select" maxlength="10" @change="changeAmount">
<el-form-item :label="$t('pages.payApplication.form.salePrice')" prop="amountUsd">
<el-input v-model.trim="form.amountUsd" :placeholder="$t('pages.payApplication.placeholder.salePrice')" class="input-with-select" maxlength="10" @change="changeAmount">
<template slot="append">USD</template>
</el-input>
</el-form-item>
<el-form-item label="支付渠道">
<el-form-item :label="$t('pages.payApplication.form.paymentChannel')">
<div v-loading="associateLoading" />
<el-collapse v-if="supportAmounts && supportAmounts.length > 0" v-model="activeNames">
<el-collapse-item v-for="(item,index) in supportAmounts" :key="index" :name="item.channel.channelCode">
@ -56,19 +56,19 @@
</div>
</el-col>
<el-col :md="8" class="col" style="text-align: left;">
<div>售卖价格: <strong>{{ computedAmount }}</strong> {{ row.country.currency }}</div>
<div>售卖价格: <strong>{{ amountUsd }}</strong> USD</div>
<div>{{ $t('pages.payApplication.form.salePrice') }}: <strong>{{ computedAmount }}</strong> {{ row.country.currency }}</div>
<div>{{ $t('pages.payApplication.form.salePrice') }}: <strong>{{ amountUsd }}</strong> USD</div>
</el-col>
<el-col :md="8" class="col" style="text-align: left;">
<div>
最小限额: <strong>{{ aItem.countryChannelDetails.computedMinLimit }}</strong> {{ row.country.currency }}
最大限额: <strong>{{ aItem.countryChannelDetails.computedMaxLimit }} </strong>{{ row.country.currency }}
每日限额: <strong>{{ aItem.countryChannelDetails.computedDailyLimit }} </strong>{{ row.country.currency }}
{{ $t('pages.payApplication.form.minLimit') }}: <strong>{{ aItem.countryChannelDetails.computedMinLimit }}</strong> {{ row.country.currency }}{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.maxLimit') }}: <strong>{{ aItem.countryChannelDetails.computedMaxLimit }} </strong>{{ row.country.currency }}{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.dailyLimit') }}: <strong>{{ aItem.countryChannelDetails.computedDailyLimit }} </strong>{{ row.country.currency }}
</div>
<div>
最小限额: <strong>{{ aItem.countryChannelDetails.factoryMinLimit }}</strong> USD
最大限额: <strong>{{ aItem.countryChannelDetails.factoryMaxLimit }}</strong> USD
每日限额: <strong>{{ aItem.countryChannelDetails.factoryDailyLimit }}</strong> USD
{{ $t('pages.payApplication.form.minLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryMinLimit }}</strong> USD{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.maxLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryMaxLimit }}</strong> USD{{ $t('pages.payApplication.word.separator') }}
{{ $t('pages.payApplication.form.dailyLimit') }}: <strong>{{ aItem.countryChannelDetails.factoryDailyLimit }}</strong> USD
</div>
</el-col>
</el-row>
@ -79,8 +79,8 @@
</div>
<div slot="footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" :loading="submitLoading" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.payApplication.action.cancel') }}</el-button>
<el-button type="primary" :loading="submitLoading" @click="submitForm()">{{ $t('pages.payApplication.action.save') }}</el-button>
</div>
</el-dialog>
@ -100,10 +100,6 @@ export default {
}
},
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
]
return {
productTypeConfs,
form: {
@ -114,23 +110,6 @@ export default {
amountUsd: '',
type: ''
},
formRules: {
applicationId: commonRules,
payCountryId: commonRules,
content: commonRules,
awardContent: commonRules,
type: commonRules,
amountUsd: {
required: true,
trigger: 'blur',
validator: (rule, value, callback) => {
if (validPositiveNumberPointTwo(value)) {
return callback()
}
return callback(new Error('请输入正确的正数/小数最多两位小数点'))
}
}
},
activeNames: '',
submitLoading: false,
associateLoading: false,
@ -142,6 +121,28 @@ export default {
computed: {
isUpdate() {
return this.row && this.row.id
},
localizedRules() {
const commonRules = [
{ required: true, message: this.$t('pages.payApplication.validation.requiredField'), trigger: 'blur' }
]
return {
applicationId: commonRules,
payCountryId: commonRules,
content: commonRules,
awardContent: commonRules,
type: commonRules,
amountUsd: {
required: true,
trigger: 'blur',
validator: (rule, value, callback) => {
if (validPositiveNumberPointTwo(value)) {
return callback()
}
return callback(new Error(this.$t('pages.payApplication.validation.positiveNumberPointTwo')))
}
}
}
}
},
watch: {
@ -157,6 +158,11 @@ export default {
}
},
methods: {
getProductTypeName(item) {
const key = `pages.payApplication.productTypes.${item.value}`
const label = this.$t(key)
return label === key ? item.name : label
},
handleClose() {
this.$emit('close')
},

View File

@ -7,11 +7,11 @@
class="filter-item"
@change="changeType"
>
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="item.name" :value="item.value" />
<el-option v-for="(item,index) in productTypeConfs" :key="index" :label="getProductTypeName(item)" :value="item.value" />
</el-select>
<el-select
v-model="listQuery.applicationId"
placeholder="应用"
:placeholder="$t('pages.payApplication.placeholder.application')"
style="width: 200px"
class="filter-item"
collapse-tags
@ -30,7 +30,7 @@
<el-select
v-model="listQuery.payCountryId"
v-loading="loadingCountry"
placeholder="国家"
:placeholder="$t('pages.payApplication.placeholder.country')"
style="width: 200px"
class="filter-item"
collapse-tags
@ -53,16 +53,16 @@
@change="handleSearch"
>
<el-option
v-for="(item, index ) in shelfStatus"
v-for="(item, index ) in shelfStatusOptions"
:key="index"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input
v-model.trim="listQuery.id"
v-number
placeholder="商品ID"
:placeholder="$t('pages.payApplication.placeholder.productId')"
style="width: 200px;"
class="filter-item"
/>
@ -72,7 +72,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.payApplication.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -81,7 +81,7 @@
:disabled="!listQuery.payCountryId"
@click="createCommodity"
>
添加
{{ $t('pages.payApplication.action.add') }}
</el-button>
</div>
@ -94,10 +94,10 @@
highlight-current-row
>
<el-table-column label="ID" prop="id" align="center" />
<el-table-column label="金币数" prop="content" align="center" />
<el-table-column label="奖励数" prop="awardContent" align="center" />
<el-table-column label="价格$" prop="amountUsd" align="center" />
<el-table-column label="上/下架" prop="shelf" align="center">
<el-table-column :label="$t('pages.payApplication.table.goldAmount')" prop="content" align="center" />
<el-table-column :label="$t('pages.payApplication.table.rewardAmount')" prop="awardContent" align="center" />
<el-table-column :label="$t('pages.payApplication.table.priceUsd')" prop="amountUsd" align="center" />
<el-table-column :label="$t('pages.payApplication.table.shelf')" prop="shelf" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.shelf"
@ -107,9 +107,9 @@
/>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="80">
<el-table-column fixed="right" :label="$t('pages.payApplication.table.actions')" align="center" width="80">
<template slot-scope="scope">
<el-button type="text" @click="clickEditCommodity(scope.row)">编辑</el-button>
<el-button type="text" @click="clickEditCommodity(scope.row)">{{ $t('pages.payApplication.action.edit') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -149,8 +149,8 @@ export default {
return {
productTypeConfs,
shelfStatus: [
{ value: true, name: '上架' },
{ value: false, name: '下架' }
{ value: true, labelKey: 'pages.payApplication.shelfStatus.true' },
{ value: false, labelKey: 'pages.payApplication.shelfStatus.false' }
],
appCommodityEditFormVisible: false,
selectedEditFrom: {},
@ -172,6 +172,14 @@ export default {
loadingCountry: false
}
},
computed: {
shelfStatusOptions() {
return this.shelfStatus.map(item => ({
...item,
label: this.$t(item.labelKey)
}))
}
},
watch: {
appInfo: {
handler(newVal) {
@ -188,6 +196,11 @@ export default {
this.loadOpenCountry()
},
methods: {
getProductTypeName(item) {
const key = `pages.payApplication.productTypes.${item.value}`
const label = this.$t(key)
return label === key ? item.name : label
},
handleSwitchChange(row) {
switchShelfCommodity(row.id, row.shelf)
.then((res) => {})

View File

@ -77,21 +77,21 @@ export default {
},
clickEdit() {
const that = this
that.$prompt('请输入新的美元汇率', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
that.$prompt(this.$t('pages.payApplication.prompt.inputExchangeRate'), this.$t('pages.payApplication.prompt.title'), {
confirmButtonText: this.$t('pages.payApplication.action.confirm'),
cancelButtonText: this.$t('pages.payApplication.action.cancel'),
inputPattern: /^\d{1,5}(\.\d{0,2})?$/,
inputErrorMessage: '范围0~99999小数最多两位',
inputErrorMessage: this.$t('pages.payApplication.validation.exchangeRateRange'),
closeOnClickModal: false
}).then(({ value }) => {
this.$message({
type: 'success',
message: '你输入的是: ' + value
message: this.$t('pages.payApplication.message.inputValue', { value })
})
}).catch(() => {
this.$message({
type: 'info',
message: '取消输入'
message: this.$t('pages.payApplication.message.inputCanceled')
})
})
}

View File

@ -1,6 +1,6 @@
<template>
<div class="app-order">
开发中近期期待...
{{ $t('pages.payApplication.word.comingSoon') }}
<!-- <div class="filter-container">
<el-input
v-model.trim="listQuery.userId"
@ -107,21 +107,21 @@ export default {
},
clickEdit() {
const that = this
that.$prompt('请输入新的美元汇率', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
that.$prompt(this.$t('pages.payApplication.prompt.inputExchangeRate'), this.$t('pages.payApplication.prompt.title'), {
confirmButtonText: this.$t('pages.payApplication.action.confirm'),
cancelButtonText: this.$t('pages.payApplication.action.cancel'),
inputPattern: /^\d{1,5}(\.\d{0,2})?$/,
inputErrorMessage: '范围0~99999小数最多两位',
inputErrorMessage: this.$t('pages.payApplication.validation.exchangeRateRange'),
closeOnClickModal: false
}).then(({ value }) => {
this.$message({
type: 'success',
message: '你输入的是: ' + value
message: this.$t('pages.payApplication.message.inputValue', { value })
})
}).catch(() => {
this.$message({
type: 'info',
message: '取消输入'
message: this.$t('pages.payApplication.message.inputCanceled')
})
})
}

View File

@ -1,7 +1,7 @@
<template>
<div class="associated-channels">
<el-dialog
title="关联渠道2"
:title="$t('pages.payOpenCountry.associated.dialogTitle')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -24,8 +24,8 @@
<i class="el-icon-picture-outline" />
</div>
</el-image>
{{ row.country.aliasName }} 国家货币: {{ row.currency }}
美元汇率: {{ row.usdExchangeRate }}
{{ row.country.aliasName }}{{ $t('pages.payOpenCountry.associated.separator') }} {{ $t('pages.payOpenCountry.associated.currency') }}: {{ row.currency }}{{ $t('pages.payOpenCountry.associated.separator') }}
{{ $t('pages.payOpenCountry.associated.usdExchangeRate') }}: {{ row.usdExchangeRate }}
<!-- 添加渠道 按钮 -->
<div style="margin-left: 20px;">
@ -96,13 +96,13 @@
<el-col :md="20">
<!-- 最小额度 -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="最小额度">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.minLimit')">
<el-input
v-model.trim="
aItem.countryChannelDetails.factoryMinLimit
"
:disabled="aItem.disabled"
placeholder="最小限额"
:placeholder="$t('pages.payOpenCountry.associated.placeholder.minLimit')"
class="input-with-select"
maxlength="10"
@change="
@ -118,13 +118,13 @@
<!-- 最大额度 -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="最大额度">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.maxLimit')">
<el-input
v-model.trim="
aItem.countryChannelDetails.factoryMaxLimit
"
:disabled="aItem.disabled"
placeholder="最小限额"
:placeholder="$t('pages.payOpenCountry.associated.placeholder.maxLimit')"
class="input-with-select"
maxlength="10"
@change="
@ -140,13 +140,13 @@
<!-- 每日额度 -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="每日限额">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.dailyLimit')">
<el-input
v-model.trim="
aItem.countryChannelDetails.factoryDailyLimit
"
:disabled="aItem.disabled"
placeholder="每日限额"
:placeholder="$t('pages.payOpenCountry.associated.placeholder.dailyLimit')"
class="input-with-select"
maxlength="10"
@change="
@ -162,11 +162,11 @@
<!-- 渠道CODE -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="第三方渠道CODE">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.factoryChannel')">
<el-input
v-model="aItem.countryChannelDetails.factoryChannel"
:disabled="aItem.disabled"
placeholder="请输入第三方厂商渠道CODE"
:placeholder="$t('pages.payOpenCountry.associated.placeholder.factoryChannel')"
@change="
val => changeFactoryVal(aItem, 'factoryChannel')
"
@ -176,13 +176,13 @@
<!-- 货币小数点 -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="货币小数点(暂时没用)">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.currencyPoint')">
<el-input
v-model="
aItem.countryChannelDetails.factoryCurrencyPoint
"
:disabled="aItem.disabled"
placeholder="货币小数点,默认2位"
:placeholder="$t('pages.payOpenCountry.associated.placeholder.currencyPoint')"
@change="
val => changeFactoryVal(aItem, 'factoryCurrencyPoint')
"
@ -192,12 +192,12 @@
<!-- 是否启动 -->
<el-col :md="8" class="channel-item-form">
<el-form-item label="是否启动">
<el-form-item :label="$t('pages.payOpenCountry.associated.form.enabled')">
<el-switch
v-model="aItem.countryChannelDetails.shelf"
:disabled="aItem.disabled"
active-text=""
inactive-text=""
:active-text="$t('pages.payOpenCountry.associated.switch.on')"
:inactive-text="$t('pages.payOpenCountry.associated.switch.off')"
@change="changeFactoryVal(aItem, 'shelf')"
/>
</el-form-item>
@ -260,13 +260,13 @@ export default {
) {
const regx = /^\d{1,8}(\.\d{0,2})?$/;
if (!regx.test(item.countryChannelDetails[field])) {
this.$opsMessage.fail("输入支持范围0 ~ 99999999最多2位小数");
this.$opsMessage.fail(this.$t('pages.payOpenCountry.validation.amountRange'));
return;
}
}
if (field === "factoryCurrencyPoint") {
if (item.factoryCurrencyPoint < 0 || item.factoryCurrencyPoint > 6) {
this.$opsMessage.fail("货币小数点范围0 ~ 6");
this.$opsMessage.fail(this.$t('pages.payOpenCountry.validation.currencyPointRange'));
return;
}
}

View File

@ -1,7 +1,7 @@
<template>
<div class="associated-channels">
<el-dialog
title="国家选择"
:title="$t('pages.payOpenCountry.countrySelect.dialogTitle')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -16,12 +16,12 @@
v-loading="countryValuesLoading"
style="text-align: left; display: inline-block"
filterable
:titles="['可选', '已选']"
:titles="[$t('pages.payOpenCountry.countrySelect.available'), $t('pages.payOpenCountry.countrySelect.selected')]"
:format="{
noChecked: '${total}',
hasChecked: '${checked}/${total}'
}"
:button-texts="['删除','开通']"
:button-texts="[$t('pages.payOpenCountry.action.delete'), $t('pages.payOpenCountry.action.enable')]"
:props="{key: 'id', label: 'aliasName'}"
:data="countrys"
@change="handleChange"

View File

@ -10,9 +10,9 @@
@change="handleSearch"
>
<el-option
v-for="(item, index) in shelfStatus"
v-for="(item, index) in shelfStatusOptions"
:key="index"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
@ -24,7 +24,7 @@
icon="el-icon-edit"
@click="createCountry"
>
添加
{{ $t('pages.payOpenCountry.action.add') }}
</el-button>
<!-- 刷新 按钮 -->
@ -34,7 +34,7 @@
icon="el-icon-search"
@click="handleSearch"
>
刷新
{{ $t('pages.payOpenCountry.action.refresh') }}
</el-button>
</div>
@ -42,12 +42,12 @@
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.payOpenCountry.word.loading')"
fit
highlight-current-row
>
<!-- 国家信息 -->
<el-table-column width="200" label="国家信息" align="center">
<el-table-column width="200" :label="$t('pages.payOpenCountry.table.countryInfo')" align="center">
<template slot-scope="scope">
<el-image
style="width: 45px; height: 30px"
@ -64,16 +64,16 @@
<!-- 国家名称 -->
<el-table-column
width="200"
label="国家名称"
:label="$t('pages.payOpenCountry.table.countryName')"
prop="country.aliasName"
align="center"
/>
<!-- 国家货币 -->
<el-table-column label="国家货币" prop="currency" align="center">
<el-table-column :label="$t('pages.payOpenCountry.table.currency')" prop="currency" align="center">
<template slot-scope="scope">
<el-button type="text" @click="clickInputCurrency(scope.row)">
<span v-if="!scope.row.currency">点击输入货币</span>
<span v-if="!scope.row.currency">{{ $t('pages.payOpenCountry.action.inputCurrency') }}</span>
<span v-else>{{ scope.row.currency }}</span>
</el-button>
</template>
@ -81,30 +81,30 @@
<!-- 汇率 -->
<el-table-column
label="美元概率(?=$)"
:label="$t('pages.payOpenCountry.table.usdExchangeRate')"
prop="usdExchangeRate"
align="center"
>
<template slot-scope="scope">
<el-button type="text" @click="clickUpdateRate(scope.row)">
<span v-if="!scope.row.usdExchangeRate">点击入汇率</span>
<span v-if="!scope.row.usdExchangeRate">{{ $t('pages.payOpenCountry.action.inputExchangeRate') }}</span>
<span v-else>{{ scope.row.usdExchangeRate }}</span>
</el-button>
</template>
</el-table-column>
<!-- 展示权重 -->
<el-table-column label="展示权重" prop="sort" align="center">
<el-table-column :label="$t('pages.payOpenCountry.table.sortWeight')" prop="sort" align="center">
<template slot-scope="scope">
<el-button type="text" @click="clickInputUpdateSort(scope.row)">
<span v-if="!scope.row.sort">点击输入权重</span>
<span v-if="!scope.row.sort">{{ $t('pages.payOpenCountry.action.inputSortWeight') }}</span>
<span v-else>{{ scope.row.sort }}</span>
</el-button>
</template>
</el-table-column>
<!-- 上下架 -->
<el-table-column label="上/下架" align="center">
<el-table-column :label="$t('pages.payOpenCountry.table.shelf')" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.shelf"
@ -116,11 +116,11 @@
</el-table-column>
<!-- 操作 -->
<el-table-column fixed="right" label="操作" align="center" width="100">
<el-table-column fixed="right" :label="$t('pages.payOpenCountry.table.actions')" align="center" width="100">
<!-- 关联渠道 -->
<template slot-scope="scope">
<el-button type="text" @click="clickAssociateChannel(scope.row)"
>关联渠道</el-button
>{{ $t('pages.payOpenCountry.action.associateChannels') }}</el-button
>
<!-- <el-button type="text" @click="clickAssociateChannelDetails(scope.row)">详情</el-button> -->
</template>
@ -166,8 +166,8 @@ export default {
data() {
return {
shelfStatus: [
{ value: true, name: "上架" },
{ value: false, name: "下架" }
{ value: true, name: "Enabled" },
{ value: false, name: "Disabled" }
],
countrySelectVisible: false,
formAssociatedChannelVisible: false,
@ -191,6 +191,14 @@ export default {
created() {
this.renderData();
},
computed: {
shelfStatusOptions() {
return this.shelfStatus.map(item => ({
...item,
label: this.getShelfStatusName(item.value, item.name)
}));
}
},
methods: {
renderData(isClean) {
const that = this;
@ -225,11 +233,11 @@ export default {
clickInputUpdateSort(row) {
const that = this;
that
.$prompt("请输入新的权重数", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
.$prompt(this.$t('pages.payOpenCountry.prompt.inputSortWeight'), this.$t('pages.payOpenCountry.prompt.title'), {
confirmButtonText: this.$t('pages.payOpenCountry.action.confirm'),
cancelButtonText: this.$t('pages.payOpenCountry.action.cancel'),
inputPattern: /^\d{1,5}$/,
inputErrorMessage: "范围0~99999小数最多两位",
inputErrorMessage: this.$t('pages.payOpenCountry.validation.sortRange'),
closeOnClickModal: false
})
.then(({ value }) => {
@ -248,9 +256,9 @@ export default {
clickInputCurrency(row) {
const that = this;
that
.$prompt("请输入新的国家货币Code", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
.$prompt(this.$t('pages.payOpenCountry.prompt.inputCurrency'), this.$t('pages.payOpenCountry.prompt.title'), {
confirmButtonText: this.$t('pages.payOpenCountry.action.confirm'),
cancelButtonText: this.$t('pages.payOpenCountry.action.cancel'),
closeOnClickModal: false
})
.then(({ value }) => {
@ -269,11 +277,11 @@ export default {
clickUpdateRate(row) {
const that = this;
that
.$prompt("请输入新的美元汇率", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
.$prompt(this.$t('pages.payOpenCountry.prompt.inputExchangeRate'), this.$t('pages.payOpenCountry.prompt.title'), {
confirmButtonText: this.$t('pages.payOpenCountry.action.confirm'),
cancelButtonText: this.$t('pages.payOpenCountry.action.cancel'),
inputPattern: /^\d{1,5}(\.\d{0,8})?$/,
inputErrorMessage: "范围0~99999小数最多八位",
inputErrorMessage: this.$t('pages.payOpenCountry.validation.exchangeRateRange'),
closeOnClickModal: false
})
.then(({ value }) => {
@ -295,6 +303,11 @@ export default {
that.formAssociatedChannelVisible = true;
},
clickAssociateChannelDetails() {},
getShelfStatusName(value, fallback) {
const key = `pages.payOpenCountry.shelfStatus.${value}`;
const translatedName = this.$t(key);
return translatedName === key ? fallback : translatedName;
},
handleSwitchChange(row) {
updatePayOpenCountyShelf(row.id, row.shelf)
.then(res => {})

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.payRegionRelation.placeholder.system')"
style="width: 120px"
class="filter-item"
@change="changeSysOrigin"
@ -21,7 +21,7 @@
<el-select
v-model="listQuery.region"
v-loading="loading"
placeholder="区域"
:placeholder="$t('pages.payRegionRelation.placeholder.region')"
style="width:120px;"
class="filter-item"
clearable
@ -36,15 +36,15 @@
</el-select>
<el-select
v-model="listQuery.showcase"
placeholder="状态"
:placeholder="$t('pages.payRegionRelation.placeholder.status')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
>
<el-option
v-for="item in productConfigShowcase"
v-for="item in productConfigShowcaseOptions"
:key="item.value"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
@ -55,7 +55,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.payRegionRelation.action.search') }}
</el-button>
<el-button
@ -64,32 +64,32 @@
icon="el-icon-edit"
@click="handleCreate"
>
添加
{{ $t('pages.payRegionRelation.action.add') }}
</el-button>
</div>
<el-table
v-loading="loading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.payRegionRelation.word.loading')"
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center">
<el-table-column prop="sysOrigin" :label="$t('pages.payRegionRelation.table.system')" align="center">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column prop="regionName" label="区域" align="center" width="250" />
<el-table-column prop="relationDesc" label="关联数据" align="center" />
<el-table-column prop="showcase" label="状态" align="center">
<el-table-column prop="regionName" :label="$t('pages.payRegionRelation.table.region')" align="center" width="250" />
<el-table-column prop="relationDesc" :label="$t('pages.payRegionRelation.table.relatedData')" align="center" />
<el-table-column prop="showcase" :label="$t('pages.payRegionRelation.table.status')" align="center">
<template slot-scope="scope">
<span>{{ scope.row.showcase ? '已上架' : '已下架' }}</span>
<span>{{ scope.row.showcase ? $t('pages.payRegionRelation.status.enabled') : $t('pages.payRegionRelation.status.disabled') }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<el-table-column fixed="right" :label="$t('pages.payRegionRelation.table.actions')" align="center">
<template slot-scope="scope">
<div>
<el-button type="text" @click.native="handlUpdate(scope.row)">修改</el-button>
<el-button type="text" @click.native="handlUpdate(scope.row)">{{ $t('pages.payRegionRelation.action.edit') }}</el-button>
</div>
</template>
</el-table-column>
@ -102,7 +102,7 @@
@pagination="renderData"
/>
<el-dialog
:title="textOptTitle"
:title="$t(textOptTitle)"
:visible.sync="formVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -112,8 +112,8 @@
>
<div v-loading="submitLoading">
<el-form ref="form" :model="form" label-width="110px" :rules="rules">
<el-form-item prop="region" label="区域">
<el-select v-model="form.regionId" placeholder="请选择" style="width:100%;">
<el-form-item prop="region" :label="$t('pages.payRegionRelation.form.region')">
<el-select v-model="form.regionId" :placeholder="$t('pages.payRegionRelation.placeholder.select')" style="width:100%;">
<el-option
v-for="(item, index) in regions"
:key="index"
@ -122,8 +122,8 @@
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.id" prop="relationIds" label="开通国家">
<el-select v-model="form.relationIds" placeholder="请选择" style="width:100%;">
<el-form-item v-if="form.id" prop="relationIds" :label="$t('pages.payRegionRelation.form.enabledCountries')">
<el-select v-model="form.relationIds" :placeholder="$t('pages.payRegionRelation.placeholder.select')" style="width:100%;">
<el-option
v-for="(item, index) in countryList"
:key="index"
@ -137,8 +137,8 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item v-if="!form.id" prop="relationIds" label="开通国家">
<el-select v-model="form.relationIds" multiple placeholder="请选择" style="width:100%;">
<el-form-item v-if="!form.id" prop="relationIds" :label="$t('pages.payRegionRelation.form.enabledCountries')">
<el-select v-model="form.relationIds" multiple :placeholder="$t('pages.payRegionRelation.placeholder.select')" style="width:100%;">
<el-option
v-for="(item, index) in countryList"
:key="index"
@ -152,24 +152,24 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="showcase">
<el-form-item :label="$t('pages.payRegionRelation.form.status')" prop="showcase">
<el-select
v-model="form.showcase"
placeholder="状态"
:placeholder="$t('pages.payRegionRelation.placeholder.status')"
class="filter-item"
style="width:100%;"
>
<el-option
v-for="item in productConfigShowcase"
v-for="item in productConfigShowcaseOptions"
:key="item.value"
:value="item.value"
:label="item.name"
:label="item.label"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" @click="submitForm()">{{ $t('pages.payRegionRelation.action.save') }}</el-button>
<el-button @click="handleClose()">{{ $t('pages.payRegionRelation.action.cancel') }}</el-button>
</el-form-item>
</el-form>
</div>
@ -203,7 +203,7 @@ export default {
loadingCountry: false,
thisRow: {},
formVisible: false,
textOptTitle: '',
textOptTitle: 'pages.payRegionRelation.dialog.addTitle',
regions: [],
countryList: [],
form: getFormData(),
@ -219,19 +219,27 @@ export default {
relationId: '',
region: '',
showcase: true
},
rules: {
relationIds: [
{ required: true, message: '请选择关联数据', trigger: 'blur' }
],
regionId: [
{ required: true, message: '请选择区域', trigger: 'blur' }
]
}
}
},
computed: {
...mapGetters(['permissionsSysOriginPlatforms'])
...mapGetters(['permissionsSysOriginPlatforms']),
productConfigShowcaseOptions() {
return this.productConfigShowcase.map(item => ({
...item,
label: this.getShowcaseName(item.value, item.name)
}))
},
rules() {
return {
relationIds: [
{ required: true, message: this.$t('pages.payRegionRelation.validation.selectRelatedData'), trigger: 'blur' }
],
regionId: [
{ required: true, message: this.$t('pages.payRegionRelation.validation.selectRegion'), trigger: 'blur' }
]
}
}
},
created() {
const that = this
@ -283,13 +291,13 @@ export default {
this.renderData(true)
},
handleCreate() {
this.textOptTitle = '新增内购产品'
this.textOptTitle = 'pages.payRegionRelation.dialog.addTitle'
this.formVisible = true
this.form.relationIds = []
this.form = getFormData()
},
handlUpdate(row) {
this.textOptTitle = '修改内购产品'
this.textOptTitle = 'pages.payRegionRelation.dialog.editTitle'
this.formVisible = true
this.form = Object.assign(this.form, row)
this.form.relationIds = row.relationId
@ -305,6 +313,11 @@ export default {
this.listRegion()
this.handleSearch()
},
getShowcaseName(value, fallback) {
const key = `pages.payRegionRelation.statusOptions.${value}`
const translatedName = this.$t(key)
return translatedName === key ? fallback : translatedName
},
submitForm() {
const that = this
that.$refs.form.validate(valid => {

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.productV2.placeholder.system')"
style="width: 120px"
class="filter-item"
@change="changeSysOrigin"
@ -20,7 +20,7 @@
</el-select>
<el-select
v-model="listQuery.platform"
placeholder="支付平台"
:placeholder="$t('pages.productV2.placeholder.paymentPlatform')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -34,22 +34,22 @@
</el-select>
<el-select
v-model="listQuery.showcase"
placeholder="状态"
:placeholder="$t('pages.productV2.placeholder.status')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
>
<el-option
v-for="item in productConfigShowcase"
v-for="item in productConfigShowcaseOptions"
:key="item.value"
:label="item.name"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select
v-model="listQuery.region"
v-loading="loading"
placeholder="区域"
:placeholder="$t('pages.productV2.placeholder.region')"
style="width:120px;"
class="filter-item"
@change="handleSearch"
@ -68,7 +68,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.productV2.action.search') }}
</el-button>
<el-button
@ -77,7 +77,7 @@
icon="el-icon-edit"
@click="handleCreate"
>
添加
{{ $t('pages.productV2.action.add') }}
</el-button>
</div>
<el-table
@ -87,35 +87,35 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center">
<el-table-column prop="sysOrigin" :label="$t('pages.productV2.table.system')" align="center">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column prop="productPackage" label="包名" align="center" width="250" />
<el-table-column prop="unitPrice" label="产品单价" align="center" />
<el-table-column prop="obtainCandy" label="获得糖果数量" align="center" />
<el-table-column prop="rewardCandy" label="奖励糖果" align="center" />
<el-table-column prop="platform" label="平台" align="center" />
<el-table-column prop="regionNameStr" label="区域" align="center" />
<el-table-column prop="description" label="描述" align="center" />
<el-table-column prop="sort" label="序号" align="center" />
<el-table-column prop="createTime" label="创建时间" align="center">
<el-table-column prop="productPackage" :label="$t('pages.productV2.table.packageName')" align="center" width="250" />
<el-table-column prop="unitPrice" :label="$t('pages.productV2.table.unitPrice')" align="center" />
<el-table-column prop="obtainCandy" :label="$t('pages.productV2.table.obtainCandy')" align="center" />
<el-table-column prop="rewardCandy" :label="$t('pages.productV2.table.rewardCandy')" align="center" />
<el-table-column prop="platform" :label="$t('pages.productV2.table.platform')" align="center" />
<el-table-column prop="regionNameStr" :label="$t('pages.productV2.table.region')" align="center" />
<el-table-column prop="description" :label="$t('pages.productV2.table.description')" align="center" />
<el-table-column prop="sort" :label="$t('pages.productV2.table.sort')" align="center" />
<el-table-column prop="createTime" :label="$t('pages.productV2.table.createdAt')" align="center">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<el-table-column fixed="right" :label="$t('pages.productV2.table.actions')" align="center">
<template slot-scope="scope">
<div>
<el-button type="text" @click.native="handlUpdate(scope.row)">修改</el-button>
<el-button type="text" @click.native="handlUpdate(scope.row)">{{ $t('pages.productV2.action.edit') }}</el-button>
</div>
</template>
</el-table-column>
</el-table>
<el-dialog
:title="textOptTitle"
:title="dialogTitle"
:visible.sync="formVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -124,9 +124,9 @@
width="40%"
>
<div v-loading="submitLoading">
<el-form ref="form" :model="form" label-width="110px" :rules="rules">
<el-form-item label="平台" prop="platform">
<el-select v-model="form.platform" placeholder="支付平台" style="width:100%;">
<el-form ref="form" :model="form" label-width="110px" :rules="localizedRules">
<el-form-item :label="$t('pages.productV2.form.platform')" prop="platform">
<el-select v-model="form.platform" :placeholder="$t('pages.productV2.placeholder.paymentPlatform')" style="width:100%;">
<el-option
v-for="item in platformOriginsV2"
:key="item.value"
@ -135,8 +135,8 @@
/>
</el-select>
</el-form-item>
<el-form-item prop="regionList" label="区域">
<el-select v-model="form.regionList" multiple placeholder="请选择" style="width:100%;">
<el-form-item prop="regionList" :label="$t('pages.productV2.form.region')">
<el-select v-model="form.regionList" multiple :placeholder="$t('pages.productV2.placeholder.select')" style="width:100%;">
<el-option
v-for="(item, index) in regions"
:key="index"
@ -145,43 +145,43 @@
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="showcase">
<el-form-item :label="$t('pages.productV2.form.status')" prop="showcase">
<el-select
v-model="form.showcase"
placeholder="状态"
:placeholder="$t('pages.productV2.placeholder.status')"
class="filter-item"
style="width:100%;"
>
<el-option
v-for="item in productConfigShowcase"
v-for="item in productConfigShowcaseOptions"
:key="item.value"
:value="item.value"
:label="item.name"
:label="item.label"
/>
</el-select>
</el-form-item>
<el-form-item label="包名" prop="productPackage">
<el-form-item :label="$t('pages.productV2.form.packageName')" prop="productPackage">
<el-input v-model.trim="form.productPackage" />
</el-form-item>
<el-form-item label="产品单价" prop="unitPrice">
<el-form-item :label="$t('pages.productV2.form.unitPrice')" prop="unitPrice">
<el-input v-model.trim="form.unitPrice" type="number" />
</el-form-item>
<el-form-item label="获得糖果数量" prop="obtainCandy">
<el-form-item :label="$t('pages.productV2.form.obtainCandy')" prop="obtainCandy">
<el-input v-model.trim="form.obtainCandy" v-number />
</el-form-item>
<el-form-item label="奖励糖果" prop="rewardCandy">
<el-form-item :label="$t('pages.productV2.form.rewardCandy')" prop="rewardCandy">
<el-input v-model.trim="form.rewardCandy" v-number />
</el-form-item>
<el-form-item label="描述" prop="description">
<el-form-item :label="$t('pages.productV2.form.description')" prop="description">
<el-input v-model.trim="form.description" />
</el-form-item>
<el-form-item label="顺序" prop="sort">
<el-input v-model.trim="form.sort" type="number" :placeholder="'数字越小越靠前(升序排列)'" />
<el-form-item :label="$t('pages.productV2.form.sort')" prop="sort">
<el-input v-model.trim="form.sort" type="number" :placeholder="$t('pages.productV2.placeholder.sort')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" @click="submitForm()">{{ $t('pages.productV2.action.save') }}</el-button>
<el-button @click="handleClose()">{{ $t('pages.productV2.action.cancel') }}</el-button>
</el-form-item>
</el-form>
</div>
@ -231,40 +231,51 @@ export default {
region: ''
},
listLoading: true,
searchLoading: false,
rules: {
sysOrigin: [
{ required: true, message: '请选择系统', trigger: 'blur' }
],
showcase: [
{ required: true, message: '请选择状态', trigger: 'blur' }
],
regionList: [
{ required: true, message: '请选择区域', trigger: 'blur' }
],
productPackage: [
{ required: true, message: '请输入包名', trigger: 'blur' }
],
unitPrice: [
{ required: true, message: '请输入单价', trigger: 'blur' }
],
obtainCandy: [
{ required: true, message: '请输入获得糖果数', trigger: 'blur' }
],
platform: [
{ required: true, message: '请选择支付平台', trigger: 'blur' }
],
maxManager: [
{ required: true, message: '最大管理员数必须填写', trigger: 'blur' }
],
sort: [
{ required: true, message: '序号必须填写', trigger: 'blur' }
]
}
searchLoading: false
}
},
computed: {
...mapGetters(['permissionsSysOriginPlatforms'])
...mapGetters(['permissionsSysOriginPlatforms']),
dialogTitle() {
return this.form && this.form.id ? this.$t('pages.productV2.dialog.editTitle') : this.$t('pages.productV2.dialog.addTitle')
},
productConfigShowcaseOptions() {
return this.productConfigShowcase.map(item => ({
...item,
label: this.getShowcaseLabel(item)
}))
},
localizedRules() {
return {
sysOrigin: [
{ required: true, message: this.$t('pages.productV2.validation.systemRequired'), trigger: 'blur' }
],
showcase: [
{ required: true, message: this.$t('pages.productV2.validation.statusRequired'), trigger: 'blur' }
],
regionList: [
{ required: true, message: this.$t('pages.productV2.validation.regionRequired'), trigger: 'blur' }
],
productPackage: [
{ required: true, message: this.$t('pages.productV2.validation.packageRequired'), trigger: 'blur' }
],
unitPrice: [
{ required: true, message: this.$t('pages.productV2.validation.unitPriceRequired'), trigger: 'blur' }
],
obtainCandy: [
{ required: true, message: this.$t('pages.productV2.validation.obtainCandyRequired'), trigger: 'blur' }
],
platform: [
{ required: true, message: this.$t('pages.productV2.validation.platformRequired'), trigger: 'blur' }
],
maxManager: [
{ required: true, message: this.$t('pages.productV2.validation.maxManagerRequired'), trigger: 'blur' }
],
sort: [
{ required: true, message: this.$t('pages.productV2.validation.sortRequired'), trigger: 'blur' }
]
}
}
},
created() {
const that = this
@ -277,6 +288,11 @@ export default {
that.renderData()
},
methods: {
getShowcaseLabel(item) {
const key = `pages.productV2.showcase.${item.value}`
const label = this.$t(key)
return label === key ? item.name : label
},
renderData() {
const that = this
that.listLoading = true
@ -303,12 +319,10 @@ export default {
this.renderData(true)
},
handleCreate() {
this.textOptTitle = '新增内购产品'
this.formVisible = true
this.form = getFormData()
},
handlUpdate(row) {
this.textOptTitle = '修改内购产品'
this.formVisible = true
this.form = Object.assign(this.form, row)
},

View File

@ -5,19 +5,19 @@
ref="ruleForm"
class="rule-form"
:model="form"
:rules="ruleValidateForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item
class="filter-item"
label="等级"
:label="$t('pages.propsActivityRuleConfig.form.level')"
prop="level"
style="margin-bottom: 10px;"
>
<el-select
v-model="form.level"
placeholder="请选择等级"
:placeholder="$t('pages.propsActivityRuleConfig.placeholder.selectLevel')"
clearable
style="width:100%;"
>
@ -32,7 +32,7 @@
<el-form-item
class="filter-item"
label="里程碑"
:label="$t('pages.propsActivityRuleConfig.form.milestone')"
prop="milestone"
style="margin-bottom: 10px;"
>
@ -41,7 +41,7 @@
<el-form-item
class="filter-item"
label="图标Icon"
:label="$t('pages.propsActivityRuleConfig.form.icon')"
>
<el-col :span="12">
<el-form-item prop="smallIcon" style="margin-bottom: 10px;">
@ -58,7 +58,7 @@
>
<i slot="default" v-loading="uploadSmallIconLoading" class="el-icon-plus" />
</el-upload>
<span>小号</span>
<span>{{ $t('pages.propsActivityRuleConfig.form.small') }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
@ -76,13 +76,13 @@
>
<i slot="default" v-loading="uploadMediumIconLoading" class="el-icon-plus" />
</el-upload>
<span>中号</span>
<span>{{ $t('pages.propsActivityRuleConfig.form.medium') }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item
class="filter-item"
label="动画资源图"
:label="$t('pages.propsActivityRuleConfig.form.animationResource')"
prop="sourceUrl"
>
<el-upload
@ -96,8 +96,8 @@
accept=".svga,.pag"
>
<div class="upload-but">
<el-button :loading="uploadSouceUrlLoading" size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传svga/pag文件</div>
<el-button :loading="uploadSouceUrlLoading" size="small" type="primary">{{ $t('pages.propsActivityRuleConfig.action.upload') }}</el-button>
<div slot="tip" class="el-upload__tip">{{ $t('pages.propsActivityRuleConfig.tips.uploadSvgaPag') }}</div>
</div>
</el-upload>
<svgaplayer v-if="!isShowUploadSourceUrl" :url="form.sourceUrl" />
@ -142,16 +142,20 @@ export default {
{ value: 4, name: '4' },
{ value: 5, name: '5' }
],
ruleValidateForm: {
milestone: [{ required: true, message: '必填字段', trigger: 'blur' }],
level: [{ required: true, message: '必填字段', trigger: 'blur' }],
smallIcon: [{ required: true, message: '必填字段', trigger: 'blur' }],
mediumIcon: [{ required: true, message: '必填字段', trigger: 'blur' }],
sourceUrl: [{ required: true, message: '必填字段', trigger: 'blur' }]
}
ruleValidateForm: {}
}
},
computed: {
localizedRules() {
const required = this.$t('pages.propsActivityRuleConfig.validation.requiredField')
return {
milestone: [{ required: true, message: required, trigger: 'blur' }],
level: [{ required: true, message: required, trigger: 'blur' }],
smallIcon: [{ required: true, message: required, trigger: 'blur' }],
mediumIcon: [{ required: true, message: required, trigger: 'blur' }],
sourceUrl: [{ required: true, message: required, trigger: 'blur' }]
}
},
isShowUploadSmallIcon() {
return !this.form.smallIcon
},

View File

@ -5,19 +5,19 @@
ref="ruleForm"
class="rule-form"
:model="form"
:rules="ruleValidateForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item
class="filter-item"
label="内购产品"
:label="$t('pages.propsActivityRuleConfig.form.inAppProduct')"
prop="productId"
>
<el-select
v-model="form.productId"
v-loading="firstChargeRewardsLoading"
placeholder="请选择产品"
:placeholder="$t('pages.propsActivityRuleConfig.placeholder.selectProduct')"
clearable
style="width:100%;"
>
@ -55,14 +55,23 @@ export default {
},
data() {
return {
ruleValidateForm: {
productId: [{ required: true, message: '必填字段', trigger: 'blur' }]
},
ruleValidateForm: {},
firstChargeRewards: [],
firstChargeRewardsLoading: false
}
},
computed: {
localizedRules() {
return {
productId: [
{
required: true,
message: this.$t('pages.propsActivityRuleConfig.validation.requiredField'),
trigger: 'blur'
}
]
}
}
},
// watch: {
// form: {

View File

@ -5,18 +5,18 @@
ref="ruleForm"
class="rule-form"
:model="form"
:rules="ruleValidateForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item label="上/下架" prop="status">
<el-form-item :label="$t('pages.propsActivityRuleConfig.form.shelfStatus')" prop="status">
<el-radio-group v-model="form.status">
<el-radio :label="true">上架</el-radio>
<el-radio :label="false">下架</el-radio>
<el-radio :label="true">{{ $t('pages.propsActivityRuleConfig.shelfStatus.on') }}</el-radio>
<el-radio :label="false">{{ $t('pages.propsActivityRuleConfig.shelfStatus.off') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
class="filter-item"
label="数量"
:label="$t('pages.propsActivityRuleConfig.form.quantity')"
prop="quantity"
>
<el-input v-model.trim="form.quantity" v-number />
@ -46,13 +46,17 @@ export default {
},
data() {
return {
ruleValidateForm: {
quantity: [{ required: true, message: '必填字段', trigger: 'blur' }],
status: [{ required: true, message: '必填字段', trigger: 'blur' }]
}
ruleValidateForm: {}
}
},
computed: {
localizedRules() {
const required = this.$t('pages.propsActivityRuleConfig.validation.requiredField')
return {
quantity: [{ required: true, message: required, trigger: 'blur' }],
status: [{ required: true, message: required, trigger: 'blur' }]
}
}
},
created() {
},

View File

@ -6,13 +6,13 @@
v-loading="gameListLoading"
class="rule-form"
:model="form"
:rules="ruleForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item prop="gameConfId" label="游戏" style="margin-bottom: 10px">
<el-form-item prop="gameConfId" :label="$t('pages.propsActivityRuleConfig.form.game')" style="margin-bottom: 10px">
<el-select
v-model="form.gameConfId"
placeholder="请选择游戏"
:placeholder="$t('pages.propsActivityRuleConfig.placeholder.selectGame')"
clearable
style="width:100%;"
>
@ -26,8 +26,8 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="target" label="目标">
<el-input v-model.trim="form.target" v-number placeholder="目标" />
<el-form-item prop="target" :label="$t('pages.propsActivityRuleConfig.form.target')">
<el-input v-model.trim="form.target" v-number :placeholder="$t('pages.propsActivityRuleConfig.form.target')" />
</el-form-item>
</el-form>
</div>
@ -55,15 +55,19 @@ export default {
},
data() {
return {
ruleForm: {
gameConfId: [{ required: true, message: '必填字段', trigger: 'blur' }],
target: [{ required: true, message: '必填字段', trigger: 'blur' }]
},
ruleForm: {},
gameList: [],
gameListLoading: false
}
},
computed: {
localizedRules() {
const required = this.$t('pages.propsActivityRuleConfig.validation.requiredField')
return {
gameConfId: [{ required: true, message: required, trigger: 'blur' }],
target: [{ required: true, message: required, trigger: 'blur' }]
}
}
},
watch: {
form: {

View File

@ -5,20 +5,20 @@
ref="ruleForm"
class="rule-form"
:model="form"
:rules="ruleValidateForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item
class="filter-item"
label="标识"
:label="$t('pages.propsActivityRuleConfig.form.mark')"
prop="mark"
>
<el-input v-model.trim="form.mark" />
</el-form-item>
<el-form-item
class="filter-item"
label="数量"
:label="$t('pages.propsActivityRuleConfig.form.quantity')"
prop="quantity"
>
<el-input v-model.trim="form.quantity" v-number />
@ -48,13 +48,17 @@ export default {
},
data() {
return {
ruleValidateForm: {
quantity: [{ required: true, message: '必填字段', trigger: 'blur' }],
mark: [{ required: true, message: '必填字段', trigger: 'blur' }]
}
ruleValidateForm: {}
}
},
computed: {
localizedRules() {
const required = this.$t('pages.propsActivityRuleConfig.validation.requiredField')
return {
quantity: [{ required: true, message: required, trigger: 'blur' }],
mark: [{ required: true, message: required, trigger: 'blur' }]
}
}
},
created() {
},

View File

@ -5,13 +5,13 @@
ref="ruleForm"
class="rule-form"
:model="form"
:rules="ruleValidateForm"
:rules="localizedRules"
label-position="top"
>
<el-form-item
class="filter-item"
label="数量"
:label="$t('pages.propsActivityRuleConfig.form.quantity')"
prop="quantity"
>
<el-input v-model.trim="form.quantity" />
@ -41,12 +41,21 @@ export default {
},
data() {
return {
ruleValidateForm: {
quantity: [{ required: true, message: '必填字段', trigger: 'blur' }]
}
ruleValidateForm: {}
}
},
computed: {
localizedRules() {
return {
quantity: [
{
required: true,
message: this.$t('pages.propsActivityRuleConfig.validation.requiredField'),
trigger: 'blur'
}
]
}
}
},
created() {
},

View File

@ -12,15 +12,15 @@
<el-form-item
style="margin-bottom: 20px;"
:prop="'boxs.'+ index + '.quantity'"
:rules="{required: true, message: '必填字段', trigger: 'blur'}"
:rules="{required: true, message: $t('pages.propsActivityRuleConfig.validation.requiredField'), trigger: 'blur'}"
>
<el-input v-model.trim="item.quantity" v-number :placeholder="(index + 1) + '、消耗糖果'" />
<el-input v-model.trim="item.quantity" v-number :placeholder="$t('pages.propsActivityRuleConfig.placeholder.consumeCandy', { index: index + 1 })" />
</el-form-item>
<el-form-item
:prop="'boxs.'+ index + '.opportunityNumber'"
:rules="{required: true, message: '必填字段', trigger: 'blur'}"
:rules="{required: true, message: $t('pages.propsActivityRuleConfig.validation.requiredField'), trigger: 'blur'}"
>
<el-input v-model.trim="item.opportunityNumber" v-number :placeholder="(index + 1) + '、抽奖次数'" />
<el-input v-model.trim="item.opportunityNumber" v-number :placeholder="$t('pages.propsActivityRuleConfig.placeholder.drawTimes', { index: index + 1 })" />
</el-form-item>
</el-col>
</el-form>

View File

@ -14,14 +14,14 @@
<el-form
ref="form"
:model="form"
:rules="rules"
:rules="localizedRules"
label-position="right"
label-width="80px"
>
<el-form-item label="系统" prop="sysOrigin">
<el-form-item :label="$t('pages.propsActivityRuleConfig.form.system')" prop="sysOrigin">
<el-select
v-model="form.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.propsActivityRuleConfig.form.system')"
style="width:100%;"
clearable
:disabled="isUpdate"
@ -42,10 +42,10 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="activityType" label="类型">
<el-form-item prop="activityType" :label="$t('pages.propsActivityRuleConfig.form.type')">
<el-select
v-model="form.activityType"
placeholder="类型"
:placeholder="$t('pages.propsActivityRuleConfig.form.type')"
clearable
style="width:100%;"
:disabled="isUpdate"
@ -63,12 +63,12 @@
<component
:is="activeComponent"
ref="ruleForm"
:tips="activeTips"
:tips="localizedActiveTips"
:sys-origin="form.sysOrigin"
:form="tmpRuleSetting"
/>
</el-form-item>
<el-form-item label="规则描述" prop="ruleDescription">
<el-form-item :label="$t('pages.propsActivityRuleConfig.form.ruleDescription')" prop="ruleDescription">
<el-input
v-model.trim="form.ruleDescription"
type="textarea"
@ -79,7 +79,7 @@
</el-form-item>
<el-form-item
v-if="form.activityType !== 'CRYSTAL'"
label="排序"
:label="$t('pages.propsActivityRuleConfig.form.sort')"
prop="sort"
>
<el-input v-model.trim="form.sort" v-number />
@ -87,13 +87,13 @@
</el-form>
</div>
<div class="drawer-footer">
<el-button @click="handleClose()">取消</el-button>
<el-button @click="handleClose()">{{ $t("pages.propsActivityRuleConfig.action.cancel") }}</el-button>
<el-button
type="primary"
:loading="submitLoading"
:disabled="submitLoading"
@click="submitForm()"
>保存</el-button
>{{ $t("pages.propsActivityRuleConfig.action.save") }}</el-button
>
</div>
</el-drawer>
@ -300,7 +300,7 @@ export default {
},
CUMULATIVE_RECHARGE_LOTTERY: {
component: "InputQuantity",
tips: "抽奖要求充值金额(列如: 9.9)",
tipsKey: "pages.propsActivityRuleConfig.tips.cumulativeRechargeLottery",
form: {
quantity: ""
}
@ -364,7 +364,7 @@ export default {
}
}
},
propActivityTypes,
rawPropActivityTypes: propActivityTypes,
propActivityTypesHelp,
form: {
id: "",
@ -375,22 +375,36 @@ export default {
ruleDescription: ""
},
submitLoading: false,
rules: {
sysOrigin: [{ required: true, message: "必填字段", trigger: "blur" }],
activityType: [
{ required: true, message: "必填字段", trigger: "blur" }
],
jsonData: [{ required: true, message: "必填字段", trigger: "blur" }],
sort: [{ required: true, message: "必填字段", trigger: "blur" }]
}
rules: {}
};
},
computed: {
propActivityTypes() {
const map = this.$t("pages.propsActivityRuleConfig.activityTypes");
return this.rawPropActivityTypes.map(item => ({
...item,
name: map[item.value] || item.name
}));
},
localizedActiveTips() {
return this.activeTips ? this.$t(this.activeTips) : "";
},
localizedRules() {
const required = this.$t("pages.propsActivityRuleConfig.validation.requiredField");
return {
sysOrigin: [{ required: true, message: required, trigger: "blur" }],
activityType: [{ required: true, message: required, trigger: "blur" }],
jsonData: [{ required: true, message: required, trigger: "blur" }],
sort: [{ required: true, message: required, trigger: "blur" }]
};
},
isUpdate() {
return !!(this.row && this.row.id);
},
textOptTitle() {
return this.isUpdate ? "修改" : "添加";
return this.isUpdate
? this.$t("pages.propsActivityRuleConfig.action.edit")
: this.$t("pages.propsActivityRuleConfig.action.add");
},
...mapGetters(["permissionsSysOriginPlatforms"])
},
@ -424,7 +438,7 @@ export default {
return;
}
that.activeComponent = item.component;
that.activeTips = item.tips;
that.activeTips = item.tipsKey || item.tips || "";
that.tmpRuleSetting = deepClone(item.form);
},
submitForm() {

View File

@ -5,7 +5,7 @@
<!-- 系统 选择器 -->
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.propsActivityRuleConfig.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -26,7 +26,7 @@
<!-- 活动类型 选择器 -->
<el-select
v-model="listQuery.activityType"
placeholder="活动类型"
:placeholder="$t('pages.propsActivityRuleConfig.filter.activityType')"
clearable
style="width: 120px"
class="filter-item"
@ -52,7 +52,7 @@
<!-- 规则描述 -->
<el-input
v-model.trim="listQuery.ruleDescription"
placeholder="规则描述"
:placeholder="$t('pages.propsActivityRuleConfig.filter.ruleDescription')"
style="width: 200px;"
class="filter-item"
/>
@ -61,7 +61,7 @@
<el-input
v-model.trim="listQuery.resourceGroupId"
v-number
placeholder="活动组ID"
:placeholder="$t('pages.propsActivityRuleConfig.filter.resourceGroupId')"
style="width: 200px;"
class="filter-item"
/>
@ -73,7 +73,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t("pages.propsActivityRuleConfig.action.search") }}
</el-button>
<!-- 新增按钮 -->
@ -83,7 +83,7 @@
icon="el-icon-edit"
@click="handleCreate"
>
新增
{{ $t("pages.propsActivityRuleConfig.action.add") }}
</el-button>
</div>
@ -100,22 +100,22 @@
<!-- 头部操作栏 -->
<div slot="header" class="clearfix">
<sys-origin-icon :icon="item.sysOrigin" size="20" />
{{ item.activityTypeName }}
{{ getActivityTypeName(item) }}
<div style="float: right; padding: 3px 0">
<el-dropdown>
<span class="el-dropdown-link">
操作选项<i class="el-icon-arrow-down el-icon--right" />
{{ $t("pages.propsActivityRuleConfig.action.more") }}<i class="el-icon-arrow-down el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="clickEditRule(item)"
>编辑规则</el-dropdown-item
>{{ $t("pages.propsActivityRuleConfig.action.editRule") }}</el-dropdown-item
>
<el-dropdown-item
@click.native="clickAssociatedResources(item)"
>关联资源</el-dropdown-item
>{{ $t("pages.propsActivityRuleConfig.action.associateResources") }}</el-dropdown-item
>
<el-dropdown-item @click.native="handlDel(item.id)"
>删除</el-dropdown-item
>{{ $t("pages.propsActivityRuleConfig.action.delete") }}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
@ -124,23 +124,23 @@
<!-- 详细信息 -->
<div class="card-content">
<div class="title">规则信息</div>
<div class="title">{{ $t("pages.propsActivityRuleConfig.card.ruleInfo") }}</div>
<div class="contetn">
<el-row>
<el-col :span="12"> ID{{ item.id }} </el-col>
<el-col :span="12">
<div class="flex-l">
<div>排序</div>
<div>{{ $t("pages.propsActivityRuleConfig.card.sort") }}{{ $t("pages.propsActivityRuleConfig.symbol.colon") }}</div>
<div>
<div class="sort">{{ item.sort }}</div>
</div>
</div>
</el-col>
<el-col :span="12" class="nowrap-ellipsis">
描述{{ item.ruleDescription }}
{{ $t("pages.propsActivityRuleConfig.card.description") }}{{ $t("pages.propsActivityRuleConfig.symbol.colon") }}{{ item.ruleDescription }}
</el-col>
<el-col :span="12" class="nowrap-ellipsis">
规则
{{ $t("pages.propsActivityRuleConfig.card.rule") }}{{ $t("pages.propsActivityRuleConfig.symbol.colon") }}
<el-tooltip class="item" effect="light">
<div slot="content">
<div v-if="item.jsonData">
@ -150,7 +150,7 @@
sort
/>
</div>
<div v-else>请选择类型</div>
<div v-else>{{ $t("pages.propsActivityRuleConfig.placeholder.selectType") }}</div>
</div>
<i
class="el-icon-question"
@ -160,7 +160,7 @@
</el-col>
</el-row>
</div>
<div class="title">资源信息1{{ item.resourceGroupId }}</div>
<div class="title">{{ $t("pages.propsActivityRuleConfig.card.resourceInfo", { id: item.resourceGroupId }) }}</div>
<div class="content flex-l">
<props-row :list="item.activityRewards" />
</div>
@ -216,7 +216,7 @@ export default {
components: { Pagination, AssociatedResources, EditRuleDrawer, PropsRow },
data() {
return {
propActivityTypes,
rawPropActivityTypes: propActivityTypes,
clickRow: {},
associatedResourcesVisable: false,
editRuleDrawerVisible: false,
@ -235,6 +235,13 @@ export default {
};
},
computed: {
propActivityTypes() {
const map = this.$t("pages.propsActivityRuleConfig.activityTypes");
return this.rawPropActivityTypes.map(item => ({
...item,
name: map[item.value] || item.name
}));
},
...mapGetters(["permissionsSysOriginPlatforms"])
},
created() {
@ -268,6 +275,11 @@ export default {
handleSearch() {
this.renderData(true);
},
getActivityTypeName(row) {
const type = row.activityType;
const map = this.$t("pages.propsActivityRuleConfig.activityTypes");
return (type && map[type]) || row.activityTypeName;
},
selectSource(source) {
const that = this;
that.associatedResourcesVisable = false;
@ -279,7 +291,7 @@ export default {
savePropsActivityRuleConfig(from)
.then(res => {
this.$message({
message: "Successful",
message: this.$t("pages.propsActivityRuleConfig.message.saveSuccess"),
type: "success"
});
that.fileList = [];
@ -295,15 +307,19 @@ export default {
},
//
handlDel(id) {
this.$confirm("确认删除吗?", "提示", {
this.$confirm(
this.$t("pages.propsActivityRuleConfig.confirm.delete"),
this.$t("pages.propsActivityRuleConfig.confirm.title"),
{
type: "warning"
})
}
)
.then(() => {
this.listLoading = true;
delPropsActivityRuleConfig(id).then(res => {
this.listLoading = false;
this.$message({
message: "删除成功",
message: this.$t("pages.propsActivityRuleConfig.message.deleteSuccess"),
type: "success"
});
this.renderData();

View File

@ -1,15 +1,15 @@
<template>
<div class="send-props">
<el-alert title="赠送徽章" style="margin-bottom: 10px;" :closable="false" />
<el-alert :title="$t('pages.propsSendTool.title.badge')" style="margin-bottom: 10px;" :closable="false" />
<el-form ref="form" :model="propsGiveForm" :rules="formRules" label-width="85px">
<el-form-item label="接收人" prop="receiverAccounts">
<el-input v-model="propsGiveForm.receiverAccounts" placeholder="请输入用户 【短账号】 ,多个短账号用英文','分割;(一批最多15个)短账号" />
<el-form-item :label="$t('pages.propsSendTool.form.receiver')" prop="receiverAccounts">
<el-input v-model="propsGiveForm.receiverAccounts" :placeholder="$t('pages.propsSendTool.placeholder.receiverAccounts')" />
</el-form-item>
<el-form-item label="选择系统" prop="sysOrigin">
<el-form-item :label="$t('pages.propsSendTool.form.system')" prop="sysOrigin">
<el-form-item>
<el-select
v-model="propsGiveForm.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.propsSendTool.placeholder.system')"
style="width:100%;"
class="filter-item"
@change="changeSysOrigin"
@ -18,20 +18,20 @@
</el-select>
</el-form-item>
</el-form-item>
<el-form-item v-if="propsGiveForm.sysOrigin" label="选择类型" prop="secondaryType">
<el-form-item v-if="propsGiveForm.sysOrigin" :label="$t('pages.propsSendTool.form.type')" prop="secondaryType">
<el-form-item>
<el-select
v-model="propsGiveForm.secondaryType"
placeholder="类型"
:placeholder="$t('pages.propsSendTool.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changetType"
>
<el-option v-for="item in badgeTypes" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in badgeTypes" :key="item.value" :label="getBadgeTypeName(item)" :value="item.value" />
</el-select>
</el-form-item>
</el-form-item>
<el-form-item label="选择资源" prop="content">
<el-form-item :label="$t('pages.propsSendTool.form.resource')" prop="content">
<div v-if="selectProps.selectUrl" class="payer-source">
<div class="paler-icon">
<svgaplayer
@ -50,15 +50,15 @@
@select="selectPropsSourcePopover"
/>
</el-form-item>
<el-form-item label="有效天数" prop="exchangeDays">
<el-form-item :label="$t('pages.propsSendTool.form.validDays')" prop="exchangeDays">
<el-input
v-model="propsGiveForm.exchangeDays"
type="number"
placeholder="输入正数为赠送,负数为回收"
:placeholder="$t('pages.propsSendTool.placeholder.validDays')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="submitLoading" @click="onGiveSubmit">发送</el-button>
<el-button type="primary" :loading="submitLoading" @click="onGiveSubmit">{{ $t('pages.propsSendTool.action.send') }}</el-button>
</el-form-item>
</el-form>
@ -76,10 +76,6 @@ export default {
name: 'SendBadge',
components: { PropsSourceSelectPopover },
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
]
return {
list: [],
listLoading: false,
@ -93,26 +89,6 @@ export default {
},
selectProps: {},
submitLoading: false,
formRules: {
// receiverId: commonRules,
receiverAccounts: commonRules,
exchangeDays: [
{ required: true, message: '有效天数不能为空', trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (value === '' || isNaN(value)) {
callback(new Error('请输入有效数字'))
} else {
callback()
}
},
trigger: 'blur'
}
],
content: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
},
propsGiveForm: {
// receiverId: '',
receiverAccounts: '',
@ -126,11 +102,44 @@ export default {
}
},
computed: {
...mapGetters(['permissionsSysOriginPlatforms'])
...mapGetters(['permissionsSysOriginPlatforms']),
formRules() {
const commonRules = [
{ required: true, message: this.$t('pages.propsSendTool.validation.requiredField'), trigger: 'blur' }
]
return {
// receiverId: commonRules,
receiverAccounts: commonRules,
exchangeDays: [
{ required: true, message: this.$t('pages.propsSendTool.validation.validDaysRequired'), trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (value === '' || isNaN(value)) {
callback(new Error(this.$t('pages.propsSendTool.validation.validNumber')))
} else {
callback()
}
},
trigger: 'blur'
}
],
content: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
}
}
},
created() {
},
methods: {
getLocalizedOption(group, value, fallback) {
const key = `pages.propsSendTool.${group}.${value}`
const text = this.$t(key)
return text === key ? fallback : text
},
getBadgeTypeName(item) {
return this.getLocalizedOption('badgeTypes', item.value, item.name)
},
changetType(type) {
const that = this
that.selectProps = {}
@ -166,7 +175,7 @@ export default {
sendPropsGiveUser(that.propsGiveForm).then(res => {
if (res.errorCode === 0) {
if (res.body) {
that.$opsMessage.fail('无效短账号: ' + res.body + ' 请处理后再将当前批次所有短账号重新发送.')
that.$opsMessage.fail(that.$t('pages.propsSendTool.message.invalidShortAccounts', { accounts: res.body }))
that.submitLoading = false
return
}

View File

@ -1,15 +1,15 @@
<template>
<div class="send-props">
<el-alert title="赠送道具" style="margin-bottom: 10px;" :closable="false" />
<el-alert :title="$t('pages.propsSendTool.title.props')" style="margin-bottom: 10px;" :closable="false" />
<el-form ref="form" :model="propsGiveForm" :rules="formRules" label-width="85px">
<el-form-item label="接收人" prop="receiverAccounts">
<el-input v-model="propsGiveForm.receiverAccounts" placeholder="请输入用户 【短账号】 ,多个短账号用英文','分割;(一批最多15个)短账号" />
<el-form-item :label="$t('pages.propsSendTool.form.receiver')" prop="receiverAccounts">
<el-input v-model="propsGiveForm.receiverAccounts" :placeholder="$t('pages.propsSendTool.placeholder.receiverAccounts')" />
</el-form-item>
<el-form-item label="选择系统" prop="sysOrigin">
<el-form-item :label="$t('pages.propsSendTool.form.system')" prop="sysOrigin">
<el-form-item>
<el-select
v-model="propsGiveForm.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.propsSendTool.placeholder.system')"
style="width:100%;"
class="filter-item"
@change="changeSysOrigin"
@ -18,18 +18,18 @@
</el-select>
</el-form-item>
</el-form-item>
<el-form-item label="选择类型" prop="secondaryType">
<el-form-item :label="$t('pages.propsSendTool.form.type')" prop="secondaryType">
<el-select
v-model="propsGiveForm.secondaryType"
placeholder="类型"
:placeholder="$t('pages.propsSendTool.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changePropsType"
>
<el-option v-for="item in propsTypes" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in propsTypes" :key="item.value" :label="getPropsTypeName(item)" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="选择资源" prop="content">
<el-form-item :label="$t('pages.propsSendTool.form.resource')" prop="content">
<div v-if="selectProps.cover" class="payer-source">
<div class="paler-icon">
<svgaplayer
@ -48,27 +48,27 @@
@select="selectPropsSourcePopover"
/>
</el-form-item>
<el-form-item v-if="propsGiveForm.secondaryType == 'NOBLE_VIP'" label="贵族来源" prop="vipOrigin">
<el-form-item v-if="propsGiveForm.secondaryType == 'NOBLE_VIP'" :label="$t('pages.propsSendTool.form.vipOrigin')" prop="vipOrigin">
<el-select
v-model="propsGiveForm.vipOrigin"
placeholder="贵族来源"
:placeholder="$t('pages.propsSendTool.placeholder.vipOrigin')"
style="width:100%;"
class="filter-item"
>
<el-option label="系统赠送" value="SYSTEM_GIVE" />
<el-option label="购买或朋友赠送" value="BUY_OR_GIVE" />
<el-option label="活动奖励" value="ACTIVITY_AWARD" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.SYSTEM_GIVE')" value="SYSTEM_GIVE" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.BUY_OR_GIVE')" value="BUY_OR_GIVE" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.ACTIVITY_AWARD')" value="ACTIVITY_AWARD" />
</el-select>
</el-form-item>
<el-form-item label="有效天数" prop="exchangeDays">
<el-form-item :label="$t('pages.propsSendTool.form.validDays')" prop="exchangeDays">
<el-input
v-model="propsGiveForm.exchangeDays"
type="number"
placeholder="输入正数为赠送,负数为回收"
:placeholder="$t('pages.propsSendTool.placeholder.validDays')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="submitLoading" @click="onGiveSubmit">发送</el-button>
<el-button type="primary" :loading="submitLoading" @click="onGiveSubmit">{{ $t('pages.propsSendTool.action.send') }}</el-button>
</el-form-item>
</el-form>
@ -85,9 +85,6 @@ export default {
name: 'SendProps',
components: { PropsSourceSelectPopover },
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
]
const propsTypeMap = {}
propsTypes.forEach(item => {
propsTypeMap[item.value] = {
@ -108,26 +105,6 @@ export default {
},
selectProps: {},
submitLoading: false,
formRules: {
// receiverId: commonRules,
receiverAccounts: commonRules,
exchangeDays: [
{ required: true, message: '有效天数不能为空', trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (value === '' || isNaN(value)) {
callback(new Error('请输入有效数字'))
} else {
callback()
}
},
trigger: 'blur'
}
],
content: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
},
propsGiveForm: {
sysOrigin: '',
// receiverId: '',
@ -144,12 +121,45 @@ export default {
},
computed: {
...mapGetters(['permissionsSysOriginPlatforms'])
...mapGetters(['permissionsSysOriginPlatforms']),
formRules() {
const commonRules = [
{ required: true, message: this.$t('pages.propsSendTool.validation.requiredField'), trigger: 'blur' }
]
return {
// receiverId: commonRules,
receiverAccounts: commonRules,
exchangeDays: [
{ required: true, message: this.$t('pages.propsSendTool.validation.validDaysRequired'), trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (value === '' || isNaN(value)) {
callback(new Error(this.$t('pages.propsSendTool.validation.validNumber')))
} else {
callback()
}
},
trigger: 'blur'
}
],
content: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
}
}
},
created() {
this.propsTypes = this.propsTypes.filter(item => !(item.value === 'CUSTOMIZE' || item.value === 'FRAGMENTS'))
},
methods: {
getLocalizedOption(group, value, fallback) {
const key = `pages.propsSendTool.${group}.${value}`
const text = this.$t(key)
return text === key ? fallback : text
},
getPropsTypeName(item) {
return this.getLocalizedOption('propsTypes', item.value, item.name)
},
changeSysOrigin(val) {
const that = this
that.propsGiveForm.secondaryType = ''
@ -194,7 +204,7 @@ export default {
sendPropsGiveUser(that.propsGiveForm).then(res => {
if (res.errorCode === 0) {
if (res.body) {
that.$opsMessage.fail('无效短账号: ' + res.body + ' 请处理后再将当前批次所有短账号重新发送.')
that.$opsMessage.fail(that.$t('pages.propsSendTool.message.invalidShortAccounts', { accounts: res.body }))
that.submitLoading = false
return
}

View File

@ -1,7 +1,7 @@
<template>
<div class="send-props">
<el-alert
title="赠送道具券"
:title="$t('pages.propsSendTool.title.ticket')"
style="margin-bottom: 10px;"
:closable="false"
/>
@ -11,17 +11,17 @@
:rules="formRules"
label-width="85px"
>
<el-form-item label="接收人" prop="receiverAccounts">
<el-form-item :label="$t('pages.propsSendTool.form.receiver')" prop="receiverAccounts">
<el-input
v-model="propsGiveForm.receiverAccounts"
placeholder="请输入用户 【短账号】 ,多个短账号用英文','分割;(一批最多15个)短账号"
:placeholder="$t('pages.propsSendTool.placeholder.receiverAccounts')"
/>
</el-form-item>
<el-form-item label="选择系统" prop="sysOrigin">
<el-form-item :label="$t('pages.propsSendTool.form.system')" prop="sysOrigin">
<el-form-item>
<el-select
v-model="propsGiveForm.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.propsSendTool.placeholder.system')"
style="width:100%;"
class="filter-item"
@change="changeSysOrigin"
@ -35,10 +35,10 @@
</el-select>
</el-form-item>
</el-form-item>
<el-form-item label="选择类型" prop="secondaryType">
<el-form-item :label="$t('pages.propsSendTool.form.type')" prop="secondaryType">
<el-select
v-model="propsGiveForm.secondaryType"
placeholder="类型"
:placeholder="$t('pages.propsSendTool.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changePropsType"
@ -46,12 +46,12 @@
<el-option
v-for="item in propsTicket"
:key="item.value"
:label="item.name"
:label="getPropsTypeName(item)"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="选择资源" prop="propId">
<el-form-item :label="$t('pages.propsSendTool.form.resource')" prop="propId">
<div v-if="selectProps.cover" class="payer-source">
<div class="paler-icon">
<svgaplayer type="popover" :url="selectProps.sourceUrl || ''" />
@ -77,30 +77,30 @@
</el-form-item>
<el-form-item
v-if="propsGiveForm.secondaryType == 'NOBLE_VIP'"
label="贵族来源"
:label="$t('pages.propsSendTool.form.vipOrigin')"
prop="vipOrigin"
>
<el-select
v-model="propsGiveForm.vipOrigin"
placeholder="贵族来源"
:placeholder="$t('pages.propsSendTool.placeholder.vipOrigin')"
style="width:100%;"
class="filter-item"
>
<el-option label="系统赠送" value="SYSTEM_GIVE" />
<el-option label="购买或朋友赠送" value="BUY_OR_GIVE" />
<el-option label="活动奖励" value="ACTIVITY_AWARD" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.SYSTEM_GIVE')" value="SYSTEM_GIVE" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.BUY_OR_GIVE')" value="BUY_OR_GIVE" />
<el-option :label="$t('pages.propsSendTool.vipOrigin.ACTIVITY_AWARD')" value="ACTIVITY_AWARD" />
</el-select>
</el-form-item>
<el-form-item label="有效天数" prop="propDays">
<el-form-item :label="$t('pages.propsSendTool.form.validDays')" prop="propDays">
<el-input
v-model="propsGiveForm.propDays"
type="number"
placeholder="输入正数为赠送,负数为回收"
:placeholder="$t('pages.propsSendTool.placeholder.validDays')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="submitLoading" @click="onGiveSubmit"
>发送</el-button
>{{ $t('pages.propsSendTool.action.send') }}</el-button
>
</el-form-item>
</el-form>
@ -119,9 +119,6 @@ export default {
name: "SendTicket",
components: { PropsSourceSelectPopover },
data() {
const commonRules = [
{ required: true, message: "必填字段不可为空", trigger: "blur" }
];
const propsTypeMap = {};
propsTicket.forEach(item => {
propsTypeMap[item.value] = {
@ -142,25 +139,6 @@ export default {
},
selectProps: {},
submitLoading: false,
formRules: {
receiverAccounts: commonRules,
propDays: [
{ required: true, message: "道具天数不能为空", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === "" || isNaN(value)) {
callback(new Error("请输入有效数字"));
} else {
callback();
}
},
trigger: "blur"
}
],
propId: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
},
propsGiveForm: {
sysOrigin: "",
receiverAccounts: "",
@ -176,7 +154,39 @@ export default {
},
computed: {
...mapGetters(["permissionsSysOriginPlatforms"])
...mapGetters(["permissionsSysOriginPlatforms"]),
formRules() {
const commonRules = [
{
required: true,
message: this.$t("pages.propsSendTool.validation.requiredField"),
trigger: "blur"
}
];
return {
receiverAccounts: commonRules,
propDays: [
{
required: true,
message: this.$t("pages.propsSendTool.validation.propDaysRequired"),
trigger: "blur"
},
{
validator: (rule, value, callback) => {
if (value === "" || isNaN(value)) {
callback(new Error(this.$t("pages.propsSendTool.validation.validNumber")));
} else {
callback();
}
},
trigger: "blur"
}
],
propId: commonRules,
secondaryType: commonRules,
sysOrigin: commonRules
};
}
},
created() {
this.propsTicket = this.propsTicket.filter(
@ -184,6 +194,14 @@ export default {
);
},
methods: {
getLocalizedOption(group, value, fallback) {
const key = `pages.propsSendTool.${group}.${value}`;
const text = this.$t(key);
return text === key ? fallback : text;
},
getPropsTypeName(item) {
return this.getLocalizedOption("propsTypes", item.value, item.name);
},
changeSysOrigin(val) {
const that = this;
that.propsGiveForm.secondaryType = "";
@ -244,9 +262,9 @@ export default {
if (res.errorCode === 0) {
if (res.body) {
that.$opsMessage.fail(
"无效短账号: " +
res.body +
" 请处理后再将当前批次所有短账号重新发送."
that.$t("pages.propsSendTool.message.invalidShortAccounts", {
accounts: res.body
})
);
that.submitLoading = false;
return;

View File

@ -11,13 +11,13 @@
top="50px"
>
<div v-loading="submitLoading">
<el-form ref="form" :model="form" :rules="formRules" label-width="110px" style="margin-right:50px;">
<el-form ref="form" :model="form" :rules="localizedFormRules" label-width="130px" style="margin-right:50px;">
<el-row :gutter="10">
<el-col :md="24" :lg="isNobleVip ? 12 : 24">
<el-form-item label="归属系统" prop="sysOrigin">
<el-form-item :label="$t('pages.propsStore.form.system')" prop="sysOrigin">
<el-select
v-model="form.sysOrigin"
placeholder="归属系统"
:placeholder="$t('pages.propsStore.form.system')"
style="width: 100%"
:disabled="true"
>
@ -32,28 +32,28 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="道具类型" prop="propsType">
<el-form-item :label="$t('pages.propsStore.form.propsType')" prop="propsType">
<el-select
v-model="form.propsType"
placeholder="道具类型"
:placeholder="$t('pages.propsStore.form.propsType')"
style="width: 100%"
:disabled="true"
>
<el-option
v-for="(item, index) in propsCommodityTypes"
v-for="(item, index) in propsCommodityTypeOptions"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="道具资源" :prop="sourceMap[form.propsType].isChangeSource ? 'tmpSourceIndex' : ''">
<el-form-item :label="$t('pages.propsStore.form.propsResource')" :prop="sourceMap[form.propsType].isChangeSource ? 'tmpSourceIndex' : ''">
<el-row v-loading="sourceMap[form.propsType].loading" :gutter="10">
<el-col v-if="sourceMap[form.propsType].isChangeSource" :span="15">
<el-form-item :prop="isUpdate ? 'tmpSourceIndex' : ''">
<el-select
v-model="form.tmpSourceIndex"
placeholder="类型"
:placeholder="$t('pages.propsStore.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changePropsSouce"
@ -90,23 +90,23 @@
</el-col>
</el-row>
<div>
<el-button v-if="!sourceMap[form.propsType].isChangeSource" type="text" @click="clickChangeSource(form.propsType)">更换资源</el-button>
<el-button v-if="!sourceMap[form.propsType].isChangeSource" type="text" @click="clickChangeSource(form.propsType)">{{ $t('pages.propsStore.action.changeResource') }}</el-button>
</div>
</el-form-item>
<el-form-item label="付费类型" prop="tmpCurrencyTypes">
<el-form-item :label="$t('pages.propsStore.form.currencyType')" prop="tmpCurrencyTypes">
<el-select
v-model="form.tmpCurrencyTypes"
placeholder="付费类型"
:placeholder="$t('pages.propsStore.form.currencyType')"
style="width: 100%"
multiple
>
<el-option v-for="item in propsCurrencyType" :key="item.value" :disabled="isNobleVip && item.value !== 'GOLD'" :label="item.name" :value="item.value" />
<el-option v-for="item in propsCurrencyTypeOptions" :key="item.value" :disabled="isNobleVip && item.value !== 'GOLD'" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="有效天数" prop="tmpValidDays">
<el-form-item :label="$t('pages.propsStore.form.validDays')" prop="tmpValidDays">
<el-select
v-model="form.tmpValidDays"
placeholder="付费类型"
:placeholder="$t('pages.propsStore.form.validDays')"
style="width: 100%"
class="filter-item"
multiple
@ -115,49 +115,49 @@
</el-select>
</el-form-item>
<el-form-item label="标签" prop="label">
<el-input v-model.trim="form.label" placeholder="请输入标签" />
<el-form-item :label="$t('pages.propsStore.form.label')" prop="label">
<el-input v-model.trim="form.label" :placeholder="$t('pages.propsStore.placeholder.label')" />
</el-form-item>
<el-row v-if="form.propsType === 'NOBLE_VIP'">
<el-col :span="12">
<el-form-item label="折扣率" prop="discount">
<el-input v-model="form.discount" placeholder="折扣率" @change="calculateDiscountPrice()" />
<el-form-item :label="$t('pages.propsStore.form.discount')" prop="discount">
<el-input v-model="form.discount" :placeholder="$t('pages.propsStore.form.discount')" @change="calculateDiscountPrice()" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="序号" prop="sort">
<el-input v-model.trim="form.sort" v-number placeholder="序号越大越靠前" />
<el-form-item :label="$t('pages.propsStore.form.sort')" prop="sort">
<el-input v-model.trim="form.sort" v-number :placeholder="$t('pages.propsStore.placeholder.sort')" />
</el-form-item>
</el-col>
</el-row>
<el-row v-if="form.propsType !== 'NOBLE_VIP'">
<el-col :span="12">
<el-form-item label="折扣率" prop="discount">
<el-input v-model="form.discount" placeholder="折扣率" :disabled="true" />
<el-form-item :label="$t('pages.propsStore.form.discount')" prop="discount">
<el-input v-model="form.discount" :placeholder="$t('pages.propsStore.form.discount')" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="序号" prop="sort">
<el-input v-model.trim="form.sort" v-number placeholder="序号越大越靠前" />
<el-form-item :label="$t('pages.propsStore.form.sort')" prop="sort">
<el-input v-model.trim="form.sort" v-number :placeholder="$t('pages.propsStore.placeholder.sort')" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="上/下架" prop="shelfStatus">
<el-form-item :label="$t('pages.propsStore.form.shelfStatus')" prop="shelfStatus">
<el-radio-group v-model="form.shelfStatus">
<el-radio :label="true">上架</el-radio>
<el-radio :label="false">下架</el-radio>
<el-radio :label="true">{{ $t('pages.propsStore.status.onShelf') }}</el-radio>
<el-radio :label="false">{{ $t('pages.propsStore.status.offShelf') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="isNobleVip" :md="24" :lg="12">
<el-form-item label="车辆">
<el-form-item :label="$t('pages.propsStore.propsTypes.RIDE')">
<el-row v-loading="sourceMap['RIDE'].loading" :gutter="10">
<el-col v-if="sourceMap['RIDE'].isChangeSource" :span="15">
<el-form-item>
<el-select
v-model="form.tmpCarIndex"
placeholder="类型"
:placeholder="$t('pages.propsStore.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changeCarSouce"
@ -195,16 +195,16 @@
</el-col>
</el-row>
<div>
<el-button v-if="!sourceMap['RIDE'].isChangeSource" type="text" @click="clickChangeSource('RIDE')">更换资源</el-button>
<el-button v-if="!sourceMap['RIDE'].isChangeSource" type="text" @click="clickChangeSource('RIDE')">{{ $t('pages.propsStore.action.changeResource') }}</el-button>
</div>
</el-form-item>
<el-form-item label="头像框">
<el-form-item :label="$t('pages.propsStore.propsTypes.AVATAR_FRAME')">
<el-row v-loading="sourceMap['AVATAR_FRAME'].loading" :gutter="10">
<el-col v-if="sourceMap['AVATAR_FRAME'].isChangeSource" :span="15">
<el-form-item>
<el-select
v-model="form.tmpAvatarIndex"
placeholder="类型"
:placeholder="$t('pages.propsStore.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changeAvatarFrameSource"
@ -241,16 +241,16 @@
</el-col>
</el-row>
<div>
<el-button v-if="!sourceMap['AVATAR_FRAME'].isChangeSource" type="text" @click="clickChangeSource('AVATAR_FRAME')">更换资源</el-button>
<el-button v-if="!sourceMap['AVATAR_FRAME'].isChangeSource" type="text" @click="clickChangeSource('AVATAR_FRAME')">{{ $t('pages.propsStore.action.changeResource') }}</el-button>
</div>
</el-form-item>
<el-form-item label="资料卡">
<el-form-item :label="$t('pages.propsStore.propsTypes.DATA_CARD')">
<el-row v-loading="sourceMap['DATA_CARD'].loading" :gutter="10">
<el-col v-if="sourceMap['DATA_CARD'].isChangeSource" :span="15">
<el-form-item>
<el-select
v-model="form.tmpDataCardIndex"
placeholder="类型"
:placeholder="$t('pages.propsStore.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changeDataCardSource"
@ -287,16 +287,16 @@
</el-col>
</el-row>
<div>
<el-button v-if="!sourceMap['DATA_CARD'].isChangeSource" type="text" @click="clickChangeSource('DATA_CARD')">更换资源</el-button>
<el-button v-if="!sourceMap['DATA_CARD'].isChangeSource" type="text" @click="clickChangeSource('DATA_CARD')">{{ $t('pages.propsStore.action.changeResource') }}</el-button>
</div>
</el-form-item>
<el-form-item label="聊天气泡">
<el-form-item :label="$t('pages.propsStore.propsTypes.CHAT_BUBBLE')">
<el-row v-loading="sourceMap['CHAT_BUBBLE'].loading" :gutter="10">
<el-col v-if="sourceMap['CHAT_BUBBLE'].isChangeSource" :span="15">
<el-form-item>
<el-select
v-model="form.tmpChatBubbleIndex"
placeholder="类型"
:placeholder="$t('pages.propsStore.placeholder.type')"
style="width:100%;"
class="filter-item"
@change="changeChatBubbleSource"
@ -333,49 +333,49 @@
</el-col>
</el-row>
<div>
<el-button v-if="!sourceMap['CHAT_BUBBLE'].isChangeSource" type="text" @click="clickChangeSource('CHAT_BUBBLE')">更换资源</el-button>
<el-button v-if="!sourceMap['CHAT_BUBBLE'].isChangeSource" type="text" @click="clickChangeSource('CHAT_BUBBLE')">{{ $t('pages.propsStore.action.changeResource') }}</el-button>
</div>
</el-form-item>
<el-form-item label="VIP类型" prop="propsAbility.vipType">
<el-form-item :label="$t('pages.propsStore.form.vipType')" prop="propsAbility.vipType">
<el-select
v-model="form.propsAbility.vipType"
placeholder="贵族类型"
:placeholder="$t('pages.propsStore.placeholder.vipType')"
style="width: 100%"
class="filter-item"
>
<el-option v-for="item in nobleVipTabs" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in nobleVipTabOptions" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="登录奖励" prop="propsAbility.loginRewardsAmount">
<el-input v-model="form.propsAbility.loginRewardsAmount" placeholder="登录奖励" />
<el-form-item :label="$t('pages.propsStore.form.loginReward')" prop="propsAbility.loginRewardsAmount">
<el-input v-model="form.propsAbility.loginRewardsAmount" :placeholder="$t('pages.propsStore.form.loginReward')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="VIP等级" prop="propsAbility.vipLevel">
<el-input v-model="form.propsAbility.vipLevel" placeholder="VIP等级" />
<el-form-item :label="$t('pages.propsStore.form.vipLevel')" prop="propsAbility.vipLevel">
<el-input v-model="form.propsAbility.vipLevel" :placeholder="$t('pages.propsStore.form.vipLevel')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="管理员数" prop="propsAbility.adminNumber">
<el-input v-model="form.propsAbility.adminNumber" placeholder="管理员数" />
<el-form-item :label="$t('pages.propsStore.form.adminCount')" prop="propsAbility.adminNumber">
<el-input v-model="form.propsAbility.adminNumber" :placeholder="$t('pages.propsStore.form.adminCount')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="房间成员数" prop="propsAbility.roomMaxMember">
<el-input v-model="form.propsAbility.roomMaxMember" placeholder="房间成员数" />
<el-form-item :label="$t('pages.propsStore.form.roomMemberCount')" prop="propsAbility.roomMaxMember">
<el-input v-model="form.propsAbility.roomMaxMember" :placeholder="$t('pages.propsStore.form.roomMemberCount')" />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<el-form-item>
<el-button type="primary" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" @click="submitForm()">{{ $t('pages.propsStore.action.save') }}</el-button>
<el-button @click="handleClose()">{{ $t('pages.propsStore.action.cancel') }}</el-button>
</el-form-item>
</el-form>
@ -397,9 +397,6 @@ export default {
}
},
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
]
return {
discountPrice: '',
propsCommodityTypes,
@ -452,32 +449,7 @@ export default {
tmpFloatPictureIndex: '',
tmpCarIndex: ''
},
formRules: {
sort: commonRules,
propsType: commonRules,
sysOrigin: commonRules,
tmpTypeIndex: commonRules,
tmpCurrencyTypes: commonRules,
tmpValidDays: commonRules,
validDays: commonRules,
discount: commonRules,
shelfStatus: commonRules,
'propsAbility.vipType': commonRules,
'propsAbility.vipLevel': commonRules,
'propsAbility.adminNumber': commonRules,
'propsAbility.loginRewardsAmount': commonRules,
'propsAbility.roomMaxMember': commonRules,
'propsAbility.avatarFrameId': commonRules,
'propsAbility.carId': commonRules,
'propsAbility.chatBubbleId': commonRules,
'propsAbility.dataCardId': commonRules,
tmpCarIndex: commonRules,
tmpDataCardIndex: commonRules,
tmpAvatarIndex: commonRules,
tmpChatBubbleIndex: commonRules,
tmpFloatPictureIndex: commonRules,
tmpSourceIndex: commonRules
},
formRules: {},
sourceTypeList: [],
selectType: {},
isLoadSourceTypeList: false,
@ -555,11 +527,60 @@ export default {
return !this.form.sourceUrl
},
textOptTitle() {
return this.form && this.form.id ? '修改' : '添加'
return this.form && this.form.id ? this.$t('pages.propsStore.action.edit') : this.$t('pages.propsStore.action.add')
},
isUpdate() {
return !!(this.form && this.form.id)
},
propsCommodityTypeOptions() {
return this.propsCommodityTypes.map(item => ({
...item,
name: this.$t(`pages.propsStore.propsTypes.${item.value}`)
}))
},
propsCurrencyTypeOptions() {
return this.propsCurrencyType.map(item => ({
...item,
name: this.$t(`pages.propsStore.currencyTypes.${item.value}`)
}))
},
nobleVipTabOptions() {
return this.nobleVipTabs.map(item => ({
...item,
name: this.$t(`pages.propsStore.nobleVipTypes.${item.value}`)
}))
},
localizedFormRules() {
const commonRules = [
{ required: true, message: this.$t('pages.propsStore.validation.required'), trigger: 'blur' }
]
return {
sort: commonRules,
propsType: commonRules,
sysOrigin: commonRules,
tmpTypeIndex: commonRules,
tmpCurrencyTypes: commonRules,
tmpValidDays: commonRules,
validDays: commonRules,
discount: commonRules,
shelfStatus: commonRules,
'propsAbility.vipType': commonRules,
'propsAbility.vipLevel': commonRules,
'propsAbility.adminNumber': commonRules,
'propsAbility.loginRewardsAmount': commonRules,
'propsAbility.roomMaxMember': commonRules,
'propsAbility.avatarFrameId': commonRules,
'propsAbility.carId': commonRules,
'propsAbility.chatBubbleId': commonRules,
'propsAbility.dataCardId': commonRules,
tmpCarIndex: commonRules,
tmpDataCardIndex: commonRules,
tmpAvatarIndex: commonRules,
tmpChatBubbleIndex: commonRules,
tmpFloatPictureIndex: commonRules,
tmpSourceIndex: commonRules
}
},
...mapGetters(['permissionsSysOriginPlatforms'])
},
watch: {

View File

@ -4,7 +4,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="归属系统"
:placeholder="$t('pages.propsStore.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -21,13 +21,13 @@
</el-select>
<el-select
v-model="listQuery.propsType"
placeholder="道具类型"
:placeholder="$t('pages.propsStore.filter.propsType')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
>
<el-option
v-for="(item, index) in propsCommodityTypes"
v-for="(item, index) in propsCommodityTypeOptions"
:key="index"
:label="item.name"
:value="item.value"
@ -35,30 +35,30 @@
</el-select>
<el-select
v-model="listQuery.shelfStatus"
placeholder="上/下架"
:placeholder="$t('pages.propsStore.filter.shelfStatus')"
clearable
style="width: 120px"
class="filter-item"
@change="handleSearch"
>
<el-option v-for="item in showcaseTypes" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in showcaseTypeOptions" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
<el-select
v-model="listQuery.currencyTypes"
placeholder="付费类型"
:placeholder="$t('pages.propsStore.filter.currencyType')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option v-for="item in propsCurrencyType" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in propsCurrencyTypeOptions" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
<el-input
v-model.trim="listQuery.id"
v-number
placeholder="商品ID"
:placeholder="$t('pages.propsStore.filter.commodityId')"
clearable
style="width: 200px;"
class="filter-item"
@ -67,7 +67,7 @@
<el-input
v-model.trim="listQuery.sourceId"
v-number
placeholder="资源ID"
:placeholder="$t('pages.propsStore.filter.resourceId')"
clearable
style="width: 200px;"
class="filter-item"
@ -79,7 +79,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.propsStore.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -87,7 +87,7 @@
icon="el-icon-edit"
@click="handleCreate"
>
添加
{{ $t('pages.propsStore.action.add') }}
</el-button>
</div>
<el-table
@ -100,7 +100,7 @@
>
<el-table-column type="expand">
<template slot-scope="scope">
<h2>资源信息</h2>
<h2>{{ $t('pages.propsStore.section.resourceInfo') }}</h2>
<el-form v-if="scope.row.propsSource" label-position="left" class="store-table-expand" style="margin-left:20px;">
<el-form-item>
<el-col :span="12">
@ -109,57 +109,57 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编号">
<el-form-item :label="$t('pages.propsStore.detail.code')">
<span>{{ scope.row.propsSource.code }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item>
<el-col :span="12">
<el-form-item label="名称">
<el-form-item :label="$t('pages.propsStore.detail.name')">
<span>{{ scope.row.propsSource.name }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="低价">
<el-form-item :label="$t('pages.propsStore.detail.basePrice')">
<span>{{ scope.row.propsSource.amount }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item v-if="scope.row.commodity.propsType !== 'NOBLE_VIP'">
<el-col :span="12">
<el-form-item label="上/下架状态">
<span>{{ scope.row.propsSource.del ? '下架' : '上架' }}</span>
<el-form-item :label="$t('pages.propsStore.detail.shelfStatus')">
<span>{{ getShelfStatusLabel(!scope.row.propsSource.del) }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="低价">
<el-form-item :label="$t('pages.propsStore.detail.salePrice')">
<el-tag>{{ scope.row.salePrice }}</el-tag>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item v-if="scope.row.commodity.propsType === 'NOBLE_VIP'">
<el-col :span="12">
<el-form-item label="上/下架状态">
<span>{{ scope.row.propsSource.del ? '下架' : '上架' }}</span>
<el-form-item :label="$t('pages.propsStore.detail.shelfStatus')">
<span>{{ getShelfStatusLabel(!scope.row.propsSource.del) }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item v-if="scope.row.commodity.propsType === 'NOBLE_VIP'">
<el-col :span="12">
<el-form-item label="原低价">
<el-form-item :label="$t('pages.propsStore.detail.originalPrice')">
<el-tag>{{ scope.row.salePrice }}</el-tag>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="折后低价">
<el-form-item :label="$t('pages.propsStore.detail.discountedPrice')">
<el-tag>{{ scope.row.saleDiscountPrice }}</el-tag>
</el-form-item>
</el-col>
</el-form-item>
</el-form>
<div v-if="scope.row.commodity.propsType === 'NOBLE_VIP'">
<h2>贵族能力</h2>
<h2>{{ $t('pages.propsStore.section.nobleAbility') }}</h2>
<el-form v-if="scope.row.propsAbility && scope.row.propsAbility.nobleVipAbility" label-position="left" class="store-table-expand" style="margin-left:20px;">
<el-form-item>
<el-col :span="12">
@ -168,31 +168,31 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="VIP类型">
<el-form-item :label="$t('pages.propsStore.form.vipType')">
<span>{{ scope.row.propsAbility.nobleVipAbility.vipType }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item>
<el-col :span="12">
<el-form-item label="VIP等级">
<el-form-item :label="$t('pages.propsStore.form.vipLevel')">
<span>{{ scope.row.propsAbility.nobleVipAbility.vipLevel }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成员数量">
<el-form-item :label="$t('pages.propsStore.detail.memberCount')">
<span>{{ scope.row.propsAbility.nobleVipAbility.roomMaxMember }}</span>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item>
<el-col :span="12">
<el-form-item label="登录奖励数">
<el-form-item :label="$t('pages.propsStore.detail.loginRewardCount')">
<span>{{ scope.row.propsAbility.nobleVipAbility.loginRewardsAmount }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="道具">
<el-form-item :label="$t('pages.propsStore.detail.props')">
<div class="vip-props flex-l">
@ -209,7 +209,7 @@
:url="scope.row.propsAbility.avatarFrame.sourceUrl"
/>
</div>
<div class="props-lable">头像框</div>
<div class="props-lable">{{ $t('pages.propsStore.propsTypes.AVATAR_FRAME') }}</div>
</div>
</div>
@ -226,7 +226,7 @@
:url="scope.row.propsAbility.car.sourceUrl"
/>
</div>
<div class="props-lable">座驾</div>
<div class="props-lable">{{ $t('pages.propsStore.propsTypes.RIDE') }}</div>
</div>
</div>
@ -243,7 +243,7 @@
:url="scope.row.propsAbility.chatBubble.sourceUrl"
/>
</div>
<div class="props-lable">气泡框</div>
<div class="props-lable">{{ $t('pages.propsStore.propsTypes.CHAT_BUBBLE') }}</div>
</div>
</div>
@ -260,7 +260,7 @@
:url="scope.row.propsAbility.dataCard.sourceUrl"
/>
</div>
<div class="props-lable">资料卡</div>
<div class="props-lable">{{ $t('pages.propsStore.propsTypes.DATA_CARD') }}</div>
</div>
</div>
</div>
@ -272,14 +272,18 @@
</template>
</el-table-column>
<el-table-column prop="commodity.id" width="200" label="ID" align="center" />
<el-table-column label="平台" width="80" align="center">
<el-table-column :label="$t('pages.propsStore.table.platform')" width="80" align="center">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.commodity.sysOrigin" :desc="scope.row.commodity.sysOrigin" />
</template>
</el-table-column>
<el-table-column prop="currencyTypesName" label="付费类型" align="center" width="80" />
<el-table-column prop="commodity.validDays" label="有效天数" align="center" min-width="100" />
<el-table-column label="封面" width="80" align="center">
<el-table-column :label="$t('pages.propsStore.table.currencyType')" align="center" width="100">
<template slot-scope="scope">
{{ getCurrencyTypesLabel(scope.row) }}
</template>
</el-table-column>
<el-table-column prop="commodity.validDays" :label="$t('pages.propsStore.table.validDays')" align="center" min-width="100" />
<el-table-column :label="$t('pages.propsStore.table.cover')" width="80" align="center">
<template slot-scope="scope">
<div v-if="scope.row.propsSource" class="preview-img">
<el-image
@ -296,7 +300,7 @@
</div>
</template>
</el-table-column>
<el-table-column width="100" label="上/下架" align="center">
<el-table-column width="100" :label="$t('pages.propsStore.table.shelfStatus')" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.commodity.shelfStatus"
@ -306,21 +310,21 @@
/>
</template>
</el-table-column>
<el-table-column prop="commodity.label" width="100" label="标签" align="center" min-width="100" />
<el-table-column prop="commodity.sort" width="50" label="序号" align="center" min-width="60" />
<el-table-column prop="commodity.createTime" width="200" label="创建时间" align="center">
<el-table-column prop="commodity.label" width="100" :label="$t('pages.propsStore.table.label')" align="center" min-width="100" />
<el-table-column prop="commodity.sort" width="70" :label="$t('pages.propsStore.table.sort')" align="center" min-width="70" />
<el-table-column prop="commodity.createTime" width="200" :label="$t('pages.propsStore.table.createTime')" align="center">
<template slot-scope="scope">
{{ scope.row.commodity.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column prop="commodity.updateTime" width="200" label="修改时间" align="center">
<el-table-column prop="commodity.updateTime" width="200" :label="$t('pages.propsStore.table.updateTime')" align="center">
<template slot-scope="scope">
{{ scope.row.commodity.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<el-table-column :label="$t('pages.propsStore.table.actions')" align="center" width="100">
<template slot-scope="scope">
<el-button type="text" @click.native="handleUpdate(scope.row)">编辑</el-button>
<el-button type="text" @click.native="handleUpdate(scope.row)">{{ $t('pages.propsStore.action.edit') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -355,8 +359,8 @@ export default {
return {
propsCommodityTypes,
showcaseTypes: [
{ value: false, name: '下架' },
{ value: true, name: '上架' }
{ value: false },
{ value: true }
],
formEditVisable: false,
thisRow: {},
@ -378,6 +382,24 @@ export default {
}
},
computed: {
propsCommodityTypeOptions() {
return this.propsCommodityTypes.map(item => ({
...item,
name: this.$t(`pages.propsStore.propsTypes.${item.value}`)
}))
},
propsCurrencyTypeOptions() {
return this.propsCurrencyType.map(item => ({
...item,
name: this.$t(`pages.propsStore.currencyTypes.${item.value}`)
}))
},
showcaseTypeOptions() {
return this.showcaseTypes.map(item => ({
...item,
name: this.getShelfStatusLabel(item.value)
}))
},
...mapGetters(['permissionsSysOriginPlatforms'])
},
created() {
@ -425,6 +447,16 @@ export default {
row.shelfStatus = !row.shelfStatus
})
},
getShelfStatusLabel(value) {
return this.$t(value ? 'pages.propsStore.status.onShelf' : 'pages.propsStore.status.offShelf')
},
getCurrencyTypesLabel(row) {
const currencyTypes = row && row.commodity && row.commodity.currencyTypes
if (!currencyTypes) {
return row.currencyTypesName
}
return currencyTypes.split(',').map(type => this.$t(`pages.propsStore.currencyTypes.${type}`)).join(',')
},
handleSearch() {
this.renderData(true)
},

View File

@ -1,7 +1,7 @@
<template>
<div class="team-details-drawer">
<el-drawer
title="详情"
:title="$t('pages.teamDetailsDrawer.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -13,50 +13,50 @@
<div v-loading="loading" class="team-details-drawer-content">
<div v-if="profile.ownUserProfile">
<div class="blockquote">代理</div>
<div class="blockquote">{{ $t('pages.teamDetailsDrawer.section.agent') }}</div>
<div class="content">
<user-table-exhibit :user-profile="profile.ownUserProfile" :query-details="true" />
</div>
</div>
<div v-if="profile.teamProfile">
<div class="blockquote">设置资料</div>
<div class="blockquote">{{ $t('pages.teamDetailsDrawer.section.settings') }}</div>
<div class="content">
<div class="flex-b team-row">
<div class="team-col nowrap-ellipsis">
ID: {{ profile.teamProfile.id }}
</div>
<div class="team-col nowrap-ellipsis">
状态:
<el-tag v-if="profile.teamProfile.status === 'AVAILABLE'" size="mini" type="success">正常</el-tag>
<el-tag v-if="profile.teamProfile.status === 'CLOSE'" size="mini" type="danger">关闭</el-tag>
{{ $t('pages.teamDetailsDrawer.label.status') }}:
<el-tag v-if="profile.teamProfile.status === 'AVAILABLE'" size="mini" type="success">{{ $t('pages.teamDetailsDrawer.status.available') }}</el-tag>
<el-tag v-if="profile.teamProfile.status === 'CLOSE'" size="mini" type="danger">{{ $t('pages.teamDetailsDrawer.status.closed') }}</el-tag>
</div>
</div>
<div class="flex-b team-row">
<div class="team-col nowrap-ellipsis">
区域ID: {{ profile.teamProfile.region }}
{{ $t('pages.teamDetailsDrawer.label.regionId') }}: {{ profile.teamProfile.region }}
</div>
<div class="team-col nowrap-ellipsis">
区域: {{ profile.regionName }}
{{ $t('pages.teamDetailsDrawer.label.region') }}: {{ profile.regionName }}
</div>
</div>
<div class="flex-b team-row">
<div class="team-col nowrap-ellipsis">
成员: {{ profile.teamProfile.counter.memberQuantity }}/{{ profile.teamProfile.setting.maxMember }}
{{ $t('pages.teamDetailsDrawer.label.members') }}: {{ profile.teamProfile.counter.memberQuantity }}/{{ profile.teamProfile.setting.maxMember }}
</div>
<div class="team-col nowrap-ellipsis">
国家(团队): {{ profile.teamProfile.country.countryName }}
{{ $t('pages.teamDetailsDrawer.label.teamCountry') }}: {{ profile.teamProfile.country.countryName }}
</div>
</div>
<div class="flex-b team-row">
<div class="team-col nowrap-ellipsis">
创建时间: {{ profile.teamProfile.createTime }}
{{ $t('pages.teamDetailsDrawer.label.createdTime') }}: {{ profile.teamProfile.createTime }}
</div>
<div class="team-col nowrap-ellipsis">
修改时间: {{ profile.teamProfile.updateTime }}
{{ $t('pages.teamDetailsDrawer.label.updatedTime') }}: {{ profile.teamProfile.updateTime }}
</div>
</div>
@ -65,7 +65,7 @@
</div>
<div v-if="profile.createUserProfile || profile.createUserNickname">
<div class="blockquote">创建用户</div>
<div class="blockquote">{{ $t('pages.teamDetailsDrawer.section.createdBy') }}</div>
<div class="content">
<user-table-exhibit v-if="profile.createUserProfile" :user-profile="profile.createUserProfile" :query-details="true" :tag-name="profile.createUserBdRoles ? 'BD': ''" />
<span v-else>{{ profile.createUserNickname }}</span>
@ -73,7 +73,7 @@
</div>
<div v-if="profile.updateUserProfile || profile.updateUserNickname">
<div class="blockquote">最近操作用户</div>
<div class="blockquote">{{ $t('pages.teamDetailsDrawer.section.lastOperator') }}</div>
<div class="content">
<user-table-exhibit v-if="profile.updateUserProfile" :user-profile="profile.updateUserProfile" :query-details="true" :tag-name="profile.updateUserBdRoles ? 'BD': ''" />
<span v-else>{{ profile.updateUserNickname }}</span>
@ -81,7 +81,7 @@
</div>
<div v-if="profile.releasePolicy">
<div class="blockquote">发布政策</div>
<div class="blockquote">{{ $t('pages.teamDetailsDrawer.section.releasePolicy') }}</div>
<div class="content">
<div class="policy">
<div v-for="(item, index) in profile.releasePolicy.policy" :key="index" class="policy-row">

View File

@ -1,7 +1,7 @@
<template>
<div class="team-member-work-drawer">
<el-drawer
title="详情"
:title="$t('pages.teamMemberWork.drawer.details')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -33,63 +33,63 @@
</div>
</div> -->
<div class="blockquote">代理</div>
<div class="blockquote">{{ $t('pages.teamMemberWork.section.agent') }}</div>
<div class="content">
<user-table-exhibit :user-profile="row.ownUserProfile" :query-details="true" />
</div>
<div class="blockquote">成员</div>
<div class="blockquote">{{ $t('pages.teamMemberWork.section.member') }}</div>
<div class="content">
<user-table-exhibit :user-profile="row.memberProfile" :query-details="true" />
</div>
<div class="blockquote">工作数据</div>
<div class="blockquote">{{ $t('pages.teamMemberWork.section.workData') }}</div>
<div class="content">
<el-row class="text-row">
<el-col class="text-col" :span="12">周期: {{ row.billBelong }}</el-col>
<el-col class="text-col" :span="12">状态: <el-tag size="mini" :type="teamBillStatusMap[row.billStatus].tag">{{ teamBillStatusMap[row.billStatus].name }}</el-tag></el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.period') }}: {{ row.billBelong }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.status') }}: <el-tag size="mini" :type="teamBillStatusMap[row.billStatus].tag">{{ teamBillStatusMap[row.billStatus].name }}</el-tag></el-col>
<el-col class="text-col" :span="12">时长(我的): {{ row.target.ownOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">时长(其他): {{ row.target.otherOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.myDuration') }}: {{ row.target.ownOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.otherDuration') }}: {{ row.target.otherOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">礼物(): {{ row.target.giveGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">礼物(): {{ row.target.acceptGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.sentGifts') }}: {{ row.target.giveGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.receivedGifts') }}: {{ row.target.acceptGiftValue || 0 }}</el-col>
<!-- <el-col class="text-col" :span="12">房间: {{ row.target.roomValue || 0 }}</el-col> -->
<el-col class="text-col" :span="12">粉丝: {{ row.memberFans || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.fans') }}: {{ row.memberFans || 0 }}</el-col>
<el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'MONEY'">成员工资$: {{ row.target.settleRes ? row.target.settleRes.memberSalary : '?' }}</div>
<div v-else>成员工资钻石: {{ row.target.settleRes ? row.target.settleRes.memberSalary : '?' }}</div>
<div v-if="row.target.settleRes.policyType === 'MONEY'">{{ $t('pages.teamMemberWork.label.memberSalaryUsd') }}: {{ row.target.settleRes ? row.target.settleRes.memberSalary : '?' }}</div>
<div v-else>{{ $t('pages.teamMemberWork.label.memberSalaryDiamonds') }}: {{ row.target.settleRes ? row.target.settleRes.memberSalary : '?' }}</div>
</el-col>
<el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'MONEY'">代理工资$: {{ row.target.settleRes ? row.target.settleRes.ownSalary : '?' }}</div>
<div v-else>代理工资钻石: {{ row.target.settleRes ? row.target.settleRes.ownSalary : '?' }}</div>
<div v-if="row.target.settleRes.policyType === 'MONEY'">{{ $t('pages.teamMemberWork.label.agentSalaryUsd') }}: {{ row.target.settleRes ? row.target.settleRes.ownSalary : '?' }}</div>
<div v-else>{{ $t('pages.teamMemberWork.label.agentSalaryDiamonds') }}: {{ row.target.settleRes ? row.target.settleRes.ownSalary : '?' }}</div>
</el-col>
<el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'MONEY'">合计工资$: {{ row.target.settleRes ? row.target.settleRes.totalSalary : '?' }}</div>
<div v-else>合计工资钻石: {{ row.target.settleRes ? row.target.settleRes.totalSalary : '?' }}</div>
<div v-if="row.target.settleRes.policyType === 'MONEY'">{{ $t('pages.teamMemberWork.label.totalSalaryUsd') }}: {{ row.target.settleRes ? row.target.settleRes.totalSalary : '?' }}</div>
<div v-else>{{ $t('pages.teamMemberWork.label.totalSalaryDiamonds') }}: {{ row.target.settleRes ? row.target.settleRes.totalSalary : '?' }}</div>
</el-col>
<!-- <el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'SALARY_DIAMOND'">平台扣除钻石: {{ row.target.settleRes ? row.target.settleRes.deductDiamonds : '?' }}</div>
</el-col> -->
<el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'SALARY_DIAMOND'">已兑换钻石: {{ row.target.settleRes ? row.target.settleRes.exchangeDiamonds : '?' }}</div>
<div v-if="row.target.settleRes.policyType === 'SALARY_DIAMOND'">{{ $t('pages.teamMemberWork.label.exchangedDiamonds') }}: {{ row.target.settleRes ? row.target.settleRes.exchangeDiamonds : '?' }}</div>
</el-col>
<el-col class="text-col" :span="12">
<div v-if="row.target.settleRes.policyType === 'SALARY_DIAMOND'">剩余钻石: {{ row.target.settleRes ? row.target.settleRes.surplusDiamonds : '?' }}</div>
<div v-if="row.target.settleRes.policyType === 'SALARY_DIAMOND'">{{ $t('pages.teamMemberWork.label.remainingDiamonds') }}: {{ row.target.settleRes ? row.target.settleRes.surplusDiamonds : '?' }}</div>
</el-col>
<el-col class="text-col" :span="12">道具奖励: {{ existsPropsRewards ? 'Yes' : 'No' }}</el-col>
<el-col v-if="existsPropsRewards" class="text-col" :span="12">领取状态: {{ row.target.settleRes.propsRewardReceive ? '已领取': '待领取' }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.propsReward') }}: {{ existsPropsRewards ? $t('pages.teamMemberWork.label.yes') : $t('pages.teamMemberWork.label.no') }}</el-col>
<el-col v-if="existsPropsRewards" class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.receiveStatus') }}: {{ row.target.settleRes.propsRewardReceive ? $t('pages.teamMemberWork.label.receivedReward') : $t('pages.teamMemberWork.label.pendingReward') }}</el-col>
<el-col v-if="existsPropsRewards" class="text-col" :span="24">
<props-row :list="row.target.settleRes.propsRewards" />
</el-col>
</el-row>
</div>
<div class="blockquote">每天工作数据</div>
<div class="blockquote">{{ $t('pages.teamMemberWork.section.dailyWorkData') }}</div>
<div class="content">
<el-card
v-for="(item, index) in row.target.dailyTargets"
@ -99,12 +99,12 @@
{{ item.dateNumber }}
</div>
<el-row class="text-row">
<el-col class="text-col" :span="12">时长(我的): {{ item.ownOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">时长(其他): {{ item.otherOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">礼物(): {{ item.giveGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">有效天: {{ item.effectiveDay || 0 }}</el-col>
<el-col class="text-col" :span="12">礼物(): {{ item.acceptGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">房间: {{ row.roomValue || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.myDuration') }}: {{ item.ownOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.otherDuration') }}: {{ item.otherOnlineTime || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.sentGifts') }}: {{ item.giveGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.effectiveDays') }}: {{ item.effectiveDay || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.receivedGifts') }}: {{ item.acceptGiftValue || 0 }}</el-col>
<el-col class="text-col" :span="12">{{ $t('pages.teamMemberWork.label.room') }}: {{ row.roomValue || 0 }}</el-col>
</el-row>
</el-card>
</div>

View File

@ -1,6 +1,6 @@
<template>
<el-dialog
title="礼物流水"
:title="$t('pages.teamMemberWork.dialog.giftTransactions')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -12,12 +12,12 @@
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.teamMemberWork.loading')"
fit
highlight-current-row
max-height="500"
>
<el-table-column label="发送人" align="center" min-width="200">
<el-table-column :label="$t('pages.teamMemberWork.table.sender')" align="center" min-width="200">
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.userProfile"
@ -29,7 +29,7 @@
<el-table-column
prop="giftValue.quantity"
label="礼物数量"
:label="$t('pages.teamMemberWork.table.giftQuantity')"
align="center"
min-width="80"
>
@ -48,19 +48,19 @@
<el-table-column
prop="giftValue.userSize"
label="接收人数"
:label="$t('pages.teamMemberWork.table.recipientCount')"
align="center"
min-width="80"
/>
<el-table-column
prop="giftValue.actualAmount"
label="消费金额"
:label="$t('pages.teamMemberWork.table.spendAmount')"
align="center"
min-width="100"
/>
<el-table-column
prop="createTime"
label="创建时间"
:label="$t('pages.teamMemberWork.table.createdTime')"
align="center"
width="200"
>
@ -68,12 +68,12 @@
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="60">
<el-table-column fixed="right" :label="$t('pages.teamMemberWork.table.actions')" align="center" width="60">
<template slot-scope="scope">
<el-button
type="text"
@click="clickQueryDetails(scope.row)"
>详情</el-button>
>{{ $t('pages.teamMemberWork.action.details') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -86,8 +86,8 @@
size="mini"
:disabled="listLoading"
@click="clickLoadMore"
>加载更多</el-button>
<span v-else>已加载全部</span>
>{{ $t('pages.teamMemberWork.action.loadMore') }}</el-button>
<span v-else>{{ $t('pages.teamMemberWork.action.loadedAll') }}</span>
</div>
<gift-history-details-drawer

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="归属系统"
:placeholder="$t('pages.teamMemberWork.placeholder.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -19,13 +19,13 @@
</el-option>
</el-select>
<div class="filter-item">
<el-input v-model="listQuery.billId" :sys-origin="listQuery.billId" placeholder="账单ID" />
<el-input v-model="listQuery.billId" :sys-origin="listQuery.billId" :placeholder="$t('pages.teamMemberWork.placeholder.billId')" />
</div>
<div class="filter-item">
<account-input v-model="listQuery.ownUserId" :sys-origin="listQuery.sysOrigin" placeholder="代理ID" />
<account-input v-model="listQuery.ownUserId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.teamMemberWork.placeholder.agentId')" />
</div>
<div class="filter-item">
<account-input v-model="listQuery.memberUserId" :sys-origin="listQuery.sysOrigin" placeholder="成员ID" />
<account-input v-model="listQuery.memberUserId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.teamMemberWork.placeholder.memberId')" />
</div>
<el-button
class="filter-item"
@ -34,7 +34,7 @@
:disabled="listLoading"
@click="handleSearch"
>
搜索
{{ $t('pages.teamMemberWork.action.search') }}
</el-button>
<el-button
@ -46,14 +46,14 @@
:loading="delLoading"
@click="clickRemoveMemberBatch"
>
删除
{{ $t('pages.teamMemberWork.action.delete') }}
</el-button>
</div>
<el-table
ref="teamTable"
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.teamMemberWork.loading')"
fit
highlight-current-row
@selection-change="selectTableChange"
@ -66,37 +66,37 @@
:selectable="tableSelectable"
/>
<el-table-column type="index" width="50" label="No" />
<el-table-column label="代理" align="left" show-overflow-tooltip min-width="220">
<el-table-column :label="$t('pages.teamMemberWork.table.agent')" align="left" show-overflow-tooltip min-width="220">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.ownUserProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column label="成员" align="center" show-overflow-tooltip min-width="220">
<el-table-column :label="$t('pages.teamMemberWork.table.member')" align="center" show-overflow-tooltip min-width="220">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.memberProfile" :query-details="true" :show-sys-origin="true" />
</template>
</el-table-column>
<el-table-column prop="salarySettlementMode" label="工资模式" show-overflow-tooltip min-width="50" />
<el-table-column prop="salarySettlementMode" :label="$t('pages.teamMemberWork.table.salaryMode')" show-overflow-tooltip min-width="80" />
<el-table-column label="周期" align="center" show-overflow-tooltip min-width="220">
<el-table-column :label="$t('pages.teamMemberWork.table.period')" align="center" show-overflow-tooltip min-width="220">
<template slot-scope="scope">
{{ scope.row.billBelong }} <el-tag size="mini" :type="teamBillStatusMap[scope.row.billStatus].tag">{{ teamBillStatusMap[scope.row.billStatus].name }}</el-tag>
</template>
</el-table-column>
<el-table-column label="时长" align="left" show-overflow-tooltip min-width="100">
<el-table-column :label="$t('pages.teamMemberWork.table.duration')" align="left" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<div>我的: {{ scope.row.target.ownOnlineTime || 0 }}</div>
<div>其他: {{ scope.row.target.otherOnlineTime || 0 }}</div>
<div>{{ $t('pages.teamMemberWork.label.mine') }}: {{ scope.row.target.ownOnlineTime || 0 }}</div>
<div>{{ $t('pages.teamMemberWork.label.other') }}: {{ scope.row.target.otherOnlineTime || 0 }}</div>
</template>
</el-table-column>
<el-table-column label="有效天" align="left" show-overflow-tooltip min-width="80">
<el-table-column :label="$t('pages.teamMemberWork.table.effectiveDays')" align="left" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<div>{{ scope.row.target.effectiveDay || 0 }}</div>
</template>
</el-table-column>
<el-table-column label="粉丝" align="left" show-overflow-tooltip min-width="100">
<el-table-column :label="$t('pages.teamMemberWork.table.fans')" align="left" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<!-- <div>
<el-link @click="queryRoomGift(scope.row)"><a :title="scope.row.target.roomValue">房间: {{ scope.row.target.roomValue || 0 }} </a></el-link>
@ -105,67 +105,67 @@
<div>{{ scope.row.memberFans || 0 }}</div>
</template>
</el-table-column>
<el-table-column label="礼物" align="left" show-overflow-tooltip min-width="100">
<el-table-column :label="$t('pages.teamMemberWork.table.gifts')" align="left" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<div>
<el-link @click="queryGiftRunningWater(scope.row,'ACCEPT')">
<a :title="scope.row.target.acceptGiftValue">
<el-tag v-if="scope.row.target.settleRes" type="info" size="mini">Lv.{{ scope.row.target.settleRes.level }}</el-tag>:
{{ $t('pages.teamMemberWork.label.received') }}<el-tag v-if="scope.row.target.settleRes" type="info" size="mini">Lv.{{ scope.row.target.settleRes.level }}</el-tag>:
{{ scope.row.target.acceptGiftValue || 0 }}
</a>
</el-link>
</div>
<div>
<el-link @click="queryGiftRunningWater(scope.row,'SEND')"><a :title="scope.row.target.giveGiftValue">: {{ scope.row.target.giveGiftValue || 0 }} </a></el-link>
<el-link @click="queryGiftRunningWater(scope.row,'SEND')"><a :title="scope.row.target.giveGiftValue">{{ $t('pages.teamMemberWork.label.sent') }}: {{ scope.row.target.giveGiftValue || 0 }} </a></el-link>
</div>
</template>
</el-table-column>
<el-table-column label="工资$" align="left" show-overflow-tooltip min-width="100">
<el-table-column :label="$t('pages.teamMemberWork.table.salaryUsd')" align="left" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<div v-if="scope.row.target.settleRes && scope.row.target.settleRes.policyType != 'SALARY_DIAMOND'">
<div>成员: {{ scope.row.target.settleRes.memberSalary }}</div>
<div>代理: {{ scope.row.target.settleRes.ownSalary }}</div>
<div>{{ $t('pages.teamMemberWork.label.member') }}: {{ scope.row.target.settleRes.memberSalary }}</div>
<div>{{ $t('pages.teamMemberWork.label.agent') }}: {{ scope.row.target.settleRes.ownSalary }}</div>
</div>
<div v-else>
<div>成员: ?</div>
<div>代理: ?</div>
<div>{{ $t('pages.teamMemberWork.label.member') }}: ?</div>
<div>{{ $t('pages.teamMemberWork.label.agent') }}: ?</div>
</div>
</template>
</el-table-column>
<el-table-column label="工资钻石" align="left" show-overflow-tooltip min-width="120">
<el-table-column :label="$t('pages.teamMemberWork.table.salaryDiamonds')" align="left" show-overflow-tooltip min-width="140">
<template slot-scope="scope">
<div v-if="scope.row.target.settleRes && scope.row.target.settleRes.policyType === 'SALARY_DIAMOND'">
<div>成员: {{ scope.row.target.settleRes.memberSalary }}</div>
<div>代理: {{ scope.row.target.settleRes.ownSalary }}</div>
<div>成员剩余: {{ scope.row.target.settleRes.surplusDiamonds }}</div>
<div>{{ $t('pages.teamMemberWork.label.member') }}: {{ scope.row.target.settleRes.memberSalary }}</div>
<div>{{ $t('pages.teamMemberWork.label.agent') }}: {{ scope.row.target.settleRes.ownSalary }}</div>
<div>{{ $t('pages.teamMemberWork.label.memberRemaining') }}: {{ scope.row.target.settleRes.surplusDiamonds }}</div>
</div>
<div v-else>
<div>?</div>
</div>
</template>
</el-table-column>
<el-table-column label="时间" align="left" show-overflow-tooltip min-width="200">
<el-table-column :label="$t('pages.teamMemberWork.table.time')" align="left" show-overflow-tooltip min-width="200">
<template slot-scope="scope">
<div>创建: {{ scope.row.createTime | dateFormat }}</div>
<div>修改: {{ scope.row.updateTime | dateFormat }}</div>
<div>{{ $t('pages.teamMemberWork.label.created') }}: {{ scope.row.createTime | dateFormat }}</div>
<div>{{ $t('pages.teamMemberWork.label.updated') }}: {{ scope.row.updateTime | dateFormat }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100">
<el-table-column fixed="right" :label="$t('pages.teamMemberWork.table.actions')" align="center" width="100">
<template slot-scope="scope">
<el-dropdown>
<span class="el-dropdown-link">
<i class="el-icon-more" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="scope.row.role !== 'OWN'" @click.native="clickQueryDetails(scope.row)">详情</el-dropdown-item>
<el-dropdown-item v-if="scope.row.role !== 'OWN'" @click.native="clickQueryDetails(scope.row)">{{ $t('pages.teamMemberWork.action.details') }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.teamMemberWork.action.loadedAll') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.teamMemberWork.action.loadMore') }}</el-button>
</div>
<room-gift-dialog

View File

@ -1,6 +1,6 @@
<template>
<el-dialog
title="房间流水"
:title="$t('pages.teamMemberWork.dialog.roomTransactions')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -12,11 +12,11 @@
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.teamMemberWork.loading')"
fit
highlight-current-row
>
<el-table-column label="发送人" align="center" min-width="200">
<el-table-column :label="$t('pages.teamMemberWork.table.sender')" align="center" min-width="200">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" :show-sys-origin="true" />
<div class="associate-block">
@ -50,7 +50,7 @@
</template>
</el-table-column>
<el-table-column prop="giftValue.quantity" label="礼物数量" align="center" min-width="80">
<el-table-column prop="giftValue.quantity" :label="$t('pages.teamMemberWork.table.giftQuantity')" align="center" min-width="80">
<template slot-scope="scope">
<div class="flex-c">
<el-image
@ -64,22 +64,22 @@
</template>
</el-table-column>
<el-table-column prop="giftValue.userSize" label="接收人数" align="center" min-width="80" />
<el-table-column prop="giftValue.actualAmount" label="消费金额" align="center" min-width="100" />
<el-table-column prop="createTime" label="创建时间" align="center" width="200">
<el-table-column prop="giftValue.userSize" :label="$t('pages.teamMemberWork.table.recipientCount')" align="center" min-width="80" />
<el-table-column prop="giftValue.actualAmount" :label="$t('pages.teamMemberWork.table.spendAmount')" align="center" min-width="100" />
<el-table-column prop="createTime" :label="$t('pages.teamMemberWork.table.createdTime')" align="center" width="200">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="60">
<el-table-column fixed="right" :label="$t('pages.teamMemberWork.table.actions')" align="center" width="60">
<template slot-scope="scope">
<el-button type="text" @click="clickQueryDetails(scope.row)">详情</el-button>
<el-button type="text" @click="clickQueryDetails(scope.row)">{{ $t('pages.teamMemberWork.action.details') }}</el-button>
</template>
</el-table-column>
</el-table>
<div v-if="list && list.length > 0" style="text-align: center; margin-top:20px;">
<el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">加载更多</el-button>
<span v-else>已加载全部</span>
<el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">{{ $t('pages.teamMemberWork.action.loadMore') }}</el-button>
<span v-else>{{ $t('pages.teamMemberWork.action.loadedAll') }}</span>
</div>
<gift-history-details-drawer

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="归属系统"
:placeholder="$t('pages.teamMember.placeholder.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -23,7 +23,7 @@
<el-select
v-model="listQuery.role"
placeholder="角色"
:placeholder="$t('pages.teamMember.placeholder.role')"
style="width: 120px"
class="filter-item"
clearable
@ -41,18 +41,21 @@
<account-input
v-model="listQuery.ownUserId"
:sys-origin="listQuery.sysOrigin"
placeholder="代理ID"
:placeholder="$t('pages.teamMember.placeholder.agentId')"
/>
</div>
<div class="filter-item">
<account-input
v-model="listQuery.memberId"
:sys-origin="listQuery.sysOrigin"
placeholder="成员ID"
:placeholder="$t('pages.teamMember.placeholder.memberId')"
/>
</div>
<div class="filter-item">
<el-input v-model="listQuery.notActiveDays" placeholder="不活跃天数" />
<el-input
v-model="listQuery.notActiveDays"
:placeholder="$t('pages.teamMember.placeholder.inactiveDays')"
/>
</div>
<div class="filter-item">
<el-date-picker
@ -61,9 +64,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="开始日期开始"
end-placeholder="结束日期结束"
:range-separator="$t('pages.teamMember.date.rangeSeparator')"
:start-placeholder="$t('pages.teamMember.date.start')"
:end-placeholder="$t('pages.teamMember.date.end')"
/>
</div>
<el-button
@ -72,7 +75,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.teamMember.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -80,7 +83,7 @@
icon="el-icon-edit"
@click="teamMebmerAddVisible = true"
>
新增
{{ $t('pages.teamMember.action.add') }}
</el-button>
<el-button
v-if="selectTableRow.length > 0"
@ -91,14 +94,14 @@
:loading="delLoading"
@click="clickRemoveMemberBatch"
>
删除
{{ $t('pages.teamMember.action.delete') }}
</el-button>
</div>
<el-table
ref="teamTable"
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.teamMember.loading')"
fit
highlight-current-row
@selection-change="selectTableChange"
@ -111,7 +114,7 @@
:selectable="tableSelectable"
/>
<el-table-column
label="代理"
:label="$t('pages.teamMember.table.agent')"
align="left"
show-overflow-tooltip
min-width="220"
@ -125,7 +128,7 @@
</el-table-column>
<el-table-column
label="成员"
:label="$t('pages.teamMember.table.member')"
align="center"
show-overflow-tooltip
min-width="220"
@ -141,7 +144,7 @@
</el-table-column>
<el-table-column
label="备注"
:label="$t('pages.teamMember.table.remarks')"
prop="remarks"
align="center"
show-overflow-tooltip
@ -149,7 +152,7 @@
/>
<el-table-column
label="创建人"
:label="$t('pages.teamMember.table.createdBy')"
align="left"
show-overflow-tooltip
min-width="220"
@ -170,17 +173,17 @@
</el-table-column>
<el-table-column
label="时间"
:label="$t('pages.teamMember.table.time')"
align="center"
show-overflow-tooltip
min-width="220"
>
<template slot-scope="scope">
<div>创建: {{ scope.row.createTime | dateFormat }}</div>
<div>活跃: {{ scope.row.activeTime | dateFormat }}</div>
<div>{{ $t('pages.teamMember.label.created') }}: {{ scope.row.createTime | dateFormat }}</div>
<div>{{ $t('pages.teamMember.label.active') }}: {{ scope.row.activeTime | dateFormat }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100">
<el-table-column fixed="right" :label="$t('pages.teamMember.table.actions')" align="center" width="100">
<template slot-scope="scope">
<el-dropdown>
<span class="el-dropdown-link">
@ -190,35 +193,38 @@
<el-dropdown-item
v-if="scope.row.role !== 'OWN'"
@click.native="clickMemberTeamChange(scope.row)"
>更换团队</el-dropdown-item
>
{{ $t('pages.teamMember.action.changeTeam') }}
</el-dropdown-item>
<el-dropdown-item
v-if="scope.row.role !== 'OWN'"
:disabled="delLoading"
@click.native="clickRemoveMember(scope.row)"
>删除成员</el-dropdown-item
>
{{ $t('pages.teamMember.action.deleteMember') }}
</el-dropdown-item>
<el-dropdown-item
@click.native="clickEditMemberRemarks(scope.row)"
>修改备注</el-dropdown-item
>
<el-dropdown-item @click.native="clickResetTarget(scope.row)"
>重置目标</el-dropdown-item
>
{{ $t('pages.teamMember.action.editRemarks') }}
</el-dropdown-item>
<el-dropdown-item @click.native="clickResetTarget(scope.row)">
{{ $t('pages.teamMember.action.resetTarget') }}
</el-dropdown-item
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<span v-if="notData">{{ $t('pages.teamMember.action.loadedAll') }}</span>
<el-button
v-else
size="mini"
:disabled="loadMoreLoading"
:loading="loadMoreLoading"
@click="clickLoadMore"
>加载更多</el-button
>{{ $t('pages.teamMember.action.loadMore') }}</el-button
>
</div>
@ -391,14 +397,14 @@ export default {
clickRemoveMember(row, index) {
const that = this;
if (that.delLoading) {
that.$opsMessage.warn("正在提交处理中!");
that.$opsMessage.warn(that.$t("pages.teamMember.message.processing"));
return;
}
that
.$confirm("是否确认删除, 本期账单工作数据将会同步移除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
.$confirm(that.$t("pages.teamMember.confirm.deleteMember"), that.$t("pages.teamMember.confirm.title"), {
confirmButtonText: that.$t("pages.teamMember.confirm.confirm"),
cancelButtonText: that.$t("pages.teamMember.confirm.cancel"),
type: "warning"
})
.then(() => {
@ -416,20 +422,19 @@ export default {
});
},
//
clickRemoveMemberBatch() {
const that = this;
if (that.delLoading) {
that.$opsMessage.warn("正在提交处理中!");
that.$opsMessage.warn(that.$t("pages.teamMember.message.processing"));
return;
}
that.selectMemberIds = that.selectTableRow.map(
item => item.userProfile.id
);
that
.$confirm("是否确认删除, 本期账单工作数据将会同步移除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
.$confirm(that.$t("pages.teamMember.confirm.deleteMember"), that.$t("pages.teamMember.confirm.title"), {
confirmButtonText: that.$t("pages.teamMember.confirm.confirm"),
cancelButtonText: that.$t("pages.teamMember.confirm.cancel"),
type: "warning"
})
.then(() => {

View File

@ -1,7 +1,7 @@
<template>
<div class="team-member-add-drawer">
<el-drawer
title="添加成员"
:title="$t('pages.teamMember.dialog.addMember')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -11,7 +11,7 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="sysOrigin" size="18px" />&nbsp;添加成员
<sys-origin-icon :icon="sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamMember.dialog.addMember') }}
</div>
<div class="team-member-add">
@ -25,22 +25,22 @@
</el-radio-group>
</el-form-item> -->
<el-form-item v-if="addMolde === 'TEAM_OWN_USER_ID'" prop="ownUserId" label="代理ID">
<account-input v-model="form.ownUserId" :sys-origin="sysOrigin" placeholder="代理ID" />
<el-form-item v-if="addMolde === 'TEAM_OWN_USER_ID'" prop="ownUserId" :label="$t('pages.teamMember.form.agentId')">
<account-input v-model="form.ownUserId" :sys-origin="sysOrigin" :placeholder="$t('pages.teamMember.placeholder.agentId')" />
</el-form-item>
<el-form-item v-if="addMolde === 'TEAM_ACCOUNT'" prop="teamAccount" label="团队账号">
<el-input v-model="form.teamAccount" placeholder="请输入团队账号" maxlength="10" show-word-limit />
<el-form-item v-if="addMolde === 'TEAM_ACCOUNT'" prop="teamAccount" :label="$t('pages.teamMember.form.teamAccount')">
<el-input v-model="form.teamAccount" :placeholder="$t('pages.teamMember.placeholder.teamAccount')" maxlength="10" show-word-limit />
</el-form-item>
<el-form-item prop="memberUserId" label="成员ID">
<account-input v-model="form.memberUserId" :sys-origin="sysOrigin" placeholder="成员ID" />
<el-form-item prop="memberUserId" :label="$t('pages.teamMember.form.memberId')">
<account-input v-model="form.memberUserId" :sys-origin="sysOrigin" :placeholder="$t('pages.teamMember.placeholder.memberId')" />
</el-form-item>
<el-form-item prop="remarks" label="备注">
<el-form-item prop="remarks" :label="$t('pages.teamMember.form.remarks')">
<el-input
v-model="form.remarks"
type="textarea"
placeholder="请输入备注"
:placeholder="$t('pages.teamMember.placeholder.remarks')"
maxlength="100"
show-word-limit
resize="none"
@ -50,8 +50,8 @@
</el-form>
</div>
<div class="drawer-footer">
<el-button @click="handleClose()">关闭</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.teamMember.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamMember.action.save') }}</el-button>
</div>
</div>
</el-drawer>
@ -72,7 +72,7 @@ export default {
},
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
{ required: true, message: this.$t('pages.teamMember.validation.requiredField'), trigger: 'blur' }
]
return {
addMolde: 'TEAM_OWN_USER_ID',
@ -116,7 +116,7 @@ export default {
methods: {
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在提交!')
this.$opsMessage.warn(this.$t('pages.teamMember.message.submitting'))
return
}
this.$emit('close')

View File

@ -1,7 +1,7 @@
<template>
<div class="member-team-change-drawer">
<el-drawer
title="更换团队"
:title="$t('pages.teamMember.dialog.changeTeam')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -11,20 +11,20 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;变更成员归属团队
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamMember.dialog.changeMemberTeam') }}
</div>
<div class="member-team-change">
<div class="drawer-form">
<el-alert
title="注意!! 切换到【不同区域】代理团队名下: 该主播相关目标工作都将删除,请谨慎操作!"
:title="$t('pages.teamMember.alert.crossRegion')"
type="warning"
effect="dark"
:closable="false"
style="margin-bottom: 10px;"
/>
<el-alert
title="注意!! 切换到【相同区域】代理团队名下: 该主播没有结算前进更换代理团队, 相关目标工作都会进行迁移!"
:title="$t('pages.teamMember.alert.sameRegion')"
type="warning"
effect="dark"
:closable="false"
@ -39,18 +39,18 @@
</el-radio-group>
</el-form-item> -->
<el-form-item v-if="addMolde === 'TEAM_OWN_USER_ID'" prop="ownUserId" label="代理ID">
<account-input v-model="form.ownUserId" :sys-origin="sysOrigin" placeholder="代理ID" />
<el-form-item v-if="addMolde === 'TEAM_OWN_USER_ID'" prop="ownUserId" :label="$t('pages.teamMember.form.agentId')">
<account-input v-model="form.ownUserId" :sys-origin="sysOrigin" :placeholder="$t('pages.teamMember.placeholder.agentId')" />
</el-form-item>
<el-form-item v-if="addMolde === 'TEAM_ACCOUNT'" prop="teamAccount" label="团队账号">
<el-input v-model="form.teamAccount" placeholder="请输入团队账号" maxlength="10" show-word-limit />
<el-form-item v-if="addMolde === 'TEAM_ACCOUNT'" prop="teamAccount" :label="$t('pages.teamMember.form.teamAccount')">
<el-input v-model="form.teamAccount" :placeholder="$t('pages.teamMember.placeholder.teamAccount')" maxlength="10" show-word-limit />
</el-form-item>
<el-form-item prop="remarks" label="备注">
<el-form-item prop="remarks" :label="$t('pages.teamMember.form.remarks')">
<el-input
v-model="form.remarks"
type="textarea"
placeholder="请输入备注"
:placeholder="$t('pages.teamMember.placeholder.remarks')"
maxlength="100"
show-word-limit
resize="none"
@ -61,8 +61,8 @@
</div>
<div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button>
<el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamMember.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamMember.action.save') }}</el-button>
</div>
</div>
</el-drawer>
@ -83,7 +83,7 @@ export default {
},
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
{ required: true, message: this.$t('pages.teamMember.validation.requiredField'), trigger: 'blur' }
]
return {
addMolde: 'TEAM_OWN_USER_ID',
@ -130,7 +130,7 @@ export default {
methods: {
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在提交!')
this.$opsMessage.warn(this.$t('pages.teamMember.message.submitting'))
return
}
this.$emit('close')

View File

@ -1,7 +1,7 @@
<template>
<div class="team-member-remarks-drawer">
<el-drawer
title="编辑备注"
:title="$t('pages.teamMember.dialog.editRemarks')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -13,11 +13,11 @@
<div class="team-member-remarks">
<div class="drawer-form">
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="remarks" label="备注">
<el-form-item prop="remarks" :label="$t('pages.teamMember.form.remarks')">
<el-input
v-model="form.remarks"
type="textarea"
placeholder="请输入备注"
:placeholder="$t('pages.teamMember.placeholder.remarks')"
maxlength="100"
show-word-limit
resize="none"
@ -28,8 +28,8 @@
</div>
<div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button>
<el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamMember.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamMember.action.save') }}</el-button>
</div>
</div>
</el-drawer>
@ -74,7 +74,7 @@ export default {
methods: {
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在提交!')
this.$opsMessage.warn(this.$t('pages.teamMember.message.submitting'))
return
}
this.$emit('close')

View File

@ -10,7 +10,7 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;重置目标
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamMember.dialog.resetTarget') }}
</div>
<div class="member-team-change">
<div class="drawer-form">
@ -18,24 +18,24 @@
type="info"
:closable="false"
style="margin:0px 0px 20px 0px;"
description="注意: 当前重置目标将计算到最新未结算账单(更细的操作将在后期完善)"
:description="$t('pages.teamMember.alert.resetTarget')"
/>
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="startTime" label="时间范围">
<el-form-item prop="startTime" :label="$t('pages.teamMember.form.timeRange')">
<el-date-picker
v-model="rangeDate"
style="width: 100%;"
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="开始日期开始"
end-placeholder="结束日期结束"
:range-separator="$t('pages.teamMember.date.rangeSeparator')"
:start-placeholder="$t('pages.teamMember.date.start')"
:end-placeholder="$t('pages.teamMember.date.end')"
/>
</el-form-item>
<el-form-item label="">
<el-checkbox v-model="form.checkAnchor">验证用户收礼物时段必须是主播身份</el-checkbox>
<el-checkbox v-model="form.checkAnchor">{{ $t('pages.teamMember.form.checkAnchor') }}</el-checkbox>
</el-form-item>
<!-- <el-form-item label="">
<el-checkbox v-model="luckyGift">处理幸运礼物目标问题(彭石刚专用)</el-checkbox>
@ -44,10 +44,10 @@
</div>
<div class="drawer-footer">
<el-button :disabled="checkLoading" @click="handleClose()">关闭</el-button>
<el-button v-if="!luckyGift" type="primary" :disabled="checkLoading" :loading="checkLoading" @click="clickCheckTarget">检测</el-button>
<el-input v-if="luckyGift" v-model="money" placeholder="请输入内容比例" />
<el-button v-if="luckyGift" type="primary" :disabled="checkLoading" :loading="checkLoading" @click="sumbitResetTargetTmp()">(彭石刚)检测幸运礼物目标问题</el-button>
<el-button :disabled="checkLoading" @click="handleClose()">{{ $t('pages.teamMember.action.close') }}</el-button>
<el-button v-if="!luckyGift" type="primary" :disabled="checkLoading" :loading="checkLoading" @click="clickCheckTarget">{{ $t('pages.teamMember.action.check') }}</el-button>
<el-input v-if="luckyGift" v-model="money" :placeholder="$t('pages.teamMember.placeholder.contentRatio')" />
<el-button v-if="luckyGift" type="primary" :disabled="checkLoading" :loading="checkLoading" @click="sumbitResetTargetTmp()">{{ $t('pages.teamMember.action.checkLuckyGiftTarget') }}</el-button>
</div>
</div>
</el-drawer>
@ -68,7 +68,7 @@ export default {
},
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
{ required: true, message: this.$t('pages.teamMember.validation.requiredField'), trigger: 'blur' }
]
return {
pickerOptions,
@ -119,7 +119,7 @@ export default {
methods: {
handleClose() {
if (this.checkLoading) {
this.$opsMessage.warn('正在处理中!')
this.$opsMessage.warn(this.$t('pages.teamMember.message.processing'))
return
}
this.$emit('close')
@ -164,9 +164,9 @@ export default {
// return
// }
that.$confirm(`是否确认恢复用户目标: ${that.targetVal}?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
that.$confirm(that.$t('pages.teamMember.confirm.restoreTarget', { target: that.targetVal }), that.$t('pages.teamMember.confirm.title'), {
confirmButtonText: that.$t('pages.teamMember.confirm.confirm'),
cancelButtonText: that.$t('pages.teamMember.confirm.cancel'),
type: 'warning'
}).then(() => {
that.submitResetTarget()
@ -194,9 +194,9 @@ export default {
// return
// }
that.$confirm(`是否确认恢复用户目标: ${that.targetVal}?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
that.$confirm(that.$t('pages.teamMember.confirm.restoreTarget', { target: that.targetVal }), that.$t('pages.teamMember.confirm.title'), {
confirmButtonText: that.$t('pages.teamMember.confirm.confirm'),
cancelButtonText: that.$t('pages.teamMember.confirm.cancel'),
type: 'warning'
}).then(() => {
that.submitResetTarget()

View File

@ -4,7 +4,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.workStatistics.placeholder.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -22,13 +22,13 @@
<el-input
v-model.trim="listQuery.userId"
v-number
placeholder="长UID"
:placeholder="$t('pages.workStatistics.placeholder.longUid')"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model.trim="listQuery.account"
placeholder="短账号"
:placeholder="$t('pages.workStatistics.placeholder.shortAccount')"
style="width: 200px;"
class="filter-item"
/>
@ -38,21 +38,21 @@
v-model="listQuery.region"
:sys-origin="listQuery.sysOrigin"
clearable
placeholder="区域"
:placeholder="$t('pages.workStatistics.placeholder.region')"
@change="handleSearch"
/>
</div>
<div class="filter-item">
<el-tooltip effect="dark" content="仅包含开始时间至结束时间区间的数据" placement="bottom">
<el-tooltip effect="dark" :content="$t('pages.workStatistics.tooltip.dateRange')" placement="bottom">
<el-date-picker
v-model="rangeDate"
style="width: 100%;"
value-format="yyyy-MM-dd"
type="daterange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="开始日期开始"
end-placeholder="结束日期结束"
:range-separator="$t('pages.workStatistics.dateRange.separator')"
:start-placeholder="$t('pages.workStatistics.dateRange.start')"
:end-placeholder="$t('pages.workStatistics.dateRange.end')"
@change="handleDateRangeChange"
/>
</el-tooltip>
@ -65,19 +65,19 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.workStatistics.action.search') }}
</el-button>
</div>
<div>
<div slot="title" class="count-item">
<i>
<strong class="strong-style"> 筛选时间</strong>
<strong class="strong-style">{{ $t('pages.workStatistics.summary.filterTime') }}</strong>
</i>
<i>
<strong class="strong-style">{{ formatDate(listQuery.startDate) }} 00:00:00</strong>
</i>
<i>
<strong class="strong-style">{{ formatDate(listQuery.endDate) }} 00:00:00 区间的数据</strong>
<strong class="strong-style">{{ $t('pages.workStatistics.summary.rangeData', { endDate: formatDate(listQuery.endDate) }) }}</strong>
</i>
</div>
</div>
@ -85,18 +85,18 @@
v-loading="listLoading"
:data="list"
:default-sort="{ prop: 'effectivePerson', order: 'descending' }"
element-loading-text="Loading"
:element-loading-text="$t('pages.workStatistics.word.loading')"
fit
highlight-current-row
@cell-mouse-enter="handleMouseEnter"
@sort-change="handleSortChange"
>
<el-table-column label="BD" align="left" min-width="190">
<el-table-column :label="$t('pages.workStatistics.table.bd')" align="left" min-width="190">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column label="自己邀请人数(一级邀请)" align="left" min-width="80">
<el-table-column :label="$t('pages.workStatistics.table.level1Invitation')" align="left" min-width="80">
<template slot-scope="scope">
<span>
{{
@ -105,7 +105,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="二级邀请人数" align="left" min-width="80">
<el-table-column :label="$t('pages.workStatistics.table.level2Invitation')" align="left" min-width="80">
<template slot-scope="scope">
<span>
{{
@ -114,7 +114,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="三级邀请人数" align="left" min-width="80">
<el-table-column :label="$t('pages.workStatistics.table.level3Invitation')" align="left" min-width="80">
<template slot-scope="scope">
<span>
{{
@ -123,7 +123,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="邀请总人数" align="left" min-width="80">
<el-table-column :label="$t('pages.workStatistics.table.totalInvitation')" align="left" min-width="80">
<template slot-scope="scope">
<span>
{{
@ -132,28 +132,28 @@
</span>
</template>
</el-table-column>
<el-table-column label="总充值(金币)" align="left" min-width="90">
<el-table-column :label="$t('pages.workStatistics.table.totalRechargeGold')" align="left" min-width="90">
<template slot-scope="scope">
<span>{{ isNull(scope.row.totalRecharge) }}</span>
</template>
</el-table-column>
<el-table-column label="BD客单价" align="left" min-width="80">
<el-table-column :label="$t('pages.workStatistics.table.bdCustomerUnitPrice')" align="left" min-width="80">
<template slot-scope="scope">
<span>{{ isNull(scope.row.customerUnitPrice) }}</span>
</template>
</el-table-column>
<el-table-column label="区域平均客单价" align="left" min-width="100">
<el-table-column :label="$t('pages.workStatistics.table.regionAvgCustomerUnitPrice')" align="left" min-width="100">
<template slot-scope="scope">
<span>{{ isNull(scope.row.regionalAvgCustomerUnitPrice) }}</span>
</template>
</el-table-column>
<el-table-column prop="effectivePerson" label="有效人数" align="" min-width="120" />
<el-table-column label="区域" align="left" min-width="180">
<el-table-column prop="effectivePerson" :label="$t('pages.workStatistics.table.effectivePerson')" align="" min-width="120" />
<el-table-column :label="$t('pages.workStatistics.table.region')" align="left" min-width="180">
<template slot-scope="scope">
<span>{{ scope.row.regionName == null ? scope.row.region : scope.row.regionName }}</span>
</template>
</el-table-column>
<el-table-column sortable prop="regionRanking" label="BD区域排名" align="" min-width="120" />
<el-table-column sortable prop="regionRanking" :label="$t('pages.workStatistics.table.bdRegionRanking')" align="" min-width="120" />
</el-table>
<pagination
v-show="total > 0"

View File

@ -11,7 +11,7 @@
direction="btt"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;自动发送工资详情({{ dateNumber }})
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.automaticSalaryPaymentRecord.detailsDrawer.title', { dateNumber }) }}
</div>
<div>
@ -20,50 +20,50 @@
fit
highlight-current-row
>
<el-table-column label="系统" align="center" width="80">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.system')" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column prop="teamRegionName" label="区域" align="center" min-width="80" />
<el-table-column prop="policyLevel" label="政策等级" align="center" width="160" />
<el-table-column prop="target" label="用户目标" align="center" min-width="80" />
<el-table-column prop="salary" label="工资" align="center" min-width="80" />
<el-table-column label="应收工资用户" align="center" min-width="80">
<el-table-column prop="teamRegionName" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.region')" align="center" min-width="80" />
<el-table-column prop="policyLevel" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.policyLevel')" align="center" width="160" />
<el-table-column prop="target" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.target')" align="center" min-width="80" />
<el-table-column prop="salary" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.salary')" align="center" min-width="80" />
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.expectedReceiver')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.anchor ? scope.row.teamMemberProfile : scope.row.teamOwnProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column label="实际接收工资用户" align="center" min-width="80">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.actualReceiver')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.hostSalaryToAgent ? scope.row.teamOwnProfile : (scope.row.anchor ? scope.row.teamMemberProfile : scope.row.teamOwnProfile)" :query-details="true" />
</template>
</el-table-column>
<el-table-column label="团长代收" align="center" min-width="80">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.hostSalaryToAgent')" align="center" min-width="80">
<template slot-scope="scope">
<span v-if="!scope.row.hostSalaryToAgent"></span>
<el-tag v-if="scope.row.hostSalaryToAgent" effect="plain">代收</el-tag>
<span v-if="!scope.row.hostSalaryToAgent">{{ $t('pages.automaticSalaryPaymentRecord.words.no') }}</span>
<el-tag v-if="scope.row.hostSalaryToAgent" effect="plain">{{ $t('pages.automaticSalaryPaymentRecord.words.collectedByCaptain') }}</el-tag>
</template>
</el-table-column>
<el-table-column label="已收回" align="center" min-width="80">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.recycled')" align="center" min-width="80">
<template slot-scope="scope">
<span v-if="!scope.row.recycled"></span>
<el-tag v-if="scope.row.recycled" type="danger" effect="plain">已收回</el-tag>
<span v-if="!scope.row.recycled">{{ $t('pages.automaticSalaryPaymentRecord.words.no') }}</span>
<el-tag v-if="scope.row.recycled" type="danger" effect="plain">{{ $t('pages.automaticSalaryPaymentRecord.words.recycled') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="createTime" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center" width="160">
<el-table-column prop="updateTime" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.updateTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="140">
<el-table-column fixed="right" :label="$t('pages.automaticSalaryPaymentRecord.detailsDrawer.table.actions')" align="center" width="140">
<template slot-scope="scope">
<el-button type="text" @click="clickDetailsDrawer(scope.row)">查看</el-button>
<el-button type="text" @click="clickDetailsDrawer(scope.row)">{{ $t('pages.automaticSalaryPaymentRecord.action.view') }}</el-button>
</template>
</el-table-column>
</el-table>

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.automaticSalaryPaymentRecord.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -19,14 +19,18 @@
</el-option>
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" />
<account-input
v-model="listQuery.userId"
:sys-origin="listQuery.sysOrigin"
:placeholder="$t('pages.automaticSalaryPaymentRecord.filter.userId')"
/>
</div>
<div class="filter-item">
<el-date-picker
v-model="listQuery.dateNumber"
type="month"
placeholder="选择日期"
format="yyyy 年 MM 月"
:placeholder="$t('pages.automaticSalaryPaymentRecord.filter.selectMonth')"
:format="$t('pages.automaticSalaryPaymentRecord.date.format')"
value-format="yyyyMM"
/>
</div>
@ -37,7 +41,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.automaticSalaryPaymentRecord.action.search') }}
</el-button>
</div>
<el-table
@ -47,31 +51,31 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.table.system')" prop="sysOrigin" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.table.user')" align="center">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column prop="dateNumber" label="年月" align="center" />
<el-table-column prop="createTime" label="创建时间" align="center">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.table.dateNumber')" prop="dateNumber" align="center" />
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.table.createTime')" prop="createTime" align="center">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center">
<el-table-column :label="$t('pages.automaticSalaryPaymentRecord.table.updateTime')" prop="updateTime" align="center">
<template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<el-table-column fixed="right" :label="$t('pages.automaticSalaryPaymentRecord.table.actions')" align="center">
<template slot-scope="scope">
<el-button type="text" @click="clickDetailsDrawer(scope.row)">查看明细</el-button>
<el-button type="text" @click="clickRemarkDrawer(scope.row)">查看备注</el-button>
<el-button type="text" @click="clickDetailsDrawer(scope.row)">{{ $t('pages.automaticSalaryPaymentRecord.action.viewDetails') }}</el-button>
<el-button type="text" @click="clickRemarkDrawer(scope.row)">{{ $t('pages.automaticSalaryPaymentRecord.action.viewRemarks') }}</el-button>
</template>
</el-table-column>
</el-table>

View File

@ -1,7 +1,7 @@
<template>
<div class="team-bill-drawer">
<el-drawer
title="详情"
:title="$t('pages.automaticSalaryPaymentRecord.policyDrawer.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -12,59 +12,59 @@
>
<div class="team-bill-content">
<div class="blockquote">团长</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.captain') }}</div>
<div class="content">
<user-table-exhibit :user-profile="row.teamOwnProfile" :query-details="true" />
</div>
<div class="blockquote">成员</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.member') }}</div>
<div class="content">
<user-table-exhibit :user-profile="row.teamMemberProfile" :query-details="true" />
</div>
<div v-if="row.recycled" class="blockquote">退款用户</div>
<div v-if="row.recycled" class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.refundUser') }}</div>
<div v-if="row.recycled" class="content">
<user-table-exhibit :user-profile="row.refundUser" :query-details="true" />
</div>
<div class="blockquote">账单信息</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.billInfo') }}</div>
<div class="content">
<div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis">
工资凭据ID: {{ row.id }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.recordId') }}: {{ row.id }}
</div>
<div class="right bill-col nowrap-ellipsis">
区域: {{ row.teamRegionName }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.region') }}: {{ row.teamRegionName }}
</div>
</div>
<div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis">
工资($): {{ row.salary || 0 }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.salary') }}: {{ row.salary || 0 }}
</div>
<div class="right bill-col nowrap-ellipsis">
工资接收方: {{ row.anchor ? '成员' : '团长' }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.receiver') }}: {{ row.anchor ? $t('pages.automaticSalaryPaymentRecord.words.member') : $t('pages.automaticSalaryPaymentRecord.words.captain') }}
</div>
</div>
<div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis">
是否团长代收: {{ row.hostSalaryToAgent ? '是' : '否' }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.hostSalaryToAgent') }}: {{ row.hostSalaryToAgent ? $t('pages.automaticSalaryPaymentRecord.words.yes') : $t('pages.automaticSalaryPaymentRecord.words.no') }}
</div>
<div class="right bill-col nowrap-ellipsis">
是否已收回: {{ row.recycled ? '是' : '否' }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.recycled') }}: {{ row.recycled ? $t('pages.automaticSalaryPaymentRecord.words.yes') : $t('pages.automaticSalaryPaymentRecord.words.no') }}
</div>
</div>
<div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis">
实际收款账户: {{ row.hostSalaryToAgent ? '团长账户' : (row.anchor ? '成员账户' : '团长账户') }}
{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.actualReceiveAccount') }}: {{ getActualAccountLabel() }}
</div>
<div class="left bill-col nowrap-ellipsis">
<el-tag v-if="row.recycled" type="danger" effect="plain">实际扣款账户: {{ row.hostSalaryToAgent ? '团长账户' : (row.anchor ? '成员账户' : '团长账户') }}</el-tag>
<el-tag v-if="row.recycled" type="danger" effect="plain">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.labels.actualDeductAccount') }}: {{ getActualAccountLabel() }}</el-tag>
</div>
</div>
<div class="bill-row">
<div class="blockquote">备注</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.remarks') }}</div>
<div class="content">
<el-timeline :reverse="true">
<el-timeline-item
@ -82,7 +82,7 @@
</div>
<div>
<div class="blockquote">政策: Lv.{{ row.policy.level }}</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.policyDrawer.sections.policy', { level: row.policy.level }) }}</div>
<div class="content">
<div class="policy">
<div v-if="row.policy" class="policy-row">
@ -138,6 +138,14 @@ export default {
}
},
methods: {
getActualAccountLabel() {
if (this.row.hostSalaryToAgent) {
return this.$t('pages.automaticSalaryPaymentRecord.words.captainAccount')
}
return this.row.anchor
? this.$t('pages.automaticSalaryPaymentRecord.words.memberAccount')
: this.$t('pages.automaticSalaryPaymentRecord.words.captainAccount')
},
handleClose() {
this.$emit('close')
}

View File

@ -1,7 +1,7 @@
<template>
<div class="team-bill-drawer">
<el-drawer
title="详情"
:title="$t('pages.automaticSalaryPaymentRecord.remarkDrawer.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -13,7 +13,7 @@
<div class="team-bill-content">
<div v-if="row.remarks && row.remarks.length > 0">
<div class="blockquote">内部备注</div>
<div class="blockquote">{{ $t('pages.automaticSalaryPaymentRecord.remarkDrawer.sections.internalRemarks') }}</div>
<div class="content">
<el-timeline :reverse="true">
<el-timeline-item

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankDiamondWithdrawGoldApply.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -24,26 +24,26 @@
<account-input
v-model="listQuery.submitUserId"
:sys-origin="listQuery.sysOrigin"
placeholder="提交用户ID"
:placeholder="$t('pages.userBankDiamondWithdrawGoldApply.filter.submitUserId')"
/>
</div>
<div class="filter-item">
<account-input
v-model="listQuery.acceptUserId"
:sys-origin="listQuery.sysOrigin"
placeholder="接收用户ID"
:placeholder="$t('pages.userBankDiamondWithdrawGoldApply.filter.acceptUserId')"
/>
</div>
<el-select
v-model="listQuery.acceptAccount"
placeholder="类型"
:placeholder="$t('pages.userBankDiamondWithdrawGoldApply.filter.acceptAccount')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="自己" :value="'GOLD'" />
<el-option label="货运代理账户" :value="'FREIGHT'" />
<el-option :label="$t('pages.userBankDiamondWithdrawGoldApply.acceptAccount.GOLD')" :value="'GOLD'" />
<el-option :label="$t('pages.userBankDiamondWithdrawGoldApply.acceptAccount.FREIGHT')" :value="'FREIGHT'" />
</el-select>
<div class="filter-item">
@ -52,9 +52,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankDiamondWithdrawGoldApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankDiamondWithdrawGoldApply.date.start')"
:end-placeholder="$t('pages.userBankDiamondWithdrawGoldApply.date.end')"
/>
</div>
<el-button
@ -64,7 +64,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankDiamondWithdrawGoldApply.action.search') }}
</el-button>
</div>
<el-table
@ -74,7 +74,7 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column :label="$t('pages.userBankDiamondWithdrawGoldApply.table.system')" prop="sysOrigin" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon
:icon="scope.row.sysOrigin"
@ -82,7 +82,7 @@
/>
</template>
</el-table-column>
<el-table-column label="提交用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankDiamondWithdrawGoldApply.table.submitUser')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.submitUser"
@ -90,7 +90,7 @@
/>
</template>
</el-table-column>
<el-table-column label="接收用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankDiamondWithdrawGoldApply.table.acceptUser')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.acceptUser"
@ -100,48 +100,48 @@
</el-table-column>
<el-table-column
prop="acceptAccountName"
label="接收方式"
:label="$t('pages.userBankDiamondWithdrawGoldApply.table.acceptAccount')"
align="center"
width="100"
/>
<el-table-column
prop="amount"
label="提交金额"
:label="$t('pages.userBankDiamondWithdrawGoldApply.table.amount')"
align="center"
min-width="80"
/>
<el-table-column
prop="exchangeRate"
label="兑换比率"
:label="$t('pages.userBankDiamondWithdrawGoldApply.table.exchangeRate')"
align="center"
min-width="80"
/>
<el-table-column
prop="goldQuantity"
label="获得金币"
:label="$t('pages.userBankDiamondWithdrawGoldApply.table.goldQuantity')"
align="center"
min-width="80"
/>
<el-table-column
prop="createTime"
label="创建时间"
:label="$t('pages.userBankDiamondWithdrawGoldApply.table.createTime')"
align="center"
width="160"
>
<template slot-scope="scope">
创建日期{{ scope.row.createTime | dateFormat }}
{{ $t('pages.userBankDiamondWithdrawGoldApply.table.createDate') }}: {{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<span v-if="notData">{{ $t('pages.userBankDiamondWithdrawGoldApply.action.allLoaded') }}</span>
<el-button
v-else
size="mini"
:disabled="loadMoreLoading"
:loading="loadMoreLoading"
@click="clickLoadMore"
>加载更多</el-button
>{{ $t('pages.userBankDiamondWithdrawGoldApply.action.loadMore') }}</el-button
>
</div>
</div>
@ -169,7 +169,7 @@ export default {
lastId: "",
startTime: "",
endTime: "",
amountType:"SALARY_DIAMOND"
amountType:"SALARY_DIAMOND"
},
listLoading: false,
list: [],

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankRunningWater.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -19,22 +19,22 @@
</el-option>
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" />
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userBankRunningWater.filter.userId')" />
</div>
<el-select
v-model="listQuery.type"
placeholder="类型"
:placeholder="$t('pages.userBankRunningWater.filter.type')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="收入" :value="0" />
<el-option label="支出" :value="1" />
<el-option :label="$t('pages.userBankRunningWater.type.income')" :value="0" />
<el-option :label="$t('pages.userBankRunningWater.type.expense')" :value="1" />
</el-select>
<el-select
v-model="listQuery.event"
placeholder="事件"
:placeholder="$t('pages.userBankRunningWater.filter.event')"
style="width: 120px"
class="filter-item"
clearable
@ -43,7 +43,7 @@
<el-option
v-for="(item, index) in userBankWaterEvent"
:key="index"
:label="item.name"
:label="getEventDesc(item.value)"
:value="item.value"
/>
</el-select>
@ -54,9 +54,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankRunningWater.date.to')"
:start-placeholder="$t('pages.userBankRunningWater.date.start')"
:end-placeholder="$t('pages.userBankRunningWater.date.end')"
/>
</div>
<el-button
@ -66,13 +66,13 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankRunningWater.action.search') }}
</el-button>
</div>
<el-alert
v-if="isCalculateTotalAmount"
v-loading="isCalculateTotalLoading"
:title="'金额($): '+ calculateTotalValue"
:title="$t('pages.userBankRunningWater.summary.amount', { amount: calculateTotalValue })"
type="success"
effect="dark"
style="font-weight: bold;padding: 10px;"
@ -81,16 +81,16 @@
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.userBankRunningWater.loading')"
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column prop="sysOrigin" :label="$t('pages.userBankRunningWater.table.system')" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankRunningWater.table.user')" align="center" min-width="80">
<template slot-scope="scope">
<div><user-table-exhibit :size="scope.row.userProfile ? 'mini' : 'small'" :user-profile="scope.row.userProfile" :query-details="true" /></div>
<div v-if="scope.row.tmpUserProfile" class="attached">
@ -98,8 +98,12 @@
</div>
</template>
</el-table-column>
<el-table-column prop="typeName" label="类型" align="center" width="80" />
<el-table-column label="数量" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankRunningWater.table.type')" align="center" width="80">
<template slot-scope="scope">
{{ getTypeName(scope.row.type, scope.row.typeName) }}
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankRunningWater.table.amount')" align="center" min-width="80">
<template slot-scope="scope">
<div>
<span v-if="scope.row.type === 0" class="font-danger">+{{ scope.row.amount }}</span>
@ -107,23 +111,23 @@
</div>
</template>
</el-table-column>
<el-table-column prop="balance" label="余额" align="center" min-width="80" />
<el-table-column label="事件" align="center">
<el-table-column prop="balance" :label="$t('pages.userBankRunningWater.table.balance')" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankRunningWater.table.event')" align="center">
<template slot-scope="scope">
<div>{{ getEventDesc(scope.row.event) }}</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" min-width="160" />
<el-table-column prop="createUserOriginName" label="创建源" align="center" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="remark" :label="$t('pages.userBankRunningWater.table.remark')" align="center" min-width="160" />
<el-table-column prop="createUserOriginName" :label="$t('pages.userBankRunningWater.table.createOrigin')" align="center" />
<el-table-column prop="createTime" :label="$t('pages.userBankRunningWater.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.userBankRunningWater.action.allLoaded') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.userBankRunningWater.action.loadMore') }}</el-button>
</div>
</div>
</template>
@ -137,7 +141,7 @@ export default {
name: 'UserBankRunningWater',
data() {
return {
userBankWaterEvent,
rawUserBankWaterEvent: userBankWaterEvent,
rangeDate: [],
thatSelectedUserId: '',
thatSelectedAcceptUserId: '',
@ -163,6 +167,9 @@ export default {
}
},
computed: {
userBankWaterEvent() {
return this.rawUserBankWaterEvent
},
...mapGetters(['permissionsSysOriginPlatforms'])
},
watch: {
@ -219,10 +226,10 @@ export default {
},
getTransferDescriptionName(event) {
if (event === 'TRANSFER') {
return '收款人'
return this.$t('pages.userBankRunningWater.transfer.payee')
}
if (event === 'RECEIVE_TRANSFER') {
return '付款人'
return this.$t('pages.userBankRunningWater.transfer.payer')
}
return ''
},
@ -235,12 +242,18 @@ export default {
that.renderData()
},
getEventDesc(_key) {
const that = this
const result = that.userBankWaterEvent.filter(_event => _event.value === _key)
if (!result) {
return _key
const map = this.$t('pages.userBankRunningWater.events')
const result = this.rawUserBankWaterEvent.find(_event => _event.value === _key)
return map[_key] || (result && result.name) || _key
},
getTypeName(type, fallback) {
if (type === 0) {
return this.$t('pages.userBankRunningWater.type.income')
}
return result[0].name
if (type === 1) {
return this.$t('pages.userBankRunningWater.type.expense')
}
return fallback
},
isShowAlertMoney() {
const that = this

View File

@ -1,7 +1,7 @@
<template>
<div class="user-bank-form-edit">
<el-dialog
:title="'创建账户'"
:title="$t('pages.userBankAccounts.dialog.createAccount')"
:visible="true"
:before-close="handleClose"
:close-on-click-modal="false"
@ -12,25 +12,25 @@
>
<div class="form-edit">
<el-form ref="form" :model="form" :rules="formRules" label-width="110px" style="margin-right:50px;">
<el-form-item label="系统" prop="sysOrigin">
<el-form-item :label="$t('pages.userBankAccounts.form.system')" prop="sysOrigin">
{{ sysOrigin }}
</el-form-item>
<el-form-item label="用户id" prop="userId">
<el-form-item :label="$t('pages.userBankAccounts.form.userId')" prop="userId">
<account-input v-model="form.userId" :sys-origin="sysOrigin" placeholder="用户ID" />
<account-input v-model="form.userId" :sys-origin="sysOrigin" :placeholder="$t('pages.userBankAccounts.filter.userId')" />
</el-form-item>
<el-form-item label="金额" prop="quantity">
<el-input v-model.trim="form.quantity" placeholder="请输入发送金额" class="input-with-select" maxlength="10" />
<el-form-item :label="$t('pages.userBankAccounts.form.amount')" prop="quantity">
<el-input v-model.trim="form.quantity" :placeholder="$t('pages.userBankAccounts.placeholder.sendAmount')" class="input-with-select" maxlength="10" />
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-input v-model.trim="form.remark" placeholder="对内备注" class="input-with-select" maxlength="10" />
<el-form-item :label="$t('pages.userBankAccounts.form.internalRemark')" prop="remark">
<el-input v-model.trim="form.remark" :placeholder="$t('pages.userBankAccounts.form.internalRemark')" class="input-with-select" maxlength="10" />
</el-form-item>
</el-form>
</div>
<div slot="footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" :loading="submitLoading" :disabled="searchDisabled" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.userBankAccounts.action.cancel') }}</el-button>
<el-button type="primary" :loading="submitLoading" :disabled="searchDisabled" @click="submitForm()">{{ $t('pages.userBankAccounts.action.save') }}</el-button>
</div>
</el-dialog>
@ -54,10 +54,6 @@ export default {
}
},
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
]
return {
searchDisabled: false,
userInfo: {},
@ -66,23 +62,23 @@ export default {
userId: '',
quantity: '',
remark: ''
},
formRules: {
userId: commonRules,
// earnPoints: { required: true, message: '0', validator: (rule, value, callback) => {
// if (!value || value <= 0) {
// callback(new Error())
// return
// }
// callback()
// }, trigger: 'blur' },
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' }
}
}
},
computed: {
commonRules() {
return [
{ required: true, message: this.$t('pages.userBankAccounts.validation.required'), trigger: 'blur' }
]
},
formRules() {
return {
userId: this.commonRules,
quantity: { required: true, message: this.$t('pages.userBankAccounts.validation.requiredField'), trigger: 'blur' }
}
},
textOptTitle() {
return this.row && this.row.id ? '修改' : '添加'
return this.row && this.row.id ? this.$t('pages.userBankAccounts.action.edit') : this.$t('pages.userBankAccounts.action.add')
},
isUpdate() {
return this.row && this.row.id

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankAccounts.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -20,7 +20,7 @@
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" />
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userBankAccounts.filter.userId')" />
</div>
<el-button
class="filter-item"
@ -29,7 +29,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankAccounts.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -37,7 +37,7 @@
icon="el-icon-edit"
@click="handleCreate"
>
添加
{{ $t('pages.userBankAccounts.action.add') }}
</el-button>
<el-button
class="filter-item"
@ -47,68 +47,68 @@
:loading="exportLoading"
@click="exprotExcel"
>
导出
{{ $t('pages.userBankAccounts.action.export') }}
</el-button>
<el-button
class="filter-item"
type="primary"
@click="readExcel"
>
导入<i class="el-icon-upload el-icon--right" />
{{ $t('pages.userBankAccounts.action.import') }}<i class="el-icon-upload el-icon--right" />
</el-button>
</div>
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
:element-loading-text="$t('pages.userBankAccounts.loading')"
fit
highlight-current-row
@cell-mouse-enter="handleMouseEnter"
>
<el-table-column type="index" width="50" label="No" />
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column prop="sysOrigin" :label="$t('pages.userBankAccounts.table.system')" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="200">
<el-table-column :label="$t('pages.userBankAccounts.table.user')" align="center" min-width="200">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column prop="earnPoints" label="获得总额" align="center" min-width="100" />
<el-table-column prop="consumptionPoints" label="消费总额" align="center" min-width="100" />
<el-table-column prop="balance" label="余额" align="center" min-width="100" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="earnPoints" :label="$t('pages.userBankAccounts.table.earnPoints')" align="center" min-width="100" />
<el-table-column prop="consumptionPoints" :label="$t('pages.userBankAccounts.table.consumptionPoints')" align="center" min-width="100" />
<el-table-column prop="balance" :label="$t('pages.userBankAccounts.table.balance')" align="center" min-width="100" />
<el-table-column prop="createTime" :label="$t('pages.userBankAccounts.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center" width="160">
<el-table-column prop="updateTime" :label="$t('pages.userBankAccounts.table.updateTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<el-table-column fixed="right" :label="$t('pages.userBankAccounts.table.actions')" align="center">
<template slot-scope="scope">
<el-dropdown>
<span class="el-dropdown-link">
<i class="el-icon-more" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="showGoldInputBox(scope.row, true)">发送</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, false)">扣除</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, true)">{{ $t('pages.userBankAccounts.action.send') }}</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, false)">{{ $t('pages.userBankAccounts.action.deduct') }}</el-dropdown-item>
<el-dropdown-item @click.native="showTransferBox(scope.row)">转账</el-dropdown-item>
<el-dropdown-item @click.native="clickRunningWater(scope.row)">流水</el-dropdown-item>
<el-dropdown-item @click.native="showTransferBox(scope.row)">{{ $t('pages.userBankAccounts.action.transfer') }}</el-dropdown-item>
<el-dropdown-item @click.native="clickRunningWater(scope.row)">{{ $t('pages.userBankAccounts.action.transactions') }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.userBankAccounts.action.allLoaded') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.userBankAccounts.action.loadMore') }}</el-button>
</div>
<form-edit
v-if="formEditVisable"
@ -119,7 +119,7 @@
/>
<div class="gold-input-box">
<el-dialog
:title=" type ? '发送' : '扣除'"
:title="getGoldActionName(type)"
:visible="goldInputBoxVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -133,31 +133,31 @@
label-width="70px"
style="width: 300px; margin-left:50px;"
>
<el-form-item label="金额" prop="quantity">
<el-form-item :label="$t('pages.userBankAccounts.form.amount')" prop="quantity">
<el-input
v-model.trim="formData.quantity"
:placeholder="'请输入' + (type ? '发送' : '扣除') + '金额'"
:placeholder="getGoldAmountPlaceholder(type)"
/>
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-form-item :label="$t('pages.userBankAccounts.form.internalRemark')" prop="remark">
<el-input
v-model.trim="formData.remark"
placeholder="请输入对内备注"
:placeholder="$t('pages.userBankAccounts.placeholder.internalRemark')"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="hideGoldInputBox()">
取消
{{ $t('pages.userBankAccounts.action.cancel') }}
</el-button>
<el-button
v-loading="listLoading"
type="primary"
@click="goldSubmit()"
>
提交
{{ $t('pages.userBankAccounts.action.submit') }}
</el-button>
</div>
</el-dialog>
@ -176,7 +176,7 @@
/>
<div class="gold-input-box">
<el-dialog
title="转账"
:title="$t('pages.userBankAccounts.action.transfer')"
:visible="transferVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -191,45 +191,45 @@
style="width: 400px; margin-left:50px;"
>
<el-form-item prop="acceptUserId" label="收款人">
<account-input ref="transferAccountInput" v-model="transferFormData.acceptUserId" :sys-origin="transferFormData.sysOrigin" placeholder="用户账号" />
<el-form-item prop="acceptUserId" :label="$t('pages.userBankAccounts.form.payee')">
<account-input ref="transferAccountInput" v-model="transferFormData.acceptUserId" :sys-origin="transferFormData.sysOrigin" :placeholder="$t('pages.userBankAccounts.placeholder.userAccount')" />
</el-form-item>
<el-form-item label="金额" prop="quantity">
<el-form-item :label="$t('pages.userBankAccounts.form.amount')" prop="quantity">
<el-input
v-model.trim="transferFormData.quantity"
:placeholder="'请输入转账金额'"
:placeholder="$t('pages.userBankAccounts.placeholder.transferAmount')"
/>
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-form-item :label="$t('pages.userBankAccounts.form.internalRemark')" prop="remark">
<el-input
v-model.trim="transferFormData.remark"
placeholder="请输入对内备注"
:placeholder="$t('pages.userBankAccounts.placeholder.internalRemark')"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="hideTransferBox()">
取消
{{ $t('pages.userBankAccounts.action.cancel') }}
</el-button>
<el-button
v-loading="listLoading"
type="primary"
@click="transferSubmit()"
>
提交
{{ $t('pages.userBankAccounts.action.submit') }}
</el-button>
</div>
</el-dialog>
</div>
<div class="excel-import">
<el-dialog title="导入数据" :visible.sync="uploadDialogVisible" :close-on-click-modal="false" width="400px" :modal-append-to-body="true" :append-to-body="true">
<el-dialog :title="$t('pages.userBankAccounts.importDialog.title')" :visible.sync="uploadDialogVisible" :close-on-click-modal="false" width="400px" :modal-append-to-body="true" :append-to-body="true">
<div class="upload_box">
<span>请选择导入文件</span>
<el-button type="text" :loading="downloadTemplateLoading"><i class="el-icon-tickets" style="margin-right: 4px;" /><a href="https://dev.file.momooline.com/files/Import%20Template.xlsx">模板下载</a></el-button>
<span>{{ $t('pages.userBankAccounts.importDialog.selectFile') }}</span>
<el-button type="text" :loading="downloadTemplateLoading"><i class="el-icon-tickets" style="margin-right: 4px;" /><a href="https://dev.file.momooline.com/files/Import%20Template.xlsx">{{ $t('pages.userBankAccounts.importDialog.downloadTemplate') }}</a></el-button>
<el-upload
ref="upload"
class="upload-demo"
@ -242,7 +242,7 @@
:http-request="uploadTemplate"
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__text">{{ $t('pages.userBankAccounts.importDialog.dragHere') }}<em>{{ $t('pages.userBankAccounts.importDialog.clickUpload') }}</em></div>
</el-upload>
</div>
</el-dialog>
@ -260,9 +260,6 @@ export default {
name: 'UserBankBalance',
components: { FormEdit, RunningWater },
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
]
return {
runningWaterVisible: false,
thatRow: null,
@ -293,17 +290,6 @@ export default {
sysOrigin: '',
remark: ''
},
formRules: {
userId: commonRules,
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' },
sysOrigin: commonRules
},
transferFormRules: {
userId: commonRules,
acceptUserId: commonRules,
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' },
sysOrigin: commonRules
},
listLoading: false,
list: [],
notData: false,
@ -313,7 +299,27 @@ export default {
}
},
computed: {
...mapGetters(['permissionsSysOriginPlatforms'])
...mapGetters(['permissionsSysOriginPlatforms']),
commonRules() {
return [
{ required: true, message: this.$t('pages.userBankAccounts.validation.required'), trigger: 'blur' }
]
},
formRules() {
return {
userId: this.commonRules,
quantity: { required: true, message: this.$t('pages.userBankAccounts.validation.requiredField'), trigger: 'blur' },
sysOrigin: this.commonRules
}
},
transferFormRules() {
return {
userId: this.commonRules,
acceptUserId: this.commonRules,
quantity: { required: true, message: this.$t('pages.userBankAccounts.validation.requiredField'), trigger: 'blur' },
sysOrigin: this.commonRules
}
}
},
created() {
const that = this
@ -399,6 +405,12 @@ export default {
}
that.transferVisible = true
},
getGoldActionName(type) {
return type ? this.$t('pages.userBankAccounts.action.send') : this.$t('pages.userBankAccounts.action.deduct')
},
getGoldAmountPlaceholder(type) {
return type ? this.$t('pages.userBankAccounts.placeholder.sendAmount') : this.$t('pages.userBankAccounts.placeholder.deductAmount')
},
hideGoldInputBox() {
const that = this
that.goldInputBoxVisible = false
@ -480,7 +492,7 @@ export default {
that.exportLoading = false
}).catch(er => {
that.exportLoading = false
this.$opsMessage.fail('下载失败!')
this.$opsMessage.fail(this.$t('pages.userBankAccounts.message.downloadFailed'))
})
},
uploadTemplate(value) {
@ -488,7 +500,7 @@ export default {
that.uploadLoding = true
that.loading = this.$loading({
lock: true,
text: '正在导入...',
text: this.$t('pages.userBankAccounts.message.importing'),
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.5)'
})
@ -505,7 +517,7 @@ export default {
uploadSuccess() {
const that = this
setTimeout(() => {
that.$message({ type: 'success', message: '导入成功' })
that.$message({ type: 'success', message: this.$t('pages.userBankAccounts.message.importSuccess') })
that.uploadDialogVisible = false
that.uploadLoding = false
that.loading.close()
@ -514,7 +526,7 @@ export default {
},
messageError() {
const that = this
that.$message({ type: 'error', message: '导入失败,请重试!' })
that.$message({ type: 'error', message: this.$t('pages.userBankAccounts.message.importFailed') })
that.uploadLoding = false
that.loading.close()
that.renderData(true)

View File

@ -1,6 +1,6 @@
<template>
<el-dialog
title="用户银行账户流水"
:title="$t('pages.userBankAccounts.dialog.accountTransactions')"
:visible="true"
:before-close="handleClose"
:close-on-click-modal="false"
@ -14,17 +14,17 @@
v-loading="listLoading"
:data="list"
:before-close="handleClose"
element-loading-text="Loading"
:element-loading-text="$t('pages.userBankAccounts.loading')"
fit
highlight-current-row
max-height="350px"
>
<el-table-column prop="sysOrigin" label="系统" align="center">
<el-table-column prop="sysOrigin" :label="$t('pages.userBankRunningWater.table.system')" align="center">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankRunningWater.table.user')" align="center" min-width="80">
<template slot-scope="scope">
<div><user-table-exhibit :size="scope.row.userProfile ? 'mini' : 'small'" :user-profile="scope.row.userProfile" :query-details="true" /></div>
<div v-if="scope.row.tmpUserProfile" class="attached">
@ -32,8 +32,12 @@
</div>
</template>
</el-table-column>
<el-table-column prop="typeName" label="类型" align="center" width="80" />
<el-table-column label="数量" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankRunningWater.table.type')" align="center" width="80">
<template slot-scope="scope">
{{ getTypeName(scope.row.type, scope.row.typeName) }}
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankRunningWater.table.amount')" align="center" min-width="80">
<template slot-scope="scope">
<div>
<span v-if="scope.row.type === 0" class="font-danger">+{{ scope.row.amount }}</span>
@ -41,14 +45,14 @@
</div>
</template>
</el-table-column>
<el-table-column prop="balance" label="余额" align="center" />
<el-table-column label="事件" align="center">
<el-table-column prop="balance" :label="$t('pages.userBankRunningWater.table.balance')" align="center" />
<el-table-column :label="$t('pages.userBankRunningWater.table.event')" align="center">
<template slot-scope="scope">
<div>{{ getEventDesc(scope.row.event) }}</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" min-width="200" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="remark" :label="$t('pages.userBankRunningWater.table.remark')" align="center" min-width="200" />
<el-table-column prop="createTime" :label="$t('pages.userBankRunningWater.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
@ -56,8 +60,8 @@
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.userBankRunningWater.action.allLoaded') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.userBankRunningWater.action.loadMore') }}</el-button>
</div>
</div>
</el-dialog>
@ -128,10 +132,10 @@ export default {
},
getTransferDescriptionName(event) {
if (event === 'TRANSFER') {
return '收款人'
return this.$t('pages.userBankRunningWater.transfer.payee')
}
if (event === 'RECEIVE_TRANSFER') {
return '付款人'
return this.$t('pages.userBankRunningWater.transfer.payer')
}
return ''
},
@ -143,13 +147,22 @@ export default {
that.loadMoreLoading = true
that.renderData()
},
getEventDesc(_key) {
const that = this
const result = that.userBankWaterEvent.filter(_event => _event.value === _key)
if (!result) {
return _key
getTypeName(type, fallback) {
if (type === 0) {
return this.$t('pages.userBankRunningWater.type.income')
}
return result[0].name
if (type === 1) {
return this.$t('pages.userBankRunningWater.type.expense')
}
return fallback || type
},
getEventDesc(_key) {
const translated = this.$t(`pages.userBankRunningWater.events.${_key}`)
if (translated !== `pages.userBankRunningWater.events.${_key}`) {
return translated
}
const result = this.userBankWaterEvent.find(_event => _event.value === _key)
return result ? result.name : _key
}
}
}

View File

@ -10,41 +10,41 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;审核提现申请
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.title') }}
</div>
<div class="team-bill-settle">
<div class="drawer-form">
<div class="blockquote">提交人</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.submitUser') }}</div>
<div class="content" style="display: flex;justify-content: flex-start;flex-direction: row;align-items: center;">
<user-table-exhibit :user-profile="row.submitUser" :query-details="true" style="margin: 0.4rem" />
</div>
<div v-if="row.settlementResult && row.settlementResult.acceptBankCard">
<div class="blockquote">银行卡 <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.bankCard') }} <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="content">
<div style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag effect="plain">卡号:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">收款人:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">银行:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.cardNo') }}:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.payee') }}:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.bankName') }}:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
</div>
<div v-if="row.settlementResult.acceptBankCard.del" style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag type="danger">该银行卡已被用户删除</el-tag>
<el-tag type="danger">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.bankCardDeleted') }}</el-tag>
</div>
</div>
</div>
<div class="blockquote">提现金额: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">结算
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.amount') }}: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.settlement') }}
<el-tooltip class="item" effect="dark">
<div slot="content">
<p>* 转账凭证: 结算人员发送美元或其他币种后的记录凭证截图</p>
<p>* 备注: 本次账单备注, 对外显示</p>
<p>* {{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.transferVoucherTip') }}</p>
<p>* {{ $t('pages.userBankWithdrawDiamondApply.approvalDrawer.remarkTip') }}</p>
</div>
<i class="el-icon-info" />
</el-tooltip>
</div>
<el-form ref="form" :model="form" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="tmpExistsCertificate" label="凭证上传">
<el-form-item prop="tmpExistsCertificate" :label="$t('pages.userBankWithdrawDiamondApply.approvalDrawer.uploadVoucher')">
<el-row>
<el-col :span="8">
<upload-image
@ -73,11 +73,11 @@
</el-row>
</el-form-item>
<el-form-item label="对外备注">
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.approvalDrawer.externalRemark')">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入对外备注"
:placeholder="$t('pages.userBankWithdrawDiamondApply.approvalDrawer.externalRemarkPlaceholder')"
maxlength="100"
show-word-limit
resize="none"
@ -88,9 +88,9 @@
</div>
<div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">取消</el-button>
<el-button :disabled="submitLoading" :loading="submitLoading" @click="submit('PASS')">通过</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit('NOT_PASS')">驳回</el-button>
<el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.userBankWithdrawDiamondApply.action.cancel') }}</el-button>
<el-button :disabled="submitLoading" :loading="submitLoading" @click="submit('PASS')">{{ $t('pages.userBankWithdrawDiamondApply.action.pass') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit('NOT_PASS')">{{ $t('pages.userBankWithdrawDiamondApply.action.reject') }}</el-button>
</div>
</div>
</el-drawer>
@ -164,22 +164,15 @@ export default {
},
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在处理中!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawDiamondApply.message.processing'))
return
}
this.$emit('close')
},
getStatusName(status) {
if (status === 'SUBMIT') {
return '用户提交'
}
if (status === 'PASS') {
return '审核通过'
}
if (status === 'NOT_PASS') {
return '审核不通过'
}
return '未知'
const key = `pages.userBankWithdrawDiamondApply.approvalRecord.${status}`
const value = this.$t(key)
return value === key ? this.$t('pages.userBankWithdrawDiamondApply.approvalRecord.UNKNOWN') : value
},
getBankCardTypeName(_type) {
var _name = ''
@ -210,7 +203,7 @@ export default {
certificateUrls.push(that.certificateFour)
}
if (certificateUrls.length <= 0 && approvalStatus === 'PASS') {
this.$opsMessage.warn('请上传转账凭证, 请稍等!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawDiamondApply.message.uploadVoucherFirst'))
return
}
that.form.credential = certificateUrls

View File

@ -10,31 +10,31 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;提现申请详情
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.title') }}
</div>
<div class="team-bill-settle">
<div class="drawer-form">
<div class="blockquote">提交人</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.submitUser') }}</div>
<div class="content" style="display: flex;justify-content: flex-start;flex-direction: row;align-items: center;">
<user-table-exhibit :user-profile="row.submitUser" :query-details="true" style="margin: 0.4rem" />
</div>
<div v-if="row.settlementResult && row.settlementResult.acceptBankCard">
<div class="blockquote">银行卡 <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.bankCard') }} <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="content">
<div style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag effect="plain">卡号:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">收款人:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">银行:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.cardNo') }}:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.payee') }}:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.bankName') }}:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
</div>
<div v-if="(row.settlementResult.acceptBankCard.del || row.settlementResult.acceptBankCard.status !== 'PASS') && row.latestApprovalStatus === 'SUBMIT'" style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag type="danger">该银行卡可能已被用户删除或没有通审核,请核实.</el-tag>
<el-tag type="danger">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.bankCardRisk') }}</el-tag>
</div>
</div>
</div>
<div class="blockquote">提现金额: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">手续费(%) <span style="color:#419eff;">{{ row.serviceCharge }}</span></div>
<div class="blockquote">实际提现金额: <span style="color:#419eff;">{{ row.actualAmount }}</span></div>
<div class="blockquote">凭证</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.amount') }}: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.serviceCharge') }} <span style="color:#419eff;">{{ row.serviceCharge }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.actualAmount') }}: <span style="color:#419eff;">{{ row.actualAmount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.voucher') }}</div>
<div v-if="row.settlementResult && row.settlementResult.credential" class="content">
<div style="display: flex;flex-direction: row;justify-content: space-around;">
<div v-for="(item, index) in row.settlementResult.credential" :key="index">
@ -46,14 +46,14 @@
</div>
</div>
</div>
<div class="blockquote">审批记录</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.approvalRecords') }}</div>
<div class="content">
<div class="block">
<el-timeline>
<el-timeline-item v-for="(item, index) in row.approvalProcesses" :key="index" :timestamp="item.createTime | dateFormat" placement="top">
<el-card>
<h4>{{ getStatusName(item.status) }}</h4>
<p>备注: {{ item.remark }}</p>
<p>{{ $t('pages.userBankWithdrawDiamondApply.detailsDrawer.remark') }}: {{ item.remark }}</p>
</el-card>
</el-timeline-item>
</el-timeline>
@ -63,7 +63,7 @@
</div>
<div class="drawer-footer">
<el-button @click="handleClose()">取消</el-button>
<el-button @click="handleClose()">{{ $t('pages.userBankWithdrawDiamondApply.action.cancel') }}</el-button>
</div>
</div>
</el-drawer>
@ -114,22 +114,15 @@ export default {
methods: {
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在处理中!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawDiamondApply.message.processing'))
return
}
this.$emit('close')
},
getStatusName(status) {
if (status === 'SUBMIT') {
return '用户提交'
}
if (status === 'PASS') {
return '审核通过'
}
if (status === 'NOT_PASS') {
return '审核不通过'
}
return '未知'
const key = `pages.userBankWithdrawDiamondApply.approvalRecord.${status}`
const value = this.$t(key)
return value === key ? this.$t('pages.userBankWithdrawDiamondApply.approvalRecord.UNKNOWN') : value
},
copyBankCard(row) {
copyText(`卡号: ${row.settlementResult.acceptBankCard.cardNo || '?'}, 收款人: ${row.settlementResult.acceptBankCard.payee || '?'}, 银行: ${row.settlementResult.acceptBankCard.cardName || '?'}

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -20,7 +20,7 @@
</el-select>
<el-select
v-model="listQuery.bankCardType"
placeholder="卡片类型"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.bankCardType')"
style="width: 120px"
class="filter-item"
clearable
@ -34,33 +34,37 @@
/>
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.submitUserId" :sys-origin="listQuery.sysOrigin" placeholder="提交用户ID" />
<account-input
v-model="listQuery.submitUserId"
:sys-origin="listQuery.sysOrigin"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.submitUserId')"
/>
</div>
<el-select
v-model="listQuery.acceptMethod"
placeholder="类型"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.acceptMethod')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="自己" :value="'ONESELF'" />
<el-option label="代理" :value="'AGENT'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.acceptMethod.ONESELF')" :value="'ONESELF'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.acceptMethod.AGENT')" :value="'AGENT'" />
<el-option label="BD" :value="'BD'" />
<el-option label="其他" :value="'OTHER'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.acceptMethod.OTHER')" :value="'OTHER'" />
</el-select>
<el-select
v-model="listQuery.latestApprovalStatus"
placeholder="状态"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.status')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="用户提交" :value="'SUBMIT'" />
<el-option label="通过" :value="'PASS'" />
<el-option label="驳回" :value="'NOT_PASS'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.SUBMIT')" :value="'SUBMIT'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.PASS')" :value="'PASS'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.NOT_PASS')" :value="'NOT_PASS'" />
</el-select>
<div class="filter-item">
<el-date-picker
@ -68,9 +72,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankWithdrawDiamondApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankWithdrawDiamondApply.date.start')"
:end-placeholder="$t('pages.userBankWithdrawDiamondApply.date.end')"
/>
</div>
<el-button
@ -80,7 +84,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankWithdrawDiamondApply.action.search') }}
</el-button>
<el-button
v-if="buttonPermissions.includes('withdraw-diamond-apply:table:export')"
@ -89,7 +93,7 @@
icon="el-icon-download"
@click="exprotOrder"
>
导出
{{ $t('pages.userBankWithdrawDiamondApply.action.export') }}
</el-button>
</div>
<el-table
@ -99,42 +103,49 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.system')" prop="sysOrigin" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="提交用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.submitUser')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.submitUser" :query-details="true" />
</template>
</el-table-column>
<el-table-column prop="amount" label="提交金额" align="center" min-width="80" />
<el-table-column label="类型" align="center" min-width="80" >
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.amount')" prop="amount" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.amountType')" align="center" min-width="80">
<template slot-scope="scope">
<span v-if="scope.row.amountType === 'SALARY_DIAMOND'">钻石</span>
<span v-else>美金</span>
<span>{{ getAmountTypeLabel(scope.row.amountType) }}</span>
</template>
</el-table-column>
<el-table-column prop="serviceCharge" label="手续费(%)" align="center" min-width="80" />
<el-table-column prop="actualAmount" label="实际提现金额" align="center" min-width="80" />
<el-table-column prop="acceptMethodName" label="接收方式" align="center" min-width="80" />
<el-table-column prop="latestApprovalStatusName" label="最新审核状态" align="center" min-width="80" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.serviceCharge')" prop="serviceCharge" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.actualAmount')" prop="actualAmount" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.acceptMethod')" align="center" min-width="80">
<template slot-scope="scope">
<span>{{ getAcceptMethodLabel(scope.row.acceptMethod) || scope.row.acceptMethodName }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.approvalStatus')" align="center" min-width="80">
<template slot-scope="scope">
<span>{{ getApprovalStatusLabel(scope.row.latestApprovalStatus) || scope.row.latestApprovalStatusName }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankWithdrawDiamondApply.table.createTime')" prop="createTime" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="140">
<el-table-column fixed="right" :label="$t('pages.userBankWithdrawDiamondApply.table.actions')" align="center" width="140">
<template slot-scope="scope">
<el-button type="text" @click="clickDetailsDrawer(scope.row)">查看</el-button>
<el-button v-if="scope.row.latestApprovalStatus === 'SUBMIT'" type="text" @click="clickApprovalDrawer(scope.row, scope.$index)">审核</el-button>
<el-button type="text" @click="clickDetailsDrawer(scope.row)">{{ $t('pages.userBankWithdrawDiamondApply.action.view') }}</el-button>
<el-button v-if="scope.row.latestApprovalStatus === 'SUBMIT'" type="text" @click="clickApprovalDrawer(scope.row, scope.$index)">{{ $t('pages.userBankWithdrawDiamondApply.action.approval') }}</el-button>
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.userBankWithdrawDiamondApply.action.allLoaded') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.userBankWithdrawDiamondApply.action.loadMore') }}</el-button>
</div>
<details-drawer
v-if="detailsDrawerVisible"
@ -149,7 +160,7 @@
/>
<el-drawer
title="导出条件"
:title="$t('pages.userBankWithdrawDiamondApply.exportDialog.title')"
:visible="exportConditionVisible"
:before-close="exportConditionClose"
:close-on-press-escape="false"
@ -168,10 +179,10 @@
label-width="70px"
>
<el-form-item label="系统" prop="sysOrigin">
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.system')" prop="sysOrigin">
<el-select
v-model="exportQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.system')"
style="width: 100%;"
>
<el-option
@ -186,10 +197,10 @@
</el-select>
</el-form-item>
<el-form-item label="类型" prop="bankCardType">
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.bankCardType')" prop="bankCardType">
<el-select
v-model="exportQuery.bankCardType"
placeholder="卡片类型"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.bankCardType')"
style="width: 100%;"
clearable
>
@ -202,46 +213,50 @@
</el-select>
</el-form-item>
<el-form-item label="用户" prop="submitUserId">
<account-input v-model="exportQuery.submitUserId" :sys-origin="exportQuery.sysOrigin || listQuery.sysOrigin" placeholder="提交用户ID" />
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.user')" prop="submitUserId">
<account-input
v-model="exportQuery.submitUserId"
:sys-origin="exportQuery.sysOrigin || listQuery.sysOrigin"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.submitUserId')"
/>
</el-form-item>
<el-form-item label="状态" prop="latestApprovalStatus">
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.status')" prop="latestApprovalStatus">
<el-select
v-model="exportQuery.latestApprovalStatus"
placeholder="状态"
:placeholder="$t('pages.userBankWithdrawDiamondApply.filter.status')"
style="width: 100%;"
clearable
@change="handleSearch"
>
<el-option label="用户提交" :value="'SUBMIT'" />
<el-option label="通过" :value="'PASS'" />
<el-option label="驳回" :value="'NOT_PASS'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.SUBMIT')" :value="'SUBMIT'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.PASS')" :value="'PASS'" />
<el-option :label="$t('pages.userBankWithdrawDiamondApply.approvalStatus.NOT_PASS')" :value="'NOT_PASS'" />
</el-select>
</el-form-item>
<el-form-item label="时间" prop="startTime">
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.time')" prop="startTime">
<el-date-picker
v-model="exportDate"
style="width: 100%;"
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankWithdrawDiamondApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankWithdrawDiamondApply.date.start')"
:end-placeholder="$t('pages.userBankWithdrawDiamondApply.date.end')"
/>
</el-form-item>
<el-form-item label="数量" prop="limit">
<el-input v-model="exportQuery.limit" v-number placeholder="导出数量" />
<el-form-item :label="$t('pages.userBankWithdrawDiamondApply.exportDialog.limit')" prop="limit">
<el-input v-model="exportQuery.limit" v-number :placeholder="$t('pages.userBankWithdrawDiamondApply.exportDialog.limitPlaceholder')" />
</el-form-item>
</el-form>
</div>
<div class="drawer-footer">
<el-button @click="exportConditionClose()">关闭</el-button>
<el-button type="primary" :disabled="exportLoading" :loading="exportLoading" @click="exportConditionSubmit()">导出</el-button>
<el-button @click="exportConditionClose()">{{ $t('pages.userBankWithdrawDiamondApply.action.close') }}</el-button>
<el-button type="primary" :disabled="exportLoading" :loading="exportLoading" @click="exportConditionSubmit()">{{ $t('pages.userBankWithdrawDiamondApply.action.export') }}</el-button>
</div>
</div>
</el-drawer>
@ -260,7 +275,7 @@ export default {
components: { DetailsDrawer, ApprovalDrawer },
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
{ required: true, message: this.$t('pages.userBankWithdrawDiamondApply.validation.requiredField'), trigger: 'blur' }
]
return {
bankCardTypes,
@ -350,6 +365,25 @@ export default {
that.renderData()
},
methods: {
getAmountTypeLabel(type) {
return this.$t(`pages.userBankWithdrawDiamondApply.amountType.${type}`)
},
getAcceptMethodLabel(type) {
if (!type) {
return ''
}
const key = `pages.userBankWithdrawDiamondApply.acceptMethod.${type}`
const value = this.$t(key)
return value === key ? '' : value
},
getApprovalStatusLabel(status) {
if (!status) {
return ''
}
const key = `pages.userBankWithdrawDiamondApply.approvalStatus.${status}`
const value = this.$t(key)
return value === key ? '' : value
},
renderData(isReset) {
const that = this
if (!that.listQuery.sysOrigin) {
@ -399,7 +433,7 @@ export default {
},
exportConditionClose() {
if (this.exportLoading) {
this.$opsMessage.warn('正在执行导出, 请稍等~')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawDiamondApply.message.exporting'))
return
}
this.exportConditionVisible = false
@ -421,7 +455,7 @@ export default {
that.exportConditionVisible = false
}).catch(er => {
that.exportLoading = false
this.$opsMessage.fail('下载失败!')
this.$opsMessage.fail(this.$t('pages.userBankWithdrawDiamondApply.message.downloadFailed'))
})
})
}

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankWithdrawGoldApply.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -24,26 +24,32 @@
<account-input
v-model="listQuery.submitUserId"
:sys-origin="listQuery.sysOrigin"
placeholder="提交用户ID"
:placeholder="$t('pages.userBankWithdrawGoldApply.filter.submitUserId')"
/>
</div>
<div class="filter-item">
<account-input
v-model="listQuery.acceptUserId"
:sys-origin="listQuery.sysOrigin"
placeholder="接收用户ID"
:placeholder="$t('pages.userBankWithdrawGoldApply.filter.acceptUserId')"
/>
</div>
<el-select
v-model="listQuery.acceptAccount"
placeholder="类型"
:placeholder="$t('pages.userBankWithdrawGoldApply.filter.acceptAccount')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="自己" :value="'GOLD'" />
<el-option label="货运代理账户" :value="'FREIGHT'" />
<el-option
:label="$t('pages.userBankWithdrawGoldApply.acceptAccount.GOLD')"
:value="'GOLD'"
/>
<el-option
:label="$t('pages.userBankWithdrawGoldApply.acceptAccount.FREIGHT')"
:value="'FREIGHT'"
/>
</el-select>
<div class="filter-item">
@ -52,9 +58,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankWithdrawGoldApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankWithdrawGoldApply.date.start')"
:end-placeholder="$t('pages.userBankWithdrawGoldApply.date.end')"
/>
</div>
<el-button
@ -64,7 +70,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankWithdrawGoldApply.action.search') }}
</el-button>
</div>
<el-table
@ -74,7 +80,12 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column
prop="sysOrigin"
:label="$t('pages.userBankWithdrawGoldApply.table.system')"
align="center"
width="80"
>
<template slot-scope="scope">
<sys-origin-icon
:icon="scope.row.sysOrigin"
@ -82,7 +93,11 @@
/>
</template>
</el-table-column>
<el-table-column label="提交用户" align="center" min-width="80">
<el-table-column
:label="$t('pages.userBankWithdrawGoldApply.table.submitUser')"
align="center"
min-width="80"
>
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.submitUser"
@ -90,7 +105,11 @@
/>
</template>
</el-table-column>
<el-table-column label="接收用户" align="center" min-width="80">
<el-table-column
:label="$t('pages.userBankWithdrawGoldApply.table.acceptUser')"
align="center"
min-width="80"
>
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.acceptUser"
@ -99,49 +118,52 @@
</template>
</el-table-column>
<el-table-column
prop="acceptAccountName"
label="接收方式"
:label="$t('pages.userBankWithdrawGoldApply.table.acceptAccount')"
align="center"
width="100"
/>
>
<template slot-scope="scope">
{{ getAcceptAccountLabel(scope.row.acceptAccount) || scope.row.acceptAccountName }}
</template>
</el-table-column>
<el-table-column
prop="amount"
label="提交金额"
:label="$t('pages.userBankWithdrawGoldApply.table.amount')"
align="center"
min-width="80"
/>
<el-table-column
prop="exchangeRate"
label="兑换比率"
:label="$t('pages.userBankWithdrawGoldApply.table.exchangeRate')"
align="center"
min-width="80"
/>
<el-table-column
prop="goldQuantity"
label="获得金币"
:label="$t('pages.userBankWithdrawGoldApply.table.goldQuantity')"
align="center"
min-width="80"
/>
<el-table-column
prop="createTime"
label="创建时间"
:label="$t('pages.userBankWithdrawGoldApply.table.createTime')"
align="center"
width="160"
>
<template slot-scope="scope">
创建日期{{ scope.row.createTime | dateFormat }}
{{ $t('pages.userBankWithdrawGoldApply.table.createDate') }}{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<span v-if="notData">{{ $t('pages.userBankWithdrawGoldApply.action.allLoaded') }}</span>
<el-button
v-else
size="mini"
:disabled="loadMoreLoading"
:loading="loadMoreLoading"
@click="clickLoadMore"
>加载更多</el-button
>{{ $t('pages.userBankWithdrawGoldApply.action.loadMore') }}</el-button
>
</div>
</div>
@ -204,6 +226,14 @@ export default {
that.renderData();
},
methods: {
getAcceptAccountLabel(value) {
if (!value) {
return "";
}
const key = `pages.userBankWithdrawGoldApply.acceptAccount.${value}`;
const translated = this.$t(key);
return translated === key ? "" : translated;
},
renderData(isReset) {
const that = this;
if (!that.listQuery.sysOrigin) {

View File

@ -10,41 +10,41 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;审核提现申请
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.title') }}
</div>
<div class="team-bill-settle">
<div class="drawer-form">
<div class="blockquote">提交人</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.submitUser') }}</div>
<div class="content" style="display: flex;justify-content: flex-start;flex-direction: row;align-items: center;">
<user-table-exhibit :user-profile="row.submitUser" :query-details="true" style="margin: 0.4rem" />
</div>
<div v-if="row.settlementResult && row.settlementResult.acceptBankCard">
<div class="blockquote">银行卡 <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.bankCard') }} <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="content">
<div style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag effect="plain">卡号:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">收款人:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">银行:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.cardNo') }}:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.payee') }}:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.bankName') }}:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
</div>
<div v-if="row.settlementResult.acceptBankCard.del" style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag type="danger">该银行卡已被用户删除</el-tag>
<el-tag type="danger">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.bankCardDeleted') }}</el-tag>
</div>
</div>
</div>
<div class="blockquote">提现金额: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">结算
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.amount') }}: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.settlement') }}
<el-tooltip class="item" effect="dark">
<div slot="content">
<p>* 转账凭证: 结算人员发送美元或其他币种后的记录凭证截图</p>
<p>* 备注: 本次账单备注, 对外显示</p>
<p>* {{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.transferVoucherTip') }}</p>
<p>* {{ $t('pages.userBankWithdrawMoneyApply.approvalDrawer.remarkTip') }}</p>
</div>
<i class="el-icon-info" />
</el-tooltip>
</div>
<el-form ref="form" :model="form" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="tmpExistsCertificate" label="凭证上传">
<el-form-item prop="tmpExistsCertificate" :label="$t('pages.userBankWithdrawMoneyApply.approvalDrawer.uploadVoucher')">
<el-row>
<el-col :span="8">
<upload-image
@ -73,11 +73,11 @@
</el-row>
</el-form-item>
<el-form-item label="对外备注">
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.approvalDrawer.externalRemark')">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入对外备注"
:placeholder="$t('pages.userBankWithdrawMoneyApply.approvalDrawer.externalRemarkPlaceholder')"
maxlength="100"
show-word-limit
resize="none"
@ -88,9 +88,9 @@
</div>
<div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">取消</el-button>
<el-button :disabled="submitLoading" :loading="submitLoading" @click="submit('PASS')">通过</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit('NOT_PASS')">驳回</el-button>
<el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.userBankWithdrawMoneyApply.action.cancel') }}</el-button>
<el-button :disabled="submitLoading" :loading="submitLoading" @click="submit('PASS')">{{ $t('pages.userBankWithdrawMoneyApply.action.pass') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit('NOT_PASS')">{{ $t('pages.userBankWithdrawMoneyApply.action.reject') }}</el-button>
</div>
</div>
</el-drawer>
@ -164,22 +164,15 @@ export default {
},
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在处理中!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawMoneyApply.message.processing'))
return
}
this.$emit('close')
},
getStatusName(status) {
if (status === 'SUBMIT') {
return '用户提交'
}
if (status === 'PASS') {
return '审核通过'
}
if (status === 'NOT_PASS') {
return '审核不通过'
}
return '未知'
const key = `pages.userBankWithdrawMoneyApply.approvalRecord.${status}`
const value = this.$t(key)
return value === key ? this.$t('pages.userBankWithdrawMoneyApply.approvalRecord.UNKNOWN') : value
},
getBankCardTypeName(_type) {
var _name = ''
@ -210,7 +203,7 @@ export default {
certificateUrls.push(that.certificateFour)
}
if (certificateUrls.length <= 0 && approvalStatus === 'PASS') {
this.$opsMessage.warn('请上传转账凭证, 请稍等!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawMoneyApply.message.uploadVoucherFirst'))
return
}
that.form.credential = certificateUrls

View File

@ -10,31 +10,31 @@
custom-class="drawer-auto-layout"
>
<div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;提现申请详情
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.title') }}
</div>
<div class="team-bill-settle">
<div class="drawer-form">
<div class="blockquote">提交人</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.submitUser') }}</div>
<div class="content" style="display: flex;justify-content: flex-start;flex-direction: row;align-items: center;">
<user-table-exhibit :user-profile="row.submitUser" :query-details="true" style="margin: 0.4rem" />
</div>
<div v-if="row.settlementResult && row.settlementResult.acceptBankCard">
<div class="blockquote">银行卡 <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.bankCard') }} <i class="el-icon-document-copy cursor-pointer" @click="copyBankCard(row)" /></div>
<div class="content">
<div style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag effect="plain">卡号:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">收款人:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">银行:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.cardNo') }}:{{ row.settlementResult.acceptBankCard.cardNo }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.payee') }}:{{ row.settlementResult.acceptBankCard.payee }}</el-tag>
<el-tag effect="plain">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.bankName') }}:{{ row.settlementResult.acceptBankCard.cardName }}</el-tag>
</div>
<div v-if="(row.settlementResult.acceptBankCard.del || row.settlementResult.acceptBankCard.status !== 'PASS') && row.latestApprovalStatus === 'SUBMIT'" style="margin: 0.2rem auto;line-height: .6rem;">
<el-tag type="danger">该银行卡可能已被用户删除或没有通审核,请核实.</el-tag>
<el-tag type="danger">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.bankCardRisk') }}</el-tag>
</div>
</div>
</div>
<div class="blockquote">提现金额: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">手续费(%) <span style="color:#419eff;">{{ row.serviceCharge }}</span></div>
<div class="blockquote">实际提现金额: <span style="color:#419eff;">{{ row.actualAmount }}</span></div>
<div class="blockquote">凭证</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.amount') }}: <span style="color:#419eff;">{{ row.amount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.serviceCharge') }} <span style="color:#419eff;">{{ row.serviceCharge }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.actualAmount') }}: <span style="color:#419eff;">{{ row.actualAmount }}</span></div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.voucher') }}</div>
<div v-if="row.settlementResult && row.settlementResult.credential" class="content">
<div style="display: flex;flex-direction: row;justify-content: space-around;">
<div v-for="(item, index) in row.settlementResult.credential" :key="index">
@ -46,14 +46,14 @@
</div>
</div>
</div>
<div class="blockquote">审批记录</div>
<div class="blockquote">{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.approvalRecords') }}</div>
<div class="content">
<div class="block">
<el-timeline>
<el-timeline-item v-for="(item, index) in row.approvalProcesses" :key="index" :timestamp="item.createTime | dateFormat" placement="top">
<el-card>
<h4>{{ getStatusName(item.status) }}</h4>
<p>备注: {{ item.remark }}</p>
<p>{{ $t('pages.userBankWithdrawMoneyApply.detailsDrawer.remark') }}: {{ item.remark }}</p>
</el-card>
</el-timeline-item>
</el-timeline>
@ -63,7 +63,7 @@
</div>
<div class="drawer-footer">
<el-button @click="handleClose()">取消</el-button>
<el-button @click="handleClose()">{{ $t('pages.userBankWithdrawMoneyApply.action.cancel') }}</el-button>
</div>
</div>
</el-drawer>
@ -114,22 +114,15 @@ export default {
methods: {
handleClose() {
if (this.submitLoading) {
this.$opsMessage.warn('正在处理中!')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawMoneyApply.message.processing'))
return
}
this.$emit('close')
},
getStatusName(status) {
if (status === 'SUBMIT') {
return '用户提交'
}
if (status === 'PASS') {
return '审核通过'
}
if (status === 'NOT_PASS') {
return '审核不通过'
}
return '未知'
const key = `pages.userBankWithdrawMoneyApply.approvalRecord.${status}`
const value = this.$t(key)
return value === key ? this.$t('pages.userBankWithdrawMoneyApply.approvalRecord.UNKNOWN') : value
},
copyBankCard(row) {
copyText(`卡号: ${row.settlementResult.acceptBankCard.cardNo || '?'}, 收款人: ${row.settlementResult.acceptBankCard.payee || '?'}, 银行: ${row.settlementResult.acceptBankCard.cardName || '?'}

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -20,7 +20,7 @@
</el-select>
<el-select
v-model="listQuery.bankCardType"
placeholder="卡片类型"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.bankCardType')"
style="width: 120px"
class="filter-item"
clearable
@ -34,33 +34,37 @@
/>
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.submitUserId" :sys-origin="listQuery.sysOrigin" placeholder="提交用户ID" />
<account-input
v-model="listQuery.submitUserId"
:sys-origin="listQuery.sysOrigin"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.submitUserId')"
/>
</div>
<el-select
v-model="listQuery.acceptMethod"
placeholder="类型"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.acceptMethod')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="自己" :value="'ONESELF'" />
<el-option label="代理" :value="'AGENT'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.acceptMethod.ONESELF')" :value="'ONESELF'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.acceptMethod.AGENT')" :value="'AGENT'" />
<el-option label="BD" :value="'BD'" />
<el-option label="其他" :value="'OTHER'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.acceptMethod.OTHER')" :value="'OTHER'" />
</el-select>
<el-select
v-model="listQuery.latestApprovalStatus"
placeholder="状态"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.status')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="用户提交" :value="'SUBMIT'" />
<el-option label="通过" :value="'PASS'" />
<el-option label="驳回" :value="'NOT_PASS'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.SUBMIT')" :value="'SUBMIT'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.PASS')" :value="'PASS'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.NOT_PASS')" :value="'NOT_PASS'" />
</el-select>
<div class="filter-item">
<el-date-picker
@ -68,9 +72,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankWithdrawMoneyApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankWithdrawMoneyApply.date.start')"
:end-placeholder="$t('pages.userBankWithdrawMoneyApply.date.end')"
/>
</div>
<el-button
@ -80,7 +84,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userBankWithdrawMoneyApply.action.search') }}
</el-button>
<el-button
v-if="buttonPermissions.includes('withdraw-money-apply:table:export')"
@ -89,7 +93,7 @@
icon="el-icon-download"
@click="exprotOrder"
>
导出
{{ $t('pages.userBankWithdrawMoneyApply.action.export') }}
</el-button>
</div>
<el-table
@ -99,42 +103,49 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.system')" prop="sysOrigin" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="提交用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.submitUser')" align="center" min-width="80">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.submitUser" :query-details="true" />
</template>
</el-table-column>
<el-table-column prop="amount" label="提交金额" align="center" min-width="80" />
<el-table-column label="类型" align="center" min-width="80" >
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.amount')" prop="amount" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.amountType')" align="center" min-width="80">
<template slot-scope="scope">
<span v-if="scope.row.amountType === 'SALARY_DIAMOND'">钻石</span>
<span v-else>美金</span>
<span>{{ getAmountTypeLabel(scope.row.amountType) }}</span>
</template>
</el-table-column>
<el-table-column prop="serviceCharge" label="手续费(%)" align="center" min-width="80" />
<el-table-column prop="actualAmount" label="实际提现金额" align="center" min-width="80" />
<el-table-column prop="acceptMethodName" label="接收方式" align="center" min-width="80" />
<el-table-column prop="latestApprovalStatusName" label="最新审核状态" align="center" min-width="80" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.serviceCharge')" prop="serviceCharge" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.actualAmount')" prop="actualAmount" align="center" min-width="80" />
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.acceptMethod')" align="center" min-width="80">
<template slot-scope="scope">
<span>{{ getAcceptMethodLabel(scope.row.acceptMethod) || scope.row.acceptMethodName }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.approvalStatus')" align="center" min-width="80">
<template slot-scope="scope">
<span>{{ getApprovalStatusLabel(scope.row.latestApprovalStatus) || scope.row.latestApprovalStatusName }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('pages.userBankWithdrawMoneyApply.table.createTime')" prop="createTime" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="140">
<el-table-column fixed="right" :label="$t('pages.userBankWithdrawMoneyApply.table.actions')" align="center" width="140">
<template slot-scope="scope">
<el-button type="text" @click="clickDetailsDrawer(scope.row)">查看</el-button>
<el-button v-if="scope.row.latestApprovalStatus === 'SUBMIT'" type="text" @click="clickApprovalDrawer(scope.row, scope.$index)">审核</el-button>
<el-button type="text" @click="clickDetailsDrawer(scope.row)">{{ $t('pages.userBankWithdrawMoneyApply.action.view') }}</el-button>
<el-button v-if="scope.row.latestApprovalStatus === 'SUBMIT'" type="text" @click="clickApprovalDrawer(scope.row, scope.$index)">{{ $t('pages.userBankWithdrawMoneyApply.action.approval') }}</el-button>
</template>
</el-table-column>
</el-table>
<div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">加载更多</el-button>
<span v-if="notData">{{ $t('pages.userBankWithdrawMoneyApply.action.allLoaded') }}</span>
<el-button v-else size="mini" :disabled="loadMoreLoading" :loading="loadMoreLoading" @click="clickLoadMore">{{ $t('pages.userBankWithdrawMoneyApply.action.loadMore') }}</el-button>
</div>
<details-drawer
v-if="detailsDrawerVisible"
@ -149,7 +160,7 @@
/>
<el-drawer
title="导出条件"
:title="$t('pages.userBankWithdrawMoneyApply.exportDialog.title')"
:visible="exportConditionVisible"
:before-close="exportConditionClose"
:close-on-press-escape="false"
@ -168,10 +179,10 @@
label-width="70px"
>
<el-form-item label="系统" prop="sysOrigin">
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.system')" prop="sysOrigin">
<el-select
v-model="exportQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.system')"
style="width: 100%;"
>
<el-option
@ -186,10 +197,10 @@
</el-select>
</el-form-item>
<el-form-item label="类型" prop="bankCardType">
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.bankCardType')" prop="bankCardType">
<el-select
v-model="exportQuery.bankCardType"
placeholder="卡片类型"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.bankCardType')"
style="width: 100%;"
clearable
>
@ -202,46 +213,50 @@
</el-select>
</el-form-item>
<el-form-item label="用户" prop="submitUserId">
<account-input v-model="exportQuery.submitUserId" :sys-origin="exportQuery.sysOrigin || listQuery.sysOrigin" placeholder="提交用户ID" />
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.user')" prop="submitUserId">
<account-input
v-model="exportQuery.submitUserId"
:sys-origin="exportQuery.sysOrigin || listQuery.sysOrigin"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.submitUserId')"
/>
</el-form-item>
<el-form-item label="状态" prop="latestApprovalStatus">
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.status')" prop="latestApprovalStatus">
<el-select
v-model="exportQuery.latestApprovalStatus"
placeholder="状态"
:placeholder="$t('pages.userBankWithdrawMoneyApply.filter.status')"
style="width: 100%;"
clearable
@change="handleSearch"
>
<el-option label="用户提交" :value="'SUBMIT'" />
<el-option label="通过" :value="'PASS'" />
<el-option label="驳回" :value="'NOT_PASS'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.SUBMIT')" :value="'SUBMIT'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.PASS')" :value="'PASS'" />
<el-option :label="$t('pages.userBankWithdrawMoneyApply.approvalStatus.NOT_PASS')" :value="'NOT_PASS'" />
</el-select>
</el-form-item>
<el-form-item label="时间" prop="startTime">
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.time')" prop="startTime">
<el-date-picker
v-model="exportDate"
style="width: 100%;"
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userBankWithdrawMoneyApply.date.rangeSeparator')"
:start-placeholder="$t('pages.userBankWithdrawMoneyApply.date.start')"
:end-placeholder="$t('pages.userBankWithdrawMoneyApply.date.end')"
/>
</el-form-item>
<el-form-item label="数量" prop="limit">
<el-input v-model="exportQuery.limit" v-number placeholder="导出数量" />
<el-form-item :label="$t('pages.userBankWithdrawMoneyApply.exportDialog.limit')" prop="limit">
<el-input v-model="exportQuery.limit" v-number :placeholder="$t('pages.userBankWithdrawMoneyApply.exportDialog.limitPlaceholder')" />
</el-form-item>
</el-form>
</div>
<div class="drawer-footer">
<el-button @click="exportConditionClose()">关闭</el-button>
<el-button type="primary" :disabled="exportLoading" :loading="exportLoading" @click="exportConditionSubmit()">导出</el-button>
<el-button @click="exportConditionClose()">{{ $t('pages.userBankWithdrawMoneyApply.action.close') }}</el-button>
<el-button type="primary" :disabled="exportLoading" :loading="exportLoading" @click="exportConditionSubmit()">{{ $t('pages.userBankWithdrawMoneyApply.action.export') }}</el-button>
</div>
</div>
</el-drawer>
@ -260,7 +275,7 @@ export default {
components: { DetailsDrawer, ApprovalDrawer },
data() {
const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' }
{ required: true, message: this.$t('pages.userBankWithdrawMoneyApply.validation.requiredField'), trigger: 'blur' }
]
return {
bankCardTypes,
@ -349,6 +364,25 @@ export default {
that.renderData()
},
methods: {
getAmountTypeLabel(type) {
return this.$t(`pages.userBankWithdrawMoneyApply.amountType.${type}`)
},
getAcceptMethodLabel(type) {
if (!type) {
return ''
}
const key = `pages.userBankWithdrawMoneyApply.acceptMethod.${type}`
const value = this.$t(key)
return value === key ? '' : value
},
getApprovalStatusLabel(status) {
if (!status) {
return ''
}
const key = `pages.userBankWithdrawMoneyApply.approvalStatus.${status}`
const value = this.$t(key)
return value === key ? '' : value
},
renderData(isReset) {
const that = this
if (!that.listQuery.sysOrigin) {
@ -398,7 +432,7 @@ export default {
},
exportConditionClose() {
if (this.exportLoading) {
this.$opsMessage.warn('正在执行导出, 请稍等~')
this.$opsMessage.warn(this.$t('pages.userBankWithdrawMoneyApply.message.exporting'))
return
}
this.exportConditionVisible = false
@ -420,7 +454,7 @@ export default {
that.exportConditionVisible = false
}).catch(er => {
that.exportLoading = false
this.$opsMessage.fail('下载失败!')
this.$opsMessage.fail(this.$t('pages.userBankWithdrawMoneyApply.message.downloadFailed'))
})
})
}

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userSalaryDiamond.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -19,22 +19,22 @@
</el-option>
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" />
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userSalaryDiamond.filter.userId')" />
</div>
<el-select
v-model="listQuery.type"
placeholder="类型"
:placeholder="$t('pages.userSalaryDiamond.filter.type')"
style="width: 120px"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option label="收入" :value="0" />
<el-option label="支出" :value="1" />
<el-option :label="$t('pages.userSalaryDiamond.type.income')" :value="0" />
<el-option :label="$t('pages.userSalaryDiamond.type.expense')" :value="1" />
</el-select>
<el-select
v-model="listQuery.event"
placeholder="事件"
:placeholder="$t('pages.userSalaryDiamond.filter.event')"
style="width: 120px"
class="filter-item"
clearable
@ -43,7 +43,7 @@
<el-option
v-for="(item, index) in userSalaryDiamondWaterEvent"
:key="index"
:label="item.name"
:label="getEventLabel(item.value)"
:value="item.value"
/>
</el-select>
@ -54,9 +54,9 @@
value-format="timestamp"
type="datetimerange"
:picker-options="pickerOptions"
range-separator=""
start-placeholder="日期开始"
end-placeholder="日期结束"
:range-separator="$t('pages.userSalaryDiamond.date.rangeSeparator')"
:start-placeholder="$t('pages.userSalaryDiamond.date.start')"
:end-placeholder="$t('pages.userSalaryDiamond.date.end')"
/>
</div>
<el-button
@ -66,7 +66,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userSalaryDiamond.action.search') }}
</el-button>
</div>
<el-table
@ -76,12 +76,12 @@
fit
highlight-current-row
>
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column prop="sysOrigin" :label="$t('pages.userSalaryDiamond.table.system')" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userSalaryDiamond.table.user')" align="center" min-width="80">
<template slot-scope="scope">
<div><user-table-exhibit :size="scope.row.userProfile ? 'mini' : 'small'" :user-profile="scope.row.userProfile" :query-details="true" /></div>
<div v-if="scope.row.tmpUserProfile" class="attached">
@ -89,8 +89,12 @@
</div>
</template>
</el-table-column>
<el-table-column prop="typeName" label="类型" align="center" width="80" />
<el-table-column label="数量" align="center" min-width="80">
<el-table-column :label="$t('pages.userSalaryDiamond.table.type')" align="center" width="80">
<template slot-scope="scope">
{{ getTypeLabel(scope.row.type) }}
</template>
</el-table-column>
<el-table-column :label="$t('pages.userSalaryDiamond.table.amount')" align="center" min-width="80">
<template slot-scope="scope">
<div>
<span v-if="scope.row.type === 0" class="font-danger">+{{ scope.row.amount }}</span>
@ -99,17 +103,17 @@
</template>
</el-table-column>
<el-table-column prop="balance" label="余额" align="center" min-width="80" />
<el-table-column prop="tempBalance" label="临时钻石余额" align="center" min-width="80" />
<el-table-column prop="balance" :label="$t('pages.userSalaryDiamond.table.balance')" align="center" min-width="80" />
<el-table-column prop="tempBalance" :label="$t('pages.userSalaryDiamond.table.tempBalance')" align="center" min-width="80" />
<el-table-column label="事件" align="center">
<el-table-column :label="$t('pages.userSalaryDiamond.table.event')" align="center">
<template slot-scope="scope">
<div>{{ getEventDesc(scope.row.salaryEvent) }}</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" min-width="160" />
<el-table-column prop="createUserOriginName" label="创建源" align="center" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="remark" :label="$t('pages.userSalaryDiamond.table.remark')" align="center" min-width="160" />
<el-table-column prop="createUserOriginName" :label="$t('pages.userSalaryDiamond.table.createOrigin')" align="center" />
<el-table-column prop="createTime" :label="$t('pages.userSalaryDiamond.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
@ -209,23 +213,31 @@ export default {
},
getTransferDescriptionName(event) {
if (event === 'TRANSFER') {
return '收款人'
return this.$t('pages.userSalaryDiamond.tag.payee')
}
if (event === 'RECEIVE_TRANSFER') {
return '付款人'
return this.$t('pages.userSalaryDiamond.tag.payer')
}
return ''
},
getTypeLabel(type) {
return this.$t(type === 0 ? 'pages.userSalaryDiamond.type.income' : 'pages.userSalaryDiamond.type.expense')
},
getEventLabel(event) {
const key = `pages.userSalaryDiamond.events.${event}`
const translated = this.$t(key)
return translated === key ? event : translated
},
handleSearch() {
this.renderData(true)
},
getEventDesc(_key) {
const that = this
const result = that.userSalaryDiamondWaterEvent.filter(_event => _event.value === _key)
if (!result) {
if (!result || result.length === 0) {
return _key
}
return result[0].name
return that.getEventLabel(result[0].value)
}
}
}

View File

@ -1,7 +1,7 @@
<template>
<div class="user-bank-form-edit">
<el-dialog
:title="'创建账户'"
:title="$t('pages.userSalaryDiamond.dialog.createAccountTitle')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -12,25 +12,25 @@
>
<div class="form-edit">
<el-form ref="form" :model="form" :rules="formRules" label-width="110px" style="margin-right:50px;">
<el-form-item label="系统" prop="sysOrigin">
<el-form-item :label="$t('pages.userSalaryDiamond.form.system')" prop="sysOrigin">
{{ sysOrigin }}
</el-form-item>
<el-form-item label="用户id" prop="userId">
<el-form-item :label="$t('pages.userSalaryDiamond.form.userId')" prop="userId">
<account-input v-model="form.userId" :sys-origin="sysOrigin" placeholder="用户ID" />
<account-input v-model="form.userId" :sys-origin="sysOrigin" :placeholder="$t('pages.userSalaryDiamond.filter.userId')" />
</el-form-item>
<el-form-item label="金额" prop="quantity">
<el-input v-model.trim="form.quantity" placeholder="请输入发送工资钻石" class="input-with-select" maxlength="10" />
<el-form-item :label="$t('pages.userSalaryDiamond.form.amount')" prop="quantity">
<el-input v-model.trim="form.quantity" :placeholder="$t('pages.userSalaryDiamond.placeholder.sendSalaryDiamond')" class="input-with-select" maxlength="10" />
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-input v-model.trim="form.remark" placeholder="对内备注" class="input-with-select" maxlength="10" />
<el-form-item :label="$t('pages.userSalaryDiamond.form.innerRemark')" prop="remark">
<el-input v-model.trim="form.remark" :placeholder="$t('pages.userSalaryDiamond.placeholder.innerRemark')" class="input-with-select" maxlength="10" />
</el-form-item>
</el-form>
</div>
<div slot="footer">
<el-button @click="handleClose()">取消</el-button>
<el-button type="primary" :loading="submitLoading" :disabled="searchDisabled" @click="submitForm()">保存</el-button>
<el-button @click="handleClose()">{{ $t('pages.userSalaryDiamond.action.cancel') }}</el-button>
<el-button type="primary" :loading="submitLoading" :disabled="searchDisabled" @click="submitForm()">{{ $t('pages.userSalaryDiamond.action.save') }}</el-button>
</div>
</el-dialog>
@ -55,7 +55,7 @@ export default {
},
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
{ required: true, message: this.$t('pages.userSalaryDiamond.validation.required'), trigger: 'blur' }
]
return {
@ -76,13 +76,13 @@ export default {
// }
// callback()
// }, trigger: 'blur' },
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' }
quantity: { required: true, message: this.$t('pages.userSalaryDiamond.validation.requiredNotEmpty'), trigger: 'blur' }
}
}
},
computed: {
textOptTitle() {
return this.row && this.row.id ? '修改' : '添加'
return this.row && this.row.id ? this.$t('pages.userSalaryDiamond.action.edit') : this.$t('pages.userSalaryDiamond.action.add')
},
isUpdate() {
return this.row && this.row.id
@ -108,7 +108,7 @@ export default {
submitForm() {
const that = this
if(that.form.quantity <= 0) {
that.$message.error('金额不能小于0')
that.$message.error(this.$t('pages.userSalaryDiamond.message.amountGreaterThanZero'))
return
}
that.$refs.form.validate(valid => {

View File

@ -3,7 +3,7 @@
<div class="filter-container">
<el-select
v-model="listQuery.sysOrigin"
placeholder="系统"
:placeholder="$t('pages.userSalaryDiamond.filter.system')"
style="width: 120px"
class="filter-item"
@change="handleSearch"
@ -20,7 +20,7 @@
</el-select>
<div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" />
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userSalaryDiamond.filter.userId')" />
</div>
<el-button
class="filter-item"
@ -29,7 +29,7 @@
:disabled="searchDisabled"
@click="handleSearch"
>
搜索
{{ $t('pages.userSalaryDiamond.action.search') }}
</el-button>
<el-button
class="filter-item"
@ -37,7 +37,7 @@
icon="el-icon-edit"
@click="handleCreate"
>
添加
{{ $t('pages.userSalaryDiamond.action.add') }}
</el-button>
</div>
<el-table
@ -49,41 +49,41 @@
@cell-mouse-enter="handleMouseEnter"
>
<el-table-column type="index" width="50" label="No" />
<el-table-column prop="sysOrigin" label="系统" align="center" width="80">
<el-table-column prop="sysOrigin" :label="$t('pages.userSalaryDiamond.table.system')" align="center" width="80">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="200">
<el-table-column :label="$t('pages.userSalaryDiamond.table.user')" align="center" min-width="200">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column prop="earnPoints" label="获得总额" align="center" min-width="100" />
<el-table-column prop="consumptionPoints" label="消费总额" align="center" min-width="100" />
<el-table-column prop="balance" label="余额" align="center" min-width="100" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="earnPoints" :label="$t('pages.userSalaryDiamond.table.totalIncome')" align="center" min-width="100" />
<el-table-column prop="consumptionPoints" :label="$t('pages.userSalaryDiamond.table.totalExpense')" align="center" min-width="100" />
<el-table-column prop="balance" :label="$t('pages.userSalaryDiamond.table.balance')" align="center" min-width="100" />
<el-table-column prop="createTime" :label="$t('pages.userSalaryDiamond.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
</el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center" width="160">
<el-table-column prop="updateTime" :label="$t('pages.userSalaryDiamond.table.updateTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<el-table-column fixed="right" :label="$t('pages.userSalaryDiamond.table.actions')" align="center">
<template slot-scope="scope">
<el-dropdown>
<span class="el-dropdown-link">
<i class="el-icon-more" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="showGoldInputBox(scope.row, true)">发送</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, false)">扣除</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, true)">{{ $t('pages.userSalaryDiamond.action.send') }}</el-dropdown-item>
<el-dropdown-item @click.native="showGoldInputBox(scope.row, false)">{{ $t('pages.userSalaryDiamond.action.deduct') }}</el-dropdown-item>
<el-dropdown-item @click.native="showTransferBox(scope.row)">转账</el-dropdown-item>
<el-dropdown-item @click.native="clickRunningWater(scope.row)">流水</el-dropdown-item>
<el-dropdown-item @click.native="showTransferBox(scope.row)">{{ $t('pages.userSalaryDiamond.action.transfer') }}</el-dropdown-item>
<el-dropdown-item @click.native="clickRunningWater(scope.row)">{{ $t('pages.userSalaryDiamond.action.runningWater') }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
@ -105,7 +105,7 @@
/>
<div class="gold-input-box">
<el-dialog
:title=" type ? '发送' : '扣除'"
:title=" type ? $t('pages.userSalaryDiamond.action.send') : $t('pages.userSalaryDiamond.action.deduct')"
:visible="goldInputBoxVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -119,31 +119,31 @@
label-width="70px"
style="width: 300px; margin-left:50px;"
>
<el-form-item label="金额" prop="quantity">
<el-form-item :label="$t('pages.userSalaryDiamond.form.amount')" prop="quantity">
<el-input
v-model.trim="formData.quantity"
:placeholder="'请输入' + (type ? '发送' : '扣除') + '工资钻石'"
:placeholder="type ? $t('pages.userSalaryDiamond.placeholder.sendSalaryDiamond') : $t('pages.userSalaryDiamond.placeholder.deductSalaryDiamond')"
/>
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-form-item :label="$t('pages.userSalaryDiamond.form.innerRemark')" prop="remark">
<el-input
v-model.trim="formData.remark"
placeholder="请输入对内备注"
:placeholder="$t('pages.userSalaryDiamond.placeholder.innerRemark')"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="hideGoldInputBox()">
取消
{{ $t('pages.userSalaryDiamond.action.cancel') }}
</el-button>
<el-button
v-loading="listLoading"
type="primary"
@click="goldSubmit()"
>
提交
{{ $t('pages.userSalaryDiamond.action.submit') }}
</el-button>
</div>
</el-dialog>
@ -162,7 +162,7 @@
/>
<div class="gold-input-box">
<el-dialog
title="转账"
:title="$t('pages.userSalaryDiamond.action.transfer')"
:visible="transferVisible"
:modal-append-to-body="true"
:append-to-body="true"
@ -177,35 +177,35 @@
style="width: 400px; margin-left:50px;"
>
<el-form-item prop="acceptUserId" label="收款人">
<account-input ref="transferAccountInput" v-model="transferFormData.acceptUserId" :sys-origin="transferFormData.sysOrigin" placeholder="用户账号" />
<el-form-item prop="acceptUserId" :label="$t('pages.userSalaryDiamond.form.payee')">
<account-input ref="transferAccountInput" v-model="transferFormData.acceptUserId" :sys-origin="transferFormData.sysOrigin" :placeholder="$t('pages.userSalaryDiamond.placeholder.userAccount')" />
</el-form-item>
<el-form-item label="金额" prop="quantity">
<el-form-item :label="$t('pages.userSalaryDiamond.form.amount')" prop="quantity">
<el-input
v-model.trim="transferFormData.quantity"
:placeholder="'请输入转账工资钻石'"
:placeholder="$t('pages.userSalaryDiamond.placeholder.transferSalaryDiamond')"
/>
</el-form-item>
<el-form-item label="对内备注" prop="remark">
<el-form-item :label="$t('pages.userSalaryDiamond.form.innerRemark')" prop="remark">
<el-input
v-model.trim="transferFormData.remark"
placeholder="请输入对内备注"
:placeholder="$t('pages.userSalaryDiamond.placeholder.innerRemark')"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="hideTransferBox()">
取消
{{ $t('pages.userSalaryDiamond.action.cancel') }}
</el-button>
<el-button
v-loading="listLoading"
type="primary"
@click="transferSubmit()"
>
提交
{{ $t('pages.userSalaryDiamond.action.submit') }}
</el-button>
</div>
</el-dialog>
@ -225,7 +225,7 @@ export default {
components: { Pagination, FormEdit, RunningWater },
data() {
const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' }
{ required: true, message: this.$t('pages.userSalaryDiamond.validation.required'), trigger: 'blur' }
]
return {
runningWaterVisible: false,
@ -260,13 +260,13 @@ export default {
},
formRules: {
userId: commonRules,
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' },
quantity: { required: true, message: this.$t('pages.userSalaryDiamond.validation.requiredNotEmpty'), trigger: 'blur' },
sysOrigin: commonRules
},
transferFormRules: {
userId: commonRules,
acceptUserId: commonRules,
quantity: { required: true, message: '必填字段不可为空', trigger: 'blur' },
quantity: { required: true, message: this.$t('pages.userSalaryDiamond.validation.requiredNotEmpty'), trigger: 'blur' },
sysOrigin: commonRules
},
listLoading: false,
@ -400,7 +400,7 @@ export default {
transferSubmit() {
const that = this
if(that.transferFormData.quantity <= 0) {
that.$message.error('金额不能小于0')
that.$message.error(this.$t('pages.userSalaryDiamond.message.amountGreaterThanZero'))
return
}
that.$refs.form.validate(valid => {

View File

@ -1,6 +1,6 @@
<template>
<el-dialog
title="用户银行账户流水"
:title="$t('pages.userSalaryDiamond.dialog.runningWaterTitle')"
:visible="true"
:modal-append-to-body="true"
:append-to-body="true"
@ -19,12 +19,12 @@
highlight-current-row
max-height="350px"
>
<el-table-column prop="sysOrigin" label="系统" align="center">
<el-table-column prop="sysOrigin" :label="$t('pages.userSalaryDiamond.table.system')" align="center">
<template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template>
</el-table-column>
<el-table-column label="用户" align="center" min-width="80">
<el-table-column :label="$t('pages.userSalaryDiamond.table.user')" align="center" min-width="80">
<template slot-scope="scope">
<div><user-table-exhibit :size="scope.row.userProfile ? 'mini' : 'small'" :user-profile="scope.row.userProfile" :query-details="true" /></div>
<div v-if="scope.row.tmpUserProfile" class="attached">
@ -32,8 +32,12 @@
</div>
</template>
</el-table-column>
<el-table-column prop="typeName" label="类型" align="center" width="80" />
<el-table-column label="数量" align="center" min-width="80">
<el-table-column :label="$t('pages.userSalaryDiamond.table.type')" align="center" width="80">
<template slot-scope="scope">
{{ getTypeLabel(scope.row.type) }}
</template>
</el-table-column>
<el-table-column :label="$t('pages.userSalaryDiamond.table.amount')" align="center" min-width="80">
<template slot-scope="scope">
<div>
<span v-if="scope.row.type === 0" class="font-danger">+{{ scope.row.amount }}</span>
@ -41,14 +45,14 @@
</div>
</template>
</el-table-column>
<el-table-column prop="balance" label="余额" align="center" />
<el-table-column label="事件" align="center">
<el-table-column prop="balance" :label="$t('pages.userSalaryDiamond.table.balance')" align="center" />
<el-table-column :label="$t('pages.userSalaryDiamond.table.event')" align="center">
<template slot-scope="scope">
<div>{{ getEventDesc(scope.row.salaryEvent) }}</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" min-width="200" />
<el-table-column prop="createTime" label="创建时间" align="center" width="160">
<el-table-column prop="remark" :label="$t('pages.userSalaryDiamond.table.remark')" align="center" min-width="200" />
<el-table-column prop="createTime" :label="$t('pages.userSalaryDiamond.table.createTime')" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createTime | dateFormat }}
</template>
@ -124,23 +128,31 @@ export default {
},
getTransferDescriptionName(event) {
if (event === 'TRANSFER') {
return '收款人'
return this.$t('pages.userSalaryDiamond.tag.payee')
}
if (event === 'RECEIVE_TRANSFER') {
return '付款人'
return this.$t('pages.userSalaryDiamond.tag.payer')
}
return ''
},
getTypeLabel(type) {
return this.$t(type === 0 ? 'pages.userSalaryDiamond.type.income' : 'pages.userSalaryDiamond.type.expense')
},
getEventLabel(event) {
const key = `pages.userSalaryDiamond.events.${event}`
const translated = this.$t(key)
return translated === key ? event : translated
},
handleClose() {
this.$emit('close')
},
getEventDesc(_key) {
const that = this
const result = that.userSalaryDiamondWaterEvent.filter(_event => _event.value === _key)
if (!result) {
if (!result || result.length === 0) {
return _key
}
return result[0].name
return that.getEventLabel(result[0].value)
}
}
}