feat: 角色默认信用与店铺实际额度管理
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 6m12s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 6m12s
This commit is contained in:
@@ -8,7 +8,7 @@ import type {
|
||||
PlatformRole,
|
||||
RoleQueryParams,
|
||||
PlatformRoleFormData,
|
||||
PermissionTreeNode,
|
||||
UpdateRoleDefaultCreditRequest,
|
||||
BaseResponse,
|
||||
PaginationResponse
|
||||
} from '@/types/api'
|
||||
@@ -51,6 +51,19 @@ export class RoleService extends BaseService {
|
||||
return this.update(`/api/admin/roles/${id}`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新客户角色默认信用
|
||||
* PUT /api/admin/roles/{id}/default-credit
|
||||
* @param id 角色ID
|
||||
* @param data 默认信用配置
|
||||
*/
|
||||
static updateRoleDefaultCredit(
|
||||
id: number,
|
||||
data: UpdateRoleDefaultCreditRequest
|
||||
): Promise<BaseResponse> {
|
||||
return this.put<BaseResponse>(`/api/admin/roles/${id}/default-credit`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除角色
|
||||
* DELETE /api/admin/roles/{id}
|
||||
|
||||
@@ -10,6 +10,7 @@ import type {
|
||||
UpdateShopParams,
|
||||
ShopRolesResponse,
|
||||
AssignShopRolesRequest,
|
||||
UpdateShopCreditLimitRequest,
|
||||
BaseResponse,
|
||||
PaginationResponse
|
||||
} from '@/types/api'
|
||||
@@ -114,4 +115,17 @@ export class ShopService extends BaseService {
|
||||
static deleteShopRole(shopId: number, roleId: number): Promise<BaseResponse> {
|
||||
return this.delete<BaseResponse>(`/api/admin/shops/${shopId}/roles/${roleId}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新店铺实际信用额度
|
||||
* PUT /api/admin/shops/{id}/credit-limit
|
||||
* @param shopId 店铺ID
|
||||
* @param data 实际信用额度配置
|
||||
*/
|
||||
static updateShopCreditLimit(
|
||||
shopId: number,
|
||||
data: UpdateShopCreditLimitRequest
|
||||
): Promise<BaseResponse> {
|
||||
return this.put<BaseResponse>(`/api/admin/shops/${shopId}/credit-limit`, data)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,6 +215,12 @@ export interface ShopFundSummaryItem {
|
||||
frozen_balance: number // 现金冻结金额(分)
|
||||
cash_available: number // 现金可用余额(分)
|
||||
low_balance_warning: boolean // 现金可用余额不足100元预警
|
||||
credit_enabled: boolean // 实际信用额度是否启用
|
||||
credit_limit: number // 实际信用额度(分)
|
||||
available_balance: number // 可用金额(分),以后端返回为准
|
||||
is_in_debt: boolean // 是否欠款,以后端返回为准
|
||||
debt_amount: number // 欠款金额(分),以后端返回为准
|
||||
version: number // 资金概况版本,用于并发控制
|
||||
total_commission: number // 总佣金(分)
|
||||
available_commission: number // 可提现佣金(分)
|
||||
frozen_commission: number // 冻结中佣金(分)
|
||||
|
||||
@@ -28,6 +28,8 @@ export interface PlatformRole {
|
||||
role_desc: string // 角色描述
|
||||
role_type: RoleType // 角色类型
|
||||
status: RoleStatus // 状态
|
||||
credit_enabled?: boolean // 新建代理默认信用是否启用(仅客户角色)
|
||||
credit_limit?: number // 新建代理默认信用额度(分,仅客户角色)
|
||||
}
|
||||
|
||||
// 角色查询参数
|
||||
@@ -44,3 +46,9 @@ export interface PlatformRoleFormData {
|
||||
role_type: RoleType
|
||||
status: RoleStatus
|
||||
}
|
||||
|
||||
// 更新客户角色默认信用参数
|
||||
export interface UpdateRoleDefaultCreditRequest {
|
||||
credit_enabled: boolean
|
||||
credit_limit: number
|
||||
}
|
||||
|
||||
@@ -101,3 +101,10 @@ export interface ShopRolesResponse {
|
||||
export interface AssignShopRolesRequest {
|
||||
role_ids: number[] | null // 角色ID列表
|
||||
}
|
||||
|
||||
// 更新店铺实际信用额度请求
|
||||
export interface UpdateShopCreditLimitRequest {
|
||||
credit_enabled: boolean // 是否启用实际信用额度
|
||||
credit_limit: number // 实际信用额度(分)
|
||||
version: number // 资金概况版本,用于并发控制
|
||||
}
|
||||
|
||||
6
src/types/components.d.ts
vendored
6
src/types/components.d.ts
vendored
@@ -87,10 +87,8 @@ declare module 'vue' {
|
||||
ElAlert: typeof import('element-plus/es')['ElAlert']
|
||||
ElAvatar: typeof import('element-plus/es')['ElAvatar']
|
||||
ElButton: typeof import('element-plus/es')['ElButton']
|
||||
ElCalendar: typeof import('element-plus/es')['ElCalendar']
|
||||
ElCard: typeof import('element-plus/es')['ElCard']
|
||||
ElCascader: typeof import('element-plus/es')['ElCascader']
|
||||
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
|
||||
ElCol: typeof import('element-plus/es')['ElCol']
|
||||
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
|
||||
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
|
||||
@@ -113,9 +111,7 @@ declare module 'vue' {
|
||||
ElOption: typeof import('element-plus/es')['ElOption']
|
||||
ElPagination: typeof import('element-plus/es')['ElPagination']
|
||||
ElPopover: typeof import('element-plus/es')['ElPopover']
|
||||
ElProgress: typeof import('element-plus/es')['ElProgress']
|
||||
ElRadio: typeof import('element-plus/es')['ElRadio']
|
||||
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
|
||||
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
|
||||
ElRow: typeof import('element-plus/es')['ElRow']
|
||||
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
|
||||
@@ -127,8 +123,6 @@ declare module 'vue' {
|
||||
ElTabPane: typeof import('element-plus/es')['ElTabPane']
|
||||
ElTabs: typeof import('element-plus/es')['ElTabs']
|
||||
ElTag: typeof import('element-plus/es')['ElTag']
|
||||
ElTimeline: typeof import('element-plus/es')['ElTimeline']
|
||||
ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
|
||||
ElTooltip: typeof import('element-plus/es')['ElTooltip']
|
||||
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
|
||||
ElUpload: typeof import('element-plus/es')['ElUpload']
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
:total="pagination.total"
|
||||
:marginTop="10"
|
||||
:actions="getActions"
|
||||
:actionsWidth="120"
|
||||
:actionsWidth="180"
|
||||
@size-change="handleSizeChange"
|
||||
@current-change="handleCurrentChange"
|
||||
>
|
||||
@@ -416,13 +416,74 @@
|
||||
</div>
|
||||
</template>
|
||||
</ElDialog>
|
||||
|
||||
<!-- 店铺实际信用额度调整弹框 -->
|
||||
<ElDialog
|
||||
v-model="creditDialogVisible"
|
||||
:title="`调整实际信用额度 - ${currentCreditShop?.shop_name || ''}`"
|
||||
width="520px"
|
||||
@closed="resetCreditDialog"
|
||||
>
|
||||
<ElDescriptions :column="1" border class="credit-preview">
|
||||
<ElDescriptionsItem label="店铺名称">
|
||||
{{ currentCreditShop?.shop_name || '-' }}
|
||||
</ElDescriptionsItem>
|
||||
<ElDescriptionsItem label="当前版本">
|
||||
{{ currentCreditShop?.version ?? '-' }}
|
||||
</ElDescriptionsItem>
|
||||
<ElDescriptionsItem label="修改前">
|
||||
{{
|
||||
formatCreditPreview(currentCreditShop?.credit_enabled, currentCreditShop?.credit_limit)
|
||||
}}
|
||||
</ElDescriptionsItem>
|
||||
<ElDescriptionsItem label="修改后">
|
||||
{{ formatCreditPreview(creditForm.credit_enabled, creditFormCreditLimitFen) }}
|
||||
</ElDescriptionsItem>
|
||||
</ElDescriptions>
|
||||
|
||||
<ElAlert
|
||||
title="实际可用金额、欠款金额和欠款状态以后端刷新后的资金概况为准。"
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
class="credit-dialog-alert"
|
||||
/>
|
||||
|
||||
<ElForm ref="creditFormRef" :model="creditForm" :rules="creditRules" label-width="110px">
|
||||
<ElFormItem label="启用信用">
|
||||
<ElSwitch v-model="creditForm.credit_enabled" @change="handleCreditEnabledChange" />
|
||||
</ElFormItem>
|
||||
<ElFormItem label="实际信用额度" prop="credit_limit_yuan">
|
||||
<ElInputNumber
|
||||
v-model="creditForm.credit_limit_yuan"
|
||||
:disabled="!creditForm.credit_enabled"
|
||||
:min="0"
|
||||
:precision="2"
|
||||
:step="100"
|
||||
controls-position="right"
|
||||
style="width: 100%"
|
||||
placeholder="请输入实际信用额度"
|
||||
/>
|
||||
<div class="credit-dialog-tip">单位:元;关闭信用时额度将自动归零</div>
|
||||
</ElFormItem>
|
||||
</ElForm>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<ElButton @click="creditDialogVisible = false">取消</ElButton>
|
||||
<ElButton type="primary" :loading="creditSubmitting" @click="handleCreditSubmit">
|
||||
确认调整
|
||||
</ElButton>
|
||||
</div>
|
||||
</template>
|
||||
</ElDialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { h, watch, onBeforeUnmount, ref, reactive, onMounted, computed } from 'vue'
|
||||
import { h, watch, onBeforeUnmount, ref, reactive, onMounted, computed, nextTick } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { CommissionService } from '@/api/modules'
|
||||
import { CommissionService, ShopService } from '@/api/modules'
|
||||
import { ElMessage, ElMessageBox, ElTag } from 'element-plus'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import { MainWalletTransactionType } from '@/types/api/commission'
|
||||
@@ -438,7 +499,7 @@
|
||||
import { useCheckedColumns } from '@/composables/useCheckedColumns'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
import ArtButtonTable from '@/components/core/forms/ArtButtonTable.vue'
|
||||
import { formatDateTime, formatMoney } from '@/utils/business/format'
|
||||
import { fenToYuan, formatDateTime, formatMoney, yuanToFen } from '@/utils/business/format'
|
||||
import {
|
||||
CommissionStatusMap,
|
||||
WithdrawalStatusMap,
|
||||
@@ -508,6 +569,20 @@
|
||||
remark: ''
|
||||
})
|
||||
|
||||
// 实际信用额度调整弹框状态
|
||||
const creditDialogVisible = ref(false)
|
||||
const creditFormRef = ref<FormInstance>()
|
||||
const creditSubmitting = ref(false)
|
||||
const currentCreditShop = ref<ShopFundSummaryItem | null>(null)
|
||||
const creditForm = reactive({
|
||||
credit_enabled: false,
|
||||
credit_limit_yuan: 0
|
||||
})
|
||||
|
||||
const creditFormCreditLimitFen = computed(() =>
|
||||
creditForm.credit_enabled ? yuanToFen(creditForm.credit_limit_yuan) || 0 : 0
|
||||
)
|
||||
|
||||
// 佣金修正表单验证规则
|
||||
const resolveRules = computed<FormRules>(() => ({
|
||||
amount:
|
||||
@@ -525,6 +600,36 @@
|
||||
remark: [{ max: 500, message: '备注最多500字符', trigger: 'blur' }]
|
||||
}))
|
||||
|
||||
const creditRules = computed<FormRules>(() => ({
|
||||
credit_limit_yuan: [
|
||||
{
|
||||
validator: (
|
||||
_rule: unknown,
|
||||
value: number | undefined,
|
||||
callback: (error?: Error) => void
|
||||
) => {
|
||||
if (!creditForm.credit_enabled) {
|
||||
callback()
|
||||
return
|
||||
}
|
||||
|
||||
if (value === undefined || value === null || Number.isNaN(value)) {
|
||||
callback(new Error('请输入实际信用额度'))
|
||||
return
|
||||
}
|
||||
|
||||
if (value < 0) {
|
||||
callback(new Error('实际信用额度不能小于0'))
|
||||
return
|
||||
}
|
||||
|
||||
callback()
|
||||
},
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}))
|
||||
|
||||
// 预充值钱包流水状态
|
||||
const mainWalletLoading = ref(false)
|
||||
const mainWalletTableRef = ref()
|
||||
@@ -552,6 +657,10 @@
|
||||
{ label: '手机号', prop: 'phone' },
|
||||
{ label: '现金余额', prop: 'balance' },
|
||||
{ label: '冻结金额', prop: 'frozen_balance' },
|
||||
{ label: '实际信用额度', prop: 'credit_limit' },
|
||||
{ label: '可用金额', prop: 'available_balance' },
|
||||
{ label: '欠款金额', prop: 'debt_amount' },
|
||||
{ label: '版本', prop: 'version' },
|
||||
{ label: '余额预警', prop: 'low_balance_warning' },
|
||||
{ label: '总佣金', prop: 'total_commission' },
|
||||
{ label: '可提现', prop: 'available_commission' },
|
||||
@@ -656,6 +765,51 @@
|
||||
minWidth: 120,
|
||||
formatter: (row: ShopFundSummaryItem) => formatMoney(row.frozen_balance)
|
||||
},
|
||||
{
|
||||
prop: 'credit_limit',
|
||||
label: '实际信用额度',
|
||||
minWidth: 150,
|
||||
formatter: (row: ShopFundSummaryItem) => {
|
||||
if (!row.credit_enabled) {
|
||||
return h('span', { style: 'color: var(--el-text-color-secondary)' }, '未启用 / ¥0.00')
|
||||
}
|
||||
|
||||
return h(
|
||||
'span',
|
||||
{ style: 'color: var(--el-color-warning); font-weight: 500' },
|
||||
formatMoney(row.credit_limit)
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'available_balance',
|
||||
label: '可用金额',
|
||||
minWidth: 130,
|
||||
formatter: (row: ShopFundSummaryItem) => {
|
||||
return h(
|
||||
'span',
|
||||
{ style: 'color: var(--el-color-success); font-weight: 500' },
|
||||
formatMoney(row.available_balance)
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'debt_amount',
|
||||
label: '欠款金额',
|
||||
minWidth: 130,
|
||||
formatter: (row: ShopFundSummaryItem) => {
|
||||
const amountText = formatMoney(row.debt_amount)
|
||||
if (!row.is_in_debt) return amountText
|
||||
|
||||
return h('span', { style: 'color: var(--el-color-danger); font-weight: 500' }, amountText)
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'version',
|
||||
label: '版本',
|
||||
minWidth: 90,
|
||||
formatter: (row: ShopFundSummaryItem) => row.version ?? '-'
|
||||
},
|
||||
{
|
||||
prop: 'low_balance_warning',
|
||||
label: '余额预警',
|
||||
@@ -803,9 +957,105 @@
|
||||
})
|
||||
}
|
||||
|
||||
actions.push({
|
||||
label: '调整额度',
|
||||
handler: () => showCreditDialog(row),
|
||||
type: 'primary'
|
||||
})
|
||||
|
||||
return actions
|
||||
}
|
||||
|
||||
const formatCreditPreview = (enabled?: boolean, creditLimit?: number) => {
|
||||
return enabled ? `启用 / ${formatMoney(creditLimit || 0)}` : '关闭 / ¥0.00'
|
||||
}
|
||||
|
||||
const showCreditDialog = (row: ShopFundSummaryItem) => {
|
||||
currentCreditShop.value = row
|
||||
creditForm.credit_enabled = Boolean(row.credit_enabled)
|
||||
creditForm.credit_limit_yuan = row.credit_enabled ? fenToYuan(row.credit_limit) : 0
|
||||
creditDialogVisible.value = true
|
||||
nextTick(() => {
|
||||
creditFormRef.value?.clearValidate()
|
||||
})
|
||||
}
|
||||
|
||||
const handleCreditEnabledChange = (enabled: boolean | string | number) => {
|
||||
if (!enabled) {
|
||||
creditForm.credit_limit_yuan = 0
|
||||
creditFormRef.value?.clearValidate('credit_limit_yuan')
|
||||
}
|
||||
}
|
||||
|
||||
const resetCreditDialog = () => {
|
||||
creditFormRef.value?.resetFields()
|
||||
currentCreditShop.value = null
|
||||
creditForm.credit_enabled = false
|
||||
creditForm.credit_limit_yuan = 0
|
||||
}
|
||||
|
||||
const isCreditConflictMessage = (message?: string) => {
|
||||
if (!message) return false
|
||||
return /版本|冲突|并发|过期|conflict/i.test(message)
|
||||
}
|
||||
|
||||
const isCreditConflictResponse = (response: any) => {
|
||||
return response?.code === 409 || isCreditConflictMessage(response?.msg)
|
||||
}
|
||||
|
||||
const isCreditConflictError = (error: any) => {
|
||||
return (
|
||||
error?.response?.status === 409 ||
|
||||
error?.response?.data?.code === 409 ||
|
||||
isCreditConflictMessage(error?.response?.data?.msg || error?.message)
|
||||
)
|
||||
}
|
||||
|
||||
const handleCreditConflict = async () => {
|
||||
ElMessage.warning('资金概况已被更新,已刷新最新数据,请重新调整')
|
||||
creditDialogVisible.value = false
|
||||
await getTableData()
|
||||
}
|
||||
|
||||
const handleCreditSubmit = async () => {
|
||||
if (!creditFormRef.value || !currentCreditShop.value) return
|
||||
|
||||
await creditFormRef.value.validate(async (valid) => {
|
||||
if (!valid || !currentCreditShop.value) return
|
||||
|
||||
creditSubmitting.value = true
|
||||
try {
|
||||
const res = await ShopService.updateShopCreditLimit(currentCreditShop.value.shop_id, {
|
||||
credit_enabled: creditForm.credit_enabled,
|
||||
credit_limit: creditFormCreditLimitFen.value,
|
||||
version: currentCreditShop.value.version
|
||||
})
|
||||
|
||||
if (res.code === 0) {
|
||||
ElMessage.success('实际信用额度调整成功')
|
||||
creditDialogVisible.value = false
|
||||
await getTableData()
|
||||
return
|
||||
}
|
||||
|
||||
if (isCreditConflictResponse(res)) {
|
||||
await handleCreditConflict()
|
||||
return
|
||||
}
|
||||
|
||||
ElMessage.error(res.msg || '实际信用额度调整失败')
|
||||
} catch (error: any) {
|
||||
if (isCreditConflictError(error)) {
|
||||
await handleCreditConflict()
|
||||
} else {
|
||||
console.error('实际信用额度调整失败:', error)
|
||||
}
|
||||
} finally {
|
||||
creditSubmitting.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 监听tab切换
|
||||
watch(activeTab, (newTab) => {
|
||||
if (newTab === 'commission') {
|
||||
@@ -1084,6 +1334,21 @@
|
||||
}
|
||||
}
|
||||
|
||||
.credit-preview {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.credit-dialog-alert {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.credit-dialog-tip {
|
||||
margin-top: 6px;
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
@media (width <= 1200px) {
|
||||
.main-wallet-filter__grid {
|
||||
grid-template-columns: repeat(2, minmax(220px, 1fr));
|
||||
|
||||
@@ -80,6 +80,27 @@
|
||||
:inactive-value="CommonStatus.DISABLED"
|
||||
/>
|
||||
</ElFormItem>
|
||||
<template v-if="isCustomerRoleForm">
|
||||
<ElFormItem label="新建代理默认信用">
|
||||
<ElSwitch
|
||||
v-model="form.credit_enabled"
|
||||
@change="handleDefaultCreditEnabledChange"
|
||||
/>
|
||||
</ElFormItem>
|
||||
<ElFormItem label="默认信用额度">
|
||||
<ElInputNumber
|
||||
v-model="form.credit_limit_yuan"
|
||||
:disabled="!form.credit_enabled"
|
||||
:min="0"
|
||||
:precision="2"
|
||||
:step="100"
|
||||
controls-position="right"
|
||||
style="width: 100%"
|
||||
placeholder="请输入默认信用额度"
|
||||
/>
|
||||
<div class="credit-form-tip">单位:元。修改后不会影响已有店铺</div>
|
||||
</ElFormItem>
|
||||
</template>
|
||||
</ElForm>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
@@ -226,11 +247,12 @@
|
||||
ElOption
|
||||
} from 'element-plus'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import { RoleType } from '@/types/api'
|
||||
import type { PlatformRole, PermissionTreeNode } from '@/types/api'
|
||||
import type { SearchFormItem } from '@/types'
|
||||
import { useCheckedColumns } from '@/composables/useCheckedColumns'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
import { formatDateTime } from '@/utils/business/format'
|
||||
import { fenToYuan, formatDateTime, yuanToFen } from '@/utils/business/format'
|
||||
import {
|
||||
CommonStatus,
|
||||
getStatusText,
|
||||
@@ -343,9 +365,27 @@
|
||||
role_name: '',
|
||||
role_desc: '',
|
||||
role_type: 1,
|
||||
status: CommonStatus.ENABLED
|
||||
status: CommonStatus.ENABLED,
|
||||
credit_enabled: false,
|
||||
credit_limit_yuan: 0
|
||||
})
|
||||
|
||||
const isCustomerRoleForm = computed(() => form.role_type === RoleType.CUSTOMER)
|
||||
|
||||
const handleDefaultCreditEnabledChange = (enabled: boolean | string | number) => {
|
||||
if (!enabled) {
|
||||
form.credit_limit_yuan = 0
|
||||
}
|
||||
}
|
||||
|
||||
const getDefaultCreditPayload = () => {
|
||||
const creditEnabled = Boolean(form.credit_enabled)
|
||||
return {
|
||||
credit_enabled: creditEnabled,
|
||||
credit_limit: creditEnabled ? yuanToFen(form.credit_limit_yuan) || 0 : 0
|
||||
}
|
||||
}
|
||||
|
||||
const roleList = ref<PlatformRole[]>([])
|
||||
|
||||
// 动态列配置
|
||||
@@ -997,23 +1037,38 @@
|
||||
const dialogType = ref('add')
|
||||
|
||||
// 显示新增/编辑对话框
|
||||
const showDialog = (type: string, row?: any) => {
|
||||
dialogVisible.value = true
|
||||
const showDialog = async (type: string, row?: any) => {
|
||||
dialogType.value = type
|
||||
|
||||
if (type === 'edit' && row) {
|
||||
form.id = row.ID
|
||||
form.role_name = row.role_name
|
||||
form.role_desc = row.role_desc
|
||||
form.role_type = row.role_type
|
||||
form.status = row.status
|
||||
let roleDetail = row
|
||||
try {
|
||||
const res = await RoleService.getRole(row.ID)
|
||||
if (res.code === 0 && res.data) {
|
||||
roleDetail = res.data
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取角色详情失败:', error)
|
||||
}
|
||||
|
||||
form.id = roleDetail.ID
|
||||
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)
|
||||
} else {
|
||||
form.id = 0
|
||||
form.role_name = ''
|
||||
form.role_desc = ''
|
||||
form.role_type = 1
|
||||
form.status = CommonStatus.ENABLED
|
||||
form.credit_enabled = false
|
||||
form.credit_limit_yuan = 0
|
||||
}
|
||||
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
// 删除角色
|
||||
@@ -1052,7 +1107,11 @@
|
||||
role_type: form.role_type,
|
||||
status: form.status
|
||||
}
|
||||
await RoleService.createRole(data)
|
||||
const res = await RoleService.createRole(data)
|
||||
const createdRoleId = res.data?.ID ?? res.data?.id ?? res.data?.role_id
|
||||
if (form.role_type === RoleType.CUSTOMER && createdRoleId) {
|
||||
await RoleService.updateRoleDefaultCredit(createdRoleId, getDefaultCreditPayload())
|
||||
}
|
||||
ElMessage.success('新增成功')
|
||||
} else {
|
||||
// 更新角色时只发送允许的字段
|
||||
@@ -1063,6 +1122,9 @@
|
||||
status: form.status
|
||||
}
|
||||
await RoleService.updateRole(form.id, data)
|
||||
if (form.role_type === RoleType.CUSTOMER) {
|
||||
await RoleService.updateRoleDefaultCredit(form.id, getDefaultCreditPayload())
|
||||
}
|
||||
ElMessage.success('修改成功')
|
||||
}
|
||||
|
||||
@@ -1118,6 +1180,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
.credit-form-tip {
|
||||
margin-top: 6px;
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
.permission-tree-transfer-container {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
|
||||
Reference in New Issue
Block a user