fix: id兼容, 通知入口
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m0s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m0s
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
<template v-if="!props.seriesId">
|
||||
<ElOption value="__NO_PACKAGE__" disabled>
|
||||
<span style="color: var(--el-text-color-warning)">
|
||||
该设备未关联套餐系列,无法购买套餐
|
||||
{{ noSeriesMessage }}
|
||||
</span>
|
||||
</ElOption>
|
||||
</template>
|
||||
@@ -45,7 +45,7 @@
|
||||
</ElSelect>
|
||||
<template v-if="noSeriesId">
|
||||
<div style="margin-top: 4px; font-size: 12px; color: var(--el-text-color-warning)">
|
||||
该设备未关联套餐系列,无法购买套餐
|
||||
{{ noSeriesMessage }}
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="packagesEmptyWithSeriesId">
|
||||
@@ -182,6 +182,9 @@
|
||||
})
|
||||
|
||||
const noSeriesId = computed(() => !props.seriesId)
|
||||
const noSeriesMessage = computed(
|
||||
() => `该${props.assetType === 'card' ? '卡' : '设备'}未关联套餐系列,无法购买套餐`
|
||||
)
|
||||
|
||||
const selectedPackageIsGift = computed(() => {
|
||||
if (!form.package_id) return false
|
||||
|
||||
@@ -11,6 +11,28 @@
|
||||
@closed="handleCreateDrawerClosed"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="110px" class="create-form">
|
||||
<ElFormItem label="套餐系列" prop="series_id">
|
||||
<ElSelect
|
||||
v-model="form.series_id"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
:remote-method="handleSeriesSearch"
|
||||
:loading="seriesLoading"
|
||||
placeholder="请输入系列名称搜索"
|
||||
style="width: 100%"
|
||||
@change="handleSeriesChange"
|
||||
@visible-change="handleSeriesVisibleChange"
|
||||
>
|
||||
<ElOption
|
||||
v-for="series in seriesOptions"
|
||||
:key="series.id"
|
||||
:label="series.series_name"
|
||||
:value="series.id"
|
||||
/>
|
||||
</ElSelect>
|
||||
</ElFormItem>
|
||||
|
||||
<ElFormItem label="套餐" prop="package_id">
|
||||
<ElSelect
|
||||
v-model="form.package_id"
|
||||
@@ -19,7 +41,8 @@
|
||||
clearable
|
||||
:remote-method="handlePackageSearch"
|
||||
:loading="packageLoading"
|
||||
placeholder="请输入套餐名称搜索"
|
||||
:disabled="!form.series_id"
|
||||
placeholder="请先选择套餐系列"
|
||||
style="width: 100%"
|
||||
@visible-change="handlePackageVisibleChange"
|
||||
>
|
||||
@@ -223,8 +246,13 @@
|
||||
} from 'element-plus'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import VoucherUpload from '@/components/business/VoucherUpload.vue'
|
||||
import { BulkPurchaseService, PackageManageService } from '@/api/modules'
|
||||
import type { BulkPurchasePaymentMethod, BulkPurchaseTask, PackageResponse } from '@/types/api'
|
||||
import { BulkPurchaseService, PackageManageService, PackageSeriesService } from '@/api/modules'
|
||||
import type {
|
||||
BulkPurchasePaymentMethod,
|
||||
BulkPurchaseTask,
|
||||
PackageResponse,
|
||||
PackageSeriesResponse
|
||||
} from '@/types/api'
|
||||
import { BulkPurchaseTaskStatus } from '@/types/api'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
import { formatDateTime } from '@/utils/business/format'
|
||||
@@ -244,6 +272,8 @@
|
||||
const orderFileUploading = ref(false)
|
||||
const voucherFileKeys = ref<string[]>([])
|
||||
const voucherUploading = ref(false)
|
||||
const seriesOptions = ref<PackageSeriesResponse[]>([])
|
||||
const seriesLoading = ref(false)
|
||||
const packageOptions = ref<PackageResponse[]>([])
|
||||
const packageLoading = ref(false)
|
||||
const taskList = ref<BulkPurchaseTask[]>([])
|
||||
@@ -257,14 +287,17 @@
|
||||
)
|
||||
|
||||
const form = reactive<{
|
||||
series_id?: number
|
||||
package_id?: number
|
||||
payment_method: BulkPurchasePaymentMethod
|
||||
}>({
|
||||
series_id: undefined,
|
||||
package_id: undefined,
|
||||
payment_method: 'wallet'
|
||||
})
|
||||
|
||||
const rules = computed<FormRules>(() => ({
|
||||
series_id: [{ required: true, message: '请选择套餐系列', trigger: 'change' }],
|
||||
package_id: [{ required: true, message: '请选择套餐', trigger: 'change' }],
|
||||
payment_method: [{ required: true, message: '请选择支付方式', trigger: 'change' }],
|
||||
orderFile: [
|
||||
@@ -289,12 +322,18 @@
|
||||
}))
|
||||
|
||||
const loadPackages = async (query = '') => {
|
||||
if (!form.series_id) {
|
||||
packageOptions.value = []
|
||||
return
|
||||
}
|
||||
|
||||
packageLoading.value = true
|
||||
try {
|
||||
const res = await PackageManageService.getPackages({
|
||||
page: 1,
|
||||
page_size: 20,
|
||||
package_name: query.trim() || undefined,
|
||||
series_id: form.series_id,
|
||||
status: 1,
|
||||
shelf_status: 1
|
||||
})
|
||||
@@ -314,20 +353,21 @@
|
||||
}
|
||||
|
||||
const handlePackageSearch = (query: string) => {
|
||||
void loadPackages(query)
|
||||
if (form.series_id) void loadPackages(query)
|
||||
}
|
||||
|
||||
const handlePackageVisibleChange = (visible: boolean) => {
|
||||
if (visible && packageOptions.value.length === 0) void loadPackages()
|
||||
if (visible && form.series_id && packageOptions.value.length === 0) void loadPackages()
|
||||
}
|
||||
|
||||
const openCreateDrawer = () => {
|
||||
createDrawerVisible.value = true
|
||||
if (packageOptions.value.length === 0) void loadPackages()
|
||||
if (seriesOptions.value.length === 0) void loadSeries()
|
||||
}
|
||||
|
||||
const handleCreateDrawerClosed = () => {
|
||||
formRef.value?.resetFields()
|
||||
form.series_id = undefined
|
||||
form.package_id = undefined
|
||||
form.payment_method = 'wallet'
|
||||
orderFileKeys.value = []
|
||||
@@ -338,6 +378,41 @@
|
||||
voucherUploading.value = false
|
||||
}
|
||||
|
||||
const loadSeries = async (query = '') => {
|
||||
seriesLoading.value = true
|
||||
try {
|
||||
const res = await PackageSeriesService.getPackageSeries({
|
||||
page: 1,
|
||||
page_size: 20,
|
||||
series_name: query.trim() || undefined,
|
||||
status: 1
|
||||
})
|
||||
if (res.code !== 0) {
|
||||
ElMessage.error(res.msg || '获取套餐系列失败')
|
||||
return
|
||||
}
|
||||
seriesOptions.value = res.data?.items || []
|
||||
} catch (error: any) {
|
||||
ElMessage.error(error?.message || '获取套餐系列失败')
|
||||
} finally {
|
||||
seriesLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleSeriesSearch = (query: string) => {
|
||||
void loadSeries(query)
|
||||
}
|
||||
|
||||
const handleSeriesVisibleChange = (visible: boolean) => {
|
||||
if (visible && seriesOptions.value.length === 0) void loadSeries()
|
||||
}
|
||||
|
||||
const handleSeriesChange = () => {
|
||||
form.package_id = undefined
|
||||
packageOptions.value = []
|
||||
if (form.series_id) void loadPackages()
|
||||
}
|
||||
|
||||
const handlePaymentMethodChange = (value: string | number | boolean | undefined) => {
|
||||
if (value === 'wallet') {
|
||||
voucherFileKeys.value = []
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="device-batch-allocation-page" id="table-full-screen">
|
||||
<ElDrawer
|
||||
v-model="createDrawerVisible"
|
||||
title="设备批量分配"
|
||||
title="设备批量任务"
|
||||
direction="rtl"
|
||||
size="520px"
|
||||
:close-on-click-modal="!createDrawerBusy"
|
||||
@@ -102,13 +102,13 @@
|
||||
<ElCard shadow="never" class="art-table-card task-list-card">
|
||||
<template #header>
|
||||
<div class="task-list-header">
|
||||
<span>设备批量分配任务</span>
|
||||
<span>设备批量任务</span>
|
||||
<div class="task-list-toolbar">
|
||||
<ElButton
|
||||
v-if="hasAuth(JULY_PERMISSIONS.deviceAllocation.create)"
|
||||
tag="a"
|
||||
href="/templates/device-batch-allocation-template.csv"
|
||||
download="设备批量分配模板.csv"
|
||||
download="设备批量任务模板.csv"
|
||||
>
|
||||
下载模板
|
||||
</ElButton>
|
||||
@@ -117,7 +117,7 @@
|
||||
type="primary"
|
||||
@click="openCreateDrawer"
|
||||
>
|
||||
设备批量分配
|
||||
设备批量任务
|
||||
</ElButton>
|
||||
<ElSelect
|
||||
v-model="taskListOperationType"
|
||||
@@ -344,7 +344,7 @@
|
||||
if (res.code === 0) seriesOptions.value = res.data.items || []
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取批量分配目标失败:', error)
|
||||
console.error('获取设备批量任务目标失败:', error)
|
||||
ElMessage.error(normalizeApiError(error).message)
|
||||
} finally {
|
||||
targetLoading.value = false
|
||||
@@ -399,13 +399,13 @@
|
||||
operation_type: taskListOperationType.value
|
||||
})
|
||||
if (res.code !== 0) {
|
||||
ElMessage.error(res.msg || '获取设备批量分配任务失败')
|
||||
ElMessage.error(res.msg || '获取设备批量任务失败')
|
||||
return
|
||||
}
|
||||
taskList.value = (res.data.items || []).filter((item) => item.operation_type !== 'import')
|
||||
taskListTotal.value = res.data.total || 0
|
||||
} catch (error) {
|
||||
console.error('获取设备批量分配任务失败:', error)
|
||||
console.error('获取设备批量任务失败:', error)
|
||||
ElMessage.error(normalizeApiError(error).message)
|
||||
} finally {
|
||||
taskListLoading.value = false
|
||||
@@ -445,14 +445,14 @@
|
||||
try {
|
||||
const res = await DeviceService.createAllocationTask(request)
|
||||
if (res.code !== 0) {
|
||||
ElMessage.error(res.msg || '创建设备批量分配任务失败')
|
||||
ElMessage.error(res.msg || '创建设备批量任务失败')
|
||||
return
|
||||
}
|
||||
createDrawerVisible.value = false
|
||||
await loadTaskList()
|
||||
ElMessage.success(`任务已创建:${res.data.task_no}`)
|
||||
} catch (error) {
|
||||
console.error('创建设备批量分配任务失败:', error)
|
||||
console.error('创建设备批量任务失败:', error)
|
||||
ElMessage.error(normalizeApiError(error).message)
|
||||
} finally {
|
||||
submitting.value = false
|
||||
|
||||
Reference in New Issue
Block a user