11
董国庆
2026-01-30 229178209fb0445fc9176627e18b64cffd52bd09
11
1个文件已修改
426 ■■■■■ 已修改文件
screen/src/view/hiddenDanger/index.vue 426 ●●●●● 补丁 | 查看 | 原始文档 | 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,228 +24,107 @@
      <!-- 搜索 -->
      <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.state "
            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.state" 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('state')"
              class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.state  !== null"
            />
            <img
              src="../../assets/img/down-circle@2x.png"
              class="w--15 h--16 shrink0"
            />
            <i @click.stop="clearSelect('state')" class="el-icon-circle-close c-fff cursor-pointer"
              v-show="searchForm.state !== 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>
@@ -267,7 +140,7 @@
        <el-table-column label="问题备注" prop="remark" min-width="150" show-overflow-tooltip />
        <el-table-column label="隐患等级" min-width="120" prop="level">
          <template #default="{ row }">
            <span>{{getLevelText(row.level) }}</span>
            <span>{{ getLevelText(row.level) }}</span>
          </template>
        </el-table-column>
        <el-table-column v-if="activeTab == 1" label="隐患类型" min-width="120">
@@ -279,15 +152,10 @@
        </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>
@@ -297,86 +165,46 @@
          <template #default="{ row }">
            <div class="flex a-center j-center">
              <div class="ripple">
                <div
                  class="ripple-wave wave-1"
                  :class="{ bgColor33: row.state == 3 }"
                ></div>
                <div
                  class="ripple-wave wave-2"
                  :class="{ bgColor44: row.state == 3 }"
                ></div>
                <div
                  class="ripple-wave wave-3"
                  :class="{ bgColor55: row.state == 3 }"
                ></div>
                <div class="ripple-wave wave-1" :class="{ bgColor33: row.state == 3 }"></div>
                <div class="ripple-wave wave-2" :class="{ bgColor44: row.state == 3 }"></div>
                <div class="ripple-wave wave-3" :class="{ bgColor55: row.state == 3 }"></div>
              </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">
@@ -424,21 +252,13 @@
            </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>
@@ -449,21 +269,13 @@
            </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>
@@ -499,9 +311,7 @@
            </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"
              >
              <div class="min-h--60 py--20 px--19 c-fff SHSBold fs--18 w100 bgcolor6">
                {{ (detailData && detailData.remark) || "-" }}
              </div>
            </div>
@@ -509,10 +319,7 @@
        </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>
@@ -533,18 +340,13 @@
              <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="
                  <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) ||
@@ -579,11 +381,7 @@
      </el-tabs>
    </CustomDialog>
    <!-- 图片预览 -->
    <CustomPreview
      :show="previewVisible"
      :imgArr="previewImages"
      @close="previewVisible = false"
    />
    <CustomPreview :show="previewVisible" :imgArr="previewImages" @close="previewVisible = false" />
  </div>
</template>
@@ -614,7 +412,7 @@
      // 搜索条件
      searchForm: {
        projectId: null, // 选中的项目ID
        state : null, // 整改状态:1已整改 0未整改
        state: null, // 整改状态:1已整改 0未整改
        type: null, // 隐患类型:1=安全 2=设备
        level: null, // 隐患等级:0=一级 1=二级 2=三级 3=四级
        startTime: null, // 开始时间
@@ -696,12 +494,12 @@
      // bigHiddenDangerConfig: 1开启 2关闭
      // generalHiddenDangerConfig: 1开启 2关闭
      if (this.activeTab === 1) {
        // 重大隐患 tab,判断 bigHiddenDangerConfig
        return this.bigHiddenDangerConfig === 1;
      if (this.bigHiddenDangerConfig === 1) {
        return false
      } else if (this.generalHiddenDangerConfig === 1) {
        return this.activeTab === 1
      } else {
        // 安全隐患和设备隐患 tab,判断 generalHiddenDangerConfig
        return this.generalHiddenDangerConfig === 1;
        return true
      }
    },
  },
@@ -800,7 +598,7 @@
    // 加载表格数据
    this.loadTableData();
  },
  mounted() {},
  mounted() { },
  methods: {
    // 从 localStorage 加载配置
    loadConfigFromLocalStorage() {
@@ -846,7 +644,7 @@
    resetSearchForm() {
      this.searchForm = {
        projectId: this.projectId || null,
        state : null,
        state: null,
        type: this.currentType,
        level: null,
        startTime: this.routeStartTime || null, // 保留路由传递的开始时间
@@ -1001,8 +799,8 @@
    },
    // 获取整改状态文本
    getReformedText(state ) {
      return ["未复查","未整改", "部分整改", "已整改",'未复查' ][state ];
    getReformedText(state) {
      return ["未复查", "未整改", "部分整改", "已整改", '未复查'][state];
    },
    // 预览图片
@@ -1099,7 +897,7 @@
    // 获取复查状态文本
    getReviewStateText(state) {
      const stateMap = {
        0:'未复查',
        0: '未复查',
        1: "未整改",
        2: "部分整改",
        3: "已整改",
@@ -1327,12 +1125,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;