|  | @@ -40,7 +40,7 @@ const campaignType = ref(rowData.value.rule.campaignType);
 | 
	
		
			
				|  |  |  const dialogVisible = defineModel({ default: false });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 定向规则
 | 
	
		
			
				|  |  | -const selected =ref([]) //存储后端中已存在的广告组
 | 
	
		
			
				|  |  | +const selected = ref([]); //存储后端中已存在的广告组
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const targetRuleDialogVisible = ref(false);
 | 
	
		
			
				|  |  |  const selectedTargetedRow = ref(null);
 | 
	
	
		
			
				|  | @@ -199,13 +199,15 @@ function handleGridChange({ records, row, checked }) {
 | 
	
		
			
				|  |  |      if (row) {
 | 
	
		
			
				|  |  |        if (!checked) {
 | 
	
		
			
				|  |  |          row.isSelected = false;
 | 
	
		
			
				|  |  | -        // 清空 keywordInfo 和 campaignTargetInfo
 | 
	
		
			
				|  |  | -        if (row.keywordInfo) {
 | 
	
		
			
				|  |  | -          row.keywordInfo = [];
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (row.campaignTargetInfo) {
 | 
	
		
			
				|  |  | -          row.campaignTargetInfo = [];
 | 
	
		
			
				|  |  | +        if (row.campaignGroupInfo) {
 | 
	
		
			
				|  |  | +          // 如果是父节点,清空所有子节点的 keywordInfo 和 campaignTargetInfo
 | 
	
		
			
				|  |  | +          row.campaignGroupInfo.forEach(group => {
 | 
	
		
			
				|  |  | +            group.keywordInfo = []; // 清空每个子节点的关键词信息
 | 
	
		
			
				|  |  | +            group.campaignTargetInfo = []; // 清空每个子节点的定向目标信息
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        } else if (row.keywordInfo || row.campaignTargetInfo) {
 | 
	
		
			
				|  |  | +          row.keywordInfo = []; // 清空关键词信息
 | 
	
		
			
				|  |  | +          row.campaignTargetInfo = []; // 清空定向目标信息
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          updateSelectedAds();
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -374,25 +376,67 @@ const removeSelectedAd = async (row) => {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return ad;
 | 
	
		
			
				|  |  |        }).filter(ad => ad.campaignGroupInfo && ad.campaignGroupInfo.length > 0);
 | 
	
		
			
				|  |  | +      // 更新 selected.value
 | 
	
		
			
				|  |  | +      selected.value = selected.value.map(ad => {
 | 
	
		
			
				|  |  | +        // 仅在父节点存在时进行过滤
 | 
	
		
			
				|  |  | +        if (ad.campaignGroupInfo) {
 | 
	
		
			
				|  |  | +          // 过滤掉与 row.adGroupId 匹配的子节点
 | 
	
		
			
				|  |  | +          const filteredGroupInfo = ad.campaignGroupInfo.filter(group => group.adGroupId !== row.adGroupId);
 | 
	
		
			
				|  |  | +          return {
 | 
	
		
			
				|  |  | +            ...ad,
 | 
	
		
			
				|  |  | +            campaignGroupInfo: filteredGroupInfo // 更新子节点
 | 
	
		
			
				|  |  | +          };
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return ad; // 返回未修改的广告
 | 
	
		
			
				|  |  | +      }).filter(ad => ad.campaignGroupInfo.length > 0); // 删除无子节点的父节点
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        // 删除父节点(广告活动)
 | 
	
		
			
				|  |  |        selectedAds.value = selectedAds.value.filter(ad => ad.campaignId !== row.campaignId);
 | 
	
		
			
				|  |  | +      // 更新 selected.value
 | 
	
		
			
				|  |  | +      selected.value = selected.value.filter(ad => ad.campaignId !== row.campaignId);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      await $grid.remove(row);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (xGridOne.value) {
 | 
	
		
			
				|  |  | -    await xGridOne.value.toggleCheckboxRow(row);
 | 
	
		
			
				|  |  | -    row.isSelected = false;
 | 
	
		
			
				|  |  | +    // 始终取消选中当前行
 | 
	
		
			
				|  |  | +    await xGridOne.value.setCheckboxRow(row, false);
 | 
	
		
			
				|  |  | +    handleGridChange({ records: [row], row, checked: false });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (!row.isSelected) {
 | 
	
		
			
				|  |  | +      // 如果当前行不是选中的状态,查找并取消选中对应的子节点
 | 
	
		
			
				|  |  | +      const parentRow = xGridOne.value.data.find(ad => ad.campaignId === row.campaignId);
 | 
	
		
			
				|  |  | +      if (parentRow && parentRow.campaignGroupInfo) {
 | 
	
		
			
				|  |  | +        parentRow.campaignGroupInfo.forEach(group => {
 | 
	
		
			
				|  |  | +          // 将子节点的 isSelected 设置为 false
 | 
	
		
			
				|  |  | +          group.isSelected = false;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function removeAllSelectedAds() {
 | 
	
		
			
				|  |  | +  // 清空 selectedAds 中的所有值
 | 
	
		
			
				|  |  |    selectedAds.value = [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    const $grid = xGridOne.value;
 | 
	
		
			
				|  |  |    if ($grid) {
 | 
	
		
			
				|  |  | +    // 清除表格中所有行的勾选状态
 | 
	
		
			
				|  |  |      $grid.clearCheckboxRow();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 循环遍历 gridOptions.data,设置所有子节点的 isSelected 为 false 并清空相关信息
 | 
	
		
			
				|  |  | +    gridOptions.data.forEach(ad => {
 | 
	
		
			
				|  |  | +      if (ad.campaignGroupInfo) {
 | 
	
		
			
				|  |  | +        ad.campaignGroupInfo.forEach(group => {
 | 
	
		
			
				|  |  | +          group.isSelected = false; // 设置子节点的 isSelected 为 false
 | 
	
		
			
				|  |  | +          group.keywordInfo = []; // 清空每个子节点的关键词信息
 | 
	
		
			
				|  |  | +          group.campaignTargetInfo = []; // 清空每个子节点的定向目标信息
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -400,7 +444,6 @@ function cancel() {
 | 
	
		
			
				|  |  |    dialogVisible.value = false;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -//TODO: 确认按钮-adGroupInfo
 | 
	
		
			
				|  |  |  async function confirm() {
 | 
	
		
			
				|  |  |    const campaignItems = selectedAds.value.map(ad => ({
 | 
	
		
			
				|  |  |      campaignId: ad.campaignId,
 | 
	
	
		
			
				|  | @@ -472,12 +515,12 @@ async function getSelectedAds() {
 | 
	
		
			
				|  |  |        if (ad.campaignGroupInfo && ad.campaignGroupInfo.length > 0) {
 | 
	
		
			
				|  |  |          ad.campaignGroupInfo.forEach(group => {
 | 
	
		
			
				|  |  |            group.isSelected = true;
 | 
	
		
			
				|  |  | -          group.targetLength = group.keywordInfo.length;
 | 
	
		
			
				|  |  | +          group.targetLength = group.keywordInfo?.length + (group.campaignTargetInfo?.length || 0);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    updateSelectedAds();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +  selectedAds.value.push(...selected.value);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 获取广告组下拉框
 |