检测计划未检、检测中、检测完成都可以绑定新的设备。但是该计划只有未检的设备可以解绑操作,其它的不允许解绑操作

This commit is contained in:
sjl
2025-11-25 16:17:58 +08:00
parent be95e792a8
commit 4a309feac5
2 changed files with 123 additions and 27 deletions

View File

@@ -235,7 +235,7 @@
</el-icon> </el-icon>
</el-tooltip> </el-tooltip>
<el-button <el-button
v-if="!data.disabled && !props.disabled" v-if="modeStore.currentMode === '比对式' ? !data.disabled : (!data.disabled && !props.disabled)"
text text
circle circle
@click="removeNode(data)" @click="removeNode(data)"
@@ -252,7 +252,7 @@
</el-row> </el-row>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { nextTick, ref, watch } from 'vue' import { computed, nextTick, onMounted, PropType, ref, useSlots, watch } from 'vue'
import type { import type {
FilterNodeMethodFunction, FilterNodeMethodFunction,
RenderContentContext, RenderContentContext,
@@ -261,6 +261,7 @@ import type {
TreeKey TreeKey
} from 'element-plus' } from 'element-plus'
import { Cpu, Lightning, Location, OfficeBuilding, Warning } from '@element-plus/icons-vue' import { Cpu, Lightning, Location, OfficeBuilding, Warning } from '@element-plus/icons-vue'
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
interface Tree { interface Tree {
[key: string]: any [key: string]: any
@@ -274,6 +275,7 @@ interface Device {
type Data = RenderContentContext['data'] type Data = RenderContentContext['data']
const modelValue = defineModel<string[]>({ default: [] }) const modelValue = defineModel<string[]>({ default: [] })
const slots = useSlots() const slots = useSlots()
const modeStore = useModeStore()
const props = defineProps({ const props = defineProps({
data: { data: {
type: Array as unknown as PropType<Device[]>, type: Array as unknown as PropType<Device[]>,
@@ -298,7 +300,7 @@ const props = defineProps({
expandAll: { expandAll: {
type: Boolean, type: Boolean,
default: false default: false
} },
}) })
const leftTreeRef = ref<TreeInstance>() const leftTreeRef = ref<TreeInstance>()
const rightTreeRef = ref<TreeInstance>() const rightTreeRef = ref<TreeInstance>()
@@ -353,6 +355,7 @@ watch(
) )
const initTree = (data: Device[]) => { const initTree = (data: Device[]) => {
// 禁用Key数据 // 禁用Key数据
disabledKeys.value = data.filter(item => item.disabled).map(item => item.id) disabledKeys.value = data.filter(item => item.disabled).map(item => item.id)
// 编辑逻辑 // 编辑逻辑
@@ -360,11 +363,14 @@ const initTree = (data: Device[]) => {
modelValue.value = [] modelValue.value = []
} }
// 左侧树数据 // 左侧树数据
leftTreeData.value = convertToTree(data, filter.value.groupBy) leftTreeData.value = convertToTree(data, 0,filter.value.groupBy)
// 右侧树数据 // 右侧树数据
rightTreeData.value = convertToTree( rightTreeData.value = convertToTree(
data.filter(item => item.checked), data.filter(item => item.checked),
1,
filter.value.groupBy filter.value.groupBy
) )
defaultCheckedKeys.value = data.filter(item => item.checked).map(item => item.id) defaultCheckedKeys.value = data.filter(item => item.checked).map(item => item.id)
modelValue.value = defaultCheckedKeys.value modelValue.value = defaultCheckedKeys.value
@@ -393,7 +399,7 @@ const setCheckedStatus = (checked: boolean) => {
}) })
} }
} }
const convertToTree = (data: Device[], groupBy?: string | undefined) => { const convertToTree = (data: Device[], type: number,groupBy?: string | undefined) => {
if (groupBy) { if (groupBy) {
// 创建一个映射来存储每个分组 // 创建一个映射来存储每个分组
const groupMap = new Map() const groupMap = new Map()
@@ -409,20 +415,56 @@ const convertToTree = (data: Device[], groupBy?: string | undefined) => {
// 将分组转换为树形结构 // 将分组转换为树形结构
const treeData: Tree[] = [] const treeData: Tree[] = []
groupMap.forEach((items, groupName) => {
const groupNode: Tree = { if(modeStore.currentMode == '比对式'){
id: `${groupBy}_${groupName}`, groupMap.forEach((items, groupName) => {
label: groupName, let groupNode: Tree;
children: (items as any[]).map((item: any) => ({ if(type === 0){
...item, // 只有当组内所有项目都禁用时,才将组节点设为禁用
label: item.name, const allItemsDisabled = (items as any[]).every((item: any) => {
children: [], return item.disabled === true ;
disabled: item.disabled ? item.disabled : props.disabled });
})), groupNode = {
disabled: props.disabled id: `${groupBy}_${groupName}`,
} label: groupName,
treeData.push(groupNode) children: (items as any[]).map((item: any) => ({
}) ...item,
label: item.name,
children: [],
// disabled: item.disabled ? item.disabled : props.disabled
})),
// disabled: props.disabled
disabled: allItemsDisabled
}
}else{
groupNode = {
id: `${groupBy}_${groupName}`,
label: groupName,
children: (items as any[]).map((item: any) => ({
...item,
label: item.name,
children: [],
})),
}
}
treeData.push(groupNode)
})
}else{
groupMap.forEach((items, groupName) => {
const groupNode: Tree = {
id: `${groupBy}_${groupName}`,
label: groupName,
children: (items as any[]).map((item: any) => ({
...item,
label: item.name,
children: [],
disabled: item.disabled ? item.disabled : props.disabled
})),
disabled: props.disabled
}
treeData.push(groupNode)
})
}
return treeData return treeData
} else { } else {
@@ -445,14 +487,17 @@ const filterNode: FilterNodeMethodFunction = (value: string, data: Tree) => {
} }
return data.label.includes(value) || data.cityName.includes(value) || data.manufacturer.includes(value) return data.label.includes(value) || data.cityName.includes(value) || data.manufacturer.includes(value)
} }
const handleCommand = (command: string) => { const handleCommand = (command: string) => {
filter.value.groupBy = command filter.value.groupBy = command
const oldCheckedKeys = leftTreeRef.value?.getCheckedKeys() || [] const oldCheckedKeys = leftTreeRef.value?.getCheckedKeys() || []
leftTreeData.value = convertToTree(props.data, filter.value.groupBy) leftTreeData.value = convertToTree(props.data,0, filter.value.groupBy)
leftTreeRef.value?.setCheckedKeys(oldCheckedKeys) leftTreeRef.value?.setCheckedKeys(oldCheckedKeys)
rightTreeData.value = convertToTree( rightTreeData.value = convertToTree(
props.data.filter(item => oldCheckedKeys.includes(item.id)), props.data.filter(item => oldCheckedKeys.includes(item.id)),
1,
filter.value.groupBy filter.value.groupBy
) )
if (filter.value.checkAll) { if (filter.value.checkAll) {
setCheckedStatus(true) setCheckedStatus(true)
@@ -467,10 +512,14 @@ const handleCheckChange = () => {
.map(key => key.toString()) .map(key => key.toString())
rightTreeData.value = convertToTree( rightTreeData.value = convertToTree(
props.data.filter(item => checkedKeys.includes(item.id)), props.data.filter(item => checkedKeys.includes(item.id)),
filter.value.groupBy 1,
filter.value.groupBy,
) )
statistics.value.checked = checkedKeys.length || 0 statistics.value.checked = checkedKeys.length || 0
filter.value.checkAll = statistics.value.checked === statistics.value.total filter.value.checkAll = statistics.value.checked === statistics.value.total
} }
const clearAll = () => { const clearAll = () => {
if (statistics.value.checked > 0) { if (statistics.value.checked > 0) {
@@ -478,11 +527,44 @@ const clearAll = () => {
} }
} }
const removeNode = (data: Data) => { const removeNode = (data: Data) => {
nextTick(() => { nextTick(() => {
leftTreeRef.value?.setChecked(data, false, true) leftTreeRef.value?.setChecked(data, false, true)
rightTreeRef.value?.remove(data) rightTreeRef.value?.remove(data)
}) })
} }
// 获取当前右侧树中的设备ID
const getSelectedDeviceIds = () => {
const extractDeviceIds = (treeData: Tree[]): string[] => {
const ids: string[] = [];
const traverse = (nodes: Tree[]) => {
if (!Array.isArray(nodes)) return;
nodes.forEach(node => {
// 如果节点有 children 且不为空,则递归遍历
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
traverse(node.children);
} else {
// 只有叶子节点(设备节点)才添加到 ID 列表中
// 设备节点的 ID 不包含下划线
if (node.id && !node.id.toString().includes('_')) {
ids.push(node.id);
}
}
});
};
traverse(treeData);
return ids;
};
return extractDeviceIds(rightTreeData.value);
};
defineExpose({ getSelectedDeviceIds });
</script> </script>
<style lang="scss"> <style lang="scss">
.card-header { .card-header {

View File

@@ -243,6 +243,7 @@
</el-col> </el-col>
<el-col :span="15"> <el-col :span="15">
<DevSelect <DevSelect
ref="devSelectRef"
v-model="formContent.devIds" v-model="formContent.devIds"
:titles="['被检设备列表', '已选被检设备列表']" :titles="['被检设备列表', '已选被检设备列表']"
filter-placeholder="请输入内容搜索" filter-placeholder="请输入内容搜索"
@@ -459,12 +460,14 @@ import { getTestConfig } from '@/api/system/base'
import { getRegRes } from '@/api/system/versionRegister' import { getRegRes } from '@/api/system/versionRegister'
import DevSelect from '@/views/plan/planList/components/devSelect.vue' import DevSelect from '@/views/plan/planList/components/devSelect.vue'
import { WarningFilled } from '@element-plus/icons-vue' import { WarningFilled } from '@element-plus/icons-vue'
import { el } from 'element-plus/es/locale'
const modeStore = useModeStore() const modeStore = useModeStore()
const AppSceneStore = useAppSceneStore() const AppSceneStore = useAppSceneStore()
const dictStore = useDictStore() const dictStore = useDictStore()
// 定义弹出组件元信息 // 定义弹出组件元信息
const dialogFormRef = ref() const dialogFormRef = ref()
const devSelectRef = ref()
const mode = ref() const mode = ref()
const selectByMode = ref(true) const selectByMode = ref(true)
const pqSourceList = ref<TestSource.ResTestSource[]>([]) //获取指定模式下所有检测源 const pqSourceList = ref<TestSource.ResTestSource[]>([]) //获取指定模式下所有检测源
@@ -513,11 +516,20 @@ const generateData = () => {
} }
} }
i.checked = boundPqDevIds.length > 0 ? boundPqDevIds.includes(i.id) : false i.checked = boundPqDevIds.length > 0 ? boundPqDevIds.includes(i.id) : false
if (i.checkState && i.checkState != 0) {
i.disabled = true if (mode.value === '比对式') {
} if (i.checkState && i.checkState != 0) {
if (allDisabled.value) { i.disabled = true
i.disabled = true }else {
i.disabled = false
}
}else{
if (i.checkState && i.checkState != 0) {
i.disabled = true
}
if (allDisabled.value) {
i.disabled = true
}
} }
}) })
// 排序逻辑 // 排序逻辑
@@ -533,6 +545,7 @@ const generateData = () => {
// 最后按名称排序(升序) // 最后按名称排序(升序)
return a.name.localeCompare(b.name) return a.name.localeCompare(b.name)
}) })
} }
@@ -756,6 +769,7 @@ const save = () => {
emit('update:tab') emit('update:tab')
} else { } else {
formContent.sourceIds = null formContent.sourceIds = null
formContent.devIds = devSelectRef.value?.getSelectedDeviceIds() || [];
await updatePlan(formContent) await updatePlan(formContent)
} }
} else { } else {