sen
2026-02-02 373177bf926ed54c22d221e1da6ef6370b7e2aa5
ui/admin-ui3/src/views/cwgl/voucherSubjectSetting/index.vue
@@ -10,12 +10,12 @@
      @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
      @size-change="sizeChange" @on-load="onLoad">
      <template #menu-left>
        <el-button type="success" icon="Edit" :disabled="pageF.single" v-hasPermi="['cwgl:voucherSubjectSetting:edit']"
        <!-- <el-button type="success" icon="Edit" :disabled="pageF.single" v-hasPermi="['cwgl:voucherSubjectSetting:edit']"
          @click="handleUpdate">修改
        </el-button>
        <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
          v-hasPermi="['cwgl:voucherSubjectSetting:remove']">删除
        </el-button>
        </el-button> -->
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:voucherSubjectSetting:export']">导出
        </el-button>
@@ -66,6 +66,10 @@
const option = ref({
  pageKey: 'VoucherSubjectSetting',
  rowKey: 'id',
  tree: true,           // 开启树形表格模式
  childrenHandler: 'children', // 指定子节点字段名,默认为 children
  expandAll: true,     // 是否默认展开所有行
  viewBtn: false,
  searchSpan: 5,
  labelWidth: 150,
  searchLabelWidth: 120,
@@ -92,10 +96,10 @@
    //     }
    //   ],
    // },
    accountSet: {
      label: '账套',
      search: true,
      minWidth: 120,
      minWidth: 220,
      addDisabled: true,
      editDisabled: true,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_accounting_type',
@@ -143,8 +147,7 @@
    parentSubjectCode: {
      label: '上级科目代码',
      minWidth: 150,
      search: true,
      hide: true,
      // rules: [
      //   {
      //     required: true,
@@ -224,7 +227,7 @@
      editDisplay: false,
    },
    accountingItemsContains: {
      label: '核算项目1',
      label: '核算项目',
      minWidth: 150,
      search: true,
      type: 'select', // 确保类型为 select
@@ -241,7 +244,7 @@
      }
    },
    accountingItems: {
      label: '核算项目2',
      label: '核算项目',
      minWidth: 150,
      type: 'select',
      multiple: true,
@@ -391,8 +394,13 @@
    // 【关键修复点】:拦截详情接口,在数据进入 form 之前完成格式化
    getDetailApi: (id: any) => {
      return getVoucherSubjectSetting(id).then((res: any) => {
        console.log(res);
        if (res.code === 200 && res.data) {
          // 1. 处理 accountingItems 数字转数组
          // 1. 如果 accountSet 是数字,转为字符串
          res.data.accountSet = res.data.accountSet ? String(res.data.accountSet) : "0";
          if (typeof res.data.accountingItems === 'number') {
            res.data.accountingItems = decomposeAccountingItems(res.data.accountingItems);
          } else if (!res.data.accountingItems) {
@@ -413,6 +421,34 @@
    deleteApi: delVoucherSubjectSetting,
    addApi: addVoucherSubjectSetting,
    updateApi: updateVoucherSubjectSetting,
    getListFunc: (res: any) => {
      // 1. 转换树结构
      tableData.value = proxy.handleTree(res.rows, "id");
      // 2. 使用递归函数展开所有层级
      nextTick(() => {
        if (crudRef.value) {
          const tableMethods = crudRef.value.$refs.table;
          if (tableMethods && tableData.value) {
            // --- 定义递归展开函数 ---
            const expandAllNodes = (list: any[]) => {
              list.forEach(row => {
                // 只要有子节点,就执行展开动作
                if (row.children && row.children.length > 0) {
                  tableMethods.toggleRowExpansion(row, true);
                  // 继续递归展开子节点的子节点
                  expandAllNodes(row.children);
                }
              });
            };
            // 执行递归
            expandAllNodes(tableData.value);
          }
        }
      });
    },
    handleUpdateFunc: () => {
      isFromRow.value = true; // 修改操作也视为禁用上级科目
      crudRef.value.rowEdit(selectionList.value[0]);
@@ -549,11 +585,23 @@
    rowSaveBegin: (row: any, done: any, loading: any) => {
      processAccountingItems(row);
      delete row.accountingItemsContains;
      // 如果 row 对象里带了 id,新增接口可能会报错或变成修改,如果是顶部新增,确保没有 id
      // --- 核心逻辑开始 ---
      if (!isFromRow.value) {
        // 1. 确保没有 ID(防止误操作)
        delete row.id;
        // 2. 如果是顶级科目(parentId 为 0 或 无)
        if (row.parentId === 0 || !row.parentId) {
          // 将上级科目代码设置为当前填写的科目代码
          row.parentSubjectCode = row.subjectCode;
      }
      done(row); // 必须调用 done 并传入处理后的 row 才会继续请求接口
      } else {
        // 如果是行内新增,parentId 已经是父节点的 ID
      }
      // --- 核心逻辑结束 ---
      done(row);
    },
    // 修改保存前的逻辑
@@ -621,22 +669,25 @@
  return result;
}
/**
 * 处理行内“新增”点击
 * 处理行内“新增子项”点击
 */
const handleRowAdd = (row: any) => {
  isFromRow.value = true;
  getVoucherSubjectSetting(row.id).then((res: any) => {
    if (res.code == 200) {
      form.value = res.data;
      form.value.parentId = form.value.id;
      const num = form.value.accountingItems;
      form.value.accountingItems = decomposeAccountingItems(num);
      // 触发 Avue 的内置新增弹窗
  // 1. 先触发新增动作,这会弹出窗口并初始化 form
      crudRef.value.rowAdd();
    }
  // 2. 在 DOM 更新后的下一次循环中强制赋值
  nextTick(() => {
    // 确保赋值给 data 响应式对象中的 form
    form.value.parentId = row.id;
    form.value.parentSubjectCode = row.subjectCode;
    form.value.accountSet = row.accountSet;
    form.value.type = row.accountSet;
    form.value.enabled = "1";
    form.value.accountingItems = [];
  });
};
</script>