<template>
  <div class="supervision-content-container">
    <!-- 搜索表单 -->
    <div class="search-panel">
      <el-form :inline="true" :model="searchForm" class="search-form">
        <el-form-item label="监审类别:">
          <el-cascader
            v-model="searchForm.catalogId"
            :options="catalogListOptions"
            placeholder=" 请选择监审类别"
            v-bind="props"
            style="width: 100%"
            clearable
          ></el-cascader>
        </el-form-item>

        <el-form-item label="模板名称:">
          <el-input
            v-model="searchForm.keyword"
            placeholder="请输入模板名称"
            clearable
          ></el-input>
        </el-form-item>

        <el-form-item>
          <el-button type="primary" icon="el-icon-search" @click="handleSearch">
            搜索
          </el-button>
          <el-button
            plain
            type="primary"
            icon="el-icon-refresh"
            @click="handleReset"
          >
            重置
          </el-button>
        </el-form-item>
      </el-form>
    </div>

    <!-- 操作按钮 -->
    <div class="operation-bar">
      <el-button
        v-region-permission="{
          category: 'costVerifyManage',
          action: 'add',
        }"
        plain
        type="success"
        icon="el-icon-circle-plus"
        @click="handleAdd"
      >
        <!-- v-region-permission="{
          category: 'costVerifyManage',
          action: 'add',
        }" -->
        添加
      </el-button>
      <el-button
        v-region-permission="{
          category: 'costVerifyManage',
          action: 'delete',
        }"
        plain
        type="danger"
        icon="el-icon-delete"
        :disabled="selectedRows.length === 0"
        @click="handleBatchDelete"
      >
        删除
      </el-button>
    </div>

    <!-- 表格 -->
    <div class="table-container">
      <el-table
        v-loading="loading"
        :data="tableData"
        border
        style="width: 100%"
        :default-sort="{ prop: 'createTime', order: 'descending' }"
        @selection-change="handleSelectionChange"
      >
        <!-- :default-sort="{ prop: 'createTime', order: 'descending' }" -->
        <el-table-column
          type="selection"
          width="55"
          align="center"
          show-overflow-tooltip
        ></el-table-column>

        <el-table-column
          type="index"
          label="序号"
          width="60"
          align="center"
          show-overflow-tooltip
        ></el-table-column>

        <el-table-column
          prop="catalogId"
          label="监审类别"
          align="center"
          show-overflow-tooltip
        >
          <template slot-scope="scope">
            <div>{{ getCatalogNames(scope.row) }}</div>
          </template>
        </el-table-column>

        <el-table-column
          prop="surveyTemplateName"
          label="核定模板名称"
          show-overflow-tooltip
          align="center"
        ></el-table-column>
        <el-table-column
          prop="versionNo"
          label="版本号"
          align="center"
          width="150"
        ></el-table-column>

        <el-table-column
          prop="status"
          label="状态"
          width="100"
          show-overflow-tooltip
          align="center"
        >
          <template slot-scope="scope">
            <span>
              {{
                scope.row.status == '-1'
                  ? '草稿'
                  : scope.row.status == '0'
                  ? '启用'
                  : '停用'
              }}
            </span>
          </template>
        </el-table-column>

        <el-table-column
          prop="createBy"
          label="创建人"
          width="120"
          show-overflow-tooltip
          align="center"
        ></el-table-column>

        <el-table-column
          prop="createTime"
          label="创建时间"
          width="160"
          show-overflow-tooltip
          align="center"
          sortable
        >
          <!-- sortable -->
          <template slot-scope="scope">
            <div>{{ scope.row.createTime.split(' ')[0] }}</div>
            <div>{{ scope.row.createTime.split(' ')[1] }}</div>
          </template>
        </el-table-column>

        <el-table-column
          label="操作"
          width="240"
          fixed="right"
          show-overflow-tooltip
          align="center"
        >
          <template slot-scope="scope">
            <el-button
              v-region-permission="{
                category: 'costVerifyManage',
                action: 'view',
              }"
              type="text"
              size="mini"
              @click="handleViewDetail(scope.row)"
            >
              查看
            </el-button>
            <el-button
              v-if="scope.row.status != '0'"
              v-region-permission="{
                category: 'costVerifyManage',
                action: 'edit',
                targetData: scope.row,
              }"
              type="text"
              size="mini"
              @click="handleEdit(scope.row)"
            >
              修改
            </el-button>
            <el-button
              v-region-permission="{
                category: 'costVerifyManage',
                action: 'edit',
                targetData: scope.row,
              }"
              type="text"
              size="mini"
              @click="handleStatusChange(scope.row)"
            >
              <!-- （-1草稿,0启用,1停用） -->
              {{ scope.row.status == '0' ? '停用' : '启用' }}
            </el-button>
            <el-button
              v-if="scope.row.status != '0'"
              v-region-permission="{
                category: 'costVerifyManage',
                action: 'delete',
                targetData: scope.row,
              }"
              type="text"
              size="mini"
              @click="handleDeleteRow(scope.row)"
            >
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination
        class="mt20"
        :current-page.sync="searchForm.page"
        :page-size="searchForm.pageSize"
        :page-sizes="[50, 100]"
        layout="total, sizes, prev, pager, next, jumper"
        :total="pagination.total"
        @current-change="handleCurrentChange"
        @size-change="handleSizeChange"
      ></el-pagination>
    </div>

    <!-- 添加/修改弹窗 -->
    <el-dialog
      :title="dialogTitle"
      :visible.sync="dialogVisible"
      width="75%"
      :close-on-click-modal="false"
    >
      <el-form
        ref="contentEditForm"
        :model="contentEditForm"
        :rules="contentEditFormRules"
        label-width="220px"
        class="content-form"
        :disabled="dialogTitle == '查看成本核定模板'"
      >
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="监审类别:" prop="catalogId">
              <el-cascader
                v-model="contentEditForm.catalogId"
                :options="catalogListOptions"
                v-bind="props"
                style="width: 100%"
              ></el-cascader>
            </el-form-item>
          </el-col>

          <el-col :span="12">
            <el-form-item label="核定模板名称:" prop="surveyTemplateName">
              <el-input
                v-model="contentEditForm.surveyTemplateName"
                placeholder="请输入核定模板名称"
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="" prop="createtemplateid">
              <!-- :disabled="dialogTitle == '修改成本核定模板'" -->
              <template slot="label">
                <el-radio
                  v-model="contentEditForm.createmode"
                  label="1"
                  :disabled="
                    dialogTitle == '查看成本核定模板' ||
                    dialogTitle == '修改成本核定模板' ||
                    contentEditForm.surveyTemplateId != ''
                  "
                  @change="handleCreateModeChange"
                >
                  根据调查表生成：
                </el-radio>
              </template>
              <el-select
                v-model="contentEditForm.createtemplateid"
                placeholder="请选择"
                :disabled="
                  dialogTitle == '查看成本核定模板' ||
                  dialogTitle == '修改成本核定模板' ||
                  contentEditForm.surveyTemplateId != ''
                "
              >
                <el-option
                  v-for="item in surveyFormList"
                  :key="item.id"
                  :label="item.surveyTemplateName"
                  :value="item.surveyTemplateId"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="" prop="">
              <template slot="label">
                <el-radio
                  v-model="contentEditForm.createmode"
                  label="2"
                  :disabled="
                    dialogTitle == '查看成本核定模板' ||
                    dialogTitle == '修改成本核定模板' ||
                    contentEditForm.surveyTemplateId != ''
                  "
                  @change="handleCreateModeChange"
                >
                  根据历史核定模板生成：
                </el-radio>
              </template>
              <el-select
                v-model="contentEditForm.createtemplateid1"
                placeholder="请选择"
                :disabled="
                  dialogTitle == '查看成本核定模板' ||
                  dialogTitle == '修改成本核定模板' ||
                  contentEditForm.surveyTemplateId != ''
                "
              >
                <el-option
                  v-for="item in contentEditFormList"
                  :key="item.id"
                  :label="item.surveyTemplateName"
                  :value="item.surveyTemplateId"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div>
        <div class="mb20">
          <el-button
            v-if="!contentEditForm.surveyTemplateId"
            type="primary"
            class="mr20"
            @click="handleGenerateTemplate"
          >
            生成模版
          </el-button>
        </div>
        <div
          v-if="contentEditForm.surveyTemplateId"
          class="table-edit-container"
        >
          <div class="mb20">
            <el-button
              v-if="dialogTitle != '查看成本核定模板'"
              type="primary"
              @click="handleAddTableHeader('固定表表头')"
            >
              添加表头
            </el-button>
            <el-button
              v-if="dialogTitle != '查看成本核定模板'"
              type="primary"
              @click="handleSaveContent('固定表表头')"
            >
              下一步
            </el-button>
          </div>
          <div class="table-edit-container">
            <el-table
              :data="contentEditForm.fixedTable.tableHeaders"
              border
              style="width: 100%"
            >
              <el-table-column label="序号" width="80" align="center">
                <template slot-scope="scope">
                  <span>{{ scope.$index + 1 }}</span>
                </template>
              </el-table-column>
              <el-table-column
                prop="fieldName"
                label="字段名称"
                min-width="150"
                align="center"
              >
                <template slot-scope="scope">
                  <el-input
                    v-model="scope.row.fieldName"
                    placeholder="请输入字段名称"
                    size="small"
                    :disabled="
                      scope.row.isReadOnly || dialogTitle == '查看成本核定模板'
                    "
                    @change="handleFieldNameChange(scope.row)"
                  ></el-input>
                </template>
              </el-table-column>
              <el-table-column
                prop="fieldType"
                label="字段类型"
                width="120"
                align="center"
              >
                <template slot-scope="scope">
                  <el-select
                    v-model="scope.row.fieldType"
                    placeholder="请选择字段类型"
                    size="small"
                    :disabled="
                      scope.row.isReadOnly || dialogTitle == '查看成本核定模板'
                    "
                    @change="handleFieldTypeChange(scope.row)"
                  >
                    <el-option label="字符串" value="string"></el-option>
                    <el-option label="整数" value="integer"></el-option>
                    <el-option label="小数" value="double"></el-option>
                    <el-option label="日期" value="datetime"></el-option>
                    <el-option label="布尔值" value="boolean"></el-option>
                  </el-select>
                </template>
              </el-table-column>
              <el-table-column
                prop="format"
                label="格式"
                width="220"
                align="center"
              >
                <template slot-scope="scope">
                  <!-- 字符串类型格式 -->
                  <div
                    v-if="scope.row.fieldType === 'string'"
                    class="format-input"
                  >
                    <span class="format-prefix">长度</span>
                    <el-input
                      v-model="scope.row.format"
                      placeholder="请输入长度"
                      size="small"
                      style="width: calc(100% - 80px); margin-left: 5px"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    ></el-input>
                  </div>

                  <!-- 整数类型格式 -->
                  <div
                    v-else-if="scope.row.fieldType === 'integer'"
                    class="format-input"
                  >
                    <span class="format-prefix">整数</span>
                    <el-input
                      v-model="scope.row.fieldTypelen"
                      placeholder="整数位数"
                      size="small"
                      style="width: calc(100% - 80px); margin: 0 5px"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    ></el-input>
                  </div>

                  <!-- 小数类型格式 -->
                  <div
                    v-else-if="scope.row.fieldType === 'double'"
                    class="format-input"
                  >
                    <span class="format-prefix">小数</span>
                    <el-input
                      v-model="scope.row.fieldTypenointlen"
                      placeholder="小数位数"
                      size="small"
                      style="width: calc(100% - 80px); margin-left: 5px"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    ></el-input>
                  </div>
                  <!-- 日期类型格式 -->
                  <div
                    v-else-if="scope.row.fieldType === 'datetime'"
                    class="format-input"
                  >
                    <el-select
                      v-model="scope.row.format"
                      placeholder="请选择日期格式"
                      size="small"
                      style="width: 100%"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    >
                      <el-option
                        label="yyyy-MM-dd HH:mm:ss"
                        value="yyyy-MM-dd HH:mm:ss"
                      ></el-option>
                      <el-option
                        label="yyyy-MM-dd"
                        value="yyyy-MM-dd"
                      ></el-option>
                    </el-select>
                  </div>
                  <!-- 布尔类型格式 -->
                  <div v-else-if="scope.row.fieldType === 'boolean'">
                    <el-select
                      v-model="scope.row.format"
                      placeholder="请选择布尔值格式"
                      size="small"
                      style="width: 100%"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    >
                      <el-option label="true" value="true"></el-option>
                      <el-option label="false" value="false"></el-option>
                    </el-select>
                  </div>
                  <!-- 默认情况 -->
                  <el-input
                    v-else
                    v-model="scope.row.format"
                    :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                    size="small"
                  ></el-input>
                </template>
              </el-table-column>

              <el-table-column
                prop="isRequired"
                label="是否必填"
                width="120"
                align="center"
              >
                <template slot-scope="scope">
                  <el-select
                    v-model="scope.row.isRequired"
                    size="small"
                    :disabled="
                      scope.row.isReadOnly || dialogTitle == '查看成本核定模板'
                    "
                  >
                    <el-option label="是" value="true"></el-option>
                    <el-option label="否" value="false"></el-option>
                  </el-select>
                </template>
              </el-table-column>

              <el-table-column
                prop="showVisible"
                label="是否显示"
                width="120"
                align="center"
              >
                <template slot-scope="scope">
                  <el-select
                    v-model="scope.row.showVisible"
                    size="small"
                    :disabled="
                      scope.row.isReadOnly || dialogTitle == '查看成本核定模板'
                    "
                  >
                    <el-option label="是" value="1"></el-option>
                    <el-option label="否" value="0"></el-option>
                  </el-select>
                </template>
              </el-table-column>

              <el-table-column
                prop="isAuditPeriod"
                label="是否绑定监审期间"
                width="140"
                align="center"
              >
                <template slot-scope="scope">
                  <el-select
                    v-model="scope.row.isAuditPeriod"
                    size="small"
                    :disabled="
                      scope.row.isReadOnly || dialogTitle == '查看成本核定模板'
                    "
                  >
                    <el-option label="是" value="true"></el-option>
                    <el-option label="否" value="false"></el-option>
                  </el-select>
                </template>
              </el-table-column>
              <el-table-column prop="isDict" label="绑定字典" min-width="150">
                <template slot-scope="scope">
                  <div class="bind-dict-column">
                    <el-select
                      v-model="scope.row.isDict"
                      size="small"
                      style="width: 80px"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                      @change="handleBindDictChange(scope.row)"
                    >
                      <el-option label="是" value="true"></el-option>
                      <el-option label="否" value="false"></el-option>
                    </el-select>
                    <el-select
                      v-if="scope.row.isDict === 'true'"
                      v-model="scope.row.dictid"
                      placeholder="请选择字典"
                      class="dict-select"
                      size="small"
                      style="width: 120px; margin-top: 5px"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                    >
                      <el-option
                        v-for="(item, index) in dictTypeList"
                        :key="index"
                        :label="item.name"
                        :value="String(item.id)"
                      ></el-option>
                    </el-select>
                  </div>
                </template>
              </el-table-column>

              <el-table-column
                label="操作"
                width="150"
                fixed="right"
                align="center"
              >
                <template slot-scope="scope">
                  <div class="table-actions">
                    <el-button
                      v-if="dialogTitle != '查看成本核定模板'"
                      type="text"
                      size="mini"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                      @click="
                        handleDeleteHeader(
                          scope.$index,
                          '固定表表头',
                          scope.row
                        )
                      "
                    >
                      删除
                    </el-button>
                    <el-button
                      v-if="
                        scope.$index !== 0 || dialogTitle != '查看成本核定模板'
                      "
                      type="text"
                      size="mini"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                      @click="handleMoveUp(scope.$index)"
                    >
                      上升
                    </el-button>
                    <el-button
                      v-if="
                        scope.$index !==
                          contentEditForm.fixedTable.tableHeaders.length - 1 ||
                        dialogTitle == '查看成本核定模板'
                      "
                      type="text"
                      size="mini"
                      :disabled="
                        scope.row.isReadOnly ||
                        dialogTitle == '查看成本核定模板'
                      "
                      @click="handleMoveDown(scope.$index)"
                    >
                      下降
                    </el-button>
                  </div>
                </template>
              </el-table-column>
            </el-table>
          </div>
          <div>
            <div class="button-group mt20 mb20">
              <el-button
                v-if="dialogTitle != '查看成本核定模板'"
                type="primary"
                @click="handleAddTableHeader('固定表项目')"
              >
                添加项目
              </el-button>
              <el-button
                v-if="dialogTitle != '查看成本核定模板'"
                type="primary"
                @click="handleSaveTemplate"
              >
                保存
              </el-button>
            </div>
            <div class="table-edit-container">
              <el-table
                :data="contentEditForm.fixedTable.fixedTables"
                border
                style="width: 100%"
                row-key="rowid"
                default-expand-all
                :tree-props="{
                  children: 'children',
                  hasChildren: 'hasChildren',
                }"
                @selection-change="handleSelectionChange"
              >
                <el-table-column label="父子节点" align="center" width="100">
                  <template slot-scope="scope">
                    <el-tag
                      v-if="
                        scope.row.isChild ||
                        scope.row.isSubItem ||
                        (scope.row.parentid &&
                          scope.row.parentid != -1 &&
                          scope.row.parentid != '-1')
                      "
                      type="success"
                      size="small"
                    >
                      子项
                    </el-tag>
                    <el-tag
                      v-else-if="
                        scope.row.parentid === -1 ||
                        scope.row.parentid === '-1' ||
                        !scope.row.parentid
                      "
                      type="primary"
                      size="small"
                    >
                      父项
                    </el-tag>
                    <el-tag v-else type="info" size="small">无</el-tag>
                  </template>
                </el-table-column>
                <el-table-column label="序号" width="150" align="center">
                  <template slot-scope="scope">
                    <div
                      class="row-indent-container"
                      :style="getRowIndentStyle(scope.row)"
                    >
                      <el-input
                        :value="
                          scope.row.fixedValues
                            ? scope.row.fixedValues['序号']
                            : ''
                        "
                        size="small"
                        placeholder="数字或中文"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @input="
                          handleFixedValueChange(scope.row, '序号', $event)
                        "
                      ></el-input>
                    </div>
                  </template>
                </el-table-column>

                <el-table-column
                  v-for="(item, index) in contentEditForm.fixedTable
                    .fixedTableHeaders"
                  :key="index"
                  :label="item.rkey"
                  align="center"
                >
                  <template slot-scope="scope">
                    <div class="row-indent-container">
                      <el-input
                        :value="
                          scope.row.fixedValues
                            ? scope.row.fixedValues[item.rkey]
                            : ''
                        "
                        size="small"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @input="
                          handleFixedValueChange(scope.row, item.rkey, $event)
                        "
                      ></el-input>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column label="指标编号" width="100" align="center">
                  <template slot-scope="scope">
                    <div class="row-indent-container">
                      <el-input
                        :value="scope.row.cellCode"
                        size="small"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @input="(val) => $set(scope.row, 'cellCode', val)"
                      ></el-input>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column
                  label="计算公式"
                  width="150"
                  align="center"
                  show-overflow-tooltip
                >
                  <template slot-scope="scope">
                    <div class="row-indent-container">
                      <el-input
                        :value="scope.row.calculationFormula"
                        size="small"
                        readonly
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @click.native="
                          openCalculationFormulaDialogVisible(
                            scope.row,
                            scope.$index
                          )
                        "
                      ></el-input>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column label="单位" width="80" align="center">
                  <template slot-scope="scope">
                    <div class="row-indent-container">
                      <el-input
                        :value="scope.row.unit"
                        size="small"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @input="(val) => $set(scope.row, 'unit', val)"
                      ></el-input>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column
                  label="操作"
                  align="center"
                  fixed="right"
                  width="200"
                >
                  <template slot-scope="scope">
                    <div class="table-actions">
                      <el-button
                        v-if="!scope.row.isChild"
                        type="text"
                        size="mini"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @click="
                          handleAddChildItem(
                            scope.$index,
                            '固定表项目',
                            scope.row
                          )
                        "
                      >
                        添加子项
                      </el-button>
                      <el-button
                        type="text"
                        size="mini"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @click="
                          handleDeleteHeader(
                            scope.$index,
                            '固定表项目',
                            scope.row
                          )
                        "
                      >
                        删除
                      </el-button>
                      <el-button
                        v-if="scope.$index !== 0"
                        type="text"
                        size="mini"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @click="handleMoveUp(scope.$index, '固定表', scope.row)"
                      >
                        上升
                      </el-button>
                      <el-button
                        v-if="
                          scope.$index !==
                          contentEditForm.fixedTable.fixedTables.length - 1
                        "
                        type="text"
                        size="mini"
                        :disabled="dialogTitle == '查看成本核定模板'"
                        @click="handleMoveDown(scope.$index, '固定表')"
                      >
                        下降
                      </el-button>
                    </div>
                  </template>
                </el-table-column>
              </el-table>
            </div>
          </div>
        </div>
      </div>

      <!-- <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="handleSaveTemplate">确 认</el-button>
        <el-button @click="dialogVisible = false">取 消</el-button>
      </div> -->
    </el-dialog>
    <el-dialog
      title="计算公式"
      :visible.sync="calculationFormulaDialogVisible"
      width="500px"
      :before-close="handleDialogClose"
      :close-on-click-modal="false"
    >
      <!-- 单选按钮组：切换“当前指标项”/“其他模板指标项” -->
      <el-radio-group
        v-model="radioType"
        class="mb20"
        @change="handleRadioChange"
      >
        <el-radio label="current">当前指标项</el-radio>
        <el-radio label="other">其他模板指标项</el-radio>
      </el-radio-group>

      <!-- 「当前指标项」内容区域 -->
      <div v-if="radioType === 'current'" class="current-panel">
        <el-input
          v-model="formulaText"
          type="textarea"
          rows="4"
          placeholder="请输入公式（如 C1+C2+C3）"
        />
      </div>

      <!-- 「其他模板指标项」内容区域 -->
      <div v-else class="other-panel">
        <span>模板名称：</span>
        <el-select
          v-model="selectedTemplateId"
          style="width: 80%"
          placeholder="请选择模板"
          @change="handleTemplateChange"
        >
          <el-option
            v-for="(item, index) in templateList"
            :key="index"
            :label="item.surveyTemplateName"
            :value="item.pkVal"
          ></el-option>
        </el-select>

        <!-- 指标表格 -->
        <el-table
          ref="indicatorTable"
          :data="indicatorTableData"
          border
          style="width: 100%; margin-top: 10px"
          class="mb20"
          @row-click="handleRowClick"
        >
          <!-- @selection-change="selectionIndicatorChange" -->
          <el-table-column type="selection" label="选择" width="60">
            <template #default="scope">
              <el-checkbox
                v-model="scope.row.checked"
                @change="handleCheckboxChange(scope.row)"
              ></el-checkbox>
            </template>
          </el-table-column>
          <el-table-column
            prop="cellCode"
            label="指标编号"
            align="center"
          ></el-table-column>
          <!--循环表头 -->
          <el-table-column
            v-for="(item, index) in indicatorTableHeaders"
            :key="index"
            :label="item.rkey"
            align="center"
            show-overflow-tooltip
          >
            <template slot-scope="scope">
              {{
                scope.row.fixedValues ? scope.row.fixedValues[item.rkey] : ''
              }}
            </template>
          </el-table-column>
        </el-table>
        <el-input
          v-model="formulaText"
          type="textarea"
          rows="4"
          placeholder="请输入公式（如 C1+C2+C3）"
          @input="handleFormulaTextChange"
        />
      </div>

      <!-- 弹窗底部按钮 -->
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="handleConfirm">确定</el-button>
        <el-button @click="calculationFormulaDialogVisible = false">
          取消
        </el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
  import {
    getCostFormDataStorageTables,
    deleteCostVerifyForm,
    getActiveCostVerifyFormList,
    getActiveCostVerifyFormListByType,
    generateCostVerifyFormData,
    generateCostVerifyForm,
    addCostVerifyForm,
    getCostFormVersionsByTemplateId,
    batchSaveOrUpdate,
  } from '@/api/costFormManage'
  import {
    getlistBySurveyTemplateId,
    batchDeleteCostVerifyForm,
    getlistBySurveyTemplateIdcurrentversion,
    batchSave,
    enable,
    getListFixedEnabled,
    listByVerifyTemplateId,
  } from '@/api/costVerifyManage'
  import { getCatalogDetail } from '@/api/catalogManage'
  import { listByCurrentTemplateId } from '@/api/catalogManage.js'
  import { catalogMixin, commonMixin } from '@/mixins/useDict'
  import { getDictTypList } from '@/api/dictionaryManage.js'
  export default {
    name: 'SupervisionContent',
    // 使用混入
    mixins: [catalogMixin, commonMixin],
    data() {
      return {
        loading: false,
        searchForm: {
          type: '',
          catalogId: '',
          keyword: '',
          page: 1,
          pageSize: 50,
        },
        props: {
          filterable: true,
          placeholder: '请选择监审类别',
          style: 'width: 100%',
          showAllLevels: false,
          props: {
            multiple: false,
            children: 'children',
            checkStrictly: false,
            label: 'catalogName',
            value: 'id',
            emitPath: false,
          },
        },
        tableData: [],
        selectedRows: [],
        pagination: {
          currentPage: 1,
          pageSize: 50,
          total: 0,
        },
        dialogVisible: false,
        detailDialogVisible: false,
        dialogTitle: '',
        contentEditForm: {
          areaCode: '',
          areaLevel: '',
          catalogId: '',
          contentType: '',
          createBy: '',
          createTime: '',
          createmode: '',
          createtemplateid: '',
          createtemplateid1: '',
          isDelete: '',
          pkVal: '',
          remarks: '',
          status: '',
          storageTable: '',
          surveyTemplateId: '',
          surveyTemplateName: '',
          surveyTemplateNameYw: '',
          templateType: '2',
          type: '',
          updateBy: '',
          updateTime: '',
          versionNo: '',
          // 固定表列表
          fixedTable: {
            tableHeaders: [],
            fixedTables: [],
            fixedTablesTitle: [],
            fixedTableHeaders: [],
          },
        },
        dynamicTable: [],
        contentEditFormRules: {
          catalogId: [
            { required: true, message: '请选择监审类别', trigger: 'change' },
          ],
          surveyTemplateName: [
            { required: true, message: '请输入核定模板名称', trigger: 'blur' },
            {
              min: 1,
              max: 30,
              message: '核定模板名称长度应在1-30个字符之间',
              trigger: 'blur',
            },
          ],
          // createtemplateid: [
          //   { required: true, message: '请选择模板类型', trigger: 'change' },
          // ],
        },
        // 成本核定表模板列表
        contentEditFormList: [],
        // 成本调查表模板列表
        surveyFormList: [],
        CatalogNameMap: {},
        calculationFormulaDialogVisible: false,
        currentEditingRow: null,
        currentEditingRowIndex: -1,
        radioType: 'current',
        formulaText: 'C1+C2+C3',
        templateName: '',
        templateList: [],
        indicatorTableData: [],
        indicatorTableHeaders: [],
        selectedIndicatorsPerTemplate: {},
        selectedIndicatorCodes: [],
        isAutoGeneratedFormula: false,
        dictTypeList: [],
      }
    },
    watch: {
      // 监听目录数据变化，数据加载完成后处理回显
      catalogListOptions: {
        handler(newVal) {
          if (newVal && newVal.length > 0) {
            // 数据加载完成后，重新处理value
            this.batchGetCatalogNames()
          }
        },
        immediate: true,
      },
      indicatorTableData: {
        handler(newVal) {
          if (this.radioType === 'other' && this.selectedTemplateId) {
            this.$set(
              this.selectedIndicatorsPerTemplate,
              this.selectedTemplateId,
              newVal.filter((item) => item.checked)
            )
          }

          this.updateSelectedIndicatorCodes()
        },
        deep: true,
      },

      selectedIndicatorCodes: {
        handler(newVal) {
          if (this.radioType === 'other') {
            const allSelectedTemplateIds = [
              ...new Set([
                this.selectedTemplateId,
                ...Object.keys(this.selectedIndicatorsPerTemplate).filter(
                  (id) =>
                    id !== this.selectedTemplateId &&
                    this.selectedIndicatorsPerTemplate[id].some(
                      (item) => item.checked
                    )
                ),
              ]),
            ].filter((id) => id)

            const isSingleTemplate = allSelectedTemplateIds.length === 1

            if (isSingleTemplate && allSelectedTemplateIds[0]) {
              const selectedTemplate = this.templateList.find(
                (item) => item.pkVal === allSelectedTemplateIds[0]
              )
              const templateNameYw = selectedTemplate
                ? selectedTemplate.surveyTemplateNameYw ||
                  selectedTemplate.surveyTemplateName ||
                  ''
                : ''

              let selectedItems = []
              if (allSelectedTemplateIds[0] === this.selectedTemplateId) {
                selectedItems = newVal
              } else {
                selectedItems = this.selectedIndicatorsPerTemplate[
                  allSelectedTemplateIds[0]
                ]
                  .filter((item) => item.checked)
                  .map(
                    (item) => `${templateNameYw}.${item.code || item.cellCode}`
                  )
              }

              if (selectedItems.length > 0) {
                this.formulaText = selectedItems.join('+')
                this.isAutoGeneratedFormula = true
              } else if (this.isAutoGeneratedFormula) {
                this.formulaText = ''
              }
            } else {
              let allSelectedCodes = []

              if (newVal.length > 0 && this.selectedTemplateId) {
                allSelectedCodes = [...newVal]
              }

              Object.keys(this.selectedIndicatorsPerTemplate).forEach(
                (templateId) => {
                  if (templateId !== this.selectedTemplateId) {
                    const items = this.selectedIndicatorsPerTemplate[templateId]
                    const selectedTemplate = this.templateList.find(
                      (item) => item.pkVal === templateId
                    )
                    const templateName = selectedTemplate
                      ? selectedTemplate.surveyTemplateNameYw ||
                        selectedTemplate.surveyTemplateName ||
                        ''
                      : ''

                    items
                      .filter((item) => item.checked)
                      .forEach((item) => {
                        allSelectedCodes.push(
                          `${templateName}.${item.code || item.cellCode}`
                        )
                      })
                  }
                }
              )

              if (allSelectedCodes.length > 0) {
                this.formulaText = allSelectedCodes.join('+')
                this.isAutoGeneratedFormula = true
              } else if (this.isAutoGeneratedFormula) {
                this.formulaText = ''
              }
            }
          } else if (newVal.length > 0 && this.radioType === 'current') {
            if (
              !this.formulaText ||
              this.formulaText === 'C1+C2+C3' ||
              this.isAutoGeneratedFormula
            ) {
              this.formulaText = newVal.join('+')
              this.isAutoGeneratedFormula = true
            }
          } else if (newVal.length === 0 && this.radioType === 'current') {
            if (this.isAutoGeneratedFormula) {
              this.formulaText = ''
            }
          }
        },
        deep: true,
      },
    },

    mounted() {
      this.handleSearch()
      this.loadDictTypeList()
    },
    methods: {
      async loadDictTypeList() {
        try {
          const res = await getDictTypList()
          this.dictTypeList = res || []
        } catch (error) {
          console.error('加载字典类型失败:', error)
        }
      },
      // 获取监审类别名称
      batchGetCatalogNames() {
        // 递归查找名称
        this.CatalogNameMap = {}
        this._recursiveCatalogMap(this.catalogListOptions)
      },

      // 递归遍历目录树并构建ID到名称的映射
      _recursiveCatalogMap(catalogs) {
        if (!Array.isArray(catalogs) || catalogs.length === 0) {
          return
        }
        catalogs.forEach((item) => {
          // 为当前目录项添加映射
          this.CatalogNameMap[item.id] = item.catalogName
          // 递归处理子目录
          if (item.children && Array.isArray(item.children)) {
            this._recursiveCatalogMap(item.children)
          }
        })
      },
      // 获取所有状态为启用的成本核定表模板数据
      getActiveCostVerifyFormList() {
        getActiveCostVerifyFormList().then((res) => {
          if (res.code === 200) {
            this.contentEditFormList = res.value
          }
        })
      },
      // 获取所有模板类型为固定表的所有启用成本调查表数据
      getActiveCostVerifyFormListByType() {
        getActiveCostVerifyFormListByType().then((res) => {
          if (res.code === 200) {
            this.surveyFormList = res.value
          }
        })
      },
      getCatalogNames(row) {
        if (!row.catalogId) return ''
        return row.catalogId
          .split(',')
          .map((id) => {
            const trimId = id.trim()
            return this.CatalogNameMap[trimId] || '未知名称'
          })
          .join('，')
      },
      // 删除成本核定表模板
      handleDeleteRow(row) {
        this.$confirm('确定删除该成本核定表模板吗？', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning',
        }).then(() => {
          deleteCostVerifyForm(row.pkVal).then((res) => {
            if (res.code === 200) {
              this.$message({
                type: 'success',
                message: '删除成功',
              })
              this.handleSearch()
            } else {
              this.$message({
                type: 'error',
                message: res.msg || '删除失败',
              })
            }
          })
        })
      },
      // 状态转换
      handleStatusChange(row) {
        enable({
          id: row.surveyTemplateId,
        }).then((res) => {
          if (res.code === 200) {
            this.$message.success(`${res.message}`)
            this.handleSearch()
          }
        })
      },
      // 搜索
      handleSearch() {
        this.loading = true
        getCostFormDataStorageTables(this.searchForm).then((res) => {
          this.loading = false
          if (res.rows.length > 0) {
            this.tableData = res.rows || []
            this.pagination.total = res.total || 0
          }
        })
      },

      // 重置
      handleReset() {
        this.searchForm = {
          catalogId: '',
          keyword: '',
          page: 1,
          pageSize: 50,
        }
        this.handleSearch()
      },

      // 添加
      handleAdd() {
        this.dialogTitle = '添加成本核定模板'
        this.contentEditForm = {
          areaCode: '',
          areaLevel: '',
          catalogId: '',
          contentType: '',
          createBy: '',
          createTime: '',
          createmode: '1',
          createtemplateid: '',
          createtemplateid1: '',
          isDelete: '',
          pkVal: '',
          remarks: '',
          status: '',
          storageTable: '',
          surveyTemplateId: '',
          surveyTemplateName: '',
          surveyTemplateNameYw: '',
          templateType: '2',
          type: '',
          updateBy: '',
          updateTime: '',
          versionNo: '',
          // 固定表列表
          fixedTable: {
            tableHeaders: [],
            fixedTables: [],
            fixedTablesTitle: [],
          },
        }
        // 成本核定表模板列表
        this.getActiveCostVerifyFormList()
        // 成本调查表模板列表
        this.getActiveCostVerifyFormListByType()
        this.dialogVisible = true
        // 清除表单校验
        this.$nextTick(() => {
          if (this.$refs.contentEditForm) {
            this.$refs.contentEditForm.clearValidate()
          }
        })
        console.log('this.contentEditForm', this.contentEditForm)
      },

      // 修改
      handleEdit(row) {
        this.dialogTitle = '修改成本核定模板'
        this.contentEditForm = {
          ...row,
          // 固定表列表
          fixedTable: {
            tableHeaders: [],
            fixedTables: [],
            fixedTablesTitle: [],
          },
        }
        if (row.createmode == '1') {
          this.contentEditFormcreatetemplateid = row.createtemplateid || ''
          this.contentEditForm.createtemplateid1 = ''
        } else if (row.createmode == '2') {
          this.contentEditForm.createtemplateid1 = row.createtemplateid || ''
          this.contentEditForm.createtemplateid = ''
        }
        // 成本核定表模板列表
        this.getActiveCostVerifyFormList()
        // 成本调查表模板列表
        this.getActiveCostVerifyFormListByType()
        this.loadTemplateDataForEdit(this.contentEditForm.surveyTemplateId)
        this.dialogVisible = true
      },

      // 查看详情
      handleViewDetail(row) {
        this.dialogTitle = '查看成本核定模板'
        this.contentEditForm = {
          ...row,
          // 固定表列表
          fixedTable: {
            tableHeaders: [],
            fixedTables: [],
            fixedTablesTitle: [],
          },
        }
        if (row.createmode == '1') {
          this.contentEditFormcreatetemplateid = row.createtemplateid || ''
          this.contentEditFormcreatetemplateid1 = ''
        } else if (row.createmode == '2') {
          this.contentEditForm.createtemplateid1 = row.createtemplateid1 || ''
          this.contentEditFormcreatetemplateid = ''
        }
        // 成本核定表模板列表
        this.getActiveCostVerifyFormList()
        // 成本调查表模板列表
        this.getActiveCostVerifyFormListByType()
        this.loadTemplateDataForEdit(this.contentEditForm.surveyTemplateId)
        this.dialogVisible = true
      },

      // 生成模板
      handleGenerateTemplate() {
        // 提示生成后不能修改
        this.$confirm(
          '生成后不能修改根据调查表生成还是根据历史核定模板生成，确定生成模板吗？',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning',
          }
        ).then(() => {
          // 校验表单
          this.$refs['contentEditForm'].validate((valid) => {
            if (valid) {
              if (this.contentEditForm.createmode == '1') {
                if (!this.contentEditForm.createtemplateid) {
                  this.$message.error('请选择成本调查表模板')
                  return
                }
                this.generateFromSurveyTemplate()
              } else if (this.contentEditForm.createmode == '2') {
                if (!this.contentEditForm.createtemplateid1) {
                  this.$message.error('请选择历史核定模板')
                  return
                }
                this.generateFromHistoryTemplate()
              }
            } else {
              this.$message.error('请填写表单数据')
              return
            }
          })
        })
      },
      async loadTemplateDataForEdit(surveyTemplateId) {
        // 并行获取表头和表格数据
        const [tableHeadersRes, tableDataRes] = await Promise.all([
          getlistBySurveyTemplateId({
            surveyTemplateId,
          }),
          getCostFormVersionsByTemplateId({
            surveyTemplateId,
          }),
        ])
        // 处理表头数据
        if (tableHeadersRes.code == 200) {
          this.contentEditForm.fixedTable.tableHeaders = Array.isArray(
            tableHeadersRes.value
          )
            ? tableHeadersRes.value
            : []
          // 表头按照orderNum重新排序
          this.contentEditForm.fixedTable.tableHeaders.sort(
            (a, b) => a.orderNum - b.orderNum
          )

          // 检查是否有fieldName为"序号"的数据
          const hasSerialNumber =
            this.contentEditForm.fixedTable.tableHeaders.some(
              (header) => header.fieldName === '序号'
            )

          // 如果没有序号数据，则添加一条默认的序号数据，并标记为不可编辑
          if (!hasSerialNumber) {
            this.contentEditForm.fixedTable.tableHeaders.unshift({
              fieldName: '序号',
              fieldType: 'string',
              format: '30',
              fieldTypelen: '',
              fieldTypenointlen: '',
              isRequired: 'false',
              showVisible: '1',
              isAuditPeriod: 'false',
              tabtype: '2',
              surveyTemplateId: this.contentEditForm.surveyTemplateId,
              versionId: this.versionId,
              isFixed: '1',
              isReadOnly: true, // 标记为不可编辑
              orderNum: 1,
            })
          } else {
            this.contentEditForm.fixedTable.tableHeaders.forEach((item) => {
              if (item.fieldName === '序号') {
                item.isReadOnly = true // 确保序号字段不可编辑
              }
            })
          }
        }
        // 处理表格数据
        if (tableDataRes.code == 200) {
          this.parseAndDisplayFixedTableData(tableDataRes)
        }
      },
      // 根据调查表生成模板
      async generateFromSurveyTemplate() {
        try {
          // 显示加载状态
          this.loading = true

          // 保存模板基本信息
          let data = await generateCostVerifyForm({
            catalogId: this.contentEditForm.catalogId,
            templatename: this.contentEditForm.surveyTemplateName,
            templateId: this.contentEditForm.createtemplateid,
          })
          this.contentEditForm.surveyTemplateId = data.value
            ? data.value.surveyTemplateId
            : ''
          this.loadTemplateDataForEdit(this.contentEditForm.surveyTemplateId)
          // // 并行获取表头和表格数据
          // const [tableHeadersRes, tableDataRes] = await Promise.all([
          //   getlistBySurveyTemplateIdcurrentversion({
          //     surveyTemplateId: this.contentEditForm.createtemplateid,
          //   }),
          //   listByCurrentTemplateId({
          //     surveyTemplateId: this.contentEditForm.createtemplateid,
          //   }),
          // ])

          // // 处理表头数据
          // if (tableHeadersRes.code == 200) {
          //   this.contentEditForm.fixedTable.tableHeaders = Array.isArray(
          //     tableHeadersRes.value
          //   )
          //     ? tableHeadersRes.value
          //     : []
          // }

          // // 处理表格数据
          // if (tableDataRes.code == 200) {
          //   const fieldNamesString =
          //     this.contentEditForm.fixedTable.tableHeaders
          //       .map((header) => header.fieldName)
          //       .join(', ')
          //   this.contentEditForm.fixedTable.fixedTablesTitle = fieldNamesString
          //   this.parseAndDisplayFixedTableData(tableDataRes)
          //   // this.$message.success('生成模板成功')
          // }
        } catch (error) {
          console.error('生成模板失败：', error)
        } finally {
          this.loading = false
        }
      },

      // 根据历史核定模板生成
      async generateFromHistoryTemplate() {
        // 保存模板基本信息
        let data = await generateCostVerifyFormData({
          catalogId: this.contentEditForm.catalogId,
          templatename: this.contentEditForm.surveyTemplateName,
          templateId: this.contentEditForm.createtemplateid1,
        })
        this.contentEditForm.surveyTemplateId = data.value
          ? data.value.surveyTemplateId
          : ''
        this.loadTemplateDataForEdit(this.contentEditForm.surveyTemplateId)
      },
      // 添加表头
      handleAddTableHeader(type) {
        switch (type) {
          case '固定表表头':
            this.contentEditForm.fixedTable.tableHeaders.push({
              fieldName: '',
              fieldType: 'string',
              format: '255',
              fieldTypelen: '',
              fieldTypenointlen: '',
              isRequired: 'false',
              showVisible: '1',
              isAuditPeriod: 'false',
              tabtype: '2',
              surveyTemplateId: this.contentEditForm.surveyTemplateId,
              versionId: this.versionId,
              orderNum: this.contentEditForm.fixedTable.tableHeaders.length + 1,
            })

            break
          case '固定表项目':
            let maxFixedOrderNum = 0
            if (this.contentEditForm.fixedTable.fixedTables.length > 0) {
              maxFixedOrderNum = Math.max(
                ...this.contentEditForm.fixedTable.fixedTables.map(
                  (item) => item.orderNum || 0
                )
              )
            }

            const newRow = {
              orderText: maxFixedOrderNum + 1,
              orderNum: maxFixedOrderNum + 1,
              cellCode: '',
              calculationFormula: '',
              unit: '',
              tabtype: this.contentEditForm.templateType,
              surveyTemplateId: this.contentEditForm.surveyTemplateId,
              versionId: this.versionId,
              fixedValues: {},
              parentid: -1,
              rowid: this.generateUUID(),
            }

            this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
              (title) => {
                newRow.fixedValues[title.rkey] = ''
              }
            )

            this.contentEditForm.fixedTable.fixedTables.push(newRow)
            break
          default:
            break
        }
      },
      // 字段名称改变
      handleFieldNameChange(row) {
        console.log(row)
        if (row.fieldName) {
          // 检查是否已存在相同的fieldName
          const existsInTableHeaders =
            this.contentEditForm.fixedTable.tableHeaders.some(
              (item) => item.fieldName === row.fieldName
            )
          // 跳过"序号"列
          if (row.fieldName !== '序号' && !existsInTableHeaders) {
            // 更新tableHeaders数组，这是关键的数据源
            this.contentEditForm.fixedTable.tableHeaders.push({
              fieldName: row.fieldName,
              fieldType: 'string',
              format: '255',
              fieldTypelen: '',
              fieldTypenointlen: '',
              isRequired: 'false',
              showVisible: '1',
              isAuditPeriod: 'false',
              tabtype: '2',
              surveyTemplateId: this.contentEditForm.surveyTemplateId,
              versionId: this.versionId || null,
              orderNum: this.contentEditForm.fixedTable.tableHeaders.length + 1,
              id: null,
            })

            // 同时更新fixedTablesTitle（这是源头数据）
            const newTitle = {
              rkey: row.fieldName,
              rvalue: '',
            }
            this.contentEditForm.fixedTable.fixedTablesTitle.push(newTitle)

            // 同时更新fixedTableHeaders
            this.contentEditForm.fixedTable.fixedTableHeaders.push(newTitle)

            // 为现有表格数据行添加对应的fixedValues属性
            if (
              this.contentEditForm.fixedTable.fixedTables &&
              this.contentEditForm.fixedTable.fixedTables.length > 0
            ) {
              this.contentEditForm.fixedTable.fixedTables.forEach(
                (tableRow) => {
                  // 确保fixedValues对象存在
                  if (!tableRow.fixedValues) {
                    tableRow.fixedValues = {}
                  }
                  // 为新字段设置默认值为空字符串
                  tableRow.fixedValues[row.fieldName] = ''
                }
              )
            }
          }
        }
      },
      // 保存内容
      handleSaveContent(type) {
        try {
          if (type === '固定表表头') {
            var data = {
              headersList: this.contentEditForm.fixedTable.tableHeaders,
            }
            batchSaveOrUpdate(data)
              .then((res) => {
                if (res.code === 200) {
                  // 如果后端返回了保存后的数据，更新本地数据
                  if (res.value && Array.isArray(res.value)) {
                    this.contentEditForm.fixedTable.tableHeaders =
                      res.value.map((item) => ({
                        ...item,
                      }))
                  }
                  this.loadTemplateDataForEdit(
                    this.contentEditForm.surveyTemplateId
                  )
                  this.contentEditForm.fixedTable.fixedTables.forEach((row) => {
                    this.initFixedTableRow(row)
                  })
                }
              })
              .catch((error) => {
                console.error('保存接口异常:', error)
              })
              .finally(() => {
                this.loading = false
              })
          }
        } catch (error) {
          console.error('保存处理异常:', error)
        }
      },
      initFixedTableRow(row) {
        if (row.cellCode === undefined) {
          this.$set(row, 'cellCode', '')
        }
        if (row.calculationFormula === undefined) {
          this.$set(row, 'calculationFormula', '')
        }
        if (row.unit === undefined) {
          this.$set(row, 'unit', '')
        }
        if (!row.fixedValues) {
          this.$set(row, 'fixedValues', {})
        }
        // 初始化children数组，支持树形结构
        if (!row.children) {
          this.$set(row, 'children', [])
        }
        this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
          (title, index) => {
            if (!(title.rkey in row.fixedValues)) {
              this.$set(row.fixedValues, title.rkey, '')
            }
          }
        )

        return row
      },

      // 删除表头
      handleDeleteHeader(index, type, row) {
        // 提取重复的删除逻辑为内部函数
        const handleDelete = () => {
          const data = {
            deleteheadersList: [row],
          }
          batchSaveOrUpdate(data)
            .then((res) => {
              if (res.code === 200) {
                this.$message.success('删除成功')
              }
            })
            .catch((error) => {
              console.error('删除接口异常:', error)
            })
            .finally(() => {})
        }
        switch (type) {
          case '固定表表头':
            if (this.contentEditForm.fixedTable.tableHeaders.length <= 1) {
              this.$message.warning('至少保留一个表头')
              return
            }
            this.contentEditForm.fixedTable.tableHeaders.splice(index, 1)
            handleDelete()
            break

          case '固定表项目':
            if (this.contentEditForm.fixedTable.fixedTables.length <= 1) {
              this.$message.warning('至少保留一个项目')
              return
            }
            this.contentEditForm.fixedTable.fixedTables.splice(index, 1)
            handleDelete() // 执行删除逻辑
            break
          default:
            break
        }
      },
      /**
       * 处理固定表项目字段值变化
       */
      handleFixedValueChange(row, rkey, value) {
        if (!row.fixedValues) {
          this.$set(row, 'fixedValues', {})
        }
        this.$set(row.fixedValues, rkey, value)
      },
      // 上升
      handleMoveUp(index, tableType, row) {
        if (tableType === '固定表') {
          const fixedTableData = this.contentEditForm.fixedTable.fixedTables
          const newFixedTableData = [...fixedTableData]
          this.swamTableArr(newFixedTableData, row, true)
          this.contentEditForm.fixedTable.fixedTables = newFixedTableData
        } else {
          // const tableHeaders = this.contentEditForm.fixedTable.tableHeaders
          // const newTableHeaders = [...tableHeaders]
          // this.swamTableArr(newTableHeaders, row, true, true)
          // this.contentEditForm.tableHeaders = newTableHeaders
          if (index > 0) {
            const temp = this.contentEditForm.fixedTable.tableHeaders[index]
            this.contentEditForm.fixedTable.tableHeaders.splice(index, 1)
            this.contentEditForm.fixedTable.tableHeaders.splice(
              index - 1,
              0,
              temp
            )
            // 更新表头的序号
            this.updateTableHeadersOrderNumbers()
          }
        }
      },
      // 下降
      handleMoveDown(index, tableType, row) {
        if (tableType === '固定表') {
          const fixedTableData = this.contentEditForm.fixedTable.fixedTables
          const newFixedTableData = [...fixedTableData]
          this.swamTableArr(newFixedTableData, row, false)
          this.contentEditForm.fixedTable.fixedTables = newFixedTableData
        } else {
          // const tableHeaders = this.contentEditForm.tableHeaders
          // const newTableHeaders = [...tableHeaders]
          // this.swamTableArr(newTableHeaders, row, false)
          // this.contentEditForm.tableHeaders = newTableHeaders
          if (index < this.contentEditForm.fixedTable.tableHeaders.length - 1) {
            const temp = this.contentEditForm.fixedTable.tableHeaders[index]
            this.contentEditForm.fixedTable.tableHeaders.splice(index, 1)
            this.contentEditForm.fixedTable.tableHeaders.splice(
              index + 1,
              0,
              temp
            )
            // 更新表头的序号
            this.updateTableHeadersOrderNumbers()
          }
        }
      },
      swamTableArr(arr, row, asc, isHeader) {
        const isChild = row.isChild || row.isSubItem || false
        if (isChild) {
          // 子节点处理逻辑后续实现 parentid rowid
          let child = arr.find((item) => item.rowid === row.parentid)
          // const rowIndex = arr.indexOf(row);
          // newFixedTableData[rowIndex]
          this.doSwamTableArr(child.children, row, asc, isHeader)
        } else {
          // 创建数组副本以确保Vue能检测到变化
          // 直接替换整个数组，确保Vue能检测到变化
          this.doSwamTableArr(arr, row, asc, isHeader)
        }
      },

      doSwamTableArr(arr, row, asc, isHeader) {
        const rowIndex = arr.indexOf(row)
        let swamIndex = 0
        if (asc) {
          // 正序
          if (rowIndex < 1) {
            return
          }
          swamIndex = rowIndex - 1
        } else {
          // 倒序
          if (rowIndex >= arr.length - 1) {
            return
          }
          swamIndex = rowIndex + 1
        }

        const curr = arr[rowIndex]
        const swam = arr[swamIndex]

        // 交换orderNum
        const tempOrderNum = curr.orderNum
        curr.orderNum = swam.orderNum
        swam.orderNum = tempOrderNum
        // row.isChild &&
        if (!isHeader) {
          // 获取当前项的序号值
          let currIndex = curr.fixedValues
            ? curr.fixedValues['序号']
            : curr.dynamicValues['序号']
          // 获取交换项的序号值
          let swamIndex = swam.fixedValues
            ? swam.fixedValues['序号']
            : swam.dynamicValues['序号']
          // 先保存交换项的值，再进行赋值，避免值被覆盖
          if (curr.fixedValues) {
            curr.fixedValues['序号'] = swamIndex
          } else {
            curr.dynamicValues['序号'] = swamIndex
          }
          if (swam.fixedValues) {
            swam.fixedValues['序号'] = currIndex
          } else {
            swam.dynamicValues['序号'] = currIndex
          }
        }

        // 交换数组中的位置
        arr[rowIndex] = swam
        arr[swamIndex] = curr
      },
      // 更新表头序号
      updateTableHeadersOrderNumbers() {
        // 更新固定表的表头序号
        if (
          this.contentEditForm.fixedTable &&
          this.contentEditForm.fixedTable.tableHeaders
        ) {
          this.contentEditForm.fixedTable.tableHeaders.forEach(
            (header, index) => {
              header.orderNum = index + 1
            }
          )
        }
      },

      // 添加子项方法
      handleAddChildItem(index, type, parentRow) {
        if (!parentRow.rowid) {
          this.$set(parentRow, 'rowid', this.generateUUID())
        }

        switch (type) {
          case '固定表项目':
            let parentIndex1 =
              this.contentEditForm.fixedTable.fixedTables.findIndex(
                (item) => item.rowid == parentRow.rowid
              )
            if (
              !this.contentEditForm.fixedTable.fixedTables[parentIndex1]
                .children
            ) {
              this.$set(
                this.contentEditForm.fixedTable.fixedTables[parentIndex1],
                'children',
                []
              )
            }

            let childOrderNum =
              this.contentEditForm.fixedTable.fixedTables[parentIndex1].children
                .length + 1

            let fixedValues = {
              ...parentRow.fixedValues,
            }

            for (const key in fixedValues) {
              if (key == '序号') {
                fixedValues[key] = childOrderNum
              } else {
                fixedValues[key] = ''
              }
            }

            const fixedNewRow = {
              orderText: this.contentEditForm.fixedTable.fixedTables.length + 1,
              orderNum: this.contentEditForm.fixedTable.fixedTables.length + 1,
              cellCode: '',
              calculationFormula: '',
              unit: '',
              tabtype: this.contentEditForm.templateType,
              surveyTemplateId: this.contentEditForm.surveyTemplateId,
              versionId: this.versionId,
              fixedValues: fixedValues,
              parentid: parentRow.rowid,
              isChild: true,
              isSubItem: true,
              rowid: this.generateUUID(),
            }

            this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
              (title) => {
                if (!(title.rkey in fixedNewRow.fixedValues)) {
                  fixedNewRow.fixedValues[title.rkey] = ''
                }
              }
            )
            this.contentEditForm.fixedTable.fixedTables[
              parentIndex1
            ].children.push(fixedNewRow)

            // this.contentEditForm.fixedTable.fixedTables.splice(
            //   index + 1,
            //   0,
            //   fixedNewRow
            // )
            break
        }
        this.$nextTick(() => {
          const tableBody = document.querySelector('.el-table__body-wrapper')
          if (tableBody) {
            tableBody.scrollTop = tableBody.scrollHeight
          }
        })
      },
      handleCreateModeChange() {
        if (this.contentEditForm.createmode == 1) {
          this.contentEditForm.createtemplateid1 = ''
        } else if (this.contentEditForm.createmode == 2) {
          this.contentEditForm.createtemplateid = ''
        }
      },
      openCalculationFormulaDialogVisible(row, index) {
        this.currentEditingRow = row
        this.currentEditingRowIndex = index
        this.calculationFormulaDialogVisible = true
        this.formulaText = row.calculationFormula || ''
        this.selectedTemplateId = '' // 重置选中的模板
        this.indicatorTableData = [] // 清空指标数据
        this.getListFixedEnabled()
      },
      getListFixedEnabled() {
        getListFixedEnabled({
          surveyTemplateId: this.contentEditForm.surveyTemplateId,
        }).then((res) => {
          this.templateList = res.value
        })
      },
      // 处理模板选择变化
      handleTemplateChange(templateId) {
        if (templateId) {
          // 根据选中的模板ID查找对应的surveyTemplateId
          const selectedTemplate = this.templateList.find(
            (item) => item.pkVal === templateId
          )

          if (selectedTemplate && selectedTemplate.surveyTemplateId) {
            this.getCellCodesByTemplateId(selectedTemplate.surveyTemplateId)
          } else {
            this.indicatorTableData = []
          }
        } else {
          this.indicatorTableData = []
        }

        // 恢复该模板之前选中的指标项
        this.$nextTick(() => {
          if (this.selectedIndicatorsPerTemplate[templateId]) {
            this.indicatorTableData.forEach((item) => {
              const isSelected = this.selectedIndicatorsPerTemplate[
                templateId
              ].some((selectedItem) => selectedItem.code === item.code)
              this.$set(item, 'checked', isSelected)

              if (isSelected) {
                this.formatRowCode(item)
              }
            })
          }

          // 更新选中的指标代码列表
          this.updateSelectedIndicatorCodes()
        })
      },
      getCellCodesByTemplateId(surveyTemplateId) {
        listByVerifyTemplateId({
          surveyTemplateId: surveyTemplateId,
        })
          .then((res) => {
            // 将返回的数据转换为表格需要的格式
            if (res.value && Array.isArray(res.value.itemlist)) {
              let fixedTablesTitle = this.stringToObjects(
                res.value.fixedFields || ''
              )
              this.indicatorTableHeaders = fixedTablesTitle
              this.indicatorTableData = res.value.itemlist.map((item) => ({
                ...item,
                checked: false,
                cellCode: item.cellCode || '',
                name: res.value.fixedFields.split(',')[0] || '',
                formattedCode: '', // 添加格式化代码字段
              }))
            } else {
              this.indicatorTableData = []
            }
          })
          .catch((error) => {
            console.error('获取指标数据失败:', error)
            this.indicatorTableData = []
          })
      },
      updateSelectedIndicatorCodes() {
        // 获取当前选中的行
        const selectedRows = this.indicatorTableData.filter(
          (item) => item.checked
        )

        // 更新选中的指标代码列表
        this.selectedIndicatorCodes = selectedRows.map((item) => {
          // 获取选中的模板信息
          const selectedTemplate = this.templateList.find(
            (template) => template.pkVal === this.selectedTemplateId
          )

          // 获取模板的 surveyTemplateNameYw
          const templateName = selectedTemplate
            ? selectedTemplate.surveyTemplateNameYw ||
              selectedTemplate.surveyTemplateName ||
              ''
            : ''

          return templateName
            ? `${templateName}.${item.code || item.cellCode || ''}`
            : item.code || item.cellCode || ''
        })
      },
      formatRowCode(row) {
        const selectedTemplate = this.templateList.find(
          (item) => item.pkVal === this.selectedTemplateId
        )

        const surveyTemplateNameYw = selectedTemplate
          ? selectedTemplate.surveyTemplateNameYw ||
            selectedTemplate.surveyTemplateName ||
            ''
          : ''

        const formattedCode = surveyTemplateNameYw
          ? `${surveyTemplateNameYw}.${row.code || row.cellCode || ''}`
          : row.code || row.cellCode || ''

        this.$set(row, 'formattedCode', formattedCode)

        const templateCode = surveyTemplateNameYw
          ? `${surveyTemplateNameYw}_${row.code || row.cellCode || ''}`
          : row.code || row.cellCode || ''

        this.$set(
          row,
          'jsonStr',
          JSON.stringify([
            {
              [templateCode]: this.selectedTemplateId,
            },
          ])
        )
      },
      handleRowClick(row, column, event) {
        // 只有点击非 checkbox 列才触发
        if (column && column.property !== 'checked') {
          // 如果没有 cellCode，则不允许选中
          if (!row.cellCode) {
            // this.$message.warning('该数据没有指标编号，无法选择')
            return
          }

          // 切换选中状态
          this.toggleRowSelection(row)
        }
      },
      toggleRowSelection(row) {
        // 切换选中状态
        this.$set(row, 'checked', !row.checked)

        // 格式化代码并存储在行数据中
        if (row.checked) {
          this.formatRowCode(row)
        }

        // 触发选中状态更新
        this.$forceUpdate()
      },
      selectionIndicatorChange(val) {
        this.indicatorTableData.forEach((item) => {
          item.checked = val.includes(item)
        })
      },
      handleCheckboxChange(row) {
        // 如果没有 cellCode，则不允许选中
        if (!row.cellCode) {
          this.$message.warning('该数据没有指标编号，无法选择')
          this.$set(row, 'checked', false)
          return
        }
        this.$set(row, 'checked', !row.checked)

        if (row.checked) {
          this.formatRowCode(row)
        }

        this.updateSelectedIndicatorCodes()

        this.$forceUpdate()
      },
      handleFormulaTextChange(value) {
        // 当用户手动修改公式文本时，标记为非自动生成
        this.isAutoGeneratedFormula = false
      },
      handleDialogClose(done) {
        this.selectedIndicatorsPerTemplate = {}
        done()
      },
      handleRadioChange(value) {
        this.formulaText = ''
      },
      handleConfirm() {
        const result = {
          type: this.radioType,
          formula: this.formulaText,
          selectedTemplate: this.selectedTemplateId,
          selectedItems: this.indicatorTableData.filter((item) => item.checked),
        }
        let _data = []
        if (this.radioType == 'current') {
          // 使用递归函数扁平化树形结构
          const flattenTree = (nodes) => {
            let result = []
            nodes.forEach((node) => {
              result.push(node)
              if (node.children && node.children.length > 0) {
                result = result.concat(flattenTree(node.children))
              }
            })
            return result
          }

          // 扁平化数据并提取cellCode
          _data = flattenTree(this.contentEditForm.fixedTable.fixedTables)
            .filter((item) => item.cellCode)
            .map((item) => item.cellCode)
        } else if (this.radioType == 'other') {
          if (!result.selectedTemplate) {
            this.$message.error('请选择指标编号')
            return
          }
          _data = this.indicatorTableData
            .filter((item) => item.cellCode)
            .map((item) => item.cellCode)
        }
        if (!this.validateFormula(this.formulaText, _data).valid) {
          this.$message.error(
            this.validateFormula(this.formulaText, _data).errorMsg
          )
          return
        }

        // 生成 jsonstr 字段
        const jsonStrArray = this.indicatorTableData
          .filter((item) => item.checked)
          .map((item) => {
            if (item.jsonStr) {
              try {
                return JSON.parse(item.jsonStr)[0]
              } catch (e) {
                console.error('解析 jsonStr 失败:', e)
                return {}
              }
            }
            return {}
          })
          .filter((item) => Object.keys(item).length > 0)

        const jsonstr = JSON.stringify(jsonStrArray)

        // 更新当前编辑行的计算公式值
        if (this.currentEditingRow) {
          this.$set(
            this.currentEditingRow,
            'calculationFormula',
            this.formulaText
          )

          this.$set(this.currentEditingRow, 'jsonstr', jsonstr)
        }

        console.log('点击了确定，获取到的数据：', {
          ...result,
          jsonstr: jsonstr,
        })

        // 清空当前操作的状态
        this.calculationFormulaDialogVisible = false
        this.currentEditingRow = null
        this.currentEditingRowIndex = -1
        this.isAutoGeneratedFormula = false
        this.selectedTemplateId = ''
        this.indicatorTableData = []
        this.selectedIndicatorsPerTemplate = {} // 清空模板选中记录
      },
      /**
       * 解析并回显固定表项目数据
       * @param {Object} responseData - listByCurrentTemplateId接口返回的数据
       */
      parseAndDisplayFixedTableData(responseData) {
        if (responseData.value.fixedFields) {
          this.contentEditForm.fixedTable.fixedTablesTitle =
            this.stringToObjects(responseData.value.fixedFields || '')
        } else {
          let fixedFields = this.contentEditForm.fixedTable.tableHeaders
            .map((item) => item.fieldName)
            .join(',')
          this.contentEditForm.fixedTable.fixedTablesTitle =
            this.stringToObjects(fixedFields || '')
        }
        const fixedTitles = this.contentEditForm.fixedTable.fixedTablesTitle
        this.contentEditForm.fixedTable.fixedTableHeaders = fixedTitles.filter(
          (title) => title.rkey !== '序号'
        )
        if (
          !responseData ||
          !responseData.value ||
          !responseData.value.itemlist
        ) {
          return
        }

        const itemList = responseData.value.itemlist
        const allRows = []
        const rowMap = new Map()

        // 清空现有数据
        this.contentEditForm.fixedTable.fixedTables = []

        // 遍历itemList，为每个项目创建一行数据
        itemList.forEach((item, index) => {
          // 判断是否为子项（parentid不为-1且不为"-1"）
          const isSubItem =
            item.parentid && item.parentid !== -1 && item.parentid !== '-1'

          const newRow = {
            orderText: item.orderNum || '', // 显示用序号
            orderNum: item.orderNum || '', // 保留原始序号用于发送后端
            surveyTemplateId: item.surveyTemplateId,
            versionId: item.versionId,
            cellCode: item.cellCode || '',
            calculationFormula: item.calculationFormula || '',
            unit: item.unit || '',
            fixedValues: {},
            itemId: item.id || null,
            parentid: item.parentid || -1,
            isChild: isSubItem,
            isSubItem: isSubItem,
            rowid: item.rowid || this.generateUUID(),
            jsonstr: item.jsonstr || null,
            children: [], // 添加children数组用于树形结构
          }

          // 确保orderNum是数字类型
          if (item.orderNum) {
            newRow.orderNum = parseInt(item.orderNum, 10) || 0
          }

          // 初始化fixedValues并填充实际值
          fixedTitles.forEach((title) => {
            newRow.fixedValues[title.rkey] = item[title.rkey] || ''
          })

          allRows.push(newRow)
          // 构建rowMap用于快速查找
          if (newRow.rowid) rowMap.set(String(newRow.rowid), newRow)
          if (newRow.itemId) rowMap.set(String(newRow.itemId), newRow)
        })

        // 构建树形结构
        const treeData = []
        const parentItems = allRows.filter((item) => !item.isChild)

        // 父级按orderNum正序排序
        parentItems.sort((a, b) => (a.orderNum || 0) - (b.orderNum || 0))

        // 将子项添加到对应的父项的children中
        allRows.forEach((item) => {
          if (item.isChild) {
            const parentId = String(item.parentid)
            const parent = rowMap.get(parentId)
            if (parent) {
              parent.children.push(item)
            }
          }
        })

        // 对子项进行排序
        parentItems.forEach((parent) => {
          parent.children.sort(
            (a, b) =>
              (a.fixedValues['序号'] || 0) - (b.fixedValues['序号'] || 0)
          )
          treeData.push(parent)
        })

        this.contentEditForm.fixedTable.fixedTables = treeData
      },
      /**
       * 将固定表项目的数据根据固定列拆分成对应的数据结构
       * @returns {Array} 拆分后的数据数组，每个固定列对应一行数据
       */
      splitFixedTableDataForSave() {
        const fixedTables = this.contentEditForm.fixedTable.fixedTables
        const fixedTitles = this.contentEditForm.fixedTable.fixedTablesTitle
        const fixedHeaders = this.contentEditForm.fixedTable.tableHeaders
        // 结果数组
        const result = []

        // 递归处理树形结构中的所有节点
        const processNode = (node, parentRowIndex = 0) => {
          // 确保node和fixedValues存在
          if (!node) {
            console.warn('遇到空节点，跳过处理')
            return
          }

          // 确保fixedValues属性存在，如果不存在则初始化为空对象
          if (!node.fixedValues) {
            node.fixedValues = {}
          }

          // 为每个固定列创建一条记录
          fixedTitles.forEach((title) => {
            // 找到对应的表头信息
            const correspondingHeader = fixedHeaders.find(
              (header) => header.fieldName === title.rkey
            )

            const newItem = {
              rkey: title.rkey,
              rvalue: node.fixedValues[title.rkey] || '',
              surveyTemplateId: node.surveyTemplateId || this.surveyTemplateId,
              versionId: node.versionId || this.versionId,
              tabtype: node.tabtype || this.templateType,
              // 添加 headersId 字段（表头的id）
              headersId: correspondingHeader ? correspondingHeader.id : null,
              // 添加记录的id（itemlist中每条记录的id）
              id: node.itemId || null,
              // 添加父子关系字段
              parentid: node.parentid || -1, // 父项ID，默认为-1表示无父项
              isChild: node.isChild || false, // 是否为子项
              // 添加 rowid 字段
              rowid: node.rowid || null,
              // 添加计算公式相关字段
              calculationFormula: node.calculationFormula || null,
              jsonstr: node.jsonstr || null,
              orderNum:
                typeof node.orderNum === 'number'
                  ? node.orderNum
                  : parseInt(node.orderNum, 10) || 0,
            }
            // 添加其他固定表特有的字段
            if (!node.isSubItem) {
              newItem.cellCode = node.cellCode || ''
              newItem.unit = node.unit || ''
            }

            // 添加其他可能需要的字段，但排除特定字段
            Object.keys(node).forEach((key) => {
              if (
                !(key in newItem) &&
                key !== 'fixedValues' &&
                key !== 'itemId' &&
                key !== 'id' &&
                key !== 'parentid' &&
                key !== 'isChild' &&
                key !== 'isSubItem' &&
                key !== 'rowid' &&
                key !== 'jsonstr' &&
                key !== 'calculationFormula' &&
                key !== 'children' // 排除children字段
              ) {
                newItem[key] = node[key]
              }
            })

            result.push(newItem)
          })

          // 递归处理子节点
          if (node.children && node.children.length > 0) {
            node.children.forEach((childNode) => {
              processNode(childNode)
            })
          }
        }

        // 遍历所有顶级节点
        fixedTables.forEach((row) => {
          processNode(row)
        })
        // 重新给子节点赋值orderNum 保证所有元素orderNum字段不重复
        // 为所有子节点分配唯一的orderNum，但保持父节点的orderNum不变
        // 计算所有已存在的orderNum中的最大值
        let maxExistingOrderNum = 0

        // 首先遍历结果数组找出当前最大的orderNum
        result.forEach((item) => {
          const orderNum =
            typeof item.orderNum === 'number'
              ? item.orderNum
              : parseInt(item.orderNum, 10) || 0
          if (orderNum > maxExistingOrderNum) {
            maxExistingOrderNum = orderNum
          }
        })

        // 子节点orderNum从当前最大orderNum + 1开始
        let childOrderNumCounter = maxExistingOrderNum + 1

        // 创建一个映射表，用于记录每个子节点对应的新orderNum
        const childOrderMap = new Map()

        // 第一次遍历：为每个子节点分配新的orderNum并存储映射关系
        function assignChildOrderNums(nodes) {
          nodes.forEach((node) => {
            if (node.isChild || node.isSubItem) {
              // 为每个子节点分配唯一的orderNum
              childOrderMap.set(node.id || node.rowid, childOrderNumCounter++)
            }
            // 递归处理子节点
            if (node.children && node.children.length > 0) {
              assignChildOrderNums(node.children)
            }
          })
        }

        // 第二次遍历：更新结果数组中的orderNum
        assignChildOrderNums(fixedTables)

        // 应用新的orderNum到结果数组
        result.forEach((item) => {
          // 只更新子节点的orderNum
          if (item.isChild || item.isSubItem) {
            const newOrderNum =
              childOrderMap.get(item.id) || childOrderMap.get(item.rowid)
            if (newOrderNum) {
              item.orderNum = newOrderNum
            }
          }
        })

        return result
      },
      //分割字符串
      stringToObjects(str) {
        const items = str.split(',')
        return items.map((item) => ({
          rkey: item,
          rvalue: '',
        }))
      },
      /**
       * 获取行缩进样式，用于树形结构展示
       * @param {Object} row - 表格行数据
       * @returns {Object} 样式对象
       */
      getRowIndentStyle(row) {
        // 为子项添加缩进
        if (row.isChild) {
          return {
            marginLeft: '30px',
          }
        }
        return {}
      },
      handleSaveTemplate() {
        // 校验表单
        this.$refs['contentEditForm'].validate((valid) => {
          if (valid) {
            if (this.dialogTitle == '修改成本核定模板') {
              let data = {
                ...this.contentEditForm,
              }
              delete data.fixedTable
              // 修改表单数据
              addCostVerifyForm(data).then((res) => {})
            }
            // 获取拆分后的数据
            const splitData = this.splitFixedTableDataForSave()
            const headersList =
              this.contentEditForm.fixedTable.tableHeaders.map(
                (header, index) => ({
                  ...header,
                  orderNum: header.orderNum || index + 1,
                })
              )
            let data = {
              costVerifyTemplateId: this.contentEditForm.surveyTemplateId,
              headersList: headersList,
              itemsList: splitData,
            }
            batchSaveOrUpdate(data)
              .then((data) => {
                this.dialogVisible = false
                this.$message.success('保存成功')
                this.handleSearch()
              })
              .catch((err) => {
                console.log(err)
              })
          } else {
            this.$message.error('请填写表单数据')
            return
          }
        })
      },

      // 批量删除
      handleBatchDelete() {
        if (this.selectedRows.length === 0) {
          this.$message.warning('请先选择要删除的数据')
          return
        }

        this.$confirm(
          `确定要删除选中的${this.selectedRows.length}条数据吗？`,
          '提示',
          {
            type: 'warning',
          }
        )
          .then(() => {
            const ids = this.selectedRows.map((row) => row.surveyTemplateId)
            batchDeleteCostVerifyForm(ids).then((res) => {
              if (res.code === 200) {
                this.selectedRows = []
                this.$message.success('批量删除成功')
                this.handleSearch()
              }
            })
          })
          .catch(() => {})
      },

      // 表格选择
      handleSelectionChange(selection) {
        this.selectedRows = selection
      },

      // 分页相关
      handleSizeChange(val) {
        this.searchForm.pageSize = val
        this.handleSearch()
      },

      handleCurrentChange(val) {
        this.searchForm.page = val
        this.handleSearch()
      },

      // 获取或设置序号字段
      getOrSetOrder(row, value) {
        // 如果提供了value参数，则设置值
        if (value !== undefined) {
          // 使用this.$set确保响应式更新
          if (row['序号'] === undefined) {
            this.$set(row, '序号', value)
          } else {
            row['序号'] = value
          }
        }

        // 如果没有提供value参数，则获取值
        return row['序号'] !== undefined && row['序号'] !== null
          ? row['序号']
          : row.orderNum || ''
      },
      // 公式验证函数
      validateFormula(formula, data) {
        if (!formula || typeof formula !== 'string') {
          return { valid: false, errorMsg: '公式不能为空' }
        }

        // 定义有效的操作符
        const operators = ['+', '-', '*', '/', '(', ')']

        // 检查是否包含至少一个操作符
        const hasOperator = operators.some((operator) =>
          formula.includes(operator)
        )
        if (!hasOperator) {
          return { valid: false, errorMsg: '公式必须包含操作符' }
        }

        // 检查值是否在data中存在
        function checkValueInData(value, data) {
          if (!data) return false

          if (Array.isArray(data)) {
            return data.includes(value)
          } else if (typeof data === 'object') {
            return Object.values(data).includes(value)
          }
          return data === value
        }

        // 提取公式中的变量/值
        function extractValues(formulaStr) {
          // 改进实现：支持形如"CeShi3.C2"的格式，提取点后面的部分作为变量，同时保留普通变量
          const result = new Set()

          // 1. 首先提取带点格式中的变量部分（如CeShi3.C2中的C2）
          const dotRegex = /[A-Za-z0-9]+\.([A-Za-z0-9]+)/g
          let dotMatch
          while ((dotMatch = dotRegex.exec(formulaStr)) !== null) {
            result.add(dotMatch[1]) // 提取点后面的部分作为变量
          }

          // 2. 然后提取普通变量（C3等），但排除已经从带点格式中提取的部分
          // 移除所有带点的部分，然后提取剩余的变量
          const remainingFormula = formulaStr.replace(
            /[A-Za-z0-9]+\.[A-Za-z0-9]+/g,
            ''
          )
          const normalRegex = /[A-Za-z0-9]+/g
          let normalMatch
          while ((normalMatch = normalRegex.exec(remainingFormula)) !== null) {
            // 跳过纯数字
            if (
              !isNaN(Number(normalMatch[0])) &&
              Number(normalMatch[0]).toString() === normalMatch[0]
            ) {
              continue
            }
            result.add(normalMatch[0])
          }

          return Array.from(result)
        }

        function checkOperatorContext(formulaStr, data) {
          for (let i = 0; i < formulaStr.length; i++) {
            const char = formulaStr[i]
            // 跳过括号
            if (char === '(' || char === ')') continue

            // 检查操作符
            if (operators.includes(char)) {
              // 检查操作符前是否有值（开头或不是操作符和左括号）
              if (
                i === 0 ||
                (operators.includes(formulaStr[i - 1]) &&
                  formulaStr[i - 1] !== ')') ||
                formulaStr[i - 1] === '('
              ) {
                return {
                  valid: false,
                  errorMsg: `位置 ${i + 1} 的操作符 '${char}' 前缺少值`,
                }
              }

              // 检查操作符后是否有值（结尾或不是操作符和右括号）
              if (
                i === formulaStr.length - 1 ||
                (operators.includes(formulaStr[i + 1]) &&
                  formulaStr[i + 1] !== '(') ||
                formulaStr[i + 1] === ')'
              ) {
                return {
                  valid: false,
                  errorMsg: `位置 ${i + 1} 的操作符 '${char}' 后缺少值`,
                }
              }
            }
          }

          // 验证通过后，检查公式中的值是否都在data中存在
          if (data.length > 0) {
            const values = extractValues(formulaStr)
            for (const value of values) {
              // 跳过纯数字（假设有值不在data中）
              if (!isNaN(Number(value)) && Number(value).toString() === value) {
                continue
              }

              if (!checkValueInData(value, data)) {
                return {
                  valid: false,
                  errorMsg: `变量 '${value}' 在数据中不存在`,
                }
              }
            }
          }

          return { valid: true }
        }

        // 执行验证
        return checkOperatorContext(formula, data)
      },
    },
  }
</script>

<style lang="scss" scoped>
  .row-indent-container {
    display: flex;
    align-items: center;
    position: relative;
  }

  .child-item {
    padding-left: 30px; /* 增加子项缩进，为'子项'文字留出空间 */
  }

  .child-item-indicator {
    position: absolute;
    left: 0;
    color: $base-color-default; /* 使用主题色，更醒目 */
    font-size: 12px;
    width: 30px;
    text-align: left;
    font-weight: 500;
  }

  @import '@/styles/costAudit.scss';
  .supervision-content-container {
    padding: 20px;

    .operation-bar {
      margin-bottom: 20px;
    }

    .table-container {
      .table-name-link {
        color: #409eff;
        cursor: pointer;

        &:hover {
          color: #66b1ff;
          text-decoration: underline;
        }
      }

      .pagination-container {
        margin-top: 20px;
        text-align: right;
      }
    }

    .content-form,
    .detail-form {
      ::v-deep .el-select {
        width: 100%;
      }
    }
  }
</style>
