feat: 完善15- 角色默认信用与店铺实际额度管理
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m8s

This commit is contained in:
luo
2026-07-25 11:55:44 +08:00
parent 9289a6e940
commit ee508c3e1e
16 changed files with 457 additions and 100 deletions

View File

@@ -25,7 +25,7 @@
<!-- 表格 -->
<ArtTable
ref="tableRef"
row-key="ID"
row-key="id"
:loading="loading"
:data="roleList"
:currentPage="pagination.page"
@@ -46,7 +46,7 @@
:title="dialogType === 'add' ? '新增角色' : '编辑角色'"
width="30%"
>
<ElForm ref="formRef" :model="form" :rules="rules" label-width="120px">
<ElForm ref="formRef" :model="form" :rules="rules" label-width="160px">
<ElFormItem label="角色名称" prop="role_name">
<ElInput v-model="form.role_name" placeholder="请输入角色名称" />
</ElFormItem>
@@ -91,7 +91,7 @@
<ElInputNumber
v-model="form.credit_limit_yuan"
:disabled="!form.credit_enabled"
:min="0"
:min="1"
:precision="2"
:step="100"
controls-position="right"
@@ -250,6 +250,8 @@
import { RoleType } from '@/types/api'
import type { PlatformRole, PermissionTreeNode } from '@/types/api'
import type { SearchFormItem } from '@/types'
import { useRouter } from 'vue-router'
import { RoutesAlias } from '@/router/routesAlias'
import { useCheckedColumns } from '@/composables/useCheckedColumns'
import { useAuth } from '@/composables/useAuth'
import { fenToYuan, formatDateTime, yuanToFen } from '@/utils/business/format'
@@ -263,6 +265,7 @@
defineOptions({ name: 'Role' })
const { hasAuth } = useAuth()
const router = useRouter()
const canUpdateRoleStatus = hasAuth('role:update_status')
const dialogVisible = ref(false)
@@ -345,8 +348,10 @@
{ label: '角色名称', prop: 'role_name' },
{ label: '角色描述', prop: 'role_desc' },
{ label: '角色类型', prop: 'role_type' },
{ label: '新建代理默认信用', prop: 'default_credit_enabled' },
{ label: '默认信用额度', prop: 'default_credit_limit' },
...(canUpdateRoleStatus ? [{ label: '状态', prop: 'status' }] : []),
{ label: '创建时间', prop: 'CreatedAt' }
{ label: '创建时间', prop: 'created_at' }
]
const formRef = ref<FormInstance>()
@@ -357,7 +362,23 @@
{ min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' }
],
role_desc: [{ max: 200, message: '描述不能超过200个字符', trigger: 'blur' }],
role_type: [{ required: true, message: '请选择角色类型', trigger: 'change' }]
role_type: [{ required: true, message: '请选择角色类型', trigger: 'change' }],
credit_limit_yuan: [
{
validator: (_rule, value, callback) => {
if (!isCustomerRoleForm.value || !form.credit_enabled) {
callback()
return
}
if (value === undefined || value === null || value <= 0) {
callback(new Error('默认信用额度必须大于0'))
return
}
callback()
},
trigger: 'blur'
}
]
})
const form = reactive<any>({
@@ -388,12 +409,40 @@
const roleList = ref<PlatformRole[]>([])
const getRoleId = (role: PlatformRole | any) => role.id ?? role.ID
const handleNameClick = (row: PlatformRole) => {
if (hasAuth('role:detail')) {
void router.push(`${RoutesAlias.RoleDetail}/${getRoleId(row)}`)
} else {
ElMessage.warning('您没有查看详情的权限')
}
}
// 动态列配置
const { columnChecks, columns } = useCheckedColumns(() => [
{
prop: 'role_name',
label: '角色名称',
width: 180
width: 180,
formatter: (row: PlatformRole) => {
const hasPermission = hasAuth('role:detail')
return h(
'span',
{
style: hasPermission
? 'color: var(--el-color-primary); cursor: pointer; text-decoration: underline;'
: '',
onClick: hasPermission
? (event: MouseEvent) => {
event.stopPropagation()
handleNameClick(row)
}
: undefined
},
row.role_name
)
}
},
{
prop: 'role_type',
@@ -405,6 +454,28 @@
)
}
},
{
prop: 'default_credit_enabled',
label: '新建代理默认信用',
width: 150,
formatter: (row: PlatformRole) => {
if (row.role_type !== RoleType.CUSTOMER) return '-'
return h(
ElTag,
{ type: row.default_credit_enabled ? 'success' : 'info' },
() => (row.default_credit_enabled ? '启用' : '未启用')
)
}
},
{
prop: 'default_credit_limit',
label: '默认信用额度',
width: 140,
formatter: (row: PlatformRole) => {
if (row.role_type !== RoleType.CUSTOMER || !row.default_credit_enabled) return '-'
return `${fenToYuan(row.default_credit_limit)}`
}
},
...(canUpdateRoleStatus
? [
{
@@ -431,10 +502,10 @@
label: '角色描述'
},
{
prop: 'CreatedAt',
prop: 'created_at',
label: '创建时间',
width: 180,
formatter: (row: any) => formatDateTime(row.CreatedAt)
formatter: (row: any) => formatDateTime(row.created_at)
},
{
prop: 'actions',
@@ -934,7 +1005,7 @@
// 显示分配权限对话框
const showPermissionDialog = async (row: PlatformRole) => {
currentRoleId.value = row.ID
currentRoleId.value = getRoleId(row)
currentRole.value = {
role_name: row.role_name,
role_type: row.role_type
@@ -1043,7 +1114,7 @@
if (type === 'edit' && row) {
let roleDetail = row
try {
const res = await RoleService.getRole(row.ID)
const res = await RoleService.getRole(getRoleId(row))
if (res.code === 0 && res.data) {
roleDetail = res.data
}
@@ -1051,13 +1122,17 @@
console.error('获取角色详情失败:', error)
}
form.id = roleDetail.ID
form.id = getRoleId(roleDetail)
form.role_name = roleDetail.role_name
form.role_desc = roleDetail.role_desc
form.role_type = roleDetail.role_type
form.status = roleDetail.status
form.credit_enabled = Boolean(roleDetail.credit_enabled)
form.credit_limit_yuan = fenToYuan(roleDetail.credit_limit)
form.credit_enabled = Boolean(
roleDetail.default_credit_enabled ?? roleDetail.credit_enabled
)
form.credit_limit_yuan = fenToYuan(
roleDetail.default_credit_limit ?? roleDetail.credit_limit
)
} else {
form.id = 0
form.role_name = ''
@@ -1080,7 +1155,7 @@
})
.then(async () => {
try {
await RoleService.deleteRole(row.ID)
await RoleService.deleteRole(getRoleId(row))
ElMessage.success('删除成功')
await getTableData()
} catch (error) {
@@ -1118,7 +1193,6 @@
const data = {
role_name: form.role_name,
role_desc: form.role_desc,
role_type: form.role_type,
status: form.status
}
await RoleService.updateRole(form.id, data)
@@ -1146,7 +1220,7 @@
// 先更新UI
row.status = newStatus
try {
await RoleService.updateRoleStatus(row.ID, newStatus as 0 | 1)
await RoleService.updateRoleStatus(getRoleId(row), newStatus as 0 | 1)
ElMessage.success('状态切换成功')
} catch (error) {
// 切换失败,恢复原状态