优化分红方式
This commit is contained in:
@@ -40,13 +40,6 @@ optButtons[1].display = (row) => {
|
||||
return row.id != adminInfo.id
|
||||
}
|
||||
|
||||
const formatRatePercent = (_row: any, _column: any, cellValue: number | string | null) => {
|
||||
if (cellValue === null || cellValue === undefined || cellValue === '') return '--'
|
||||
const num = Number(cellValue)
|
||||
if (Number.isNaN(num)) return '--'
|
||||
return `${num.toFixed(2)}%`
|
||||
}
|
||||
|
||||
const baTable = new baTableClass(
|
||||
new baTableApi('/admin/auth.Admin/'),
|
||||
{
|
||||
@@ -64,14 +57,6 @@ const baTable = new baTableClass(
|
||||
render: 'tags',
|
||||
},
|
||||
{ label: t('auth.admin.invite_code'), prop: 'invite_code', align: 'center', operator: 'LIKE', operatorPlaceholder: t('Fuzzy query') },
|
||||
{
|
||||
label: t('auth.admin.commission_rate'),
|
||||
prop: 'commission_rate',
|
||||
align: 'center',
|
||||
minWidth: 90,
|
||||
operator: 'RANGE',
|
||||
formatter: formatRatePercent,
|
||||
},
|
||||
{ label: t('auth.admin.avatar'), prop: 'avatar', align: 'center', render: 'image', operator: false },
|
||||
{ label: t('auth.admin.email'), prop: 'email', align: 'center', operator: 'LIKE', operatorPlaceholder: t('Fuzzy query') },
|
||||
{ label: t('auth.admin.mobile'), prop: 'mobile', align: 'center', operator: 'LIKE', operatorPlaceholder: t('Fuzzy query') },
|
||||
|
||||
@@ -56,23 +56,6 @@
|
||||
placeholder: t('Click select'),
|
||||
}"
|
||||
/>
|
||||
<FormItem
|
||||
:label="t('auth.admin.commission_rate')"
|
||||
v-model="baTable.form.items!.commission_rate"
|
||||
type="number"
|
||||
prop="commission_rate"
|
||||
:input-attr="{ step: 0.01, precision: 2, min: 0, max: 100, disabled: shouldDisableCommissionRate() }"
|
||||
:placeholder="t('Please input field', { field: t('auth.admin.commission_rate') })"
|
||||
/>
|
||||
<el-alert class="commission-rate-alert" :title="t('auth.admin.commission_rate_desc_title')" type="info" :closable="false" show-icon>
|
||||
<template #default>
|
||||
<ul class="commission-rate-desc-list">
|
||||
<li>{{ t('auth.admin.commission_rate_desc_1') }}</li>
|
||||
<li>{{ t('auth.admin.commission_rate_desc_2') }}</li>
|
||||
<li>{{ t('auth.admin.commission_rate_desc_3') }}</li>
|
||||
</ul>
|
||||
</template>
|
||||
</el-alert>
|
||||
<FormItem
|
||||
v-if="baTable.form.operate == 'Edit'"
|
||||
:label="t('auth.admin.invite_code')"
|
||||
@@ -156,32 +139,6 @@ const baTable = inject('baTable') as baTableClass
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
/** 解析管理员分红比例:与后端 isValidCommissionRate 一致地拒绝非法字符,避免 Number('30,00') 等为 NaN 导致误报 */
|
||||
function parseAdminCommissionRateInput(raw: unknown): { kind: 'empty' } | { kind: 'invalid' } | { kind: 'ok'; value: number } {
|
||||
if (raw === null || raw === undefined || raw === '') {
|
||||
return { kind: 'empty' }
|
||||
}
|
||||
if (typeof raw === 'number') {
|
||||
if (!Number.isFinite(raw)) {
|
||||
return { kind: 'invalid' }
|
||||
}
|
||||
return { kind: 'ok', value: raw }
|
||||
}
|
||||
const s = String(raw).trim()
|
||||
if (s === '') {
|
||||
return { kind: 'empty' }
|
||||
}
|
||||
const normalized = s.replace(',', '.')
|
||||
const n = parseFloat(normalized)
|
||||
if (!Number.isFinite(n)) {
|
||||
return { kind: 'invalid' }
|
||||
}
|
||||
return { kind: 'ok', value: n }
|
||||
}
|
||||
|
||||
const shouldDisableCommissionRate = () => {
|
||||
return adminInfo.id == baTable.form.items!.id
|
||||
}
|
||||
const singleGroupValue = computed({
|
||||
get: () => {
|
||||
const group = baTable.form.items?.group_arr
|
||||
@@ -241,26 +198,6 @@ const rules: Partial<Record<string, FormItemRule[]>> = reactive({
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
commission_rate: [
|
||||
{
|
||||
validator: (_rule: unknown, val: unknown, callback: (e?: Error) => void) => {
|
||||
const parsed = parseAdminCommissionRateInput(val)
|
||||
if (parsed.kind === 'empty') {
|
||||
return callback()
|
||||
}
|
||||
if (parsed.kind === 'invalid') {
|
||||
return callback(new Error(t('Please enter the correct field', { field: t('auth.admin.commission_rate') })))
|
||||
}
|
||||
const n = parsed.value
|
||||
const rounded = Math.round(n * 100) / 100
|
||||
if (rounded < -0.000001 || rounded > 100.000001) {
|
||||
return callback(new Error(t('Please enter the correct field', { field: t('auth.admin.commission_rate') })))
|
||||
}
|
||||
return callback()
|
||||
},
|
||||
trigger: ['blur', 'change'],
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
watch(
|
||||
@@ -285,14 +222,6 @@ watch(
|
||||
width: 110px;
|
||||
height: 110px;
|
||||
}
|
||||
.commission-rate-alert {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.commission-rate-desc-list {
|
||||
margin: 6px 0 0;
|
||||
padding-left: 18px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.avatar-uploader:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,6 @@ const baTable: baTableClass = new baTableClass(
|
||||
align: 'center',
|
||||
minWidth: '140',
|
||||
},
|
||||
{ label: t('auth.group.commission_rate'), prop: 'commission_rate', align: 'center', formatter: formatRatePercent },
|
||||
{ label: t('auth.group.jurisdiction'), prop: 'rules', align: 'center' },
|
||||
{
|
||||
label: t('State'),
|
||||
@@ -199,13 +198,6 @@ const menuRuleTreeUpdate = () => {
|
||||
|
||||
provide('baTable', baTable)
|
||||
|
||||
function formatRatePercent(row: anyObj, _column: any, cellValue: number | string | null) {
|
||||
if (cellValue === null || cellValue === undefined || cellValue === '') {
|
||||
return '0%'
|
||||
}
|
||||
return `${cellValue}%`
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
baTable.table.ref = tableRef.value
|
||||
baTable.mount()
|
||||
|
||||
@@ -85,23 +85,6 @@
|
||||
:placeholder="t('Please input field', { field: t('auth.group.Group name') })"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<FormItem
|
||||
:label="t('auth.group.commission_rate')"
|
||||
v-model="baTable.form.items!.commission_rate"
|
||||
type="number"
|
||||
prop="commission_rate"
|
||||
:input-attr="{ step: 0.01, precision: 2, min: 0, max: 100, disabled: shouldDisableCommissionRate() }"
|
||||
:placeholder="t('Please input field', { field: t('auth.group.commission_rate') })"
|
||||
/>
|
||||
<el-alert class="commission-rate-alert" :title="t('auth.group.commission_rate_desc_title')" type="info" :closable="false" show-icon>
|
||||
<template #default>
|
||||
<ul class="commission-rate-desc-list">
|
||||
<li>{{ t('auth.group.commission_rate_desc_1') }}</li>
|
||||
<li>{{ t('auth.group.commission_rate_desc_2') }}</li>
|
||||
<li>{{ t('auth.group.commission_rate_desc_3') }}</li>
|
||||
</ul>
|
||||
</template>
|
||||
</el-alert>
|
||||
<el-form-item prop="auth" :label="t('auth.group.jurisdiction')">
|
||||
<el-tree
|
||||
ref="treeRef"
|
||||
@@ -174,10 +157,6 @@ const strFromRow = (key: string): string => {
|
||||
|
||||
const channelPreviewName = computed(() => strFromRow('channel_name'))
|
||||
|
||||
const shouldDisableCommissionRate = () => {
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* 子角色组:选择上级分组后,只拉取展示用渠道名;channel_id 由后端按父级保存,不在此写入提交字段。
|
||||
*/
|
||||
@@ -253,25 +232,6 @@ watch(
|
||||
|
||||
const rules: Partial<Record<string, FormItemRule[]>> = reactive({
|
||||
name: [buildValidatorData({ name: 'required', title: t('auth.group.Group name') })],
|
||||
commission_rate: [
|
||||
{
|
||||
required: true,
|
||||
validator: (_rule: any, val: number | string, callback: Function) => {
|
||||
if (shouldDisableCommissionRate()) {
|
||||
return callback()
|
||||
}
|
||||
const strVal = String(val ?? '').trim()
|
||||
if (!strVal) {
|
||||
return callback(new Error(t('Please input field', { field: t('auth.group.commission_rate') })))
|
||||
}
|
||||
if (!/^(100(\.00?)?|[0-9]{1,2}(\.[0-9]{1,2})?)$/.test(strVal)) {
|
||||
return callback(new Error(t('auth.admin.Commission rate must be between 0 and 100 with up to 2 decimals')))
|
||||
}
|
||||
return callback()
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
auth: [
|
||||
{
|
||||
required: true,
|
||||
@@ -329,16 +289,6 @@ defineExpose({
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.commission-rate-alert {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.commission-rate-desc-list {
|
||||
margin: 6px 0 0;
|
||||
padding-left: 18px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
:deep(.penultimate-node) {
|
||||
.el-tree-node__children {
|
||||
padding-left: 60px;
|
||||
|
||||
Reference in New Issue
Block a user