| | |
| | | <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> |
| | |
| | | <!-- 搜索 --> |
| | | <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> |
| | |
| | | </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"> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | </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> |
| | |
| | | <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"> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | </el-tabs> |
| | | </CustomDialog> |
| | | <!-- 图片预览 --> |
| | | <CustomPreview :show="previewVisible" :imgArr="previewImages" @close="previewVisible = false" /> |
| | | <CustomPreview |
| | | :show="previewVisible" |
| | | :imgArr="previewImages" |
| | | @close="previewVisible = false" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | getHiddenDangerDetailByType, |
| | | editResponsiblePersonByType, |
| | | } from "./service"; |
| | | import { |
| | | errorLevelMap, |
| | | errorReviewStateMap, |
| | | } from "@/utils/riskSourceMap"; |
| | | import { errorLevelMap, errorReviewStateMap } from "@/utils/riskSourceMap"; |
| | | |
| | | export default { |
| | | components: { HeaderBox }, |
| | |
| | | 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 { |
| | |
| | | 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 { |
| | |
| | | // 加载表格数据 |
| | | 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; |
| | |
| | | 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 }, |
| | | ]; |
| | | }, |
| | | |
| | |
| | | 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, |
| | |
| | | // 项目端:传递 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) { |
| | |
| | | |
| | | // 清除日期时间 |
| | | clearDateTime(type) { |
| | | if (type === 'start') { |
| | | if (type === "start") { |
| | | this.startDateTime = null; |
| | | this.startDateTxt = ""; |
| | | this.searchForm.startTime = null; |
| | |
| | | |
| | | // 获取整改状态文本 |
| | | getReformedText(reformed) { |
| | | return reformed ? "已整改" : "未整改"; |
| | | return ["未整改", "部分整改", "已整改", "未复查"][reformed]; |
| | | }, |
| | | |
| | | // 预览图片 |
| | |
| | | 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; |
| | |
| | | // 获取复查记录标签 |
| | | 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] || "-"; |
| | | }, |
| | | |
| | | // 预览复查图片(需要添加前缀) |
| | |
| | | } |
| | | // 图片没有前缀,需要根据实际情况添加图片服务器地址前缀 |
| | | // 假设图片服务器地址为 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; |
| | |
| | | |
| | | // 获取问题数量名称(取第一条数据的 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 "-"; |
| | | }, |
| | | |
| | | // 返回 |
| | |
| | | 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; |