bonus-ui/src/views/business/apply/addApply.vue

900 lines
32 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 基础页面 -->
<div class="app-container">
<el-card v-show="showSearch" style="margin-bottom: 20px">
<el-form :model="queryParams" ref="queryForm" :rules="outFormRules" inline label-width="110px">
<el-form-item label="需求单位" prop="useUnit">
<el-input style="width: 200px" v-model="queryParams.useUnit" placeholder="请输入需求单位"
:disabled="queryParams.status=='0'" clearable
/>
</el-form-item>
<el-form-item label="使用项目" prop="proCode">
<el-select
clearable
:disabled="!routerParams.isEdit"
style="width: 200px"
placeholder="请选择使用项目"
v-model="queryParams.proCode"
@change="onChangeProCode"
>
<el-option
:key="item.proCode"
:label="item.proName"
:value="item.proCode"
v-for="item in useProjectList"
/>
</el-select>
</el-form-item>
<el-form-item label="项目类型" prop="proType">
<el-input style="width: 200px" disabled v-model="queryParams.proType"/>
</el-form-item>
<el-form-item label="电压等级" prop="voltageLevel">
<el-input style="width: 200px" disabled v-model="queryParams.voltageLevel"/>
</el-form-item>
<el-form-item label="项目所在省" prop="proProvince">
<el-input style="width: 200px" disabled v-model="queryParams.proProvince"/>
</el-form-item>
<el-form-item label="项目所在市" prop="proCity">
<el-input style="width: 200px" disabled v-model="queryParams.proCity"/>
</el-form-item>
<el-form-item label="项目所在区/县" prop="proCounty">
<el-input style="width: 200px" disabled v-model="queryParams.proCounty"/>
</el-form-item>
<el-form-item label="使用日期" prop="useTime">
<el-date-picker
:disabled="!routerParams.isEdit"
v-model="queryParams.useTime"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 200px"
@change="useTimeChange"
>
</el-date-picker>
</el-form-item>
</el-form>
</el-card>
<el-card>
<el-row :gutter="10" class="mb8" justify="end">
<el-col :span="4">
<span style="font-size: 20px; font-weight: 800">自用申请列表</span>
</el-col>
<el-col v-if="!routerParams.isView" :span="20" style="display: flex; justify-content: flex-end">
<el-button type="primary" @click="handleDialog">添加</el-button>
<el-button type="primary" @click="submit">确定申请</el-button>
</el-col>
</el-row>
<el-table
v-loading="isLoading"
:data="tableList"
highlight-current-row
border
stripe
:max-height="650"
style="width: 100%"
>
<el-table-column
type="index"
width="55"
label="序号"
align="center"
/>
<el-table-column label="分类" align="center" prop="devType" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.devType==1">{{ '装备' }}</span>
<span v-if="scope.row.devType==2">{{ '工具' }}</span>
</template>
</el-table-column>
<el-table-column label="类目" align="center" prop="category" :show-overflow-tooltip="true"/>
<el-table-column label="名称" align="center" prop="typeName" :show-overflow-tooltip="true" width="120px"/>
<el-table-column label="规格型号" align="center" prop="typeModelName" :show-overflow-tooltip="true"/>
<el-table-column label="管理模式" align="center" prop="manageType" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.manageType==0">{{ '编码设备' }}</span>
<span v-if="scope.row.manageType==1">{{ '数量设备' }}</span>
</template>
</el-table-column>
<el-table-column label="设备编码" align="center" prop="devCode" :show-overflow-tooltip="true" width="140px"/>
<el-table-column label="当前库存" align="center" prop="storageNum" :show-overflow-tooltip="true"/>
<el-table-column label="申请数量" align="center" prop="num" :show-overflow-tooltip="true"/>
<el-table-column label="使用到期日期" align="center" prop="useTime" width="160px">
<template slot-scope="scope">
<el-date-picker
:disabled="!routerParams.isEdit"
v-model="scope.row.useTime"
type="date"
format="yyyy-MM-dd"
style="width: 100%"
placeholder="选择日期"
>
</el-date-picker>
</template>
</el-table-column>
<el-table-column label="操作" align="center" v-if="!routerParams.isView">
<template slot-scope="{ row }">
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(row)" style="color: red"
>删除
</el-button
>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 添加申请 -->
<el-dialog title="添加申请" :visible.sync="openAdd" width="1200px" append-to-body>
<el-form :model="addQuery" ref="addQueryForm" label-width="70px" inline>
<el-form-item label="名称" prop="typeName">
<el-input v-model="addQuery.typeName" maxlength="20" placeholder="请输入名称"/>
</el-form-item>
<el-form-item label="规格型号" prop="typeModelName">
<el-input v-model="addQuery.typeModelName" maxlength="20" placeholder="请输入规格型号"/>
</el-form-item>
<el-form-item label="编码" prop="devCode">
<el-input v-model="addQuery.devCode" maxlength="20" placeholder="请输入编码"/>
</el-form-item>
<!-- 新增:分类选择下拉框(装备/工具) -->
<el-form-item label="分类" prop="devType">
<el-select
v-model="addQuery.devType"
placeholder="请选择分类"
clearable
>
<el-option label="装备" value="1"/>
<el-option label="工具" value="2"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="装备分类" prop="categoryPath">-->
<!-- <el-cascader-->
<!-- v-model="addQuery.categoryPath"-->
<!-- :options="processedTreeData"-->
<!-- :props="cascaderProps"-->
<!-- placeholder="请选择装备分类(最多六级)"-->
<!-- clearable-->
<!-- style="width: 100%"-->
<!-- filterable-->
<!-- popper-class="six-level-cascader"-->
<!-- @change="handleCategoryChange"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="工具分类" prop="toolCategoryPath">-->
<!-- <el-cascader-->
<!-- v-model="addQuery.toolCategoryPath"-->
<!-- :options="toolTreeData"-->
<!-- :props="toolCascaderProps"-->
<!-- placeholder="请选择工具分类"-->
<!-- clearable-->
<!-- style="width: 100%"-->
<!-- filterable-->
<!-- popper-class="six-level-cascader"-->
<!-- @change="handleToolCategoryChange"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item style="margin-left: 980px">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleAddQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetAddQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8" justify="end">
<el-col style="display: flex; justify-content: flex-end">
<el-button type="primary" @click="saveAdd">确定添加</el-button>
</el-col>
</el-row>
<el-table ref="addTable" :data="addList" height="500" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :selectable="selectable"/>
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
<span>{{
(addQuery.pageNum - 1) * 10 + scope.$index + 1
}}</span>
</template>
</el-table-column>
<el-table-column label="分类" align="center" prop="devType" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.devType==1">{{ '装备' }}</span>
<span v-if="scope.row.devType==2">{{ '工具' }}</span>
</template>
</el-table-column>
<el-table-column label="类目" align="center" prop="category" :show-overflow-tooltip="true"/>
<el-table-column label="名称" align="center" prop="typeName" :show-overflow-tooltip="true"/>
<el-table-column label="规格型号" align="center" prop="typeModelName" :show-overflow-tooltip="true"/>
<el-table-column label="管理模式" align="center" prop="manageType" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.manageType==0">{{ '编码设备' }}</span>
<span v-if="scope.row.manageType==1">{{ '数量设备' }}</span>
</template>
</el-table-column>
<el-table-column label="设备编码" align="center" prop="devCode" :show-overflow-tooltip="true" width="140px"/>
<el-table-column label="当前库存" align="center" prop="storageNum" :show-overflow-tooltip="true"/>
<el-table-column label="申请数量" align="center" prop="num">
<template slot-scope="scope">
<span v-if="scope.row.manageType==0">{{ 1 }}</span>
<el-input-number v-if="scope.row.manageType==1" :disabled="isRowSelected(scope.row)" v-model="scope.row.num"
:min="0" :max="scope.row.storageNum" :default-value="0" style="width: 120px"
@change="applyNumChange(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<pagination
v-show="addTotal > 0"
:total="addTotal"
:page.sync="addQuery.pageNum"
:limit.sync="addQuery.pageSize"
@pagination="getApplyList"
/>
</el-dialog>
</div>
</template>
<script>
import { getListByApplyIdApi, deleteToolApi, updateToolApplyApi } from '@/api/toolsManage'
import { getApplyListApi, addApplyApi, getApplyDetailsApi, editApplyApi } from '@/api/business'
import {
getUseProjectListAPI,
getVoltageListAPI,
addProjectOutAPI
} from '@/api/EquipmentLedger/equ-out'
import { regionData } from 'element-china-area-data'
import { getEquipmentTreeAPI } from '@/api/EquipmentConfig/index.js'
import { getTreeSelectApi } from '@/api/toolsManage/index.js' // 替换为实际工具接口路径
export default {
name: 'AddEditApply',
data() {
return {
routerParams: {},
isLoading: false,
showSearch: true,
timeRange: [],
processedTreeData: [], // 装备分类树
toolTreeData: [], // 工具分类树
// 装备分类级联配置
cascaderProps: {
value: 'id',
label: 'name',
children: 'children',
checkStrictly: true,
expandTrigger: 'click'
},
// 工具分类级联配置匹配返回字段typeId/typeName
toolCascaderProps: {
value: 'typeId',
label: 'typeName',
children: 'children',
checkStrictly: true,
expandTrigger: 'click'
},
queryParams: {
type: 2, // 出库
status: '0', // 变更状态
proCode: '', // 使用项目id
proName: '', // 使用项目名称
proType: '', // 项目类型
voltageLevel: '', // 电压等级
proProvince: '', // 项目所在省
proCity: '', // 项目所在市
proCounty: '', // 项目所在区/县
proLocation: '', // 详细地址
useUnit: '', // 需求单位
useTime: null,
pageNum: 1, // 页码
pageSize: 10 // 每页条数
},
useProjectList: [], // 使用项目下拉选
voltageList: [], // 电压等级下拉选
provinceList: [],
cityList: [],
countyList: [],
outFormRules: {
status: [{ required: true, message: '请选择变更状态', trigger: 'change' }],
proCode: [{ required: true, message: '请选择使用项目', trigger: 'change' }],
proType: [{ required: true, message: '请选择项目类型', trigger: 'change' }],
voltageLevel: [{ required: true, message: '请选择电压等级', trigger: 'change' }],
proProvince: [{ required: true, message: '请选择项目所在省', trigger: 'change' }],
proCity: [{ required: true, message: '请选择项目所在市', trigger: 'change' }],
proCounty: [{ required: true, message: '请选择项目所在区/县', trigger: 'change' }],
proLocation: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
useUnit: [{ required: true, message: '请输入需求单位', trigger: 'blur' }],
},
typeList: [
{ label: '数量管理', value: '1' },
{ label: '编码管理', value: '0' }
],
total: 0, // 总条数
tableList: [], // 表格数据
openAdd: false, // 添加申请弹窗开关
addQuery: { // 页面输入的查询参数
typeName: '', // 名称
typeModelName: '', // 规格型号
devCode: '', // 设备编码
devType: '', // 核心分类选择1=装备2=工具)
categoryPath: '', // 装备分类路径(数组)
toolCategoryPath: '', // 工具分类路径(数组)
pageNum: 1, // 页码
pageSize: 10 // 每页条数
},
filterParams: { // 存储筛选条件(分页时保留)
typeName: '',
typeModelName: '',
devCode: '',
categoryEquipment: '', // 装备分类ID字符串
toolTypeId: '', // 工具分类ID字符串
devType: '' // 筛选类型1=装备2=工具)
},
addTotal: 0, // 添加申请列表总条数
addList: [], // 添加申请列表数据
addTempList: [], // 添加申请临时列表
ids: [], // 选中的id
single: false, // 单选标识
multiple: false // 多选标识
}
},
created() {
this.routerParams = this.$route.query
let title = '新增申请'
if (this.routerParams.isView) {
title = '查看申请'
} else if (this.routerParams.isEdit) {
title = '编辑申请'
}
this.queryParams.id = this.routerParams.id || ''
this.getUseProjectList()
// 如果是新增状态,默认填充当前部门名称
if (this.queryParams.status === '0') {
this.queryParams.useUnit = sessionStorage.getItem('deptName')
}
this.provinceList = regionData
const obj = Object.assign({}, this.$route, { title })
this.$tab.updatePage(obj)
this.getList()
this.getEquipmentTree() // 初始化加载装备分类树
this.getToolTree() // 初始化加载工具分类树
},
methods: {
// 获取使用项目的下拉选
async getUseProjectList() {
try {
const [resProject, resVoltage] = await Promise.all([
getUseProjectListAPI(),
getVoltageListAPI()
]);
this.useProjectList = resProject.data || []
this.voltageList = resVoltage.data || []
} catch (error) {
this.$message.error('获取项目或电压等级列表失败');
console.error(error);
}
},
// 选择使用项目
onChangeProCode(value) {
this.queryParams.proCode = value
const item = this.useProjectList.find((item) => item.proCode === value)
if (item) {
this.queryParams.proName = item.proName
const { proTypeName, voltage, city, county, province } = item
this.queryParams.proType = proTypeName
this.queryParams.voltageLevel = voltage + 'kV'
this.queryParams.proProvince = province
this.queryParams.proCity = city
this.queryParams.proCounty = county
}
},
// 选择省份
onChangeProvince(value) {
if (!value) {
this.cityList = []
return
}
this.cityList = this.provinceList.find((item) => item.label === value)?.children || []
},
// 选择城市
onChangeCity(value) {
if (!value) {
this.countyList = []
return
}
this.countyList = this.cityList.find((item) => item.label === value)?.children || []
},
// 获取列表数据
async getList(emit = {}) {
if (emit.id) {
this.queryParams.id = emit.id
this.$route.query.id = this.queryParams.id
}
this.isLoading = true
try {
const params = { ...this.queryParams }
const res = await getApplyDetailsApi(params)
this.tableList = res.data.devDetailsList || []
if (this.queryParams.id) {
// 编辑或查看时,回填表单数据
Object.assign(this.queryParams, res.data.devInfo || {})
// 确保useTime是Date对象防止Element UI日期选择器显示异常
if (this.queryParams.useTime) {
this.queryParams.useTime = new Date(this.queryParams.useTime);
}
}
this.total = res.data.total || 0
} catch (error) {
this.tableList = []
this.total = 0
this.$message.error('获取申请详情失败')
} finally {
this.isLoading = false
}
},
// 删除列表项
handleDelete(row) {
this.$confirm('此操作将永久删除该申请项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableList = this.tableList.filter((item) => item.id !== row.id)
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch(() => {
// 用户点击取消,不做操作
});
},
// 打开添加申请弹窗
handleDialog() {
this.addQuery.pageNum = 1;
this.resetAddQuery(); // 打开时重置查询条件和分页
this.openAdd = true
// 确保弹窗打开后表格能正确渲染
this.$nextTick(() => {
if (this.$refs.addTable) {
this.$refs.addTable.clearSelection();
}
});
},
/**
* 分页回调获取添加申请列表数据整合devType筛选
* @param {Object} pagination - 分页参数 { pageNum, pageSize }
*/
getApplyList(pagination = {}) {
// 合并分页参数,优先使用分页组件传递的参数
const pageNum = pagination.pageNum || this.addQuery.pageNum;
const pageSize = pagination.pageSize || this.addQuery.pageSize;
// 更新组件内的分页状态
this.addQuery.pageNum = pageNum;
this.addQuery.pageSize = pageSize;
// 构造完整的查询参数包含devType
const queryParams = {
...this.filterParams,
pageNum,
pageSize
};
this.isLoading = true;
getApplyListApi(queryParams)
.then(response => {
if (response && response.data) {
this.addList = response.data.rows || [];
this.addTotal = response.data.total || 0;
// 初始化申请数量
this.addList.forEach(item => {
item.num = item.manageType === 0 ? 1 : 0;
});
} else {
this.addList = [];
this.addTotal = 0;
this.$message.warning('获取数据格式异常');
}
})
.catch(error => {
this.addList = [];
this.addTotal = 0;
this.$message.error(`获取设备列表失败:${error.message || '未知错误'}`);
console.error('分页查询失败:', error);
})
.finally(() => {
this.isLoading = false;
});
},
/**
* 添加申请查询核心处理devType筛选逻辑
*/
handleAddQuery() {
this.addQuery.pageNum = 1; // 查询时重置页码为1
const queryParams = { ...this.addQuery };
// 1. 处理devType直接使用选择的分类值1=装备2=工具)
const devType = queryParams.devType || '';
// 2. 处理装备分类(仅当选择装备时生效)
let categoryEquipment = '';
if (devType === '1' && queryParams.categoryPath && Array.isArray(queryParams.categoryPath) && queryParams.categoryPath.length > 0) {
categoryEquipment = String(queryParams.categoryPath[queryParams.categoryPath.length - 1]);
}
// 3. 处理工具分类(仅当选择工具时生效)
let toolTypeId = '';
if (devType === '2' && queryParams.toolCategoryPath && Array.isArray(queryParams.toolCategoryPath) && queryParams.toolCategoryPath.length > 0) {
toolTypeId = String(queryParams.toolCategoryPath[queryParams.toolCategoryPath.length - 1]);
}
// 保存筛选条件包含devType
this.filterParams = {
typeName: queryParams.typeName,
typeModelName: queryParams.typeModelName,
devCode: queryParams.devCode,
categoryEquipment,
toolTypeId,
devType // 关键将devType传递给后端筛选
};
// 调用分页查询方法
this.getApplyList({
pageNum: this.addQuery.pageNum,
pageSize: this.addQuery.pageSize
});
},
/**
* 重置添加申请查询条件包含devType
*/
resetAddQuery() {
this.addQuery = {
typeName: '',
typeModelName: '',
devCode: '',
devType: '', // 重置分类选择
categoryPath: '',
toolCategoryPath: '',
pageNum: 1,
pageSize: 10
};
// 同步重置筛选参数
this.filterParams = {
typeName: '',
typeModelName: '',
devCode: '',
categoryEquipment: '',
toolTypeId: '',
devType: '' // 重置devType筛选
};
// 重置后触发一次查询
this.getApplyList({ pageNum: 1, pageSize: this.addQuery.pageSize });
},
// 返回上一页
handleBack() {
this.$router.go(-1)
},
// 使用日期变化(批量设置表格中的使用日期)
useTimeChange(val) {
this.tableList.forEach(item => {
item.useTime = val
})
},
// 选择项变化表格勾选时触发保留devType
handleSelectionChange(selection) {
this.addTempList = []
this.ids = selection.map(item => item.id)
selection.forEach(item => {
this.addTempList.push({
id: item.id,
typeId: item.typeId,
devType: item.devType, // 关键保留分类类型1=装备2=工具)
category: item.category,
typeName: item.typeName,
typeModelName: item.typeModelName,
manageType: item.manageType,
devCode: item.devCode,
storageNum: item.storageNum,
num: item.manageType == 0 ? 1 : item.num, // 编码设备默认1数量设备取输入值
useTime: this.queryParams.useTime ? new Date(this.queryParams.useTime) : null // 默认为主表单的使用日期
})
})
this.single = selection.length !== 1
this.multiple = !selection.length
},
// 表格选择框是否可勾选库存为0或已添加过的不可选
selectable(row) {
// 库存为0或null不可选
if (!row.storageNum || row.storageNum <= 0) {
return false
}
// 已在主列表中的不可选
return !this.tableList.some(item => item.id === row.id && item.typeId === row.typeId)
},
// 检查行是否被选中
isRowSelected(row) {
return this.ids.includes(row.id)
},
// 申请数量变化(校验:不能大于库存)
applyNumChange(row) {
if (row.num > row.storageNum) {
this.$message({
type: 'error',
message: '申请数量不能大于当前库存'
})
row.num = row.storageNum // 超过库存时,自动设为最大库存
} else if (row.num < 0) {
row.num = 0; // 防止输入负数
}
},
// 确认添加(将勾选的数据添加到主表格)
saveAdd() {
if (!this.ids.length) {
this.$message({
type: 'error',
message: '请勾选要添加的数据'
})
return
}
// 检查是否有数量设备未填写数量
const invalidItem = this.addTempList.find(item => item.manageType === 1 && (item.num === 0 || !item.num));
if (invalidItem) {
this.$message.error('请为数量管理的设备填写申请数量。');
return;
}
this.addTempList.forEach(item => {
this.tableList.push(item) // 数据包含devType字段
})
// 清除勾选状态
this.ids = []
this.addTempList = []
if (this.$refs.addTable) {
this.$refs.addTable.clearSelection()
}
this.openAdd = false
},
// 提交申请(新增/编辑devType随数据传递
// 提交
async submit() {
this.$refs.queryForm.validate(async(valid) => {
if (valid) {
this.$confirm('是否确定提交申请?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async() => {
this.isLoading = true
try {
//新增
if (!this.routerParams.id) {
this.queryParams.type = 2
this.queryParams.leaseType = 0
const tempTableList = this.tableList.map(item => ({
...item,
category: null
}))
const params = {
devInfo: this.queryParams,
devDetailsList: tempTableList
}
const res = await addApplyApi(params)
if (res.code == 200) {
this.$message({
type: 'success',
message: '添加成功!'
})
this.$router.go(-1)
// this.$tab.closeOpenPage({ path: '/business/applyList' })
}
} else if (this.routerParams.id) {
// 修改
this.queryParams.type = 2
this.queryParams.leaseType = 0
const tempTableList = this.tableList.map(item => ({
...item,
category: null
}))
const params = {
devInfo: this.queryParams,
devDetailsList: tempTableList
}
const res = await editApplyApi(params)
if (res.code == 200) {
this.$message({
type: 'success',
message: '修改成功!'
})
this.$router.go(-1)
// this.$tab.closeOpenPage({ path: '/business/applyList' })
}
}
} catch (error) {
console.log('🚀 ~ error:', error)
} finally {
this.isLoading = false
}
})
}
})
},
// 处理分类树数据(适配六级分类)
processTreeData(data) {
return Array.isArray(data) ? data : data ? [data] : []
},
// 递归处理装备分类节点限制六级补充level字段
processChildrenData(data, currentLevel = 1) {
if (currentLevel > 6) return []
return data.map(item => {
const nodeId = item.typeId ? Number(item.typeId) : item.id ? Number(item.id) : ''
const processedItem = {
id: nodeId,
name: item.typeName || item.name,
level: currentLevel,
parentId: item.parentId ? Number(item.parentId) : null,
...item
}
// 六级以下不再递归
if (item.children && item.children.length > 0 && currentLevel < 6) {
processedItem.children = this.processChildrenData(item.children, currentLevel + 1)
} else {
delete processedItem.children
}
return processedItem
})
},
// 获取装备分类树数据
async getEquipmentTree() {
try {
const res = await getEquipmentTreeAPI()
if (res.code === 200) {
const rawTreeData = this.processTreeData(res.data)
this.processedTreeData = this.processChildrenData(rawTreeData)
} else {
this.$message.error(res.msg || '获取装备分类失败')
}
} catch (error) {
this.$message.error('获取分类数据失败:' + (error.message || '未知错误'))
}
},
// 获取工具分类树数据适配返回字段限制最多6级
async getToolTree() {
try {
const res = await getTreeSelectApi()
if (res.code === 200) {
let rawData = res.data || []
this.toolTreeData = this.processToolTreeData(rawData)
} else {
this.$message.error(res.msg || '获取工具分类失败')
}
} catch (error) {
this.$message.error('获取工具分类数据失败:' + (error.message || '未知错误'))
}
},
// 递归处理工具分类节点(限制六级)
processToolTreeData(data, currentLevel = 1) {
if (currentLevel > 6) return []
return data.map(item => {
const processedItem = { ...item }
// 六级以下递归处理子节点
if (item.children && item.children.length > 0 && currentLevel < 6) {
processedItem.children = this.processToolTreeData(item.children, currentLevel + 1)
} else {
delete processedItem.children // 超过六级移除子节点
}
return processedItem
})
}
}
}
</script>
<style lang="scss" scoped>
/* 六级分类级联选择器样式 */
::v-deep .six-level-cascader .el-cascader-menu {
max-height: 300px;
overflow-y: auto;
}
::v-deep .six-level-cascader .el-cascader-menu__item {
position: relative;
transition: all 0.2s;
}
/* 各级分类缩进差异化 */
::v-deep .six-level-cascader .el-cascader-menu[data-level='1'] .el-cascader-menu__item {
padding-left: 20px;
font-weight: 500;
}
::v-deep .six-level-cascader .el-cascader-menu[data-level='2'] .el-cascader-menu__item {
padding-left: 35px;
font-weight: 400;
}
::v-deep .six-level-cascader .el-cascader-menu[data-level='3'] .el-cascader-menu__item {
padding-left: 50px;
font-size: 13px;
}
::v-deep .six-level-cascader .el-cascader-menu[data-level='4'] .el-cascader-menu__item {
padding-left: 65px;
font-size: 13px;
color: #666;
}
::v-deep .six-level-cascader .el-cascader-menu[data-level='5'] .el-cascader-menu__item {
padding-left: 80px;
font-size: 12px;
color: #888;
}
::v-deep .six-level-cascader .el-cascader-menu[data-level='6'] .el-cascader-menu__item {
padding-left: 95px;
font-size: 12px;
color: #999;
background-color: #f8f9fa;
}
/* 隐藏七级及以上分类 */
::v-deep .six-level-cascader .el-cascader-menu[data-level='7'] .el-cascader-menu__item {
display: none;
}
/* 滚动条样式优化 */
::v-deep .six-level-cascader .el-cascader-menu::-webkit-scrollbar {
width: 6px;
}
::v-deep .six-level-cascader .el-cascader-menu::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
::v-deep .six-level-cascader .el-cascader-menu::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
</style>