| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346 |
- <template>
- <div class="safety-platform-container">
- <header class="safety-platform-container__header">
- <div class="breadcrumb-title"><BreadcrumbBack /> 查看危险作业申请</div>
- </header>
- <!-- <main class="safety-platform-container__main">
- <el-form ref="formRef" :model="formValue" :rules="rules" disabled label-width="160px" label-position="right">
- <div class="section-title">基础信息</div>
- <div class="form-grid">
- <el-form-item label="审批流程" prop="templateId" class="span-full">
- <el-select v-model="formValue.templateId" placeholder="请选择审批流程" size="large" clearable>
- <el-option v-for="opt in approvalOptions" :key="opt.id" :label="opt.templateName" :value="opt.id" />
- </el-select>
- </el-form-item>
- <el-form-item label="作业类型" prop="hazardOperationType">
- <el-select disabled size="large" v-model="formValue.hazardOperationType" class="w-100">
- <el-option :value="1" label="有限空间作业" />
- <el-option :value="2" label="高处作业" />
- <el-option :value="3" label="临时用电" />
- <el-option :value="4" label="动火作业" />
- </el-select>
- </el-form-item>
- <el-form-item label="申请单位" prop="applicationUnitName"
- ><el-input size="large" v-model="formValue.applicationUnitName"
- /></el-form-item>
- <el-form-item label="申请人" prop="applicantName"
- ><el-input size="large" v-model="formValue.applicantName"
- /></el-form-item>
- <el-form-item label="申请部门" prop="applicationDepartment"
- ><el-cascader
- v-model="formValue.applicationDepartmentId"
- size="large"
- ref="cascaderRef"
- :options="firstLevelDepts"
- :props="cascaderProp"
- :show-all-levels="false"
- placeholder="请选择部门名称"
- filterable
- @change="handleChangeDept"
- style="width: 100%"
- /></el-form-item>
- <el-form-item label="联系电话" prop="applicantPhone"
- ><el-input size="large" v-model="formValue.applicantPhone"
- /></el-form-item>
- <el-form-item label="备注信息" prop="remark" class="span-full">
- <el-input size="large" v-model="formValue.remark" type="textarea" :rows="2" placeholder="备注信息..." />
- </el-form-item>
- </div>
- <div class="form-line-divider"></div>
- <template v-if="formValue.hazardOperationType === 1">
- <div class="section-title">有限空间作业详情</div>
- <div class="form-grid">
- <el-form-item label="所属单位" prop="space.confinedSpaceUnit"
- ><el-input size="large" v-model="formValue.space.confinedSpaceUnit"
- /></el-form-item>
- <el-form-item label="空间名称" prop="space.confinedSpaceName"
- ><el-input size="large" v-model="formValue.space.confinedSpaceName"
- /></el-form-item>
- <el-form-item label="负责人" prop="space.unitResponsible"
- ><el-input size="large" v-model="formValue.space.unitResponsible"
- /></el-form-item>
- <el-form-item label="监护人" prop="space.supervisor"
- ><el-input size="large" v-model="formValue.space.supervisor"
- /></el-form-item>
- <el-form-item label="作业人" prop="space.operator"
- ><el-input size="large" v-model="formValue.space.operator" placeholder="多人请用逗号分隔"
- /></el-form-item>
- <el-form-item label="其他作业" prop="space.otherSpecialOps"
- ><el-input size="large" v-model="formValue.space.otherSpecialOps"
- /></el-form-item>
- <el-form-item label="开始时间" prop="space.operationStartTime"
- ><el-date-picker
- size="large"
- v-model="formValue.space.operationStartTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="结束时间" prop="space.operationEndTime"
- ><el-date-picker
- size="large"
- v-model="formValue.space.operationEndTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- </div>
- <div class="sub-group-box">
- <div class="sub-label is-required-manual section-title-flex">环境当前浓度指标 (初始评估)</div>
- <el-table :data="[formValue.space]" border class="density-table" style="margin-bottom: 20px">
- <el-table-column label="有毒有害物质 (toxicHazardous)">
- <template #default="scope">
- <el-form-item prop="space.toxicHazardous" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.toxicHazardous"
- /></el-form-item>
- </template>
- </el-table-column>
- <el-table-column label="可燃气 (flammable)">
- <template #default="scope">
- <el-form-item prop="space.flammable" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.flammable"
- /></el-form-item>
- </template>
- </el-table-column>
- <el-table-column label="氧含量 (oxygenContent)">
- <template #default="scope">
- <el-form-item prop="space.oxygenContent" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.oxygenContent"
- /></el-form-item>
- </template>
- </el-table-column>
- </el-table>
- </div>
- <div class="form-grid mt-20">
- <el-form-item label="作业内容" prop="space.operationContent" class="span-full"
- ><el-input size="large" v-model="formValue.space.operationContent" type="textarea"
- /></el-form-item>
- <el-form-item label="危害辨识" prop="space.hazardIdentification" class="span-full"
- ><el-input size="large" v-model="formValue.space.hazardIdentification" type="textarea"
- /></el-form-item>
- <el-form-item label="作业附件" class="span-full"
- ><UploadFiles
- label="上传附件"
- disabled
- @upload-success="(l) => handleUpload('space', 'attachment', l)"
- :fileList="listMap['space.attachment']"
- /></el-form-item>
- </div>
- </template>
- <template v-else-if="formValue.hazardOperationType === 2">
- <div class="section-title">高处作业详情</div>
- <div class="form-grid">
- <el-form-item label="作业地点" prop="highAltitude.operationLocation"
- ><el-input size="large" v-model="formValue.highAltitude.operationLocation"
- /></el-form-item>
- <el-form-item label="作业单位" prop="highAltitude.operationUnit"
- ><el-input size="large" v-model="formValue.highAltitude.operationUnit"
- /></el-form-item>
- <el-form-item label="作业高度(m)" prop="highAltitude.operationHeight"
- ><el-input-number
- size="large"
- v-model="formValue.highAltitude.operationHeight"
- class="w-100"
- :controls="false"
- /></el-form-item>
- <el-form-item label="作业类别" prop="highAltitude.operationType"
- ><el-input size="large" v-model="formValue.highAltitude.operationType" placeholder="如:悬挂作业"
- /></el-form-item>
- <el-form-item label="作业人姓名" prop="highAltitude.operatorName"
- ><el-input size="large" v-model="formValue.highAltitude.operatorName"
- /></el-form-item>
- <el-form-item label="监护人" prop="highAltitude.supervisor"
- ><el-input size="large" v-model="formValue.highAltitude.supervisor"
- /></el-form-item>
- <el-form-item label="开始时间" prop="highAltitude.operationStartTime"
- ><el-date-picker
- size="large"
- v-model="formValue.highAltitude.operationStartTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="结束时间" prop="highAltitude.operationEndTime"
- ><el-date-picker
- size="large"
- v-model="formValue.highAltitude.operationEndTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="作业内容" prop="highAltitude.operationContent" class="span-full"
- ><el-input size="large" v-model="formValue.highAltitude.operationContent" type="textarea"
- /></el-form-item>
- <el-form-item label="危害辨识" prop="highAltitude.hazardIdentification" class="span-full"
- ><el-input size="large" v-model="formValue.highAltitude.hazardIdentification" type="textarea"
- /></el-form-item>
- <el-form-item label="作业附件" class="span-full"
- ><UploadFiles
- label="上传附件"
- disabled
- @upload-success="(l) => handleUpload('highAltitude', 'attachment', l)"
- :fileList="listMap['highAltitude.attachment']"
- /></el-form-item>
- </div>
- </template>
- <template v-else-if="formValue.hazardOperationType === 3">
- <div class="section-title">临时用电详情</div>
- <div class="form-grid">
- <el-form-item label="需求部门" prop="electricityList.requestDepartment"
- ><el-input size="large" v-model="formValue.electricityList.requestDepartment"
- /></el-form-item>
- <el-form-item label="用电类型" prop="electricityList.electricityType">
- <el-select v-model="formValue.electricityList.electricityType" class="w-100">
- <el-option :value="1" label="长期" /><el-option :value="2" label="临时" />
- </el-select>
- </el-form-item>
- <el-form-item label="责任人" prop="electricityList.contactPerson"
- ><el-input size="large" v-model="formValue.electricityList.contactPerson"
- /></el-form-item>
- <el-form-item label="设备功率" prop="electricityList.equipmentPower"
- ><el-input size="large" v-model="formValue.electricityList.equipmentPower"
- /></el-form-item>
- <el-form-item label="开始时间" prop="electricityList.operationStartTime"
- ><el-date-picker
- size="large"
- v-model="formValue.electricityList.operationStartTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="结束时间" prop="electricityList.operationEndTime"
- ><el-date-picker
- size="large"
- v-model="formValue.electricityList.operationEndTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="保护措施" prop="electricityList.safety" class="span-full"
- ><el-input size="large" v-model="formValue.electricityList.safety"
- /></el-form-item>
- <el-form-item label="用电事由" prop="electricityList.reason" class="span-full"
- ><el-input size="large" v-model="formValue.electricityList.reason" type="textarea"
- /></el-form-item>
- <el-form-item label="申请附件" class="span-full"
- ><UploadFiles
- label="上传附件"
- disabled
- @upload-success="(l) => handleUpload('electricityList', 'attachment', l)"
- :fileList="listMap['electricityList.attachment']"
- /></el-form-item>
- </div>
- </template>
- <template v-else-if="formValue.hazardOperationType === 4">
- <div class="section-title">动火作业详情</div>
- <div class="sub-label">A. 动火任务信息</div>
- <div class="form-grid">
- <el-form-item label="动火地点" prop="hot.hotWorkLocation"
- ><el-input size="large" v-model="formValue.hot.hotWorkLocation"
- /></el-form-item>
- <el-form-item label="动火级别" prop="hot.hotWorkLevel">
- <el-select v-model="formValue.hot.hotWorkLevel" class="w-100">
- <el-option :value="1" label="一级" /><el-option :value="2" label="二级" /><el-option
- :value="3"
- label="三级"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="特殊时段" prop="hot.isSpecialPeriod">
- <el-radio-group v-model="formValue.hot.isSpecialPeriod">
- <el-radio :label="1">是 (节假日/重大活动)</el-radio>
- <el-radio :label="0">否</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="动火类型" prop="hot.hotWorkType"
- ><el-input size="large" v-model="formValue.hot.hotWorkType" placeholder="气焊/电焊/打磨等"
- /></el-form-item>
- <el-form-item label="开始时间" prop="hot.hotWorkStart"
- ><el-date-picker
- size="large"
- v-model="formValue.hot.hotWorkStart"
- value-format="YYYY-MM-DD"
- class="w-100"
- /></el-form-item>
- <el-form-item label="结束时间" prop="hot.hotWorkEnd"
- ><el-date-picker size="large" v-model="formValue.hot.hotWorkEnd" value-format="YYYY-MM-DD" class="w-100"
- /></el-form-item>
- <el-form-item label="动火任务" prop="hot.hotWorkTask" class="span-full"
- ><el-input size="large" v-model="formValue.hot.hotWorkTask" type="textarea"
- /></el-form-item>
- <el-form-item label="危险性分析" prop="hot.hazardAnalysis" class="span-full"
- ><el-input size="large" v-model="formValue.hot.hazardAnalysis" type="textarea"
- /></el-form-item>
- </div>
- <div class="sub-label">B. 责任人信息</div>
- <div class="form-grid">
- <el-form-item label="动火作业人员" prop="hot.hotWorkman"
- ><el-input size="large" v-model="formValue.hot.hotWorkman"
- /></el-form-item>
- <el-form-item label="动火人电话" prop="hot.hotWorkContact"
- ><el-input size="large" v-model="formValue.hot.hotWorkContact"
- /></el-form-item>
- <el-form-item label="施工单位监护人" prop="hot.constructionSupervisor"
- ><el-input size="large" v-model="formValue.hot.constructionSupervisor"
- /></el-form-item>
- <el-form-item label="监护人电话" prop="hot.supervisorContact"
- ><el-input size="large" v-model="formValue.hot.supervisorContact"
- /></el-form-item>
- <el-form-item label="现场负责人" prop="hot.constructionSiteLeader"
- ><el-input size="large" v-model="formValue.hot.constructionSiteLeader"
- /></el-form-item>
- <el-form-item label="教育人" prop="hot.constructionEducator"
- ><el-input size="large" v-model="formValue.hot.constructionEducator"
- /></el-form-item>
- <el-form-item label="申请部门监护人" prop="hot.hotWorkSupervisor"
- ><el-input size="large" v-model="formValue.hot.hotWorkSupervisor"
- /></el-form-item>
- <el-form-item label="部门监护电话" prop="hot.supervisorNumber"
- ><el-input size="large" v-model="formValue.hot.supervisorNumber"
- /></el-form-item>
- </div>
- <div class="sub-label">C. 防护措施与附件</div>
- <div class="form-grid">
- <el-form-item label="安全防护措施" prop="hot.fireSafetyMeasures" class="span-full"
- ><el-input size="large" v-model="formValue.hot.fireSafetyMeasures" type="textarea"
- /></el-form-item>
- <el-form-item label="现场检查情况" prop="hot.supervisorMeasures" class="span-full"
- ><el-input size="large" v-model="formValue.hot.supervisorMeasures" type="textarea"
- /></el-form-item>
- <el-form-item label="动火现场照片"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'photos', l)"
- :fileList="listMap['hot.photos']"
- /></el-form-item>
- <el-form-item label="身份证复印件"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'idCard', l)"
- :fileList="listMap['hot.idCard']"
- /></el-form-item>
- <el-form-item label="特种作业证"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'optionCard', l)"
- :fileList="listMap['hot.optionCard']"
- /></el-form-item>
- <el-form-item label="安全教育记录"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'safetyEducationPlan', l)"
- :fileList="listMap['hot.safetyEducationPlan']"
- /></el-form-item>
- <el-form-item label="施工方案"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'constructionPlan', l)"
- :fileList="listMap['hot.constructionPlan']"
- /></el-form-item>
- <el-form-item label="准备工作照片"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'preparationPhotos', l)"
- :fileList="listMap['hot.preparationPhotos']"
- /></el-form-item>
- <el-form-item label="管理协议"
- ><UploadFiles
- disabled
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'safetyManagementAgreement', l)"
- :fileList="listMap['hot.safetyManagementAgreement']"
- /></el-form-item>
- </div>
- </template>
- <div class="form-line-divider"></div>
- <div class="section-title-flex">
- <span class="is-required-manual">安全措施清单</span>
- <el-button type="primary" @click="addRow('measure')">+ 新增措施</el-button>
- </div>
- <el-table :data="formValue.measure" border class="mb-20">
- <el-table-column label="序号" prop="serialNumber" width="100" align="center" />
- <el-table-column label="措施内容"
- ><template #default="scope"><el-input v-model="scope.row.safetyMeasure" /></template
- ></el-table-column>
- <el-table-column label="确认人" width="200"
- ><template #default="scope"><el-input v-model="scope.row.confirmer" /></template
- ></el-table-column>
- <el-table-column label="操作" width="80" align="center">
- <template #default="scope"
- ><el-button type="primary" link @click="removeRow('measure', scope.$index)">删除</el-button></template
- >
- </el-table-column>
- </el-table>
- <div class="section-title-flex">
- <span class="is-required-manual">危害分析记录</span>
- <el-button type="primary" @click="addRow('analysis')">+ 新增记录</el-button>
- </div>
- <el-table :data="formValue.analysis" border>
- <el-table-column label="检测部位"
- ><template #default="scope"><el-input v-model="scope.row.analysisPosition" /></template
- ></el-table-column>
- <el-table-column label="有毒物质及浓度"
- ><template #default="scope"><el-input v-model="scope.row.toxicSubstance" /></template
- ></el-table-column>
- <el-table-column label="可燃气及浓度"
- ><template #default="scope"><el-input v-model="scope.row.flammableGas" /></template
- ></el-table-column>
- <el-table-column label="氧含量"
- ><template #default="scope"><el-input v-model="scope.row.oxygenContent" /></template
- ></el-table-column>
- <el-table-column label="检测人" width="130"
- ><template #default="scope"><el-input v-model="scope.row.analyst" /></template
- ></el-table-column>
- <el-table-column label="检测时间" width="220"
- ><template #default="scope">
- <el-date-picker
- v-model="scope.row.analysisTime"
- value-format="YYYY-MM-DD"
- style="width: 100%"
- /> </template
- ></el-table-column>
- <el-table-column label="操作" width="80" align="center">
- <template #default="scope"
- ><el-button type="primary" link @click="removeRow('analysis', scope.$index)">删除</el-button></template
- >
- </el-table-column>
- </el-table>
- </el-form>
- </main> -->
- <main class="safety-platform-container__main">
- <el-form ref="formRef" :model="formValue" :rules="rules" disabled label-width="180px" label-position="right">
- <div class="section-title">基础信息</div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="申请单位" prop="applicationUnitName"
- ><el-input size="large" placeholder="输入申请单位名称" v-model="formValue.applicationUnitName"
- /></el-form-item>
- <el-form-item label="申请人" prop="applicantName"
- ><el-input size="large" placeholder="输入申请人" v-model="formValue.applicantName"
- /></el-form-item>
- <el-form-item label="申请部门" prop="applicationDepartment"
- ><el-cascader
- v-model="formValue.applicationDepartmentId"
- size="large"
- ref="cascaderRef"
- :options="firstLevelDepts"
- :props="cascaderProp"
- :show-all-levels="false"
- placeholder="请选择申请部门"
- filterable
- @change="handleChangeDept"
- style="width: 100%"
- /></el-form-item>
- <el-form-item label="申请人电话" prop="applicantPhone"
- ><el-input size="large" placeholder="输入申请人电话" v-model="formValue.applicantPhone"
- /></el-form-item>
- <el-form-item label="危险作业类别" prop="hazardOperationType">
- <el-select size="large" v-model="formValue.hazardOperationType" placeholder="选择危险作业类别">
- <el-option :value="1" label="有限空间" />
- <el-option :value="2" label="高处作业" />
- <el-option :value="3" label="临时用电" />
- <el-option :value="4" label="动火作业" />
- </el-select>
- </el-form-item>
- <el-form-item label="审批流程" prop="templateId" class="span-full">
- <el-select v-model="formValue.templateId" placeholder="请选择审批流程" size="large" clearable>
- <el-option v-for="opt in approvalOptions" :key="opt.id" :label="opt.templateName" :value="opt.id" />
- </el-select>
- </el-form-item>
- <!-- <el-form-item label="备注信息" prop="remark" class="span-full">
- <el-input size="large" v-model="formValue.remark" type="textarea" :rows="2" placeholder="备注信息..." />
- </el-form-item> -->
- </div>
- <div class="form-line-divider"></div>
- <template v-if="formValue.hazardOperationType === 1">
- <div class="section-title">有限空间作业详情</div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="有限空间所属单位" prop="space.confinedSpaceUnit"
- ><el-input size="large" placeholder="输入有限空间所属单位" v-model="formValue.space.confinedSpaceUnit"
- /></el-form-item>
- <el-form-item label="有限空间名称" prop="space.confinedSpaceName"
- ><el-input size="large" placeholder="输入有限空间名称" v-model="formValue.space.confinedSpaceName"
- /></el-form-item>
- <el-form-item label="作业内容" prop="space.operationContent" class="span-full"
- ><el-input size="large" placeholder="输入作业内容" v-model="formValue.space.operationContent" type="textarea"
- /></el-form-item>
- <el-form-item label="作业开始时间" prop="space.operationStartTime"
- ><el-date-picker
- size="large"
- v-model="formValue.space.operationStartTime"
- value-format="YYYY-MM-DD"
- placeholder="作业开始时间"
- style="width: 100%"
- /></el-form-item>
- <el-form-item label="作业结束时间" prop="space.operationEndTime"
- ><el-date-picker
- size="large"
- v-model="formValue.space.operationEndTime"
- placeholder="作业结束时间"
- value-format="YYYY-MM-DD"
- style="width: 100%"
- /></el-form-item>
- <el-form-item label="作业单位负责人" prop="space.unitResponsible"
- ><el-input size="large" placeholder="输入作业单位负责人" v-model="formValue.space.unitResponsible"
- /></el-form-item>
- <el-form-item label="监护人" prop="space.supervisor"
- ><el-input size="large" placeholder="输入监护人" v-model="formValue.space.supervisor"
- /></el-form-item>
- <el-form-item label="作业人" prop="space.operator"
- ><el-input size="large" placeholder="输入作业人" v-model="formValue.space.operator"
- /></el-form-item>
- <el-form-item label="涉及其它特殊作业" prop="space.otherSpecialOps"
- ><el-input size="large" placeholder="输入涉及其它特殊作业" v-model="formValue.space.otherSpecialOps"
- /></el-form-item>
- <el-form-item label="危害辨识" prop="space.hazardIdentification" class="span-full"
- ><el-input size="large" placeholder="输入危害辨识" v-model="formValue.space.hazardIdentification" type="textarea"
- /></el-form-item>
- <el-form-item label="作业附件" class="span-full" prop="space.attachment">
- <!-- <UploadFiles
- label="上传附件"
- disabled
- @upload-success="(l) => handleUpload('space', 'attachment', l)"
- :fileList="listMap['space.attachment']"
- /> -->
- <div class="file-list" v-if="listMap['space.attachment'].length > 0">
- <div v-for="file in listMap['space.attachment']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- </div>
- <div class="sub-group-box">
- <div class="sub-label is-required-manual section-title-flex">项目分析-物质分析标准</div>
- <el-table :data="[formValue.space]" border class="density-table" style="margin-bottom: 20px">
- <el-table-column label="有毒有害介质">
- <template #default="scope">
- <el-form-item prop="space.toxicHazardous" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.toxicHazardous"
- /></el-form-item>
- </template>
- </el-table-column>
- <el-table-column label="可燃气">
- <template #default="scope">
- <el-form-item prop="space.flammable" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.flammable"
- /></el-form-item>
- </template>
- </el-table-column>
- <el-table-column label="氧含量">
- <template #default="scope">
- <el-form-item prop="space.oxygenContent" :rules="r" label-width="0" class="m-0"
- ><el-input v-model="scope.row.oxygenContent"
- /></el-form-item>
- </template>
- </el-table-column>
- </el-table>
- </div>
- <div class="section-title-flex">
- <span class="is-required-manual">项目分析-危害分析记录</span>
- <el-button type="primary" @click="addRow('analysis')">+ 新增记录</el-button>
- </div>
- <el-table :data="formValue.analysis" border>
- <el-table-column label="有毒有害介质"
- ><template #default="scope"><el-input v-model="scope.row.toxicSubstance" /></template
- ></el-table-column>
- <el-table-column label="可燃气"
- ><template #default="scope"><el-input v-model="scope.row.flammableGas" /></template
- ></el-table-column>
- <el-table-column label="氧含量"
- ><template #default="scope"><el-input v-model="scope.row.oxygenContent" /></template
- ></el-table-column>
- <el-table-column label="部位"
- ><template #default="scope"><el-input v-model="scope.row.analysisPosition" /></template
- ></el-table-column>
- <el-table-column label="分析人" width="130"
- ><template #default="scope"><el-input v-model="scope.row.analyst" /></template
- ></el-table-column>
- <el-table-column label="时间" width="220"
- ><template #default="scope">
- <el-date-picker
- v-model="scope.row.analysisTime"
- value-format="YYYY-MM-DD"
- style="width: 100%"
- /> </template
- ></el-table-column>
- <el-table-column label="操作" width="100" align="center">
- <template #default="scope"
- ><el-button type="primary" link @click="removeRow('analysis', scope.$index)">删除</el-button></template
- >
- </el-table-column>
- </el-table>
- </template>
- <template v-else-if="formValue.hazardOperationType === 2">
- <div class="section-title">高处作业详情</div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="作业地点" prop="highAltitude.operationLocation"
- ><el-input size="large" placeholder="输入作业地点" v-model="formValue.highAltitude.operationLocation"
- /></el-form-item>
- <el-form-item label="作业开始时间" prop="highAltitude.operationStartTime"
- ><el-date-picker
- size="large"
- v-model="formValue.highAltitude.operationStartTime"
- value-format="YYYY-MM-DD"
- placeholder="作业开始时间"
- style="width:100%"
- /></el-form-item>
- <el-form-item label="作业结束时间" prop="highAltitude.operationEndTime"
- ><el-date-picker
- size="large"
- v-model="formValue.highAltitude.operationEndTime"
- value-format="YYYY-MM-DD"
- placeholder="作业结束时间"
- style="width:100%"
- /></el-form-item>
- <el-form-item label="作业内容" prop="highAltitude.operationContent" class="span-full"
- ><el-input size="large" placeholder="输入作业内容" v-model="formValue.highAltitude.operationContent" type="textarea"
- /></el-form-item>
- <el-form-item label="作业高度" prop="highAltitude.operationHeight"
- ><el-input-number
- size="large"
- placeholder="输入作业高度"
- v-model="formValue.highAltitude.operationHeight"
- style="width:100%"
- :controls="false"
- /></el-form-item>
- <el-form-item label="作业单位" prop="highAltitude.operationUnit"
- ><el-input size="large" placeholder="输入作业单位" v-model="formValue.highAltitude.operationUnit"
- /></el-form-item>
-
- <el-form-item label="作业类别" prop="highAltitude.operationType"
- ><el-input size="large" v-model="formValue.highAltitude.operationType" placeholder="输入作业类别"
- /></el-form-item>
- <el-form-item label="作业人" prop="highAltitude.operatorName"
- ><el-input size="large" placeholder="输入作业人" v-model="formValue.highAltitude.operatorName"
- /></el-form-item>
- <el-form-item label="监护人" prop="highAltitude.supervisor"
- ><el-input size="large" placeholder="输入监护人" v-model="formValue.highAltitude.supervisor"
- /></el-form-item>
- <el-form-item label="涉及其它特殊作业" prop="highAltitude.operatorJob"
- ><el-input size="large" placeholder="输入涉及其它特殊作业" v-model="formValue.highAltitude.operatorJob"
- /></el-form-item>
- <el-form-item label="危害辨识" prop="highAltitude.hazardIdentification" class="span-full"
- ><el-input size="large" placeholder="输入危害辨识" v-model="formValue.highAltitude.hazardIdentification" type="textarea"
- /></el-form-item>
- <el-form-item label="作业附件" class="span-full" prop="highAltitude.attachment">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('highAltitude', 'attachment', l)"
- :fileList="listMap['highAltitude.attachment']"
- /> -->
- <div class="file-list" v-if="listMap['highAltitude.attachment'].length > 0">
- <div v-for="file in listMap['highAltitude.attachment']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- </div>
- </template>
- <template v-else-if="formValue.hazardOperationType === 3">
- <div class="section-title">临时用电详情</div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="需求部门/IPT团队" prop="electricityList.requestDepartment"
- ><el-input size="large" placeholder="输入需求部门/IPT团队" v-model="formValue.electricityList.requestDepartment"
- /></el-form-item>
- <el-form-item label="接用电性质" prop="electricityList.electricityType">
- <el-select v-model="formValue.electricityList.electricityType" class="w-100">
- <el-option :value="1" label="长期" />
- <el-option :value="2" label="临时" />
- </el-select>
- </el-form-item>
- <el-form-item label="作业开始时间" prop="electricityList.operationStartTime"
- ><el-date-picker
- size="large"
- placeholder="作业开始时间"
- v-model="formValue.electricityList.operationStartTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- style="width: 100%;"
- /></el-form-item>
- <el-form-item label="作业结束时间" prop="electricityList.operationEndTime"
- ><el-date-picker
- size="large"
- placeholder="作业结束时间"
- v-model="formValue.electricityList.operationEndTime"
- value-format="YYYY-MM-DD"
- class="w-100"
- style="width:100%"
- /></el-form-item>
- <el-form-item label="事由" prop="electricityList.reason" class="span-full"
- ><el-input size="large" placeholder="输入事由" v-model="formValue.electricityList.reason" type="textarea" rows="3" show-word-limit maxlength="300"
- /></el-form-item>
- <el-form-item label="责任人及联系方式" prop="electricityList.contactPerson"
- ><el-input size="large" placeholder="输入责任人及联系方式" v-model="formValue.electricityList.contactPerson" type="textarea" rows="3" show-word-limit maxlength="300"
- /></el-form-item>
- <el-form-item label="设备及功率" prop="electricityList.equipmentPower"
- ><el-input size="large" placeholder="输入设备及功率" v-model="formValue.electricityList.equipmentPower" type="textarea" rows="3" show-word-limit maxlength="300"
- /></el-form-item>
-
- <el-form-item label="保护措施" prop="electricityList.safety" class="span-full"
- ><el-input size="large" placeholder="输入保护措施" v-model="formValue.electricityList.safety" type="textarea" rows="3" show-word-limit maxlength="300"
- /></el-form-item>
-
- <el-form-item label="需求部门负责人" prop="electricityList.deptManager" class="span-full"
- ><el-input size="large" placeholder="输入需求部门负责人" v-model="formValue.electricityList.deptManager"
- /></el-form-item>
- <el-form-item label="建设管理部负责人" prop="electricityList.constructionManager" class="span-full"
- ><el-input size="large" placeholder="输入建设管理部负责人" v-model="formValue.electricityList.constructionManager"
- /></el-form-item>
- <el-form-item label="申请附件" class="span-full" prop="electricityList.attachment">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('electricityList', 'attachment', l)"
- :fileList="listMap['electricityList.attachment']"
- /> -->
- <div class="file-list" v-if="listMap['electricityList.attachment'].length > 0">
- <div v-for="file in listMap['electricityList.attachment']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- </div>
- </template>
- <template v-else-if="formValue.hazardOperationType === 4">
- <div class="section-title">动火作业详情</div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="动火作业地点" prop="hot.hotWorkLocation"
- ><el-input size="large" placeholder="输入动火作业地点" v-model="formValue.hot.hotWorkLocation"
- /></el-form-item>
- <el-form-item label="动火级别" prop="hot.hotWorkLevel">
- <el-select v-model="formValue.hot.hotWorkLevel" class="w-100" >
- <el-option :value="1" label="一级" />
- <el-option :value="2" label="二级" />
- <el-option :value="3" label="三级" />
- </el-select>
- </el-form-item>
- <el-form-item label="是否节假日、重大活动及公司启动一级响应期间" prop="hot.isSpecialPeriod">
- <el-radio-group v-model="formValue.hot.isSpecialPeriod">
- <el-radio :value="1">是</el-radio>
- <el-radio :value="0">否</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="动火时间起" prop="hot.hotWorkStart"
- ><el-date-picker
- size="large"
- placeholder="输入动火时间起"
- v-model="formValue.hot.hotWorkStart"
- value-format="YYYY-MM-DD"
- style="width:100%"
- /></el-form-item>
- <el-form-item label="动火时间止" prop="hot.hotWorkEnd"
- ><el-date-picker size="large" placeholder="动火时间止" v-model="formValue.hot.hotWorkEnd" value-format="YYYY-MM-DD" style="width:100%"
- /></el-form-item>
- <el-form-item label="动火任务" prop="hot.hotWorkTask" class="span-full"
- ><el-input size="large" placeholder="输入动火任务" v-model="formValue.hot.hotWorkTask"
- /></el-form-item>
- <el-form-item label="动火类型" prop="hot.hotWorkType"
- ><el-input size="large" v-model="formValue.hot.hotWorkType" placeholder="输入动火类型"
- /></el-form-item>
- <el-form-item label="动火作业人员" prop="hot.hotWorkman"
- ><el-input size="large" placeholder="输入动火作业人员" v-model="formValue.hot.hotWorkman"
- /></el-form-item>
- <el-form-item label="动火人联系电话" prop="hot.hotWorkContact"
- ><el-input size="large" placeholder="输入动火人联系电话" v-model="formValue.hot.hotWorkContact"
- /></el-form-item>
- <el-form-item label="动火危险性分析" prop="hot.hazardAnalysis" class="span-full"
- ><el-input size="large" placeholder="输入动火危险性分析" v-model="formValue.hot.hazardAnalysis"
- /></el-form-item>
- <el-form-item label="消防安全防护措施" prop="hot.fireSafetyMeasures" class="span-full"
- ><el-input size="large" placeholder="输入消防安全防护措施" v-model="formValue.hot.fireSafetyMeasures"
- /></el-form-item>
- </div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="施工单位指定动火监护人" prop="hot.constructionSupervisor"
- ><el-input size="large" placeholder="输入施工单位指定动火监护人" v-model="formValue.hot.constructionSupervisor"
- /></el-form-item>
- <el-form-item label="施工单位指定动火监护人联系电话" prop="hot.supervisorContact"
- ><el-input size="large" placeholder="输入施工单位指定动火监护人联系电话" v-model="formValue.hot.supervisorContact"
- /></el-form-item>
- <el-form-item label="施工单位现场负责人" prop="hot.constructionSiteLeader"
- ><el-input size="large" placeholder="输入施工单位现场负责人" v-model="formValue.hot.constructionSiteLeader"
- /></el-form-item>
- <el-form-item label="施工单位教育人" prop="hot.constructionEducator"
- ><el-input size="large" placeholder="输入施工单位教育人" v-model="formValue.hot.constructionEducator"
- /></el-form-item>
- <el-form-item label="申请部门指定动火监护人" prop="hot.hotWorkSupervisor"
- ><el-input size="large" placeholder="输入申请部门指定动火监护人" v-model="formValue.hot.hotWorkSupervisor"
- /></el-form-item>
- <el-form-item label="申请部门指定动火监护人联系电话" prop="hot.supervisorNumber"
- ><el-input size="large" placeholder="输入申请部门指定动火监护人联系电话" v-model="formValue.hot.supervisorNumber"
- /></el-form-item>
- </div>
- <div class="form-grid" style="width:50%">
- <el-form-item label="动火操作现场防护措施及检查情况" prop="hot.supervisorMeasures" class="span-full"
- ><el-input size="large" placeholder="输入动火操作现场防护措施及检查情况" v-model="formValue.hot.supervisorMeasures" type="textarea"
- /></el-form-item>
- <el-form-item label="动火现场检查照片" prop="hot.photos">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'photos', l)"
- :fileList="listMap['hot.photos']"
- /> -->
- <div class="file-list" v-if="listMap['hot.photos'].length > 0">
- <div v-for="file in listMap['hot.photos']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="身份证复印件" prop="hot.idCard">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'idCard', l)"
- :fileList="listMap['hot.idCard']"
- /> -->
- <div class="file-list" v-if="listMap['hot.idCard'].length > 0">
- <div v-for="file in listMap['hot.idCard']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="动火人特种作业操作证复印件" prop="hot.optionCard">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'optionCard', l)"
- :fileList="listMap['hot.optionCard']"
- /> -->
- <div class="file-list" v-if="listMap['hot.optionCard'].length > 0">
- <div v-for="file in listMap['hot.optionCard']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="动火安全教育记录" prop="hot.safetyEducationPlan">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'safetyEducationPlan', l)"
- :fileList="listMap['hot.safetyEducationPlan']"
- /> -->
- <div class="file-list" v-if="listMap['hot.safetyEducationPlan'].length > 0">
- <div v-for="file in listMap['hot.safetyEducationPlan']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="动火作业施工方案" prop="hot.constructionPlan">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'constructionPlan', l)"
- :fileList="listMap['hot.constructionPlan']"
- /> -->
- <div class="file-list" v-if="listMap['hot.constructionPlan'].length > 0">
- <div v-for="file in listMap['hot.constructionPlan']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="动火作业场所准备照片" prop="hot.preparationPhotos">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'preparationPhotos', l)"
- :fileList="listMap['hot.preparationPhotos']"
- /> -->
- <div class="file-list" v-if="listMap['hot.preparationPhotos'].length > 0">
- <div v-for="file in listMap['hot.preparationPhotos']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="特种行业操作证网上查询情况照片" prop="hot.operationCertificates">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'operationCertificates', l)"
- :fileList="listMap['hot.operationCertificates']"
- /> -->
- <div class="file-list" v-if="listMap['hot.operationCertificates'].length > 0">
- <div v-for="file in listMap['hot.operationCertificates']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- <el-form-item label="动火作业安全管理协议" prop="hot.safetyManagementAgreement">
- <!-- <UploadFiles
- label="上传附件"
- @upload-success="(l) => handleUpload('hot', 'safetyManagementAgreement', l)"
- :fileList="listMap['hot.safetyManagementAgreement']"
- /> -->
- <div class="file-list" v-if="listMap['hot.safetyManagementAgreement'].length > 0">
- <div v-for="file in listMap['hot.safetyManagementAgreement']" :key="file.fileId" class="file-item">
- <div class="file-info">
- <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
- <span class="file-name">{{ file.fileName }}</span>
- </div>
- <div link class="fileAction" @click="previewOnline(file.fileUrl, file.fileType as keyof typeof FILE_TYPE_ICON)">预览</div>
- <div link class="fileAction" @click.stop="downloadFile(file.fileUrl, file.fileName)">下载</div>
- </div>
- </div>
- </el-form-item>
- </div>
- </template>
- <div class="form-line-divider"></div>
- <div v-if="formValue.hazardOperationType < 3">
- <div class="section-title-flex">
- <span class="is-required-manual">安全措施</span>
- <el-button type="primary" @click="addRow('measure')">+ 新增措施</el-button>
- </div>
- <el-table :data="formValue.measure" border class="mb-20">
- <el-table-column label="序号" prop="serialNumber" width="100" align="center" />
- <el-table-column label="安全措施"
- ><template #default="scope"><el-input placeholder="输入安全措施" v-model="scope.row.safetyMeasure" /></template
- ></el-table-column>
- <el-table-column label="确认人" width="200"
- ><template #default="scope"><el-input placeholder="输入确认人" v-model="scope.row.confirmer" /></template
- ></el-table-column>
- <el-table-column label="操作" width="100" align="center">
- <template #default="scope"
- ><el-button type="primary" link @click="removeRow('measure', scope.$index)">删除</el-button></template
- >
- </el-table-column>
- </el-table>
- </div>
- </el-form>
- </main>
- <footer class="safety-platform-container__footer">
- <el-button size="large" @click="router.back()">返回</el-button>
- </footer>
- <PreviewOnline ref="previewOnlineRef" />
- </div>
- </template>
- <script lang="ts" setup>
- import { ref, reactive, onMounted, nextTick } from 'vue';
- import { useRouter, useRoute } from 'vue-router';
- import { ElMessage } from 'element-plus';
- import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
- import { getAllApproval } from '@/api/approval/approval';
- import { dangerWorkQueryDetail } from '@/api/production-safety/responsibility-implementation';
- import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
- import { getAllDepartments } from '@/api/auth/dept';
- import { unformatAttachment, formatAttachmentList } from '@/components/UploadFiles/utils';
- import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
- import { FILE_TYPE_ICON } from '@/components/UploadFiles/constants';
- import type { FileItem } from '@/components/UploadFiles/types';
- import { downloadFile } from '@/views/disaster/utils';
- const router = useRouter();
- const route = useRoute();
- const formRef = ref<any>(null);
- const detailId = route.query.id as string;
- const approvalOptions = ref<any[]>([]);
- const firstLevelDepts = ref<any[]>([]);
- const cascaderRef = ref<any>(null);
- const cascaderProp = { expandTrigger: 'click', checkStrictly: true, value: 'id', label: 'deptName' };
- /**
- * 1. 附件显示映射 (仅用于组件内部回显显示)
- */
- const listMap = reactive<any>({
- 'space.attachment': [],
- 'highAltitude.attachment': [],
- 'electricityList.attachment': [],
- 'hot.photos': [],
- 'hot.idCard': [],
- 'hot.optionCard': [],
- 'hot.safetyEducationPlan': [],
- 'hot.constructionPlan': [],
- 'hot.preparationPhotos': [],
- 'hot.operationCertificates': [],
- 'hot.safetyManagementAgreement': [],
- });
- /**
- * 2. 初始化表单数据结构 (保持深度对象存在)
- */
- const formValue = reactive<any>({
- id: detailId,
- templateId: '',
- applicationDepartment: '',
- applicationDepartmentId: [],
- applicationUnitName: '',
- applicantName: '',
- applicantPhone: '',
- hazardOperationType: '',
- remark: '',
- // 必须预设这些对象,防止赋值时路径不存在
- space: { attachment: '' },
- highAltitude: { attachment: '' },
- electricityList: { attachment: '' },
- hot: {
- photos: '',
- idCard: '',
- optionCard: '',
- safetyEducationPlan: '',
- constructionPlan: '',
- preparationPhotos: '',
- operationCertificates: '',
- safetyManagementAgreement: '',
- },
- measure: [],
- analysis: [],
- });
- const r = { required: true, message: '此项必填', trigger: ['blur', 'change'] };
- const rules = reactive({
- templateId: [r],
- applicationUnitName: [r],
- applicantName: [r],
- applicationDepartment: [r],
- applicantPhone: [r],
- hazardOperationType:[r],
- remark: [r],
- // 有限空间
- 'space.confinedSpaceUnit': [r],
- 'space.confinedSpaceName': [r],
- 'space.unitResponsible': [r],
- 'space.supervisor': [r],
- 'space.operator': [r],
- 'space.otherSpecialOps': [r],
- 'space.operationStartTime': [r],
- 'space.operationEndTime': [r],
- 'space.operationContent': [r],
- 'space.hazardIdentification': [r],
- 'space.attachment':[r],
- // 高处作业
- 'highAltitude.operationLocation': [r],
- 'highAltitude.operationUnit': [r],
- 'highAltitude.operationHeight': [r],
- 'highAltitude.operationType': [r],
- 'highAltitude.operatorName': [r],
- 'highAltitude.supervisor': [r],
- 'highAltitude.operationStartTime': [r],
- 'highAltitude.operationEndTime': [r],
- 'highAltitude.operationContent': [r],
- 'highAltitude.hazardIdentification': [r],
- 'highAltitude.operatorJob':[r],
- 'highAltitude.attachment':[r],
- // 临时用电
- 'electricityList.requestDepartment': [r],
- 'electricityList.electricityType': [r],
- 'electricityList.contactPerson': [r],
- 'electricityList.equipmentPower': [r],
- 'electricityList.operationStartTime': [r],
- 'electricityList.operationEndTime': [r],
- 'electricityList.safety': [r],
- 'electricityList.deptManager': [r],
- 'electricityList.constructionManager':[r],
- 'electricityList.reason': [r],
- 'electricityList.attachment': [r],
- // 动火作业
- 'hot.hotWorkLocation': [r],
- 'hot.hotWorkLevel': [r],
- 'hot.isSpecialPeriod':[r],
- 'hot.hotWorkType': [r],
- 'hot.hotWorkStart': [r],
- 'hot.hotWorkEnd': [r],
- 'hot.hotWorkman': [r],
- 'hot.hotWorkContact': [r],
- 'hot.constructionSupervisor': [r],
- 'hot.supervisorContact': [r],
- 'hot.constructionSiteLeader': [r],
- 'hot.constructionEducator': [r],
- 'hot.hotWorkSupervisor': [r],
- 'hot.supervisorNumber': [r],
- 'hot.hotWorkTask': [r],
- 'hot.hazardAnalysis': [r],
- 'hot.fireSafetyMeasures': [r],
- 'hot.supervisorMeasures': [r],
- // 动火附件
- 'hot.photos': [r],
- 'hot.idCard': [r],
- 'hot.optionCard': [r],
- 'hot.safetyEducationPlan': [r],
- 'hot.constructionPlan': [r],
- 'hot.preparationPhotos': [r],
- 'hot.operationCertificates': [r],
- 'hot.safetyManagementAgreement': [r],
- });
- /**
- * 3. 关键:上传成功回调
- * @param obj 对应的对象名 (如 'space')
- * @param key 对应的字段名 (如 'attachment')
- * @param list 组件返回的最新的 fileList 数组
- */
- const handleUpload = async (obj: string, key: string, list: any[]) => {
- listMap[`${obj}.${key}`] = list;
- if (formValue[obj]) {
- const formatted = await formatAttachmentList(list);
- formValue[obj][key] = formatted.length > 0 ? JSON.stringify(formatted) : '';
- }
- };
- /**
- * 4. 详情回显
- */
- const getDetail = async () => {
- if (!detailId) return;
- try {
- const res = await dangerWorkQueryDetail(detailId);
- res.applicationDepartmentId = JSON.parse(res.applicationDepartmentId)
- // 1. 基础属性拷贝
- Object.assign(formValue, res);
- // 2. 等待 DOM 和 v-if 完成渲染 (确保 Upload 控件已经挂载)
- await nextTick();
- const typeKeyMap: any = { 1: 'space', 2: 'highAltitude', 3: 'electricityList', 4: 'hot' };
- const activeObjName = typeKeyMap[formValue.hazardOperationType];
- if (!activeObjName) return;
- // 3. 附件处理逻辑
- Object.keys(listMap).forEach((path) => {
- // 检查当前路径是否属于选中的作业类型 (例如 "space.attachment")
- if (path.startsWith(activeObjName)) {
- const [objName, fieldName] = path.split('.');
- // 拿到后端返回的原始字段值 (通常是字符串)
- const rawValue = formValue[objName]?.[fieldName];
- if (rawValue) {
- // 【核心修改】:调用你的解析函数,将字符串转为数组
- // 确保 unformatAttachment 函数已在当前作用域可用
- listMap[path] = unformatAttachment(rawValue);
- console.log(`附件解析成功 [${path}]:`, listMap[path]);
- }
- }
- });
- } catch (err) {
- console.error('详情加载失败:', err);
- // ElMessage.error('详情回显失败');
- }
- };
- // 预览
- const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
- const previewOnline = (url: string | undefined, type: keyof typeof FILE_TYPE_ICON) => {
- if (url) {
- previewOnlineRef.value?.open(url, type);
- }
- };
- /**
- * 辅助:表格行操作
- */
- const addRow = (type: 'measure' | 'analysis') => {
- if (type === 'measure') {
- formValue.measure.push({ serialNumber: formValue.measure.length + 1, safetyMeasure: '', confirmer: '' });
- } else {
- formValue.analysis.push({
- toxicSubstance: '',
- flammableGas: '',
- oxygenContent: '',
- analysisTime: '',
- analysisPosition: '',
- analyst: '',
- });
- }
- };
- const removeRow = (type: 'measure' | 'analysis', index: number) => {
- formValue[type].splice(index, 1);
- if (type === 'measure') {
- formValue.measure.forEach((item: any, i: number) => (item.serialNumber = i + 1));
- }
- };
- const handleChangeDept = () => {
- const node = cascaderRef.value?.getCheckedNodes()?.[0];
- if (node) {
- formValue.applicationDepartment = node.label;
- formValue.applicationDepartmentId = node.pathValues;
- }
- };
- onMounted(async () => {
- const [depts, approvals] = await Promise.all([getAllDepartments(), getAllApproval()]);
- firstLevelDepts.value = formatDeptTree(depts);
- approvalOptions.value = approvals || [];
- getDetail();
- });
- </script>
- <style lang="scss" scoped>
- @use '@/styles/page-main-layout.scss' as *;
- @use '@/styles/page-details-layout.scss' as *;
- .safety-platform-container {
- .section-title-flex {
- display: flex;
- justify-content: space-between;
- margin: 15px 0;
- }
- &__main {
- padding: 24px;
- background-color: #fff;
- }
- :deep(.el-form-item) {
- margin-right: 20px;
- margin-bottom: 24px;
- vertical-align: top;
- .el-form-item__label {
- font-weight: bold;
- }
- }
- }
- .file-list {
- margin-top: 16px;
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- &:first-child {
- margin-top: 0;
- }
- }
- .file-item {
- @include flex-center;
- justify-content: space-between;
- gap: 10px;
- height: 32px;
- border: 1px solid #e5e7eb;
- border-radius: 6px;
- padding: 12px;
- transition: all 0.2s ease;
- &:hover {
- background-color: #f8fafc;
- }
- }
- .file-info {
- display: flex;
- align-items: center;
- gap: 8px;
- img {
- width: 10px;
- }
- }
- .file-name {
- flex: 1;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-size: 14px;
- color: rgba($text-color, 0.65);
- }
- .fileAction {
- width: 60px;
- text-align: center;
- cursor: pointer;
- color: #1777ff;
- }
- .delete-button {
- color: #ef4444;
- background: none;
- border: none;
- cursor: pointer;
- font-size: 12px;
- }
- :deep(.preview-img){
- overflow: auto;
- img {
- max-height: 90vh;
- }
- }
- </style>
|