fix
hejianhao
2026-01-29 1745ebe09e8a6cdc461364b140768502262b52c3
fix
1个文件已修改
645 ■■■■■ 已修改文件
screen/src/view/hiddenDanger/index.vue 645 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/hiddenDanger/index.vue
@@ -4,10 +4,16 @@
    <div class="pt--35 px--20 pb--54">
      <!-- 返回 -->
      <div>
        <img @click="backFun" src="../../assets/img/back.png" class="w--22 h--20 shrink0 mr--13 cursor-pointer" />
        <img
          @click="backFun"
          src="../../assets/img/back.png"
          class="w--22 h--20 shrink0 mr--13 cursor-pointer"
        />
      </div>
      <!-- tab -->
      <div class="flex a-center absolute postion-center br--16 top--130 br--16 c-fff fs--14 bgcolor4 SSHR">
      <div
        class="flex a-center absolute postion-center br--16 top--130 br--16 c-fff fs--14 bgcolor4 SSHR"
      >
        <div @click="activeTab = 1" class="lh--32 px--20 cursor-pointer z-10">
          重大隐患
        </div>
@@ -24,120 +30,276 @@
      <!-- 搜索 -->
      <div class="flex a-center gap--16 mt--24 mb--20">
        <!-- 项目选择(非项目端才显示) -->
        <div v-if="!isProjectMode"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox">
          <el-select filterable v-model="searchForm.projectId" placeholder="请选择项目" class="flex1"
            @change="handleSelectChange">
            <el-option v-for="item in projectList" :key="item.value" :label="item.label" :value="item.value">
        <div
          v-if="!isProjectMode"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
        >
          <el-select
            filterable
            v-model="searchForm.projectId"
            placeholder="请选择项目"
            class="flex1"
            @change="handleSelectChange"
          >
            <el-option
              v-for="item in projectList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
          <div class="flex a-center gap--5">
            <i @click.stop="clearSelect('projectId')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.projectId" />
            <img src="../../assets/img/down-circle@2x.png" class="w--15 h--16 shrink0" />
            <i
              @click.stop="clearSelect('projectId')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.projectId"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <!-- 整改状态 -->
        <div v-if="showReformedFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox">
          <el-select v-model="searchForm.reformed" placeholder="请选择整改状态" class="flex1" @change="handleSelectChange">
            <el-option v-for="item in reformedOptions" :key="item.value" :label="item.label" :value="item.value">
        <div
          v-if="showReformedFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
        >
          <el-select
            v-model="searchForm.reformed"
            placeholder="请选择整改状态"
            class="flex1"
            @change="handleSelectChange"
          >
            <el-option
              v-for="item in reformedOptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
          <div class="flex a-center gap--5">
            <i @click.stop="clearSelect('reformed')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.reformed !== null" />
            <img src="../../assets/img/down-circle@2x.png" class="w--15 h--16 shrink0" />
            <i
              @click.stop="clearSelect('reformed')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.reformed !== null"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <!-- 隐患类型(仅重大隐患显示) -->
        <div v-if="showTypeFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox">
          <el-select v-model="searchForm.type" placeholder="请选择隐患类型" class="flex1" @change="handleSelectChange">
        <div
          v-if="showTypeFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
        >
          <el-select
            v-model="searchForm.type"
            placeholder="请选择隐患类型"
            class="flex1"
            @change="handleSelectChange"
          >
            <el-option label="安全隐患" :value="1"></el-option>
            <el-option label="设备隐患" :value="2"></el-option>
          </el-select>
          <div class="flex a-center gap--5">
            <i @click.stop="clearSelect('type')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.type !== null" />
            <img src="../../assets/img/down-circle@2x.png" class="w--15 h--16 shrink0" />
            <i
              @click.stop="clearSelect('type')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.type !== null"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <!-- 隐患等级(安全和设备隐患显示) -->
        <div v-if="showLevelFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox">
          <el-select v-model="searchForm.level" placeholder="请选择隐患等级" class="flex1" @change="handleSelectChange">
            <el-option v-for="item in levelOptions" :key="item.value" :label="item.label" :value="item.value">
        <div
          v-if="showLevelFilter"
          class="flex a-center j-between pl--18 pr--15 h--40 relative w--300 bgcolor1 searchBox"
        >
          <el-select
            v-model="searchForm.level"
            placeholder="请选择隐患等级"
            class="flex1"
            @change="handleSelectChange"
          >
            <el-option
              v-for="item in levelOptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
          <div class="flex a-center gap--5">
            <i @click.stop="clearSelect('level')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.level !== null" />
            <img src="../../assets/img/down-circle@2x.png" class="w--15 h--16 shrink0" />
            <i
              @click.stop="clearSelect('level')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.level !== null"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
          </div>
        </div>
        <!-- 开始时间 -->
        <div class="flex a-center j-between px--20 w--300 h--40 relative bgcolor1 picker">
          <el-date-picker v-model="startDateTime" ref="datetime1" type="datetime" placeholder="">
        <div
          class="flex a-center j-between px--20 w--300 h--40 relative bgcolor1 picker"
        >
          <el-date-picker
            v-model="startDateTime"
            ref="datetime1"
            type="datetime"
            placeholder=""
          >
          </el-date-picker>
          <div @click.stop="handleClick(1)" class="absolute h100 flex a-center c-fff fs--14 SHS pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1;" v-if="startDateTxt">
          <div
            @click.stop="handleClick(1)"
            class="absolute h100 flex a-center c-fff fs--14 SHS pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1"
            v-if="startDateTxt"
          >
            {{ startDateTxt }}
          </div>
          <div @click.stop="handleClick(1)" v-else
          <div
            @click.stop="handleClick(1)"
            v-else
            class="absolute h100 flex a-center c-fff fs--14 SHSR pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1;">
            style="left: 20px; right: 60px; z-index: 1"
          >
            开始时间
          </div>
          <div class="flex a-center gap--5" style="position: relative; z-index: 2;">
            <i @click.stop="clearDateTime('start')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="startDateTxt" />
            <img @click="handleClick(1)" src="../../assets/img/home/Shape@2x (6).png"
              class="w--13 h--13 shrink0 cursor-pointer" />
          <div
            class="flex a-center gap--5"
            style="position: relative; z-index: 2"
          >
            <i
              @click.stop="clearDateTime('start')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="startDateTxt"
            />
            <img
              @click="handleClick(1)"
              src="../../assets/img/home/Shape@2x (6).png"
              class="w--13 h--13 shrink0 cursor-pointer"
            />
          </div>
        </div>
        <!-- 结束时间 -->
        <div class="flex a-center j-between px--20 w--300 h--40 relative bgcolor1 picker">
          <el-date-picker v-model="endDateTime" ref="datetime2" type="datetime" placeholder="">
        <div
          class="flex a-center j-between px--20 w--300 h--40 relative bgcolor1 picker"
        >
          <el-date-picker
            v-model="endDateTime"
            ref="datetime2"
            type="datetime"
            placeholder=""
          >
          </el-date-picker>
          <div @click="handleClick(2)" class="absolute h100 flex a-center c-fff fs--14 SHS pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1;" v-if="endDateTxt">
          <div
            @click="handleClick(2)"
            class="absolute h100 flex a-center c-fff fs--14 SHS pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1"
            v-if="endDateTxt"
          >
            {{ endDateTxt }}
          </div>
          <div @click="handleClick(2)" v-else class="absolute h100 flex a-center c-fff fs--14 SHSR pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1;">
          <div
            @click="handleClick(2)"
            v-else
            class="absolute h100 flex a-center c-fff fs--14 SHSR pointer-events-none"
            style="left: 20px; right: 60px; z-index: 1"
          >
            结束时间
          </div>
          <div class="flex a-center gap--5" style="position: relative; z-index: 2;">
            <i @click.stop="clearDateTime('end')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="endDateTxt" />
            <img @click="handleClick(2)" src="../../assets/img/home/Shape@2x (6).png"
              class="w--13 h--13 shrink0 cursor-pointer" />
          <div
            class="flex a-center gap--5"
            style="position: relative; z-index: 2"
          >
            <i
              @click.stop="clearDateTime('end')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="endDateTxt"
            />
            <img
              @click="handleClick(2)"
              src="../../assets/img/home/Shape@2x (6).png"
              class="w--13 h--13 shrink0 cursor-pointer"
            />
          </div>
        </div>
        <!-- 搜索内容 -->
        <div class="flex a-center j-between w--300 pl--20 h--40 relative bgcolor1 searchBox">
          <el-input v-model="searchForm.content" placeholder="请输入搜索内容" class="flex1" clearable
            @keyup.enter.native="handleSearch">
        <div
          class="flex a-center j-between w--300 pl--20 h--40 relative bgcolor1 searchBox"
        >
          <el-input
            v-model="searchForm.content"
            placeholder="请输入搜索内容"
            class="flex1"
            clearable
            @keyup.enter.native="handleSearch"
          >
          </el-input>
          <div class="btn SHSR" @click="handleSearch">搜索</div>
        </div>
      </div>
      <!-- 表格 -->
      <CustomTable :key="activeTab" :data="tableData" height="800" style="border: 2px solid #3d7fff"
        v-loading="loading">
        <el-table-column v-if="!isProjectMode" label="项目名称" prop="projectName" min-width="150" />
        <el-table-column label="检查计划" prop="planName" min-width="150" show-overflow-tooltip />
        <el-table-column label="检查内容" prop="hierarchyName" min-width="150" show-overflow-tooltip />
        <el-table-column label="问题描述" prop="description" min-width="200" show-overflow-tooltip />
        <el-table-column label="问题部位" prop="problemPart" min-width="150" show-overflow-tooltip />
        <el-table-column label="问题备注" prop="remark" min-width="150" show-overflow-tooltip />
      <CustomTable
        :key="activeTab"
        :data="tableData"
        height="800"
        style="border: 2px solid #3d7fff"
        v-loading="loading"
      >
        <el-table-column
          v-if="!isProjectMode"
          label="项目名称"
          prop="projectName"
          min-width="150"
        />
        <el-table-column
          label="检查计划"
          prop="planName"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="检查内容"
          prop="hierarchyName"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="问题描述"
          prop="description"
          min-width="200"
          show-overflow-tooltip
        />
        <el-table-column
          label="问题部位"
          prop="problemPart"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="问题备注"
          prop="remark"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column label="隐患等级" min-width="120">
          <template #default="{ row }">
            <span>{{ getLevelText(row.level) }}</span>
@@ -145,67 +307,115 @@
        </el-table-column>
        <el-table-column v-if="activeTab == 1" label="隐患类型" min-width="120">
          <template #default="{ row }">
            <span>{{ row.type === 1 ? '安全隐患' : row.type === 2 ? '设备隐患' : '-' }}</span>
            <span>{{
              row.type === 1 ? "安全隐患" : row.type === 2 ? "设备隐患" : "-"
            }}</span>
          </template>
        </el-table-column>
        <el-table-column label="图片" min-width="100">
          <template #default="{ row }">
            <div class="btnColor cursor-pointer"
              :class="!row.userFiles || row.userFiles.length === 0 ? 'disableColor' : ''"
              @click="handlePreviewImages(row.userFiles)">
            <div
              class="btnColor cursor-pointer"
              :class="
                !row.userFiles || row.userFiles.length === 0
                  ? 'disableColor'
                  : ''
              "
              @click="handlePreviewImages(row.userFiles)"
            >
              {{ row.fileNum || 0 }}张
            </div>
          </template>
        </el-table-column>
        <el-table-column label="检查时间" prop="createTime" min-width="180" />
        <el-table-column
          label="检查时间"
          prop="createTime"
          min-width="180"
        />
        <el-table-column v-if="showReformedFilter" label="整改状态" min-width="120">
          v-if="showReformedFilter"
          label="整改状态"
          min-width="120"
        >
          <template #default="{ row }">
            <div class="flex a-center j-center">
              <div class="ripple">
                <div class="ripple-wave wave-1" :class="{ bgColor33: row.reformed }"></div>
                <div class="ripple-wave wave-2" :class="{ bgColor44: row.reformed }"></div>
                <div class="ripple-wave wave-3" :class="{ bgColor55: row.reformed }"></div>
                <div
                  class="ripple-wave wave-1"
                  :class="{ bgColor33: row.state == 2 }"
                ></div>
                <div
                  class="ripple-wave wave-2"
                  :class="{ bgColor44: row.state == 2 }"
                ></div>
                <div
                  class="ripple-wave wave-3"
                  :class="{ bgColor55: row.state == 2 }"
                ></div>
              </div>
              <div class="ml--6 SHSR">{{ getReformedText(row.reformed) }}</div>
              <div class="ml--6 SHSR">{{ getReformedText(row.state) }}</div>
            </div>
          </template>
        </el-table-column>
        <el-table-column label="责任人" prop="responsiblePerson" min-width="120" />
        <el-table-column
          label="责任人"
          prop="responsiblePerson"
          min-width="120"
        />
        <el-table-column label="操作" min-width="200" fixed="right">
          <template #default="{ row }">
            <el-button @click="handleEditPeople(row)" type="text" class="btnColor">
            <el-button
              @click="handleEditPeople(row)"
              type="text"
              class="btnColor"
            >
              编辑责任人
            </el-button>
            <el-button type="text" class="btnColor" @click="handleViewDetail(row)">
            <el-button
              type="text"
              class="btnColor"
              @click="handleViewDetail(row)"
            >
              详情
            </el-button>
          </template>
        </el-table-column>
      </CustomTable>
      <CustomPagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" :total="total" />
      <CustomPagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        :total="total"
      />
    </div>
    <!-- 修改责任人 -->
    <CustomDialog title="责任人" :visible.sync="updatePeople" width="600px">
      <div class="pt--37 px--45 pb--64">
        <input v-model="peopleName" placeholder="请输入" class="w100 h--60 fs--14 SHSR py--23 px--21 bgcolor5 c-fff" />
        <input
          v-model="peopleName"
          placeholder="请输入"
          class="w100 h--60 fs--14 SHSR py--23 px--21 bgcolor5 c-fff"
        />
        <div class="flex a-center j-center gap--30 mt--59 SHSR fs--16 c-fff">
          <div @click="closeUpdatePeople" class="w--150 lh--40 txt-center bgcolor2 br--4 cursor-pointer">
          <div
            @click="closeUpdatePeople"
            class="w--150 lh--40 txt-center bgcolor2 br--4 cursor-pointer"
          >
            取消
          </div>
          <div @click="saveUpdatePeople" class="w--150 lh--40 txt-center bgcolor3 br--4 cursor-pointer">
          <div
            @click="saveUpdatePeople"
            class="w--150 lh--40 txt-center bgcolor3 br--4 cursor-pointer"
          >
            保存
          </div>
        </div>
      </div>
    </CustomDialog>
    <!-- 隐患详情 -->
    <CustomDialog :title="detailData ? detailData.projectName || '隐患详情' : '隐患详情'" :visible.sync="detailVisible"
      width="1420px">
    <CustomDialog
      :title="detailData ? detailData.projectName || '隐患详情' : '隐患详情'"
      :visible.sync="detailVisible"
      width="1420px"
    >
      <el-tabs v-model="activeName" type="card" @tab-click="handleClickTab">
        <el-tab-pane label="基本信息" name="first">
          <div class="oa" style="height: 700px">
@@ -213,13 +423,13 @@
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">计划名称:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.planName || '-' }}
                  {{ (currentRow && currentRow.planName) || "-" }}
                </div>
              </div>
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">项目名称:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.projectName || '-' }}
                  {{ (currentRow && currentRow.projectName) || "-" }}
                </div>
              </div>
            </div>
@@ -227,13 +437,13 @@
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">检查内容:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.hierarchyName || '-' }}
                  {{ (currentRow && currentRow.hierarchyName) || "-" }}
                </div>
              </div>
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">责任人:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.responsiblePerson || '-' }}
                  {{ (currentRow && currentRow.responsiblePerson) || "-" }}
                </div>
              </div>
            </div>
@@ -241,39 +451,63 @@
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">问题部位:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.problemPart || '-' }}
                  {{ (currentRow && currentRow.problemPart) || "-" }}
                </div>
              </div>
              <div class="flex1">
                <div class="SHSR fs--16 lh--16 mb--17 color1">创建时间:</div>
                <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                  {{ currentRow && currentRow.createTime || '-' }}
                  {{ (currentRow && currentRow.createTime) || "-" }}
                </div>
              </div>
            </div>
            <div class="mt--30">
              <div class="SHSR fs--16 lh--16 mb--17 color1">规范条款:</div>
              <div class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                <template v-if="detailData && detailData.specificTerms && detailData.specificTerms.length > 0">
                  <div v-for="(term, index) in detailData.specificTerms" :key="'term-' + index" class="mb--10">
              <div
                class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6"
              >
                <template
                  v-if="
                    detailData &&
                    detailData.specificTerms &&
                    detailData.specificTerms.length > 0
                  "
                >
                  <div
                    v-for="(term, index) in detailData.specificTerms"
                    :key="'term-' + index"
                    class="mb--10"
                  >
                    {{ index + 1 }}. {{ term }}
                  </div>
                </template>
                <template v-else>
                  {{ detailData && detailData.specificTermsStr || '-' }}
                  {{ (detailData && detailData.specificTermsStr) || "-" }}
                </template>
              </div>
            </div>
            <div class="mt--30">
              <div class="SHSR fs--16 lh--16 mb--17 color1">建议措施:</div>
              <div class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                <template v-if="detailData && detailData.suggestActions && detailData.suggestActions.length > 0">
                  <div v-for="(action, index) in detailData.suggestActions" :key="'action-' + index" class="mb--10">
              <div
                class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6"
              >
                <template
                  v-if="
                    detailData &&
                    detailData.suggestActions &&
                    detailData.suggestActions.length > 0
                  "
                >
                  <div
                    v-for="(action, index) in detailData.suggestActions"
                    :key="'action-' + index"
                    class="mb--10"
                  >
                    {{ index + 1 }}. {{ action }}
                  </div>
                </template>
                <template v-else>
                  {{ detailData && detailData.suggestActionsStr || '-' }}
                  {{ (detailData && detailData.suggestActionsStr) || "-" }}
                </template>
              </div>
            </div>
@@ -304,15 +538,20 @@
            </div>
            <div class="mt--30">
              <div class="SHSR fs--16 lh--16 mb--17 color1">备注:</div>
              <div class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                {{ detailData && detailData.remark || '-' }}
              <div
                class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6"
              >
                {{ (detailData && detailData.remark) || "-" }}
              </div>
            </div>
          </div>
        </el-tab-pane>
        <el-tab-pane :label="getReviewRecordsLabel()" name="second">
          <div class="oa" style="height: 700px">
            <div v-if="!detailData || !detailData.errorReview" class="txt-center c-fff fs--16 mt--50">
            <div
              v-if="!detailData || !detailData.errorReview"
              class="txt-center c-fff fs--16 mt--50"
            >
              暂无复查记录
            </div>
            <div v-else>
@@ -320,7 +559,7 @@
                <div class="flex1">
                  <div class="SHSR fs--16 lh--16 mb--17 color1">复查内容:</div>
                  <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                    {{ detailData.errorReview.content || '-' }}
                    {{ detailData.errorReview.content || "-" }}
                  </div>
                </div>
                <div class="flex1">
@@ -333,16 +572,29 @@
              <div class="flex j-between gap--30 mt--30">
                <div class="flex1">
                  <div class="SHSR fs--16 lh--16 mb--17 color1">复查图片:</div>
                  <div class="lh--60 px--19 btnColor SHSBold fs--18 w100 cursor-pointer"
                    :class="!detailData.errorReview.img || detailData.errorReview.img.length === 0 ? 'disableColor' : ''"
                    @click="handlePreviewReviewImages(detailData.errorReview.img)">
                    {{ detailData.errorReview.img && detailData.errorReview.img.length || 0 }}张
                  <div
                    class="lh--60 px--19 btnColor SHSBold fs--18 w100 cursor-pointer"
                    :class="
                      !detailData.errorReview.img ||
                      detailData.errorReview.img.length === 0
                        ? 'disableColor'
                        : ''
                    "
                    @click="
                      handlePreviewReviewImages(detailData.errorReview.img)
                    "
                  >
                    {{
                      (detailData.errorReview.img &&
                        detailData.errorReview.img.length) ||
                      0
                    }}张
                  </div>
                </div>
                <div class="flex1">
                  <div class="SHSR fs--16 lh--16 mb--17 color1">复核人:</div>
                  <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                    {{ detailData.errorReview.creator || '-' }}
                    {{ detailData.errorReview.creator || "-" }}
                  </div>
                </div>
              </div>
@@ -350,13 +602,13 @@
                <div class="flex1">
                  <div class="SHSR fs--16 lh--16 mb--17 color1">创建时间:</div>
                  <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                    {{ detailData.errorReview.createTime || '-' }}
                    {{ detailData.errorReview.createTime || "-" }}
                  </div>
                </div>
                <div class="flex1">
                  <div class="SHSR fs--16 lh--16 mb--17 color1">更新时间:</div>
                  <div class="lh--60 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                    {{ detailData.errorReview.updateTime || '-' }}
                    {{ detailData.errorReview.updateTime || "-" }}
                  </div>
                </div>
              </div>
@@ -366,7 +618,11 @@
      </el-tabs>
    </CustomDialog>
    <!-- 图片预览 -->
    <CustomPreview :show="previewVisible" :imgArr="previewImages" @close="previewVisible = false" />
    <CustomPreview
      :show="previewVisible"
      :imgArr="previewImages"
      @close="previewVisible = false"
    />
  </div>
</template>
@@ -379,10 +635,7 @@
  getHiddenDangerDetailByType,
  editResponsiblePersonByType,
} from "./service";
import {
  errorLevelMap,
  errorReviewStateMap,
} from "@/utils/riskSourceMap";
import { errorLevelMap, errorReviewStateMap } from "@/utils/riskSourceMap";
export default {
  components: { HeaderBox },
@@ -503,7 +756,9 @@
      handler(newVal) {
        if (newVal) {
          this.startDateTxt = moment(newVal).format("YYYY年MM月DD日 HH:mm:ss");
          this.searchForm.startTime = moment(newVal).format("YYYY-MM-DD HH:mm:ss");
          this.searchForm.startTime = moment(newVal).format(
            "YYYY-MM-DD HH:mm:ss"
          );
          // 选择时间后自动请求
          this.handleSelectChange();
        } else {
@@ -518,7 +773,9 @@
      handler(newVal) {
        if (newVal) {
          this.endDateTxt = moment(newVal).format("YYYY年MM月DD日 HH:mm:ss");
          this.searchForm.endTime = moment(newVal).format("YYYY-MM-DD HH:mm:ss");
          this.searchForm.endTime = moment(newVal).format(
            "YYYY-MM-DD HH:mm:ss"
          );
          // 选择时间后自动请求
          this.handleSelectChange();
        } else {
@@ -572,24 +829,28 @@
    // 加载表格数据
    this.loadTableData();
  },
  mounted() { },
  mounted() {},
  methods: {
    // 从 localStorage 加载配置
    loadConfigFromLocalStorage() {
      try {
        const bigHiddenDanger = localStorage.getItem('bigHiddenDanger');
        const generalHiddenDanger = localStorage.getItem('generalHiddenDanger');
        const bigHiddenDanger = localStorage.getItem("bigHiddenDanger");
        const generalHiddenDanger = localStorage.getItem("generalHiddenDanger");
        // 转换为数字类型,默认为开启(1)
        this.bigHiddenDangerConfig = bigHiddenDanger ? Number(bigHiddenDanger) : 1;
        this.generalHiddenDangerConfig = generalHiddenDanger ? Number(generalHiddenDanger) : 1;
        this.bigHiddenDangerConfig = bigHiddenDanger
          ? Number(bigHiddenDanger)
          : 1;
        this.generalHiddenDangerConfig = generalHiddenDanger
          ? Number(generalHiddenDanger)
          : 1;
        console.log('隐患配置加载:', {
        console.log("隐患配置加载:", {
          bigHiddenDanger: this.bigHiddenDangerConfig,
          generalHiddenDanger: this.generalHiddenDangerConfig
          generalHiddenDanger: this.generalHiddenDangerConfig,
        });
      } catch (error) {
        console.error('加载配置失败:', error);
        console.error("加载配置失败:", error);
        // 默认都开启
        this.bigHiddenDangerConfig = 1;
        this.generalHiddenDangerConfig = 1;
@@ -600,16 +861,18 @@
    initOptions() {
      // 整改状态选项
      this.reformedOptions = [
        { label: '未整改', value: 0 },
        { label: '已整改', value: 1 }
        { label: "未整改", value: 0 },
        { label: "部分整改", value: 1 },
        { label: "已整改", value: 2 },
        { label: "未复查", value: 3 },
      ];
      // 隐患等级选项
      this.levelOptions = [
        { label: '一级隐患', value: 0 },
        { label: '二级隐患', value: 1 },
        { label: '三级隐患', value: 2 },
        { label: '四级隐患', value: 3 }
        { label: "一级隐患", value: 0 },
        { label: "二级隐患", value: 1 },
        { label: "三级隐患", value: 2 },
        { label: "四级隐患", value: 3 },
      ];
    },
@@ -632,19 +895,24 @@
    async loadProjectList() {
      try {
        // 从 localStorage 获取 userInfo
        const userInfoStr = localStorage.getItem('userInfo');
        const userInfoStr = localStorage.getItem("userInfo");
        if (!userInfoStr) {
          console.error("未找到用户信息");
          return;
        }
        const clientId = localStorage.getItem('clientId');
        const clientId = localStorage.getItem("clientId");
        if (!clientId) {
          console.error("用户信息中未找到 clientId");
          return;
        }
        const res = await getProjectList({ clientId: clientId,projectCategory:["ongoing", "fixed"][localStorage.getItem('activeTab') - 1] });
        const res = await getProjectList({
          clientId: clientId,
          projectCategory: ["ongoing", "fixed"][
            localStorage.getItem("activeTab") - 1
          ],
        });
        if (res && res) {
          this.projectList = res.map((item) => ({
            label: item.name,
@@ -674,9 +942,9 @@
          // 项目端:传递 type
          params.type = this.currentType;
        } else {
          params.clientId = localStorage.getItem('clientId');
          params.clientId = localStorage.getItem("clientId");
          if (this.projectCategory) {
            params.category = localStorage.getItem('activeTab')
            params.category = localStorage.getItem("activeTab");
          }
          // 委托方:只在重大隐患 Tab 且用户选择了类型时传递 type
          if (this.activeTab === 1 && this.searchForm.type) {
@@ -730,7 +998,7 @@
    // 清除日期时间
    clearDateTime(type) {
      if (type === 'start') {
      if (type === "start") {
        this.startDateTime = null;
        this.startDateTxt = "";
        this.searchForm.startTime = null;
@@ -759,7 +1027,7 @@
    // 获取整改状态文本
    getReformedText(reformed) {
      return reformed ? "已整改" : "未整改";
      return ["未整改", "部分整改", "已整改", "未复查"][reformed];
    },
    // 预览图片
@@ -827,10 +1095,7 @@
        this.currentRow = row;
        // 使用统一方法
        const res = await getHiddenDangerDetailByType(
          row.id,
          this.isClient
        );
        const res = await getHiddenDangerDetailByType(row.id, this.isClient);
        if (res && res) {
          this.detailData = res;
@@ -851,19 +1116,20 @@
    // 获取复查记录标签
    getReviewRecordsLabel() {
      if (!this.detailData || !this.detailData.errorReview) {
        return '复查记录(无)';
        return "复查记录(无)";
      }
      return '复查记录';
      return "复查记录";
    },
    // 获取复查状态文本
    getReviewStateText(state) {
      const stateMap = {
        0: '未整改',
        1: '部分整改',
        2: '已整改'
        0: "未整改",
        1: "部分整改",
        2: "已整改",
        3: "未复查",
      };
      return stateMap[state] || '-';
      return stateMap[state] || "-";
    },
    // 预览复查图片(需要添加前缀)
@@ -874,10 +1140,10 @@
      }
      // 图片没有前缀,需要根据实际情况添加图片服务器地址前缀
      // 假设图片服务器地址为 process.env.VUE_APP_IMG_BASE_URL 或者其他配置
      const baseUrl = process.env.VUE_APP_IMG_BASE_URL || '';
      const baseUrl = process.env.VUE_APP_IMG_BASE_URL || "";
      this.previewImages = imgArray.map((img) => {
        // 如果图片已经是完整URL,直接返回;否则添加前缀
        if (img.startsWith('http://') || img.startsWith('https://')) {
        if (img.startsWith("http://") || img.startsWith("https://")) {
          return img;
        }
        return baseUrl + img;
@@ -887,52 +1153,71 @@
    // 获取问题数量名称(取第一条数据的 name)
    getNumberFactorName() {
      if (this.detailData && this.detailData.numberFactors && this.detailData.numberFactors.length > 0) {
      if (
        this.detailData &&
        this.detailData.numberFactors &&
        this.detailData.numberFactors.length > 0
      ) {
        try {
          const firstItem = typeof this.detailData.numberFactors[0] === 'string'
            ? JSON.parse(this.detailData.numberFactors[0])
            : this.detailData.numberFactors[0];
          return firstItem.name || '-';
          const firstItem =
            typeof this.detailData.numberFactors[0] === "string"
              ? JSON.parse(this.detailData.numberFactors[0])
              : this.detailData.numberFactors[0];
          return firstItem.name || "-";
        } catch (error) {
          console.error('解析 numberFactors 失败:', error);
          return '-';
          console.error("解析 numberFactors 失败:", error);
          return "-";
        }
      }
      return '-';
      return "-";
    },
    // 获取扣除分数(取第一条数据的 deductPoint)
    getNumberFactorDeductPoint() {
      if (this.detailData && this.detailData.numberFactors && this.detailData.numberFactors.length > 0) {
      if (
        this.detailData &&
        this.detailData.numberFactors &&
        this.detailData.numberFactors.length > 0
      ) {
        try {
          const firstItem = typeof this.detailData.numberFactors[0] === 'string'
            ? JSON.parse(this.detailData.numberFactors[0])
            : this.detailData.numberFactors[0];
          const firstItem =
            typeof this.detailData.numberFactors[0] === "string"
              ? JSON.parse(this.detailData.numberFactors[0])
              : this.detailData.numberFactors[0];
          const deductPoint = firstItem.deductPoint;
          return deductPoint !== undefined && deductPoint !== null ? deductPoint : '-';
          return deductPoint !== undefined && deductPoint !== null
            ? deductPoint
            : "-";
        } catch (error) {
          console.error('解析 numberFactors 失败:', error);
          return '-';
          console.error("解析 numberFactors 失败:", error);
          return "-";
        }
      }
      return '-';
      return "-";
    },
    // 获取附加加分(取第一条数据的 additionPoint)
    getNumberFactorAdditionPoint() {
      if (this.detailData && this.detailData.numberFactors && this.detailData.numberFactors.length > 0) {
      if (
        this.detailData &&
        this.detailData.numberFactors &&
        this.detailData.numberFactors.length > 0
      ) {
        try {
          const firstItem = typeof this.detailData.numberFactors[0] === 'string'
            ? JSON.parse(this.detailData.numberFactors[0])
            : this.detailData.numberFactors[0];
          const firstItem =
            typeof this.detailData.numberFactors[0] === "string"
              ? JSON.parse(this.detailData.numberFactors[0])
              : this.detailData.numberFactors[0];
          const additionPoint = firstItem.additionPoint;
          return additionPoint !== undefined && additionPoint !== null ? additionPoint : '-';
          return additionPoint !== undefined && additionPoint !== null
            ? additionPoint
            : "-";
        } catch (error) {
          console.error('解析 numberFactors 失败:', error);
          return '-';
          console.error("解析 numberFactors 失败:", error);
          return "-";
        }
      }
      return '-';
      return "-";
    },
    // 返回
@@ -1066,10 +1351,12 @@
    position: absolute;
    top: -2px;
    right: -2px;
    background: linear-gradient(90deg,
        #3467d0 0%,
        #0d226a 50.35%,
        #376fe0 100%);
    background: linear-gradient(
      90deg,
      #3467d0 0%,
      #0d226a 50.35%,
      #376fe0 100%
    );
    height: 38px;
    display: flex;
    align-items: center;