gameapi-client/src/views/merchant/businessInformation/index.vue

788 lines
30 KiB
Vue
Raw Normal View History

2025-08-14 10:33:48 +08:00
<template>
<div class="app-container">
<table-search-card :model="queryParams" @getList="getList" @handleQuery="handleQuery" @resetQuery="resetQuery">
<template #left>
<el-form-item :label="t('商户账号')" prop="tenantKey">
<el-input
v-model="queryParams.tenantKey"
:placeholder="t('请输入商户账号')"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item :label="t('状态')" prop="tenantStatus">
<CustomSelect v-model="queryParams.tenantStatus" :options="tenantStatusArr" placeholder="请选择状态" style="width: 200px" />
</el-form-item>
</template>
<template #right>
<el-form-item>
<el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['super:tenant:create']">{{ t('') }}</el-button>
</el-form-item>
</template>
</table-search-card>
<el-table v-loading="loading" :data="agentList" class="c-table-main" border>
<!-- <el-table-column type="selection" width="55" align="center" /> -->
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('商户标识')" min-width="100" align="center" prop="tenantSn" >
2025-08-14 10:33:48 +08:00
<template #default="{row}">
{{ row.tenantSn }}<br/>
<span v-if="row.agentAccount">{{ t('') }}: {{ row.agentAccount }}</span>
</template>
</el-table-column>
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('商户账号')" align="center" prop="tenantKey" min-width="170px" >
2025-08-29 09:26:00 +08:00
<template #default="{row}">
<div style="width: 100%;text-align: left;">{{ t('账号') }} {{ row.tenantKey }}</div>
<div style="width: 100%;text-align: left;">{{ t('谷歌') }}
<span v-if="row.googleCode == null || row.googleCode == ''" style="color: #909399;">{{ t('') }}</span>
<span v-else style="color: #1ab394;">{{ t('已绑定') }} <el-button link type="primary" @click="handleUnbindGoogle(row)" v-hasPermi="['super:tenant:resetGoogleCode']">{{ t('') }}</el-button></span>
</div>
</template>
</el-table-column>
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('余额')" min-width="160" align="center" >
2025-08-14 10:33:48 +08:00
<template #default="{row}">
2025-09-01 08:59:56 +08:00
<div style="display: flex;justify-content: space-between;">
<div>
{{ getcurrencySign(row.currencyCode) }} {{ (row.realBalance ?? 0) + (row.creditBalance ?? 0) }}
</div>
<el-button link type="primary" @click="handleAdjustment(row)" v-hasPermi="['super:tenant:quota:update']">{{ t('') }}</el-button>
</div>
2025-08-14 10:33:48 +08:00
</template>
</el-table-column>
<!-- <el-table-column :label="t('商户Api平台配置')" width="100" align="center" >
<template #default="{row}">
<el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['agent:tenant:view']">{{ t('') }}</el-button>
</template>
</el-table-column> -->
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('注册时间')" align="center" prop="createTime" min-width="120">
2025-08-14 10:33:48 +08:00
<template #default="scope">{{ parseTime(scope.row.createTime)|| '--' }}</template>
</el-table-column>
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('最后登录时间')" align="center" prop="loginData" min-width="120">
2025-08-14 10:33:48 +08:00
<template #default="scope">{{ parseTime(scope.row.loginData) || '--' }}</template>
</el-table-column>
<el-table-column :label="t('状态')" align="center">
<template #default="{row}">
<!-- <dict-tag :options="ff_tenant_status" :value="String(scope.row.tenantStatus)" /> -->
<base-switch v-model="row.tenantStatus" :active-value="true" :inactive-value="false"
:before-change="() => beforeSwitchChange(row, 'tenantStatus')" v-hasPermi="['super:tenant:switch']" />
</template>
</el-table-column>
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('商户平台费率')" min-width="130" align="center">
<template #default="{row}">
<el-button type="primary" plain @click="handleView(row)">{{ t('') }}</el-button>
</template>
</el-table-column>
2025-08-14 10:33:48 +08:00
<el-table-column :label="t('操作')" align="center" width="260" class-name="small-padding fixed-width">
<template #default="scope">
<el-popconfirm
class="box-item"
:title="t('确定重置该商户密码?')"
placement="top"
@confirm="resetPassword(scope.row)"
>
<template #reference>
<!-- @click="resetPassword(scope.row)" -->
<el-button link type="primary" v-hasPermi="['super:tenant:resetPwd']">{{ t('') }}</el-button>
</template>
</el-popconfirm>
<el-button link type="primary" @click="handleConnection(scope.row)" v-hasPermi="['super:tenant:list']">{{ t('') }}</el-button>
<el-button link type="primary" @click="edit(scope.row)" v-hasPermi="['super:tenant:detail']">{{ t('') }}</el-button>
<el-button link type="primary" @click="whitelist(scope.row)" v-hasPermi="['super:white:list']">{{ t('') }}</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
2025-09-01 08:59:56 +08:00
<!-- 商户平台费率 -->
<el-dialog v-if="openView" :title="t('商户平台费率')" v-model="openView" align-center width="820px" append-to-body>
<el-descriptions :column="2" border>
<el-descriptions-item label="商户标识">{{form.tenantSn}}</el-descriptions-item>
<el-descriptions-item label="商户账号">{{form.tenantKey}}</el-descriptions-item>
</el-descriptions>
<div style="height: 30px;"></div>
<el-form :model="form" ref="openViewRef" :rules="rules" label-width="120px">
<div class="label-scoreRatio">
<span>{{ t('平台比例') }}</span>
<div>
<el-button type="danger" @click="queryCode('del')" :disabled="!form.tenantSystemPlatforms.length">-0.5</el-button>
<el-button type="primary" @click="queryCode('add')" :disabled="!form.tenantSystemPlatforms.length">+0.5</el-button>
</div>
</div>
<div style="display: flex;margin-left: 120px;justify-content: space-between;margin-bottom: 10px;">
<el-input
v-model="searchPlatformCode"
style="width: 100%"
:placeholder="t('请输入游戏平台')"
:suffix-icon="Search"
@input="searchSystemPlatforms"
/>
</div>
<el-table :data="form.tenantSystemPlatforms" height="500" width="700px" class="scoreRatioTable">
2025-08-14 10:33:48 +08:00
<el-table-column :label="t('平台')" align="center" prop="platformCode" />
<el-table-column :label="t('币种')" align="center" prop="currencyCode" />
2025-09-01 08:59:56 +08:00
<el-table-column :label="t('成本比例(%')" align="center" min-width="120" prop="cost">
<template #default="scope">
{{ scope.row.cost }}%
</template>
</el-table-column>
<el-table-column :label="t('商户通用比例(%')" align="center" min-width="130" prop="useCost">
<template #default="scope">
<div style="display: flex;align-items: center;">
<el-input v-model="scope.row.useCost" @input="handleInput(scope.row)"
@blur="handleBlur(scope.row)" :placeholder="t('请输入')" >
<template #append>%</template>
</el-input>
</div>
</template>
</el-table-column>
<el-table-column prop="maxAmount" label="带入金额" min-width="180">
<template #default="scope">
<div style="display:flex;align-items: center;"><NumberInput v-model="scope.row.minAmount" @input="handleInput1(scope.row)"></NumberInput> ~ <NumberInput v-model="scope.row.maxAmount" @input="handleInput2(scope.row)"></NumberInput></div>
</template>
</el-table-column>
2025-08-14 10:33:48 +08:00
</el-table>
</el-form>
<template #footer>
2025-09-01 08:59:56 +08:00
<div class="dialog-footer">
<el-button type="primary" @click="submitForm" :loading="loadingButton" v-hasPermi="['super:tenant:edit']">{{ t(' ') }}</el-button>
<el-button @click="closeDialog">{{ t(' ') }}</el-button>
</div>
</template>
2025-08-14 10:33:48 +08:00
</el-dialog>
<el-dialog :title="t('对接信息')" align-center v-model="openReset" width="620px" append-to-body>
<template #header>
<div class="dialog-header">
<div class="dialog-title" style="width: 100%;text-align: center;">{{ openResetTiele }}</div>
</div>
</template>
<el-descriptions border :column="1" class="c-descriptions" >
<el-descriptions-item label-width="150" label-align="right" :label="t('商户后台')">
<div style="width: 300px;">{{ yueURL }} <CopyIcon :colors="'#409EFF'" v-if="yueURL" :text="String(yueURL)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('登录账号')">
<div style="width: 300px;">{{ ConnectionArr.tenantKey }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.tenantKey" :text="String(ConnectionArr.tenantKey)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('初始密码')">
<div style="width: 300px;"> {{ ConnectionArr.originalPassword }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.originalPassword" :text="String(ConnectionArr.originalPassword)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('系统说明')">
{{ t('为了账户安全,登录成功后请先修改密码,绑定谷歌验证码。') }}
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('商户KEY')">
<div style="width: 300px;">{{ ConnectionArr.tenantKey }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.tenantKey" :text="String(ConnectionArr.tenantKey)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('商户密钥')">
<div style="width: 300px;">{{ ConnectionArr.tenantSecret }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.tenantSecret" :text="String(ConnectionArr.tenantSecret)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('api请求地址')">
<div style="width: 300px;">{{ ConnectionArr.tenantApiUrl }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.tenantApiUrl" :text="String(ConnectionArr.tenantApiUrl)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('对接文档')">
<div style="width: 300px;"> {{ ConnectionArr.documentUrl }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.documentUrl" :text="String(ConnectionArr.documentUrl)"></CopyIcon></div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('文档密码')">
<div style="width: 300px;"> {{ ConnectionArr.documentPass }}<CopyIcon :colors="'#409EFF'" v-if="ConnectionArr.documentPass" :text="String(ConnectionArr.documentPass)"></CopyIcon></div>
</el-descriptions-item>
</el-descriptions>
<div style="padding-left: 10px;margin-top: 10px;">
<el-button link type="primary" @click="copyAccountInfo(ConnectionArr)">{{ t('') }}</el-button>
</div>
<template #footer>
<div class="dialog-footer" style="width: 100%;text-align: center;">
<el-button type="primary" v-if="openResetTiele == '账号信息'" @click="cancel">{{ t('') }}</el-button>
<el-button @click="cancel" v-if="openResetTiele == '对接信息'">{{ t(' ') }}</el-button>
</div>
</template>
</el-dialog>
<add-merchants-dialog v-if="openShowDialog" :addEditStatus="addEditStatus" :modifyDate="modifyDate" @submit="submitOn"
v-model:show="openShowDialog"></add-merchants-dialog>
<adjustment-dialog v-if="openAdjustment" :addEditStatus="addEditStatus" :modifyDate="modifyDate" @submit="getList"
v-model:show="openAdjustment"></adjustment-dialog>
<whitelist-dialog v-if="whitelistShow" :addEditStatus="addEditStatus" :modifyDate="modifyDate" @submit="getList"
v-model:show="whitelistShow"></whitelist-dialog>
<renew-dialog v-if="renewShow" v-model:show="renewShow" :addEditStatus="addEditStatus" :modifyDate="modifyDate" @submit="submitOn"></renew-dialog>
</div>
</template>
<script setup name="Agent">
2025-09-01 08:59:56 +08:00
import { superTenantList, updateSuperTenantEdit,updateSuperTenantResetPwd,updateSuperResetGoogleCode,getSuperTenant,superTenantQuotaList,updateSuperTenantQuotaUpdate,updateSuperTenantSwitch } from "@/api/super/tenant.js";
2025-08-14 10:33:48 +08:00
import { superPlatformSystem } from "@/api/agent";
2025-09-01 08:59:56 +08:00
import { getPlatformShowSelect } from "@/api/super/platform.js";
2025-08-14 10:33:48 +08:00
import { getLocalStorage } from "@/utils/auth";
import AddMerchantsDialog from './components/AddMerchantsDialog'
import AdjustmentDialog from './components/AdjustmentDialog';
import WhitelistDialog from './components/WhitelistDialog';
import RenewDialog from './components/RenewDialog';
import BaseSwitch from '@/components/BaseSwitch'
import CustomSelect from '@/components/CustomSelect'
import CopyIcon from '@/components/CopyIcon'
2025-09-01 08:59:56 +08:00
import NumberInput from '@/components/NumberInput';
2025-08-14 10:33:48 +08:00
import Crontab from '@/components/Crontab'
2025-09-01 08:59:56 +08:00
import { Search } from '@element-plus/icons-vue'
2025-08-14 10:33:48 +08:00
import { parseTime } from '@/utils/ruoyi'; // 时间格式化
2025-09-01 08:59:56 +08:00
import { get } from "@vueuse/core";
2025-08-14 10:33:48 +08:00
const router = useRouter();
const { proxy } = getCurrentInstance();
const { ff_tenant_type, ff_tenant_status } = proxy.useDict("ff_tenant_type", "ff_tenant_status");
const agentList = ref([]);
const openShowDialog = ref(false),addEditStatus = ref('add'),modifyDate = ref({});
const loading = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const openView = ref(false);
const tenantSystemPlatforms = ref([]);
const realBalance = ref([]);
const openResetTiele = ref("");
2025-09-01 08:59:56 +08:00
const loadingButton = ref(false);
const oldForm = shallowRef({ });
2025-08-14 10:33:48 +08:00
const tenantStatusArr = ref([
{ label: '正常', value: '1' },
{ label: '停用', value: '0' },
]);
2025-09-01 08:59:56 +08:00
const currencySelectArr = ref([]);
const PlatformRatioAll = ref([]);
let res = getLocalStorage('currencySelect');
currencySelectArr.value = res.map(item => {
return { label:`${item.currencyName}(${item.currencyCode})`, value: item.currencyCode }
})
2025-08-14 10:33:48 +08:00
const data = reactive({
form: {
proportion:0,
},
queryParams: {
pageNum: 1,
pageSize: 10,
tenantKey: "",
},
rules: {
account: [{ required: true, message: proxy.t('商户账号不能为空'), trigger: "blur" }],
password: [{ required: true, message: proxy.t('密码不能为空'), trigger: "blur" }],
scoreRatio: [{ required: true, message: proxy.t('买分比例不能为空'), trigger: "blur" }],
tenantType: [{ required: true, message: proxy.t('商户模式不能为空'), trigger: "change" }],
realBalanceNum: [{ required: true, message: proxy.t('信誉额度不能为空'), trigger: "change" }],
}
});
const { queryParams, form, rules } = toRefs(data);
const yueURL = ref(window.location.origin);
const rulesReset = reactive({
pwd: [{ required: true, message: proxy.t('密码不能为空'), trigger: "change" }],
});
const formReset = reactive({
pwd: "",
});
const openReset = ref(false);
/** 查询列表 */
function getList() {
loading.value = true;
superTenantList(queryParams.value).then(response => {
agentList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
// 列表开关事件
const beforeSwitchChange = async (row, undateKeys) => {
const _status = row[undateKeys] == 1 ? 0 : 1
const _data = {
id: row.id,
}
_data[undateKeys] = _status
try {
await updateSuperTenantSwitch(_data).then(() => {
proxy.$modal.msgSuccess(_status === 1 ? proxy.t('开启成功') : proxy.t('关闭成功'))
getList()
})
return true;
} catch (error) {
console.error(proxy.t('接口调用失败'), error);
return false; // 阻止开关状态改变
}
}
/** 任务组名字典翻译 */
function jobGroupFormat(row, column) {
return proxy.selectDictLabel(sys_job_group.value, row.jobGroup);
}
const submitOn = (row) => {
openReset.value = true;
openResetTiele.value = "对接信息";
ConnectionArr.value = row;
getList();
};
/** 取消按钮 */
function cancel() {
openShowDialog.value = false;
openReset.value = false;
reset();
}
2025-09-01 08:59:56 +08:00
//
const getcurrencySign = (val) => {
let resData = getLocalStorage('currencySelect');
let currencySelectAlls = resData.map(item => ({
...item,
label: `${item.currencyName}(${item.currencyCode})`,
value: item.currencyCode
}));
let currencySignItem = currencySelectAlls?.find(item => item.value == val);
return currencySignItem?.currencySign
}
2025-08-14 10:33:48 +08:00
/** 表单重置 */
function reset() {
form.value = {
account: "",
password: "",
scoreRatio: 1,
tenantType: 1,
tenantSystemPlatforms: [],
realBalance: [],
};
proxy.resetForm("agentRef");
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
const whitelistShow = ref(false);
const whitelist = (row) => {
whitelistShow.value = true;
modifyDate.value = row;
}
const ConnectionArr = ref({});
const handleConnection = (row) => {
openReset.value = true;
openResetTiele.value = "对接信息";
ConnectionArr.value = row;
}
2025-08-29 09:26:00 +08:00
//解除
const handleUnbindGoogle = (row) => {
proxy.$confirm('确定解除绑定吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateSuperResetGoogleCode({
id: row.id,
}).then(res => {
proxy.$modal.msgSuccess(proxy.t('解除成功'));
getList();
})
}).catch(() => {});
}
2025-09-01 08:59:56 +08:00
const numbers = ref(0);
function queryCode(type) {
form.value.tenantSystemPlatforms = form.value.tenantSystemPlatforms.map((item, index) => {
if (type === 'del' && item.useCost > item.cost) {
item.useCost = Number(item.useCost);
item.useCost -= 0.5
} else if (type === 'add') {
item.useCost = Number(item.useCost);
item.useCost += 0.5;
}
return item
})
PlatformRatioAll.value = PlatformRatioAll.value.map((item, index) => {
if (type === 'del' && item.useCost > item.cost) {
item.useCost = Number(item.useCost);
item.useCost -= 0.5
} else if (type === 'add') {
item.useCost = Number(item.useCost);
item.useCost += 0.5;
}
return item
})
if (type === 'del' && numbers.value > 0) {
numbers.value= Number(numbers.value);
numbers.value -= 0.5;
} else if (type === 'add') {
numbers.value= Number(numbers.value);
numbers.value += 0.5;
}
2025-08-29 09:26:00 +08:00
2025-09-01 08:59:56 +08:00
}
2025-08-14 10:33:48 +08:00
const handleCopy = async(text) => {
// 支持现代 API需 HTTPS 或 localhost
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(text);
}
// fallback兼容 HTTP、老浏览器、iframe 等环境
return new Promise((resolve, reject) => {
try {
const textarea = document.createElement('textarea');
textarea.value = text;
// 设置样式防跳动
textarea.style.position = 'fixed';
textarea.style.top = '-9999px';
textarea.style.left = '-9999px';
textarea.setAttribute("readonly", true);
document.body.appendChild(textarea);
textarea.select();
const success = document.execCommand("copy");
// copyTextSuccess();
document.body.removeChild(textarea);
success ? resolve() : reject(new Error("execCommand copy failed"));
} catch (err) {
reject(err);
}
});
}
const resetPassword = (row) => {
let objItem = {
id: row.id,
}
updateSuperTenantResetPwd(objItem).then(res => {
handleCopy(res.data);
getList();
openResetTiele.value = "账号信息";
openReset.value = true;
ConnectionArr.value ={
...row,
originalPassword:res.data
};
// proxy.$modal.msgSuccess(proxy.t('密码已复制'));
})
// proxy.$prompt('请输入谷歌验证码', "提示", {
// confirmButtonText: "确定",
// cancelButtonText: "取消",
// closeOnClickModal: false,
// inputValidator: (value) => {
// if (!value) {
// return '验证码不能为空';
// }
// return true;
// }
// }).then(({ value }) => {
// }).catch(() => {});
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
const switchBeforeChange = () => {
return false
}
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.jobId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
2025-09-01 08:59:56 +08:00
/** 费率 */
2025-08-14 10:33:48 +08:00
function handleView(row) {
2025-09-01 08:59:56 +08:00
getSuperTenant(row.id).then(response => {
2025-08-14 10:33:48 +08:00
openView.value = true;
2025-09-01 08:59:56 +08:00
let fromItem = {
...row,
...response.data,
curType: response.data.curType,
account: response.data.tenantKey,
tenantType: response.data.tenantType,
googleCodeSwitch: response.data.googleCodeSwitch,
scoreRatio:response.data.scoreRatio,
tenantSystemPlatforms:response.data.tenantPlatforms
};
PlatformRatioAll.value = response.data.tenantPlatforms;
form.value = JSON.parse(JSON.stringify(fromItem));
oldForm.value = JSON.stringify(PlatformRatioAll.value);
})
2025-08-14 10:33:48 +08:00
}
const openAdjustment = ref(false);
const handleAdjustment = (row) => {
2025-09-01 08:59:56 +08:00
getSuperTenant(row.id).then(response => {
openAdjustment.value = true;
modifyDate.value = {
...row,
...response.data,
curType: response.data.curType,
account: response.data.tenantKey,
tenantType: response.data.tenantType,
googleCodeSwitch: response.data.googleCodeSwitch,
scoreRatio:response.data.scoreRatio,
tenantSystemPlatforms:row.tenantPlatforms
};
})
2025-08-14 10:33:48 +08:00
}
const handleAdjustmentUpdate = (row) => {
let obj = {
id:row.id,
balance:row.balance,
isOut:true
}
updateSuperTenantQuotaUpdate(obj).then(response => {
proxy.$modal.msgSuccess(proxy.t('重置成功'));
openAdjustment.value = false;
handleAdjustment(row);
})
}
const renewShow = ref(false);
const edit = (row) => {
reset();
getSelectPlatform();
getSuperCommonCurrencySelect();
getSuperTenant(row.id).then(response => {
2025-08-26 11:18:24 +08:00
renewShow.value = true;
2025-08-14 10:33:48 +08:00
title.value = proxy.t('修改商户');
modifyDate.value = {
...row,
2025-09-01 08:59:56 +08:00
...response.data,
2025-08-14 10:33:48 +08:00
curType: response.data.curType,
account: response.data.tenantKey,
2025-08-26 11:18:24 +08:00
tenantType: response.data.tenantType,
googleCodeSwitch: response.data.googleCodeSwitch,
2025-08-14 10:33:48 +08:00
scoreRatio:response.data.scoreRatio,
tenantSystemPlatforms:row.tenantPlatforms
};
2025-08-26 11:18:24 +08:00
2025-08-14 10:33:48 +08:00
})
}
const platformSystem = ref({
pageNum:1,
pageSize:100,
orderByColumn:'platformCode',
isAsc:'desc'
});
const totalPlatform = ref(0);
/** 获取平台利润 */
function getSelectPlatform() {
superPlatformSystem(platformSystem.value).then(response => {
form.value.tenantSystemPlatforms = response.rows;
totalPlatform.value = response.total;
tenantSystemPlatforms.value = JSON.parse(JSON.stringify(response.rows));
});
}
/** 获取货币 */
function getSuperCommonCurrencySelect() {
let res = getLocalStorage('currencySelect');
let _data = res.map(item => {
return {
...item,
balance:'',
currencyCode:item.currencyCode,
}
})
form.value.realBalance = _data;
realBalance.value = JSON.parse(JSON.stringify(_data));
}
/** 新增按钮操作 */
function handleAdd() {
reset();
openShowDialog.value = true;
title.value = proxy.t('添加商户');
}
const copyAccountInfo = (row)=>{
const content = `
商户后台${yueURL.value}
登录账号${row.tenantKey}
初始密码${row.originalPassword}
系统说明为了账户安全登录成功后请先修改密码绑定谷歌验证
商户KEY${row.tenantKey}
商户密钥${row.tenantSecret}
对接文档${row.documentUrl}
文档密码${row.documentPass}
`.trim();
handleCopy(content).then(() => {
proxy.$modal.msgSuccess(proxy.t('复制成功'));
});
}
const submitFormReset = () => {
proxy.$refs["agentResetRef"].validate(valid => {
if (valid) {
updateSuperTenantResetPwd(formReset).then(response => {
proxy.$modal.msgSuccess(proxy.t('重置成功'));
openReset.value = false;
getList();
});
}
});
}
2025-09-01 08:59:56 +08:00
const closeDialog = () => {
openView.value = false;
form.value = {};
}
const sys_job_status = ref([]);
const getsuperCommonPlatformTypeSelect = async () => {
getPlatformShowSelect().then(response => {
sys_job_status.value = response.data.map(item => {
return { label: item.platformName, value: item.platformCode }
});
});
}
getsuperCommonPlatformTypeSelect();
const handleInput = (row) => {
let input = row.useCost.toString();
// 清除非法字符(只允许数字和一个小数点)
input = input.replace(/[^\d.]/g, '');
// 防止多个小数点
const parts = input.split('.');
if (parts.length > 2) {
input = parts[0] + '.' + parts[1];
}
// 限制小数点后最多两位
if (parts[1]) {
input = parts[0] + '.' + parts[1].substring(0, 2);
}
row.useCost = input;
// 同步更新 PlatformRatioAll.value 对应项
const target = PlatformRatioAll.value.find(item => item.id == row.id);
if (target) {
target.useCost = input;
}
};
const handleInput1 = (row) => {
let input = row.minAmount.toString();
// 同步更新 PlatformRatioAll.value 对应项
const target = PlatformRatioAll.value.find(item => item.id == row.id);
if (target) {
target.minAmount = input;
}
}
2025-08-14 10:33:48 +08:00
2025-09-01 08:59:56 +08:00
const handleInput2 = (row) => {
let input = row.maxAmount.toString();
// 同步更新 PlatformRatioAll.value 对应项
const target = PlatformRatioAll.value.find(item => item.id == row.id);
if (target) {
target.maxAmount = input;
}
}
const handleBlur = (row) => {
const cost = parseFloat(row.cost);
const useCost = parseFloat(row.useCost);
if (isNaN(useCost)) {
row.useCost = '';
return;
}
if (useCost < cost) {
row.useCost = Number(cost); // 保留两位小数
// 可选提示
// this.$message.warning(`不能小于最小成本:${cost}`);
}
}
const searchPlatformCode = ref('');
const searchCurrencyCode = ref('');
// 搜索平台
const searchSystemPlatforms = (platformCode) => {
const keyword = platformCode?.trim();
if (!keyword) {
form.value.tenantSystemPlatforms = PlatformRatioAll.value;
return;
}
// 找出所有 platformCode 中包含关键字的项
const matchedCodes = PlatformRatioAll.value
.filter(item => item.platformCode?.includes(keyword))
.map(item => item.platformCode);
// 如果有匹配,就取出所有属于这些 platformCode 的数据
const result = PlatformRatioAll.value.filter(item =>
matchedCodes.includes(item.platformCode)
);
form.value.tenantSystemPlatforms = result; // 不再回退到 PlatformRatioAll
};
const openViewRef = ref(null);
// 提交表单
/** 提交按钮 */
function submitForm() {
proxy.$refs["openViewRef"].validate(valid => {
if (valid) {
loadingButton.value = true;
let dataObj = {
id: form.value.id,
scoreRatio: form.value.scoreRatio,
curType: 1,
googleCodeSwitch: form.value.googleCodeSwitch,
currencyCode: form.value.currencyCode,
// tenantType: formAll.tenantType,
// googleCode:formAll.googleCode,
tenantPlatforms: PlatformRatioAll.value,
}
if (JSON.stringify(PlatformRatioAll.value) != oldForm.value) {
updateSuperTenantEdit(dataObj).then(response => {
loadingButton.value = false;
proxy.$modal.msgSuccess(proxy.t('更新成功'));
closeDialog();
getList();
}).catch(() => {
loadingButton.value = false;
});
}else{
loadingButton.value = false;
closeDialog();
}
}
});
}
2025-08-14 10:33:48 +08:00
getList();
</script>
<style scoped lang="scss">
.label-scoreRatio{
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
span{
width: 120px;
text-align: right;
font-weight: 700;
padding-right: 12px;
}
}
.scoreRatioTable{
width: calc(100% - 120px);
margin-left: 120px;
}
</style>