问题
1、选中后:
(1)逻辑一:
勾选时,取消当前材料的下层材料的勾选状态全部置灰
(2)逻辑二:
判断其他层级是否存在相同编码的材料:
若存在,则判断该层级材料的勾选状态是否为**置灰**(父级/父级的父级/...../被勾选了):
若为置灰,则不做处理;
若不置灰,则勾选该材料,则执行逻辑一和逻辑二
(3)逻辑三,将该材料对应的下层材料的勾选框设为【不可勾选】状态(置灰);
2、取消选中后
(1)取消后,将该材料对应的下层材料的勾选框设为 【允许勾选】状态;
(2)判断其他层级是否存在相同材料编码的材料:
若存在,则判断该层级材料的勾选状态是否为**置灰**(父级/父级的父级/...../被勾选了):
若不是,则取消勾选状态;
若是,则不做处理;
接口返回的树形表格的数据都是一维数组,还是用我2年前发布的那个方法# 根据parentid(parent_id)拼树结构(js)组合,让儿孙曾孙都找到祖宗!
期间还解决了antd-vue树形表格defaultExpandAllRows全部展开无效的问题
方法:在每次获取表格数据时,设置一个随机key
以上可以解决每次树形表格数据变化时,都可以正常展开全部数据。
下面直接上勾选复选框和取消复选框的代码:
主要是使用递归方法
findTableListItem (data, id) {
data.forEach(e => {
if(e.id == id) {
this.findTableItem = e
return
}
if (e?.children?.length) {
this.findTableListItem(e.children, id)
}
})
},
selectFun (record) {
const _this = this
function getLevelStatus (record) {
if (!record.parentId) {
if (record?.children?.length) {
return 1
} else {
return 4
}
} else {
if (!record.children || !record.children.length) {
return 3
} else {
return 2
}
}
}
function selectAllChildrens (data) {
data.forEach(e => {
if(_this.selectedRowKeys.includes(record.id)) {
e.disabled = true;
_this.selectedRowKeys.forEach((selectKey, index) => {
if (e.id === selectKey) {
_this.selectedRowKeys.splice(index, 1)
}
})
} else {
e.disabled = false;
}
if (e?.children?.length) {
selectAllChildrens(e.children)
}
})
}
function findAllSameMaterialCode (record) {
let tableList = deepClone(_this.tableList);
tableList = flatten(tableList)
// 物料编码 materialCode
if(_this.selectedRowKeys.includes(record.id)) {
tableList.forEach(e => {
if(e.materialCode == record.materialCode && (!e.disabled && !e.alternativeType)) {
_this.findTableListItem(_this.tableList, e.id); // 找到相同物料编码的当前级,设置下级不可勾选
_this.findTableItem && _this.findTableItem.children && selectAllChildrens(_this.findTableItem.children); // 设置下级不可勾选
!_this.selectedRowKeys.includes(e.id) && _this.selectedRowKeys.push(e.id);
}
})
}else{
let selectedRowKeysMaterialCode = _this.selectedRowKeys.map(item => {
let filterMaterialCode = tableList.filter(f => f.id == item);
return {
materialCode: filterMaterialCode[0].materialCode,
selectedRowKey: item
}
})
_this.selectedRowKeys = selectedRowKeysMaterialCode.filter(item => item.materialCode !== record.materialCode).map(item => item.selectedRowKey);
selectedRowKeysMaterialCode.forEach(item => {
if(item.materialCode == record.materialCode){ // 找到相同物料编码,做下级可勾选的处理
_this.findTableListItem(_this.tableList, item.selectedRowKey); // 找到相同物料编码的当前级,设置下级可勾选
if(_this.findTableItem && _this.findTableItem.children) {
!_this.findTableItem.disabled && selectAllChildrens(_this.findTableItem.children); // 如果查找的当前级是可勾选的,设置下级可勾选
}
}
})
}
}
const getLevel = getLevelStatus(record)
if (getLevel === 1) {
selectAllChildrens(record.children)
findAllSameMaterialCode(record)
this.updateTableList()
} else if (getLevel === 2) {
selectAllChildrens(record.children)
findAllSameMaterialCode(record)
this.updateTableList()
} else {
findAllSameMaterialCode(record)
this.updateTableList()
}
}