修复bug
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 11m14s

This commit is contained in:
sexygoat
2026-04-08 10:19:25 +08:00
parent ff087abd44
commit b510b4539f
55 changed files with 2274 additions and 2612 deletions

View File

@@ -120,7 +120,7 @@
<ElDescriptions :column="2" border>
<ElDescriptionsItem label="启用状态">
<ElTag :type="detailData.force_recharge_enabled ? 'warning' : 'info'">
{{ detailData.force_recharge_enabled ? '已启用' : '未启用' }}
{{ getEnableStatusText(detailData.force_recharge_enabled || false) }}
</ElTag>
</ElDescriptionsItem>
<ElDescriptionsItem label="锁定状态">
@@ -314,6 +314,7 @@
PackageSeriesResponse
} from '@/types/api'
import { formatDateTime } from '@/utils/business/format'
import { getEnableStatusText } from '@/config/constants'
defineOptions({ name: 'SeriesGrantsDetail' })
@@ -504,6 +505,7 @@
const handleSavePackage = async () => {
if (!packageFormRef.value || !detailData.value) return
const grantId = detailData.value.id // 保存到常量中避免类型检查问题
await packageFormRef.value.validate(async (valid) => {
if (!valid) return
@@ -525,7 +527,7 @@
})
}
await ShopSeriesGrantService.manageGrantPackages(detailData.value.id, { packages })
await ShopSeriesGrantService.manageGrantPackages(grantId, { packages })
ElMessage.success(packageDialogType.value === 'add' ? '添加成功' : '更新成功')
packageDialogVisible.value = false

View File

@@ -35,29 +35,16 @@
:pageSize="pagination.page_size"
:total="pagination.total"
:marginTop="10"
:row-class-name="getRowClassName"
:actions="getActions"
:actionsWidth="160"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@row-contextmenu="handleRowContextMenu"
@cell-mouse-enter="handleCellMouseEnter"
@cell-mouse-leave="handleCellMouseLeave"
>
<template #default>
<ElTableColumn v-for="col in columns" :key="col.prop || col.type" v-bind="col" />
</template>
</ArtTable>
<!-- 鼠标悬浮提示 -->
<TableContextMenuHint :visible="showContextMenuHint" :position="hintPosition" />
<!-- 右键菜单 -->
<ArtMenuRight
ref="contextMenuRef"
:menu-items="contextMenuItems"
:menu-width="120"
@select="handleContextMenuSelect"
/>
<!-- 套餐列表对话框 -->
<ElDialog
v-model="packageListDialogVisible"
@@ -777,17 +764,14 @@
import type { SearchFormItem } from '@/types'
import { useCheckedColumns } from '@/composables/useCheckedColumns'
import { useAuth } from '@/composables/useAuth'
import { useTableContextMenu } from '@/composables/useTableContextMenu'
import ArtButtonTable from '@/components/core/forms/ArtButtonTable.vue'
import ArtMenuRight from '@/components/core/others/ArtMenuRight.vue'
import TableContextMenuHint from '@/components/core/others/TableContextMenuHint.vue'
import type { MenuItemType } from '@/components/core/others/ArtMenuRight.vue'
import { formatDateTime } from '@/utils/business/format'
import {
CommonStatus,
getStatusText,
frontendStatusToApi,
apiStatusToFrontend
apiStatusToFrontend,
STATUS_SELECT_OPTIONS,
getEnableStatusText
} from '@/config/constants'
defineOptions({ name: 'SeriesGrants' })
@@ -803,8 +787,6 @@
const packageLoading = ref(false)
const tableRef = ref()
const formRef = ref<FormInstance>()
const contextMenuRef = ref<InstanceType<typeof ArtMenuRight>>()
const currentRow = ref<ShopSeriesGrantResponse | null>(null)
const currentStep = ref(0) // 当前步骤0 为第一步1 为第二步
// 套餐列表对话框相关
@@ -930,10 +912,7 @@
clearable: true,
placeholder: '请选择状态'
},
options: () => [
{ label: '启用', value: 1 },
{ label: '禁用', value: 2 }
]
options: STATUS_SELECT_OPTIONS
}
])
@@ -1064,14 +1043,19 @@
label: '系列名称',
minWidth: 150,
formatter: (row: ShopSeriesGrantResponse) => {
const hasPermission = hasAuth('series_name_grants:detail')
return h(
'span',
{
style: 'color: var(--el-color-primary); cursor: pointer; text-decoration: underline;',
onClick: (e: MouseEvent) => {
e.stopPropagation()
handleNameClick(row)
}
style: hasPermission
? 'color: var(--el-color-primary); cursor: pointer; text-decoration: underline;'
: '',
onClick: hasPermission
? (e: MouseEvent) => {
e.stopPropagation()
handleNameClick(row)
}
: undefined
},
row.series_name
)
@@ -1137,7 +1121,7 @@
return h(
ElTag,
{ type: row.force_recharge_enabled ? 'warning' : 'info', size: 'small' },
() => (row.force_recharge_enabled ? '已启用' : '未启用')
() => getEnableStatusText(row.force_recharge_enabled || false)
)
}
},
@@ -1173,6 +1157,29 @@
}
])
// 操作列配置
const getActions = (row: ShopSeriesGrantResponse) => {
const actions: any[] = []
if (hasAuth('series_grants:detail')) {
actions.push({
label: '套餐列表',
handler: () => showPackageListDialog(row),
type: 'primary'
})
}
if (hasAuth('series_grants:edit')) {
actions.push({ label: '编辑', handler: () => showDialog('edit', row), type: 'primary' })
}
if (hasAuth('series_grants:delete')) {
actions.push({ label: '删除', handler: () => deleteAllocation(row), type: 'danger' })
}
return actions
}
// 构建树形结构数据
const buildTreeData = (items: ShopResponse[]) => {
const map = new Map<number, ShopResponse & { children?: ShopResponse[] }>()
@@ -1865,50 +1872,6 @@
}
}
// 右键菜单项配置
const contextMenuItems = computed((): MenuItemType[] => {
const items: MenuItemType[] = []
if (hasAuth('series_grants:detail')) {
items.push({ key: 'view_packages', label: '查看套餐列表' })
}
if (hasAuth('series_grants:edit')) {
items.push({ key: 'edit', label: '编辑' })
}
if (hasAuth('series_grants:delete')) {
items.push({ key: 'delete', label: '删除' })
}
return items
})
// 处理表格行右键菜单
const handleRowContextMenu = (row: ShopSeriesGrantResponse, column: any, event: MouseEvent) => {
event.preventDefault()
event.stopPropagation()
currentRow.value = row
contextMenuRef.value?.show(event)
}
// 处理右键菜单选择
const handleContextMenuSelect = (item: MenuItemType) => {
if (!currentRow.value) return
switch (item.key) {
case 'view_packages':
showPackageListDialog(currentRow.value)
break
case 'edit':
showDialog('edit', currentRow.value)
break
case 'delete':
deleteAllocation(currentRow.value)
break
}
}
// 显示套餐列表对话框
const showPackageListDialog = async (row: ShopSeriesGrantResponse) => {
currentGrantId.value = row.id
@@ -2108,14 +2071,6 @@
}
// 使用表格右键菜单功能
const {
showContextMenuHint,
hintPosition,
getRowClassName,
handleCellMouseEnter,
handleCellMouseLeave
} = useTableContextMenu()
// 下一步
const handleNextStep = async () => {
if (!formRef.value) return