fix:修复完善创建授权页面逻辑

This commit is contained in:
13895237362 committed 2025-10-17 11:55:07 +08:00
1 parent 8ab50aa927
commit 961be26353
1 file changed
+261 -79
+261 -79
View File
@@ -48,7 +48,7 @@
<el-input
v-model="customerCode"
placeholder="自动生成或手动输入"
readonly
disabled
/>
</el-form-item>
@@ -56,7 +56,7 @@
<el-input
v-model="createdBy"
placeholder="当前登录用户"
readonly
disabled
/>
</el-form-item>
</div>
@@ -76,19 +76,33 @@
<div class="license-form">
<h3 class="section-title">授权配置</h3>
<!-- 第三行:授权期限,起止时间 -->
<!-- 第三行:授权期限类型,起止时间 -->
<div class="fields-row">
<el-form-item label="授权期限" prop="validity_days" required class="field-item">
<el-input-number
v-model="formData.validity_days"
:min="1"
:max="36500"
placeholder="请输入授权期限(天)"
<el-form-item label="授权期限" prop="validity_type" required class="field-item">
<el-select
v-model="validityType"
placeholder="请选择授权期限类型"
style="width: 100%"
/>
@change="handleValidityTypeChange"
>
<el-option
label="永久"
value="permanent"
/>
<el-option
label="有限"
value="limited"
/>
</el-select>
</el-form-item>
<el-form-item label="起止时间" prop="date_range" required class="field-item">
<el-form-item
v-if="validityType === 'limited'"
label="起止时间"
prop="date_range"
required
class="field-item"
>
<el-date-picker
v-model="dateRange"
type="daterange"
@@ -101,6 +115,18 @@
@change="handleDateRangeChange"
/>
</el-form-item>
<el-form-item
v-if="validityType === 'permanent'"
label="有效期天数"
class="field-item"
>
<el-input
:value="'永久(365000天)'"
readonly
style="width: 100%"
/>
</el-form-item>
</div>
<!-- 第四行:最大激活设备数,部署类型,加密类型 -->
@@ -119,6 +145,7 @@
v-model="formData.deployment_type"
placeholder="请选择部署类型"
style="width: 100%"
@change="handleDeploymentTypeChange"
>
<el-option
v-for="option in deploymentTypeOptions"
@@ -157,9 +184,11 @@ import { useRouter, useRoute } from 'vue-router'
import { createLicense, updateLicense, getLicenseDetail, type AuthorizationCodeCreateRequest, type LicenseUpdateRequest } from '@/api/license'
import { getCustomers, type Customer } from '@/api/customer'
import { getEnumOptions, type RawEnumItem } from '@/api/enum'
import { useUserStore } from '@/store/modules/user'
const router = useRouter()
const route = useRoute()
const userStore = useUserStore()
// 表单引用
const formRef = ref<FormInstance>()
@@ -190,6 +219,7 @@ const formData = reactive<AuthorizationCodeCreateRequest>({
const customerCode = ref('')
const createdBy = ref('')
const dateRange = ref<[string, string] | null>(null)
const validityType = ref<'permanent' | 'limited'>('limited')
// 计算属性
const isEdit = computed(() => {
@@ -199,23 +229,72 @@ const isEdit = computed(() => {
// 表单验证规则
const formRules: FormRules = {
customer_id: [
{ required: true, message: '请选择客户', trigger: 'change' }
],
customer_code: [
{ required: true, message: '客户ID不能为空', trigger: 'blur' }
],
created_by: [
{ required: true, message: '创建人不能为空', trigger: 'blur' }
{ required: true, message: '请选择客户', trigger: 'change' },
{
validator: (_rule: any, value: any, callback: any) => {
if (value && customerOptions.value.length > 0) {
const selectedCustomer = customerOptions.value.find(c => c.id === value)
if (!selectedCustomer) {
callback(new Error('请从下拉列表中选择有效的客户'))
} else {
callback()
}
} else {
callback()
}
},
trigger: 'change'
}
],
description: [
{ required: true, message: '请输入备注信息', trigger: 'blur' }
{ required: true, message: '请输入备注信息', trigger: 'blur' },
{ min: 1, max: 500, message: '备注信息长度应在1-500个字符之间', trigger: 'blur' }
],
validity_days: [
{ required: true, message: '请输入授权期限', trigger: 'blur' },
{ type: 'number', min: 1, max: 36500, message: '授权期限必须在1-36500天之间', trigger: 'blur' }
validity_type: [
{ required: true, message: '请选择授权期限类型', trigger: 'change' }
],
date_range: [
{ required: true, message: '请选择起止时间', trigger: 'change' }
{
required: true,
message: '请选择起止时间',
trigger: 'change',
validator: (_rule: any, _value: any, callback: any) => {
if (validityType.value === 'limited' && (!dateRange.value || dateRange.value.length !== 2)) {
callback(new Error('请选择起止时间'))
} else {
callback()
}
}
},
{
validator: (_rule: any, _value: any, callback: any) => {
if (validityType.value === 'limited' && dateRange.value && dateRange.value.length === 2) {
const startDate = new Date(dateRange.value[0])
const endDate = new Date(dateRange.value[1])
const today = new Date()
today.setHours(0, 0, 0, 0)
if (startDate < today) {
callback(new Error('开始日期不能早于今天'))
} else if (endDate <= startDate) {
callback(new Error('结束日期必须晚于开始日期'))
} else {
// 检查日期范围是否超过合理范围(比如10年)
const maxDays = 3650 // 10年
const diffTime = endDate.getTime() - startDate.getTime()
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
if (diffDays > maxDays) {
callback(new Error('授权期限不能超过10年'))
} else {
callback()
}
}
} else {
callback()
}
},
trigger: 'change'
}
],
deployment_type: [
{ required: true, message: '请选择部署类型', trigger: 'change' }
@@ -225,7 +304,23 @@ const formRules: FormRules = {
],
max_activations: [
{ required: true, message: '请输入最大激活设备数', trigger: 'blur' },
{ type: 'number', min: 1, message: '最大激活设备数必须大于0', trigger: 'blur' }
{
type: 'number',
min: 1,
max: 999999,
message: '最大激活设备数必须在1-999999之间',
trigger: 'blur'
},
{
validator: (_rule: any, value: any, callback: any) => {
if (value && !Number.isInteger(Number(value))) {
callback(new Error('最大激活设备数必须为整数'))
} else {
callback()
}
},
trigger: 'blur'
}
]
}
@@ -234,26 +329,31 @@ const loadEnumOptions = async () => {
try {
// 加载部署类型选项
const deploymentResponse = await getEnumOptions('deployment_type')
deploymentTypeOptions.value = deploymentResponse.data.items
if (deploymentResponse.code === '000000') {
deploymentTypeOptions.value = deploymentResponse.data.items
} else {
throw new Error(deploymentResponse.message || '加载部署类型选项失败')
}
// 加载加密类型选项
const encryptionResponse = await getEnumOptions('encryption_type')
encryptionTypeOptions.value = encryptionResponse.data.items
} catch (error) {
if (encryptionResponse.code === '000000') {
encryptionTypeOptions.value = encryptionResponse.data.items
} else {
throw new Error(encryptionResponse.message || '加载加密类型选项失败')
}
} catch (error: any) {
console.error('加载枚举选项失败:', error)
// 使用默认选项
deploymentTypeOptions.value = [
{ key: 'standalone', display: '单机版' },
{ key: 'cloud', display: '云端版' },
{ key: 'hybrid', display: '混合版' }
]
encryptionTypeOptions.value = [
{ key: 'standard', display: '标准加密' },
{ key: 'advanced', display: '高级加密' }
]
let errorMessage = error.backendMessage || error.response?.data?.message || error.message
if (errorMessage) {
ElMessage.error('加载枚举选项失败: ' + errorMessage)
} else {
ElMessage.error('加载枚举选项失败,请稍后重试')
}
}
}
// 搜索关联客户
const searchCustomers = async (query: string) => {
if (!query) {
customerOptions.value = []
@@ -268,42 +368,73 @@ const searchCustomers = async (query: string) => {
customer_name: query
})
customerOptions.value = response.data.list
} catch (error) {
} catch (error: any) {
console.error('搜索客户失败:', error)
ElMessage.error('搜索客户失败')
let errorMessage = error.backendMessage || error.response?.data?.message || error.message
if (errorMessage) {
ElMessage.error('搜索客户失败: ' + errorMessage)
} else {
ElMessage.error('搜索客户失败,请稍后重试')
}
} finally {
customerLoading.value = false
}
}
// 表单初始化
const loadCustomerInfo = () => {
// 从路由参数获取客户信息
const customerId = route.query.customerId as string
const customerName = route.query.customerName as string
// const customerId = route.query.customerId as string
// const customerName = route.query.customerName as string
if (customerId && customerName) {
formData.customer_id = customerId
customerOptions.value = [{
id: customerId,
customer_name: customerName,
customer_code: '',
customer_type: '',
customer_type_display: '',
contact_person: '',
email: '',
customer_level: '',
customer_level_display: '',
status: '',
status_display: '',
created_at: '',
updated_at: '',
created_by: '',
updated_by: ''
} as Customer]
// if (customerId && customerName) {
// formData.customer_id = customerId
// customerOptions.value = [{
// id: customerId,
// customer_name: customerName,
// customer_code: '',
// customer_type: '',
// customer_type_display: '',
// contact_person: '',
// email: '',
// customer_level: '',
// customer_level_display: '',
// status: '',
// status_display: '',
// created_at: '',
// updated_at: '',
// created_by: '',
// updated_by: ''
// } as Customer]
// }
// 设置创建人(从用户store获取当前登录用户)
if (userStore.userInfo) {
createdBy.value = userStore.userInfo.username
} else {
createdBy.value = '未知用户'
}
// 设置创建人(这里可以从用户store获取当前登录用户)
createdBy.value = '当前用户' // TODO: 从用户store获取
}
// 处理授权期限类型变化
const handleValidityTypeChange = (type: 'permanent' | 'limited') => {
if (type === 'permanent') {
formData.validity_days = 365000
dateRange.value = null
} else {
// 有限期限时,如果已有日期范围,重新计算天数
if (dateRange.value && dateRange.value.length === 2) {
const startDate = new Date(dateRange.value[0])
const endDate = new Date(dateRange.value[1])
const diffTime = endDate.getTime() - startDate.getTime()
formData.validity_days = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
}
}
}
// 处理部署类型变化
const handleDeploymentTypeChange = () => {
// 部署类型变化时的处理逻辑(如需要可以在这里添加)
}
// 处理日期范围变化
@@ -316,15 +447,17 @@ const handleDateRangeChange = (dates: [string, string] | null) => {
}
}
// 根据id获取授权详情
const loadLicenseDetail = async () => {
if (!isEdit.value) return
try {
const id = route.params.id as string
const response = await getLicenseDetail(id)
const data = response.data
if (data) {
if (response.code === '000000' && response.data) {
const data = response.data
// 填充表单数据
formData.customer_id = data.customer_id || ''
formData.description = data.description || ''
@@ -334,15 +467,35 @@ const loadLicenseDetail = async () => {
// 设置独立字段
customerCode.value = (data as any).customer_code || data.customer_id || ''
createdBy.value = (data as any).created_by || '当前用户'
// 编辑模式下显示原始创建人,如果没有则显示当前用户
createdBy.value = (data as any).created_by || (userStore.userInfo ? userStore.userInfo.username : '未知用户')
// 计算有效期天数和设置日期范围
if (data.start_date && data.end_date) {
const startDate = new Date(data.start_date)
const endDate = new Date(data.end_date)
const diffTime = endDate.getTime() - startDate.getTime()
formData.validity_days = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
dateRange.value = [data.start_date, data.end_date]
const days = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
formData.validity_days = days
// 根据天数判断是永久还是有限
if (days >= 365000) {
validityType.value = 'permanent'
dateRange.value = null
} else {
validityType.value = 'limited'
dateRange.value = [data.start_date, data.end_date]
}
} else {
// 如果没有日期信息,根据validity_days判断
const validityDays = (data as any).validity_days
if (validityDays && validityDays >= 365000) {
validityType.value = 'permanent'
formData.validity_days = 365000
} else {
validityType.value = 'limited'
formData.validity_days = validityDays || 365
}
}
// 设置客户选项
@@ -365,17 +518,26 @@ const loadLicenseDetail = async () => {
updated_by: ''
} as Customer]
}
} else {
throw new Error(response.message || '获取授权详情失败')
}
} catch (error) {
} catch (error: any) {
console.error('加载授权详情失败:', error)
ElMessage.error('加载授权详情失败')
let errorMessage = error.backendMessage || error.response?.data?.message || error.message
if (errorMessage) {
ElMessage.error('加载授权详情失败: ' + errorMessage)
} else {
ElMessage.error('加载授权详情失败,请稍后重试')
}
}
}
// 提交(新增/更新)授权数据
const handleSubmit = async () => {
if (!formRef.value) return
try {
// 执行表单验证
await formRef.value.validate()
submitting.value = true
@@ -396,24 +558,39 @@ const handleSubmit = async () => {
reason: '管理员更新授权配置'
}
await updateLicense(id, updateData)
ElMessage.success('更新成功')
const response = await updateLicense(id, updateData)
if (response.code === '000000') {
ElMessage.success(response.message || '更新成功')
// 返回列表页面
router.back()
} else {
throw new Error(response.message || '更新失败')
}
} else {
// 创建授权
await createLicense(formData)
ElMessage.success('创建成功')
const response = await createLicense(formData)
if (response.code === '000000') {
ElMessage.success(response.message || '创建成功')
// 返回列表页面
router.back()
} else {
throw new Error(response.message || '创建失败')
}
}
// 返回列表页面
router.back()
} catch (error) {
} catch (error: any) {
console.error('提交失败:', error)
ElMessage.error('提交失败')
let errorMessage = error.backendMessage || error.response?.data?.message || error.message
if (errorMessage) {
ElMessage.error('提交失败: ' + errorMessage)
} else {
ElMessage.error('提交失败,请稍后重试')
}
} finally {
submitting.value = false
}
}
// 取消函数
const handleCancel = () => {
ElMessageBox.confirm('确定要取消吗?未保存的更改将丢失。', '提示', {
confirmButtonText: '确定',
@@ -432,7 +609,12 @@ watch(() => formData.customer_id, (newCustomerId) => {
const selectedCustomer = customerOptions.value.find(c => c.id === newCustomerId)
if (selectedCustomer) {
customerCode.value = selectedCustomer.customer_code || selectedCustomer.id
} else {
// 如果没有找到客户,清空客户代码
customerCode.value = ''
}
} else {
customerCode.value = ''
}
})