Browse Source

feat: 完善多语言支持,优化金豆充值相关

milestone-20251209-多语言二期^2
zhangrenyuan 1 month ago
parent
commit
e82c9dae96
  1. 42
      src/components/locales/lang/zh-CN.js
  2. 75
      src/views/recharge/bean/addBeanRecharge.vue
  3. 96
      src/views/recharge/bean/beanOnlineRecharge.vue
  4. 15
      src/views/recharge/bean/beanRecharge.vue
  5. 86
      src/views/recharge/bean/beanSystemRecharge.vue

42
src/components/locales/lang/zh-CN.js

@ -1,5 +1,4 @@
// 包里的变量不可随意更改!!!
export default {
@ -27,6 +26,8 @@ export default {
payPlatformPlaceholder: '请选择平台信息',
updateType: '数量更新类型',
updateTypePlaceholder: '请选择更新类型',
orderNo: '订单号',
orderNoPlaceholder: '请输入订单号',
consumeTime: '消耗时间',
rechargeTime: '充值时间',
refundTime: '退款时间',
@ -68,6 +69,12 @@ export default {
: '条',
: '个',
goldBean: '金豆',
// 币种计量类型---金豆
totalGoldBean: '金豆总数:',
payGoldBean: '付费金豆数:',
freeGoldBean: '免费金豆数:',
rechargeGoldBean: '充值金豆数:',
totalRechargeSGD: '合计新币数:',
// 对话框标题
will: '将要',
deleteRecord: '删除该翻译记录!',
@ -75,7 +82,9 @@ export default {
// 提示信息组
elmessage: {
// 通用
addSuccess: '添加成功',
addSuccess: '添加成功', // 大写是添加成功,小写是新增
addsuccess: '新增成功',
cancelOperation: '操作取消',
searchSuccess: '查询成功',
requestFailed: '请求失败',
jwcodeError: '精网号错误',
@ -106,6 +115,11 @@ export default {
checkRefundType: '请选择退款类型',
checkRefundGoods: '请选择退款商品',
checkOrderNo: '请输入订单号',
checkPayBean: '请输入付费金豆数',
checkNonNegative: '请输入非负整数',
checkFreeBean: '请输入免费金豆数',
checkRemark: '请输入备注',
checkFormInfo: '请检查并完善表单信息',
// 校验提示(error)
noEmptyJwcode: '精网号不能为空',
noEmptySumGold: '消耗金币总数不能为空',
@ -113,6 +127,7 @@ export default {
noOrder: '未查询到相关订单',
noTotalGoldZero: '总金币数不能为0',
noNegativeNumber: '不能输入负数',
noPayBeanFreeBeanZero: '付费金豆和免费金豆不能同时为0',
limitDigitJwcode: '精网号只能包含数字',
limitNoSpecialChar: '不能包含特殊符号或负数',
limitNegativeNumber: '消耗金币总数不能为负数',
@ -163,6 +178,9 @@ export default {
noNegativeNumber: '不允许输入负数',
integerPartLimit: '整数部分最多允许六位',
decimalPartLimit: '小数部分最多允许七位',
// 金豆充值相关
systemRechargeAreaError: '系统充值地区获取失败',
onlineRechargeAreaError: '线上充值地区获取失败',
},
// 通用列表字段组
@ -175,6 +193,8 @@ export default {
payPlatform: '平台信息',
type: '更新类型',
orderNo: '订单号',
number: '数量',
money: '金额',
goodsName: '商品名称',
refundType: '退款类型',
refundModel: '退款方式',
@ -203,6 +223,11 @@ export default {
refundTime: '退款时间',
updateTime: '更新时间',
operation: '操作',
// 金豆相关
permanentBean: '付费金豆',
freeBean: '免费金豆',
mobile: '手机',
other: '其他',
},
// 通用导出字段组
common_export: {
@ -267,6 +292,10 @@ export default {
onlyStatisticsDataAfter20250101: '仅统计2025-01-01后的数据',
store: '所属门店',
maxReductionAmount: '红包最大抵扣金额',
//金豆
currentPayableBean: '当前付费金豆',
currentFreeBean: '当前免费金豆',
consumeTotalBean: '消耗金豆总数',
},
// 审核组
@ -367,6 +396,15 @@ export default {
paymentAsia: 'PaymentAsia-链接收款',
other: '其他'
},
// 金豆
permanentBean: '付费金豆',
freeBean: '免费金豆',
confirmRecharge: '确认充值吗?',
prompt: '提示',
addBeanRecharge: '新增充值',
systemRecharge: '系统充值',
onlineRecharge: '线上充值',
mobile: '手机',
},
// 消耗组

75
src/views/recharge/bean/addBeanRecharge.vue

@ -14,12 +14,15 @@ import throttle from 'lodash/throttle'
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import _ from 'lodash';
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const user = ref({})
const getUser = async function (jwcode) {
if (addForm.value.jwcode) {
addForm.value.jwcode = addForm.value.jwcode.replace(/\s/g, '');
} else {
ElMessage.error('请先输入精网号')
ElMessage.error(t('elmessage.checkJwcode'))
return false
}
try {
@ -32,15 +35,15 @@ const getUser = async function (jwcode) {
if (result.code === 0) {
ElMessage.error(result.msg);
} else if (result.data === null) {
ElMessage.error("用户不存在");
ElMessage.error(t('elmessage.noUser'));
} else {
user.value = result.data;
console.log("用户信息", user.value.name);
ElMessage.success("查询成功");
ElMessage.success(t('elmessage.searchSuccess'));
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error("精网号错误");
ElMessage.error(t('elmessage.jwcodeError'));
}
}
//
@ -58,22 +61,22 @@ const adminStore = useAdminStore()
const { adminData } = storeToRefs(adminStore)
const rules = reactive({
jwcode: [
{ required: true, message: '请输入精网号', trigger: 'blur' },
{ required: true, message: t('elmessage.checkJwcode'), trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (!value) {
callback(new Error('精网号不能为空'));
callback(new Error(t('elmessage.noEmptyJwcode')));
return;
}
if (/[^0-9]/.test(value)) {
callback(new Error('精网号只能包含数字'));
callback(new Error(t('elmessage.limitDigitJwcode')));
return;
}
callback();
}, trigger: 'blur'
}],
permanentBean: [
{ required: true, message: '请输入付费金豆数', trigger: 'change' },
{ required: true, message: t('elmessage.checkPayBean'), trigger: 'change' },
{
validator: (rule, value, callback) => {
if (!value) {
@ -81,13 +84,13 @@ const rules = reactive({
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
callback(new Error(t('elmessage.checkNonNegative')));
return;
}
//
if (value.length > 6) {
callback(new Error('整数位数不能超过6位'));
callback(new Error(t('elmessage.limitSix')));
return;
}
callback();
@ -97,7 +100,7 @@ const rules = reactive({
}
],
freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'change' },
{ required: true, message: t('elmessage.checkFreeBean'), trigger: 'change' },
{
validator: (rule, value, callback) => {
if (!value) {
@ -105,13 +108,13 @@ const rules = reactive({
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
callback(new Error(t('elmessage.checkNonNegative')));
return;
}
//
if (value.length > 6) {
callback(new Error('整数位数不能超过6位'));
callback(new Error(t('elmessage.limitSix')));
return;
}
callback();
@ -120,7 +123,7 @@ const rules = reactive({
}
],
remark: [
{ required: true, message: '请输入备注', trigger: 'blur' }
{ required: true, message: t('elmessage.checkRemark'), trigger: 'blur' }
]
});
@ -141,22 +144,22 @@ const handleAddForm = async () => {
formRef.value.validate((valid) => {
if (valid) {
if (Number(addForm.value.permanentBean) === 0 && Number(addForm.value.freeBean) === 0) {
reject(new Error('付费金豆和免费金豆不能同时为0'));
reject(new Error(t('elmessage.noPayBeanFreeBeanZero')));
}
resolve(); //
} else {
reject(new Error('请检查并完善表单信息')); //
reject(new Error(t('elmessage.checkFormInfo'))); //
}
});
});
console.log('adminData', adminData.value);
await ElMessageBox.confirm(
'确认充值吗?',
'提示',
t('recharge.confirmRecharge'),
t('recharge.prompt'),
{
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonText: t('common.confirm'),
cancelButtonText: t('common.cancel'),
type: "primary",
lockScroll: false,
}
@ -174,7 +177,7 @@ const handleAddForm = async () => {
})
addDisabled.value = false
if (result.code == 200) {
ElMessage.success('新增成功')
ElMessage.success(t('elmessage.addsuccess'))
deleteAddForm()
user.value = {}
} else {
@ -182,7 +185,7 @@ const handleAddForm = async () => {
}
} catch (error) {
console.log('金豆新增充值失败');
ElMessage.error(error.message || '操作取消');
ElMessage.error(error.message || t('elmessage.cancelOperation'));
}
}
</script>
@ -191,22 +194,22 @@ const handleAddForm = async () => {
<div class="left">
<el-form :model="addForm" :rules="rules" ref="formRef" label-width="auto" style="max-width: 600px"
class="add-form">
<el-form-item prop="jwcode" label="精网号" label-position="left">
<el-form-item prop="jwcode" :label="t('common.jwcode')" label-position="left">
<el-input v-model="addForm.jwcode" style="width: 220px" />
<el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button>
<el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">{{ t('common.search') }}</el-button>
</el-form-item>
<el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-form-item prop="permanentBean" :label="t('recharge.permanentBean')" label-position="left">
<el-input v-model="addForm.permanentBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-form-item prop="freeBean" :label="t('recharge.freeBean')" label-position="left">
<el-input v-model="addForm.freeBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="remark" label="备注" label-position="left">
<el-form-item prop="remark" :label="t('common_add.remark')" label-position="left">
<el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
<el-button @click="deleteAddForm" style="margin-left: 8.5vw;margin-top:1vw" type="success">重置</el-button>
<el-button type="primary" :disabled="addDisabled" @click="handleAddForm" style="margin-top:1vw"> 提交
<el-button @click="deleteAddForm" style="margin-left: 8.5vw;margin-top:1vw" type="success">{{ t('common.reset') }}</el-button>
<el-button type="primary" :disabled="addDisabled" @click="handleAddForm" style="margin-top:1vw"> {{ t('common.submit') }}
</el-button>
</el-form>
</div>
@ -215,12 +218,12 @@ const handleAddForm = async () => {
<div class="right">
<el-card v-if="user.jwcode" class="customer-info">
<el-form :model="user" label-width="auto" label-position="left">
<el-text size="large" style="margin-left: 7vw">客户信息</el-text>
<el-text size="large" style="margin-left: 7vw">{{ t('common_add_user.customerInfo') }}</el-text>
<!-- 第一行姓名 + 当前付费金豆 -->
<div style="margin-top: 0.5vw;display:flex;">
<p style="width:6vw;">姓名:</p>
<p style="width:5vw;">{{ t('common_add_user.name') }}:</p>
<p style="color: #2fa1ff;width:6vw;">{{ user.name }}</p>
<p style="width:7vw;">当前付费金豆:</p>
<p style="width:7vw;">{{ t('common_add_user.currentPayableBean') }}:</p>
<p v-if="!isNaN(Number(user.permanentBean))" style="color: #2fa1ff;">{{ Number(user.permanentBean) }}</p>
<!-- 如果不是有效的数字显示默认值 -->
<p v-else></p>
@ -228,17 +231,17 @@ const handleAddForm = async () => {
<!-- 第二行精网号 + 免费金豆 -->
<div style="display:flex">
<p style="width:6vw;">精网号:</p>
<p style="width:5vw;">{{ t('common.jwcode') }}:</p>
<p style="color: #2fa1ff;width:6vw;">{{ user.jwcode }}</p>
<p style="width:7vw;">当前免费金豆:</p>
<p style="width:7vw;">{{ t('common_add_user.currentFreeBean') }}:</p>
<p v-if="user.freeBean !== undefined" style="color: #2fa1ff;">{{ user.freeBean }}</p>
</div>
<!-- 第三行消费次数 + 所属门店 -->
<div style="display:flex">
<p style="width:6vw;">所属门店:</p>
<p style="width:5vw;">{{ t('common_add_user.store') }}:</p>
<p style="color: #2fa1ff;width:6vw;">{{ user.market }}</p>
<p style="width:7vw;">消耗金豆总数:</p>
<p style="width:7vw;">{{ t('common_add_user.consumeTotalBean') }}:</p>
<p style="color: #2fa1ff;" v-if="user.consumeSum != null">{{ user.consumeSum }}</p>
<p style="color: #2fa1ff;" v-else>{{ 0 }}</p>
</div>

96
src/views/recharge/bean/beanOnlineRecharge.vue

@ -6,6 +6,8 @@ import { AiFillRead } from 'vue-icons-plus/ai'
import axios from 'axios'
import moment from 'moment'
import API from '@/util/http.js'
import {useI18n} from 'vue-i18n'
const { t } = useI18n()
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
@ -73,7 +75,7 @@ const getArea = async () => {
market.value = result.data
console.log('线上充值地区获取成功', market.value)
} else {
ElMessage.error('线上充值地区获取失败')
ElMessage.error(t('elmessage.onlineRechargeAreaError'))
}
}
//
@ -156,7 +158,7 @@ const search = () => {
if (selectData.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(selectData.value.jwcode)) {
ElMessage.error('请检查精网号格式')
ElMessage.error(t('elmessage.checkJwcodeFormat'))
return
}
}
@ -205,7 +207,7 @@ const platform = [
},
{
value: 2,
label: '手机'
label: t('recharge.mobile')
}
]
//
@ -258,13 +260,13 @@ const exportExcel = async () => {
try {
const res = await API({ url: '/export/exportol', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
ElMessage.success(t('elmessage.exportSuccess'))
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
ElMessage.error(res.message || t('elmessage.exportFailed'))
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
ElMessage.error(t('elmessage.exportFailed'))
}
}
const exportListVisible = ref(false)
@ -294,7 +296,7 @@ const getExportList = async () => {
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
ElMessage.error(t('elmessage.getExportListError'))
} finally {
exportListLoading.value = false
}
@ -307,7 +309,7 @@ const downloadExportFile = (item) => {
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
ElMessage.warning(t('elmessage.exportingInProgress'))
}
}
//
@ -329,15 +331,15 @@ const getTagType = (state) => {
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
return t('elmessage.pendingExecution');
case 1:
return '执行中';
return t('elmessage.executing');
case 2:
return '执行完成';
return t('elmessage.executed');
case 3:
return '执行出错';
return t('elmessage.errorExecution');
default:
return '未知状态';
return t('elmessage.unknownStatus');
}
}
const format3 = (num) => {
@ -355,22 +357,22 @@ onMounted(async function () {
<el-col style="margin-bottom: 1vh">
<div class="select">
<div class="selectRow">
<el-text class="text" size="large">精网号</el-text>
<el-input class="selectContent" v-model="selectData.jwcode" placeholder="请输入精网号" clearable />
<el-text class="text" size="large">{{ t('common.jwcode') }}</el-text>
<el-input class="selectContent" v-model="selectData.jwcode" :placeholder="t('common.jwcodePlaceholder')" clearable />
</div>
<div class="selectRow">
<el-text class="text" size="large">所属地区</el-text>
<el-select class="selectContent" v-model="selectData.market" placeholder="请选择所属地区" clearable>
<el-text class="text" size="large">{{ t('common.market') }}</el-text>
<el-select class="selectContent" v-model="selectData.market" :placeholder="t('common.marketPlaceholder')" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="selectRow" style="width: 15vw;">
<el-text class="text" size="large">订单号</el-text>
<el-input class="selectContent" v-model="selectData.orderNo" placeholder="请输入订单" clearable />
<el-text class="text" size="large">{{ t('common.orderNo') }}</el-text>
<el-input class="selectContent" v-model="selectData.orderNo" :placeholder="t('common.orderNoPlaceholder')" clearable />
</div>
<div class="selectRow" style="width: 15vw;">
<el-text class="text" size="large">充值平台</el-text>
<el-select class="selectContent" v-model="selectData.platform" placeholder="请选择充值平台" clearable>
<el-text class="text" size="large">{{ t('common.rechargePlatform') }}</el-text>
<el-select class="selectContent" v-model="selectData.platform" :placeholder="t('common.rechargePlatformPlaceholder')" clearable>
<el-option v-for="item in platform" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
@ -379,9 +381,9 @@ onMounted(async function () {
<el-col>
<div class="select">
<div class="selectRow" style="width: 36vw;">
<el-text class="text" size="large">充值时间</el-text>
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" style="margin-right:1vw;width:25vw"
<el-text class="text" size="large">{{ t('common.rechargeTime') }}</el-text>
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="t('common.to')"
:start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" style="margin-right:1vw;width:25vw"
@change="handleDatePickerChange" :default-time="defaultTime" />
<div v-if="false">
<el-button @click="getToday()" style="margin-left: 10px"
@ -397,43 +399,43 @@ onMounted(async function () {
</div>
</div>
<div class="selectRow" style="justify-content: flex-start;">
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出Excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">{{ t('common.search') }}</el-button>
<el-button type="primary" @click="exportExcel()">{{ t('common.exportExcel') }}</el-button>
<el-button type="primary" @click="openExportList">{{ t('common.viewExportList') }}</el-button>
<el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
</div>
</div>
</el-col>
</el-card>
<el-card class="card2">
<div class="goldStatistics">
充值金豆数{{ format3(num) }}&nbsp;&nbsp;&nbsp;&nbsp;合计新币数{{ format3(money) }}
{{ t('common.rechargeGoldBean') }}{{ format3(num) }}&nbsp;&nbsp;&nbsp;&nbsp;{{ t('common.totalRechargeSGD') }}{{ format3(money) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div>
<el-table :data="tableData" style="width:80vw;" height="65vh" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" min-width="120" show-overflow-tooltip />
<el-table-column fixed="left" prop="jwcode" label="精网号" min-width="110px" />
<el-table-column prop="market" label="所属地区" min-width="100px" />
<el-table-column prop="orderNo" header-align="center" align="center" label="订单号" min-width="210px" />
<el-table-column prop="num" label="数量" sortable="custom" min-width="110px" />
<el-table-column prop="money" label="金额" sortable="custom" min-width="150px" />
<el-table-column prop="platform" label="充值平台" min-width="150px" show-overflow-tooltip>
<el-table-column fixed="left" prop="name" :label="t('common_list.name')" min-width="120" show-overflow-tooltip />
<el-table-column fixed="left" prop="jwcode" :label="t('common_list.jwcode')" min-width="110px" />
<el-table-column prop="market" :label="t('common_list.market')" min-width="100px" />
<el-table-column prop="orderNo" header-align="center" align="center" :label="t('common_list.orderNo')" min-width="210px" />
<el-table-column prop="num" :label="t('common_list.number')" sortable="custom" min-width="110px" />
<el-table-column prop="money" :label="t('common_list.money')" sortable="custom" min-width="150px" />
<el-table-column prop="platform" :label="t('common_list.rechargePlatform')" min-width="150px" show-overflow-tooltip>
<template #default=scope>
<span v-if="scope.row.platform == 1">PC</span>
<span v-else-if="scope.row.platform == 2">手机</span>
<span v-else>其他</span>
<span v-else-if="scope.row.platform == 2">{{ t('common_list.mobile') }}</span>
<span v-else>{{ t('common_list.other') }}</span>
</template>
</el-table-column>
<el-table-column prop="rechargeTime" label="充值时间" min-width="200px">
<el-table-column prop="rechargeTime" :label="t('common_list.rechargeTime')" min-width="200px">
<template #default="scope">
{{ moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
@ -449,33 +451,33 @@ onMounted(async function () {
</div>
</el-card>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80vw" class="custom-height-dialog">
<el-dialog v-model="exportListVisible" :title="t('common_export.exportList')" width="80vw" class="custom-height-dialog">
<el-table :data="exportList" style="width:80vw;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<el-table-column prop="fileName" :label="t('common_export.fileName')" />
<el-table-column prop="state" :label="t('common_export.status')">
<template #default="scope">
<el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
{{ getTagText(scope.row.state) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间">
<el-table-column prop="createTime" :label="t('common_export.createTime')">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column :label="t('common_export.operation')">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
{{ t('common_export.download') }}
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
<el-button text @click="exportListVisible = false">{{ t('common_export.close') }}</el-button>
</div>
</template>
</el-dialog>

15
src/views/recharge/bean/beanRecharge.vue

@ -6,24 +6,24 @@
:class="{ 'active-btn': activeTab === 'addBeanRecharge' }"
@click="navigateTo('addBeanRecharge')"
v-if="hasAdd"
style="width: 6.5vw">
新增充值
style="min-width: 6.5vw">
{{ t('recharge.addBeanRecharge') }}
</el-button>
<el-button
class="no-active-btn"
:class="{ 'active-btn': activeTab === 'beanSystemRecharge' }"
@click="navigateTo('beanSystemRecharge')"
v-if="hasSystem"
style="width: 6.5vw;">
系统充值
style="min-width: 6.5vw">
{{ t('recharge.systemRecharge') }}
</el-button>
<el-button
class="no-active-btn"
:class="{ 'active-btn': activeTab === 'beanOnlineRecharge' }"
@click="navigateTo('beanOnlineRecharge')"
v-if="hasOnline"
style="width: 6.5vw;">
线上充值
style="min-width: 6.5vw;">
{{ t('recharge.onlineRecharge') }}
</el-button>
</el-button-group>
</div>
@ -37,6 +37,9 @@ import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
import {useI18n} from 'vue-i18n';
const { t } = useI18n();
const router = useRouter();
const route = useRoute();

86
src/views/recharge/bean/beanSystemRecharge.vue

@ -10,6 +10,8 @@ import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
const adminStore = useAdminStore();
const { adminData, menuTree,flag } = storeToRefs(adminStore);
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
// flag
watch(flag, (newFlag, oldFlag) => {
@ -87,7 +89,7 @@ const getArea = async () => {
market.value = result.data
console.log('系统充值地区获取成功', market.value)
} else {
ElMessage.error('系统充值地区获取失败')
ElMessage.error(t('elmessage.systemRechargeAreaError'))
}
}
//
@ -169,7 +171,7 @@ const search = () => {
if (selectData.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(selectData.value.jwcode)) {
ElMessage.error('请检查精网号格式')
ElMessage.error(t('elmessage.checkJwcodeFormat'))
return
}
}
@ -262,13 +264,13 @@ const exportExcel = async () => {
console.log('系统充值导出的参数为:', params);
if (res.code === 200) {
ElMessage.success('导出成功')
ElMessage.success(t('elmessage.exportSuccess'))
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
ElMessage.error(res.message || t('elmessage.exportFailed'))
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
ElMessage.error(t('elmessage.exportFailed'))
}
}
const exportListVisible = ref(false)
@ -294,11 +296,11 @@ const getExportList = async () => {
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
ElMessage.error(result.msg || t('elmessage.getExportListError'))
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
ElMessage.error(t('elmessage.getExportListError'))
} finally {
exportListLoading.value = false
}
@ -311,7 +313,7 @@ const downloadExportFile = (item) => {
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
ElMessage.warning(t('elmessage.exportingInProgress'))
}
}
//
@ -333,15 +335,15 @@ const getTagType = (state) => {
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
return t('elmessage.pendingExecution');
case 1:
return '执行中';
return t('elmessage.executing');
case 2:
return '执行完成';
return t('elmessage.executed');
case 3:
return '执行出错';
return t('elmessage.errorExecution');
default:
return '未知状态';
return t('elmessage.unknownStatus');
}
}
const format3 = (num) => {
@ -359,12 +361,12 @@ onMounted(async function () {
<el-col style="margin-bottom: 1vh">
<div class="select">
<div class="selectRow">
<el-text class="text" size="large">精网号</el-text>
<el-input class="selectContent" v-model="selectData.jwcode" placeholder="请输入精网号" clearable />
<el-text class="text" size="large">{{ t('common.jwcode') }}</el-text>
<el-input class="selectContent" v-model="selectData.jwcode" :placeholder="t('common.jwcodePlaceholder')" clearable />
</div>
<div class="selectRow">
<el-text class="text" size="large">所属地区</el-text>
<el-select class="selectContent" v-model="selectData.market" placeholder="请选择所属地区" clearable>
<el-text class="text" size="large">{{ t('common.market') }}</el-text>
<el-select class="selectContent" v-model="selectData.market" :placeholder="t('common.marketPlaceholder')" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
</el-select>
</div>
@ -373,9 +375,9 @@ onMounted(async function () {
<el-col>
<div class="select">
<div class="selectRow" style="width: 36vw;">
<el-text class="text" size="large">充值时间</el-text>
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" style="margin-right:1vw;width:25vw"
<el-text class="text" size="large">{{ t('common.rechargeTime') }}</el-text>
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="t('common.to')"
:start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" style="margin-right:1vw;width:25vw"
@change="handleDatePickerChange" :default-time="defaultTime" />
<div v-if="false">
<el-button @click="getToday()" style="margin-left: 10px"
@ -390,36 +392,36 @@ onMounted(async function () {
</el-button>
</div>
</div>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" style="width: 80px;" @click="exportExcel()">导出Excel</el-button>
<el-button type="primary" style="width: 95px;" @click="openExportList">查看导出列表</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">{{ t('common.search') }}</el-button>
<el-button type="primary" @click="exportExcel()">{{ t('common.exportExcel') }}</el-button>
<el-button type="primary" @click="openExportList">{{ t('common.viewExportList') }}</el-button>
<el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
</div>
</el-col>
</el-card>
<el-card class="card2">
<div class="goldStatistics">
金豆总数{{ format3(beanNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(permanentBeans) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(freeBean) }}
{{ t('common.totalGoldBean') }}{{ format3(beanNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
{{ t('common.payGoldBean') }}{{ format3(permanentBeans) }}&nbsp;&nbsp;&nbsp;&nbsp;
{{ t('common.freeGoldBean') }}{{ format3(freeBean) }}
</div>
<div>
<el-table :data="tableData" style="width: 82vw;height:65vh;" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" min-width="100" show-overflow-tooltip />
<el-table-column fixed="left" prop="jwcode" label="精网号" min-width="110px" />
<el-table-column prop="market" label="所属地区" min-width="100px" />
<el-table-column prop="permanentBean" label="付费金豆" sortable="custom" min-width="110px" />
<el-table-column prop="freeBean" label="免费金豆" sortable="custom" min-width="110px" />
<el-table-column prop="remark" label="备注" min-width="150px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="充值时间" min-width="200px">
<el-table-column fixed="left" prop="name" :label="t('common_list.name')" min-width="100" show-overflow-tooltip />
<el-table-column fixed="left" prop="jwcode" :label="t('common_list.jwcode')" min-width="110px" />
<el-table-column prop="market" :label="t('common_list.market')" min-width="100px" />
<el-table-column prop="permanentBean" :label="t('common_list.permanentBean')" sortable="custom" min-width="110px" />
<el-table-column prop="freeBean" :label="t('common_list.freeBean')" sortable="custom" min-width="110px" />
<el-table-column prop="remark" :label="t('common_list.remark')" min-width="150px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" :label="t('common_list.rechargeTime')" min-width="200px">
<template #default="scope">
{{ moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
@ -435,33 +437,33 @@ onMounted(async function () {
</div>
</el-card>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80vw">
<el-dialog v-model="exportListVisible" :title="t('common_export.exportList')" width="80vw">
<el-table :data="exportList" style="width: 80vw;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<el-table-column prop="fileName" :label="t('common_export.fileName')" />
<el-table-column prop="state" :label="t('common_export.status')">
<template #default="scope">
<el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
{{ getTagText(scope.row.state) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间">
<el-table-column prop="createTime" :label="t('common_export.createTime')">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column :label="t('common_export.operation')">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
{{ t('common_export.download') }}
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
<el-button text @click="exportListVisible = false">{{ t('common_export.close') }}</el-button>
</div>
</template>
</el-dialog>

Loading…
Cancel
Save