董国庆
2026-01-29 2ec79822e4fe124c89f0f9a675aa215eabb8e17b
加字段
1个文件已修改
400 ■■■■■ 已修改文件
screen/src/view/hiddenDanger/index.vue 400 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/view/hiddenDanger/index.vue
@@ -4,16 +4,10 @@
    <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>
@@ -30,387 +24,184 @@
      <!-- 搜索 -->
      <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"
            />
            <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"
            />
            <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
        />
        <el-table-column
          label="隐患等级"
          min-width="120"
        >
      <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>
          </template>
        </el-table-column>
        <el-table-column
          v-if="activeTab == 1"
          label="隐患类型"
          min-width="120"
        >
        <el-table-column v-if="activeTab == 1" label="隐患类型" min-width="120">
          <template #default="{ row }">
            <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"
            <div class="btnColor cursor-pointer"
              :class="!row.userFiles || row.userFiles.length === 0 ? 'disableColor' : ''"
              @click="handlePreviewImages(row.userFiles)"
            >
              @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 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.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>
              <div class="ml--6 SHSR">{{ getReformedText(row.reformed) }}</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">
@@ -515,10 +306,7 @@
            </div>
          </div>
        </el-tab-pane>
        <el-tab-pane
          :label="getReviewRecordsLabel()"
          name="second"
        >
        <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">
              暂无复查记录
@@ -541,11 +329,9 @@
              <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"
                  <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)"
                  >
                    @click="handlePreviewReviewImages(detailData.errorReview.img)">
                    {{ detailData.errorReview.img && detailData.errorReview.img.length || 0 }}张
                  </div>
                </div>
@@ -576,11 +362,7 @@
      </el-tabs>
    </CustomDialog>
    <!-- 图片预览 -->
    <CustomPreview
      :show="previewVisible"
      :imgArr="previewImages"
      @close="previewVisible = false"
    />
    <CustomPreview :show="previewVisible" :imgArr="previewImages" @close="previewVisible = false" />
  </div>
</template>
@@ -772,7 +554,7 @@
    // 加载表格数据
    this.loadTableData();
  },
  mounted() {},
  mounted() { },
  methods: {
    // 从 localStorage 加载配置
    loadConfigFromLocalStorage() {
@@ -874,6 +656,7 @@
          // 项目端:传递 type
          params.type = this.currentType;
        } else {
          params.clientId = localStorage.getItem('clientId');
          // 委托方:只在重大隐患 Tab 且用户选择了类型时传递 type
          if (this.activeTab === 1 && this.searchForm.type) {
            params.type = this.searchForm.type;
@@ -1262,12 +1045,10 @@
    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;
@@ -1284,6 +1065,7 @@
  .el-tabs__header {
    border-bottom: none;
    margin: 0;
    .el-tabs__nav {
      border: none;
@@ -1365,10 +1147,12 @@
    transform: translate(-50%, -50%) scale(0.7);
    opacity: 0;
  }
  20% {
    opacity: 1;
    opacity: 1;
  }
  100% {
    -webkit-transform: translate(-50%, -50%) scale(1.4);
    opacity: 0;