widget.vue 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197
  1. <template>
  2. <div class="engineering-manage" @keyup.enter="searchApi">
  3. <!-- 检测报告管理 -->
  4. <div class="table-box">
  5. <div class="top-tool">
  6. <div class="serch-engineering">
  7. <div class="title">关键字:</div>
  8. <el-input
  9. size="small"
  10. placeholder="请输入工程、地点、报告名称"
  11. v-model="searchValue.serchValue"
  12. clearable
  13. class="serch-input"
  14. >
  15. </el-input>
  16. <!-- <div class="title">检测日期:</div>
  17. <div class="sampleTime">
  18. <el-row style="display: flex; justify-content: center; align-items: center">
  19. <el-col :span="11">
  20. <el-date-picker
  21. v-model="searchValue.startDate"
  22. type="date"
  23. placeholder="选择开始日期"
  24. value-format="yyyy-MM-dd"
  25. size="small"
  26. :picker-options="sOpition"
  27. @change="sDateChange"
  28. ></el-date-picker>
  29. </el-col>
  30. <el-col :span="1" style="text-align: center; margin: 0 5px">至</el-col>
  31. <el-col :span="12">
  32. <el-date-picker
  33. v-model="searchValue.finishDate"
  34. type="date"
  35. placeholder="选择结束日期"
  36. value-format="yyyy-MM-dd"
  37. size="small"
  38. :picker-options="eOpition"
  39. @change="eDateChange"
  40. ></el-date-picker>
  41. </el-col>
  42. </el-row>
  43. </div> -->
  44. <div class="release-radio">
  45. <p class="release-title">发布状态:</p>
  46. <el-checkbox-group v-model="searchValue.checkList">
  47. <el-checkbox label="0">未发布</el-checkbox>
  48. <el-checkbox label="1">已发布</el-checkbox>
  49. </el-checkbox-group>
  50. <!-- <el-radio v-model="searchValue.checkList" label="0">未发布</el-radio> -->
  51. <!-- <el-radio v-model="searchValue.checkList" label="1">已发布</el-radio> -->
  52. </div>
  53. <el-button size="small" type="primary" @click="searchApi"> 搜索 </el-button>
  54. <el-button size="small" type="primary" @click="resetDate"> 重置 </el-button>
  55. </div>
  56. <div class="right-btn">
  57. <el-button size="small" type="primary" @click="showUpdata">报告上传</el-button>
  58. <!-- <el-button type="primary" @click="dialogFormVisible2 = true">视频上传</el-button> -->
  59. <el-button size="small" type="primary" @click="videoShowUpdata">视频上传</el-button>
  60. <el-button
  61. size="small"
  62. type="primary"
  63. :disabled="!multipleSelection.length"
  64. @click="batchReleaseDialog = true"
  65. >批量发布</el-button
  66. >
  67. <el-button
  68. size="small"
  69. type="danger"
  70. :disabled="!multipleSelection.length"
  71. @click="removeBtn"
  72. >删除</el-button
  73. >
  74. </div>
  75. </div>
  76. <!-- <el-empty description="暂无数据" v-if="!tableData"></el-empty> -->
  77. <el-table
  78. ref="multipleTable"
  79. :data="tableData"
  80. tooltip-effect="dark"
  81. height="250"
  82. stripe
  83. style="width: 100%"
  84. @selection-change="handleSelectionChange"
  85. @row-dblclick="openDetails"
  86. @row-click="lightFea"
  87. :row-style="{ height: '40px' }"
  88. :default-sort="{ prop: 'date', order: 'descending' }"
  89. >
  90. <template slot="empty">
  91. <img src="@/assets/icon/null.png" alt="暂无数据" />
  92. </template>
  93. <el-table-column header-align="center" :selectable="checkSelect" align="center" type="selection" width="55">
  94. </el-table-column>
  95. <el-table-column align="center" type="index" label="序号" width="50"> </el-table-column>
  96. <el-table-column
  97. :prop="v.name"
  98. header-align="center"
  99. :label="v.label"
  100. align="center"
  101. show-overflow-tooltip
  102. v-for="v in tableContent"
  103. :key="v.name"
  104. :sortable="v.sortable"
  105. >
  106. </el-table-column>
  107. <el-table-column prop="state" header-align="center" label="发布状态" align="center" show-overflow-tooltip>
  108. <template slot-scope="scope">
  109. <span :class="{ stateRedClass: scope.row.state == '0', stateGreenClass: scope.row.state == '1' }">{{
  110. scope.row.state | filter_state
  111. }}</span>
  112. </template>
  113. </el-table-column>
  114. <el-table-column fixed="right" header-align="center" label="操作" align="center" width="100">
  115. <template slot-scope="scope">
  116. <el-button
  117. type="text"
  118. size="small"
  119. :wu="scope"
  120. v-if="scope.row.state == '1'"
  121. @click.stop="withdrawBtn(scope.row.id, true)"
  122. >撤回</el-button
  123. >
  124. <el-button
  125. type="text"
  126. size="small"
  127. :wu="scope"
  128. v-if="scope.row.state == '0'"
  129. @click.stop="testReportDetails(scope.row, true)"
  130. >发布</el-button
  131. >
  132. <el-button
  133. type="text"
  134. size="small"
  135. :wu="scope"
  136. style="margin-left: 10px"
  137. @click.stop="testReportDetails(scope.row)"
  138. >详情</el-button
  139. >
  140. </template>
  141. </el-table-column>
  142. </el-table>
  143. <div>
  144. <el-pagination
  145. @size-change="handleSizeChange"
  146. @current-change="handleCurrentChange"
  147. :current-page="pagination.current"
  148. :page-sizes="[10, 20, 30, 50, 100, 1000]"
  149. :page-size="pagination.size"
  150. layout="total, sizes, prev, pager, next, jumper"
  151. :total="paginationTotal"
  152. >
  153. </el-pagination>
  154. </div>
  155. </div>
  156. <!-- 批量发布 -->
  157. <div class="delete-box">
  158. <!-- 删除提示框 -->
  159. <el-dialog title="提示" :visible.sync="batchReleaseDialog" width="30%" :modal='false'>
  160. <div style="display: flex; align-items: center">
  161. <!-- <i class="el-icon-info" style="color: #e6a23c"></i> -->
  162. <span class="iconfont icondtbz" style="font-size: 22px; color: #e6a23c"></span>
  163. &nbsp; 确认要发布选中的{{ multipleSelection.length }}条检测报告吗?
  164. </div>
  165. <span slot="footer" class="dialog-footer">
  166. <el-button size="small" @click="batchReleaseDialog = false">取 消</el-button>
  167. <el-button size="small" type="primary" @click="confirmRelease">确 定</el-button>
  168. </span>
  169. </el-dialog>
  170. </div>
  171. <!-- 报告上传 -->
  172. <div class="public-box">
  173. <el-dialog title="检测报告上传" @close="closeDialogDocx" :visible.sync="dialogFormVisible" :modal='false'>
  174. <el-form ref="formDocx" :model="form" :rules="rules">
  175. <el-form-item label="工程名称" :label-width="formLabelWidth" prop="name">
  176. <el-select
  177. clearable
  178. v-model="form.name"
  179. placeholder="请选择工程名称"
  180. v-selectLoadMore="selectLoadMore"
  181. @blur="initSelectDate"
  182. filterable
  183. :disabled="loadingBool"
  184. >
  185. <el-option v-for="(item, i) in selectArr" :key="i" :label="item.name" :value="item.No"> </el-option>
  186. </el-select>
  187. </el-form-item>
  188. <el-form-item label="检测报告" :label-width="formLabelWidth" class="hd-input" prop="report">
  189. <!-- action="http://192.168.2.78:1111/psjc/pipeState/pipeStateUpload" -->
  190. <el-upload
  191. :on-change="getFile"
  192. ref="updataDocx"
  193. class="upload-demo"
  194. :headers="uploadHeaders"
  195. :action="getBaseAddress"
  196. accept=".doc,.docx"
  197. :data="getData"
  198. multiple
  199. :show-file-list="false"
  200. :before-upload="checkState"
  201. :on-success="handleAvatarSuccess"
  202. :before-remove="beforeRemove"
  203. :on-progress="beforeUpload"
  204. :on-exceed="handleExceed"
  205. :file-list="fileList"
  206. :auto-upload="false"
  207. >
  208. <div class="btn-box">
  209. <el-button size="small" type="primary" :disabled="loadingBool">选择报告</el-button>
  210. <span class="btns">
  211. <el-button size="small" @click.stop="hideUpdataDocx">取 消</el-button>
  212. <el-button
  213. size="small"
  214. type="primary"
  215. :icon="isLoading"
  216. @click.stop="uploadWord"
  217. :disabled="this.loadingBool || !this.fileList.length"
  218. >确 定</el-button
  219. >
  220. </span>
  221. </div>
  222. <div slot="tip" class="el-upload__tip">
  223. <p style="line-height: 17px">只能上传docx/doc文件</p>
  224. <el-table
  225. ref="singleTable"
  226. :data="upDataTable"
  227. stripe
  228. highlight-current-row
  229. style="width: 100%"
  230. height="250"
  231. >
  232. <template slot="empty">
  233. <img src="@/assets/icon/null.png" alt="暂无数据" />
  234. </template>
  235. <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
  236. <el-table-column property="name" label="报告名称" show-overflow-tooltip align="center">
  237. </el-table-column>
  238. <el-table-column property="size" label="报告大小" align="center" width="80"> </el-table-column>
  239. <el-table-column property="status" label="上传进度" align="center" width="80">
  240. <!-- filter_schedule -->
  241. <template slot-scope="scope">
  242. <p
  243. :class="{
  244. 'font-green': scope.row.status == 'success',
  245. 'font-blue': scope.row.status == 'uploading',
  246. 'font-red': scope.row.status == 'error'
  247. }"
  248. >
  249. {{ scope.row.status | filter_schedule }}
  250. </p>
  251. </template>
  252. </el-table-column>
  253. <el-table-column show-overflow-tooltip property="result" label="上传结果" align="center" width="80"></el-table-column>
  254. </el-table>
  255. </div>
  256. </el-upload>
  257. </el-form-item>
  258. </el-form>
  259. </el-dialog>
  260. </div>
  261. <!-- 视频上传 -->
  262. <div class="public-box">
  263. <el-dialog title="附件视频上传" @close="closeDialogVideo" :visible.sync="dialogFormVisible2" :modal='false'>
  264. <el-form ref="formVideo" :model="form" :rules="rules">
  265. <!-- <el-input size="small" v-model="selectWord.name" disabled show-word-limit></el-input> -->
  266. <el-form-item label="工程名称" :label-width="formLabelWidth" prop="name">
  267. <el-select
  268. clearable
  269. v-model="form.name"
  270. placeholder="请选择工程名称"
  271. v-selectLoadMore="selectLoadMore"
  272. @blur="initSelectDate"
  273. filterable
  274. :disabled="loadingBool"
  275. >
  276. <el-option v-for="(item, i) in selectArr" :key="i" :label="item.name" :value="item.No"> </el-option>
  277. </el-select>
  278. </el-form-item>
  279. <el-form-item label="检测视频" :label-width="formLabelWidth" class="hd-input" prop="report">
  280. <!-- action="http://192.168.2.78:1111/psjc/pipeState/pipeStateUpload" -->
  281. <el-upload
  282. :on-change="getvideoFile"
  283. :show-file-list="false"
  284. ref="updataVideo"
  285. class="upload-demo"
  286. :headers="uploadHeaders"
  287. :action="getBaseAddress"
  288. accept=".mp4"
  289. :data="getVideoData"
  290. multiple
  291. :before-upload="checkState"
  292. :on-success="handleAvatarSuccessVideo"
  293. :before-remove="beforeRemove"
  294. :on-progress="beforeUpload"
  295. :on-exceed="handleExceed"
  296. :file-list="vdieofileList"
  297. :auto-upload="false"
  298. >
  299. <div class="btn-box">
  300. <el-button size="small" type="primary" :disabled="loadingBool">选择视频</el-button>
  301. <span class="btns">
  302. <el-button size="small" @click.stop="hideUpdataDocx">取 消</el-button>
  303. <el-button
  304. size="small"
  305. type="primary"
  306. :icon="isLoading"
  307. @click.stop="uploadVideoWord"
  308. :disabled="this.loadingBool || !this.vdieofileList.length"
  309. >确 定</el-button
  310. >
  311. </span>
  312. </div>
  313. <div slot="tip" class="el-upload__tip">
  314. <p style="line-height: 17px">只能上传mp4文件</p>
  315. <el-table
  316. ref="singleTable"
  317. :data="upDataTable"
  318. stripe
  319. highlight-current-row
  320. style="width: 100%"
  321. height="250"
  322. >
  323. <template slot="empty">
  324. <img src="@/assets/icon/null.png" alt="暂无数据" />
  325. </template>
  326. <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
  327. <el-table-column property="name" label="视频名称" show-overflow-tooltip align="center">
  328. </el-table-column>
  329. <el-table-column property="size" label="视频大小" align="center" width="80"> </el-table-column>
  330. <el-table-column property="status" label="上传进度" align="center" width="80">
  331. <!-- filter_schedule -->
  332. <template slot-scope="scope">
  333. <p
  334. :class="{
  335. 'font-green': scope.row.status == 'success',
  336. 'font-blue': scope.row.status == 'uploading',
  337. 'font-red': scope.row.status == 'error'
  338. }"
  339. >
  340. {{ scope.row.status | filter_schedule }}
  341. </p>
  342. </template>
  343. </el-table-column>
  344. <el-table-column show-overflow-tooltip property="result" label="上传结果" align="center" width="80"></el-table-column>
  345. </el-table>
  346. </div>
  347. </el-upload>
  348. </el-form-item>
  349. </el-form>
  350. </el-dialog>
  351. </div>
  352. <!-- 发布 -->
  353. <div class="public-box release-box">
  354. <el-dialog
  355. :title="setTitle"
  356. :visible.sync="dialogFormVisible3"
  357. @open="openRelease"
  358. @close="closeRelease"
  359. :fullscreen="true"
  360. :modal='false'
  361. >
  362. <div class="releaseTop-box">
  363. <!-- 左边部分 -->
  364. <div class="left">
  365. <el-tabs v-model="activeLeft" @tab-click="handleClick">
  366. <el-tab-pane label="统计汇总" name="first">
  367. <div class="releaseContent">
  368. <div class="detailsTitle">主要工程量表</div>
  369. <project-form :paramId="id" v-if="isOpen"></project-form>
  370. <div class="detailsTitle">管道缺陷数量统计表</div>
  371. <summary-form :tabelData="returnTabel" v-if="isOpen"></summary-form>
  372. <div class="detailsTitle">管道缺陷数量统计图</div>
  373. <div id="statistics_echatrs" style="width: 600px; display: flex; height: 600px"></div>
  374. </div>
  375. </el-tab-pane>
  376. <el-tab-pane label="管道缺陷" name="third">
  377. <div class="releaseContent">
  378. <div class="detailsTitle">管道缺陷汇总一览表</div>
  379. <defect-one :paramId="id"></defect-one>
  380. </div>
  381. </el-tab-pane>
  382. <el-tab-pane label="管段状态评估" name="fourth">
  383. <div class="releaseContent">
  384. <div class="detailsTitle">管段状况评估表</div>
  385. <assessment v-if="isOpen" :paramId="id"></assessment>
  386. <div class="detailsTitle">检测评估建议</div>
  387. <proposal v-if="isOpen" :paramId="id"></proposal>
  388. </div>
  389. </el-tab-pane>
  390. </el-tabs>
  391. </div>
  392. <!-- 右边部分 -->
  393. <div class="right">
  394. <el-tabs v-model="activeRight" @tab-click="handleClick">
  395. <!-- <el-tab-pane label="原始检测报告" name="one">
  396. <div class="releaseContent">
  397. <pdf-see :pdfUrl="pdfUrl"></pdf-see>
  398. </div>
  399. </el-tab-pane> -->
  400. <el-tab-pane label="数据地图" name="two">
  401. <!-- 数据地图 -->
  402. <div class="map-box">
  403. <simple-map @afterLoad="afterMapLoad" ref="myMap"></simple-map>
  404. </div>
  405. </el-tab-pane>
  406. </el-tabs>
  407. </div>
  408. </div>
  409. <div slot="footer" class="dialog-footer">
  410. <div style="justify-content: space-between; display: flex; align-items: center">
  411. <div style="display: flex; align-items: center; flex: 1">
  412. <span>备注:</span>
  413. <el-input
  414. size="small"
  415. style="flex: 1; padding-right: 40px"
  416. type="textarea"
  417. :rows="2"
  418. placeholder="请输入备注"
  419. :disabled="!isRelease"
  420. resize="none"
  421. v-model="remark"
  422. v-if="isRelease"
  423. >
  424. </el-input>
  425. <p v-if="!isRelease">{{ remark }}</p>
  426. </div>
  427. <div>
  428. <el-button size="small" type="primary" v-if="isRelease" @click="oneReleaseBtn">发 布</el-button>
  429. <el-button size="small" v-if="isRelease" @click="dialogFormVisible3 = false">取 消</el-button>
  430. </div>
  431. </div>
  432. </div>
  433. </el-dialog>
  434. </div>
  435. <!-- 删除提示框 -->
  436. <div class="delete-box">
  437. <!-- 删除提示框 -->
  438. <el-dialog title="提示" :visible.sync="deleteDialogVisible" width="30%" :modal='false'>
  439. <div style="display: flex; align-items: center">
  440. <!-- <i class="el-icon-info" style="color: #e6a23c"></i> -->
  441. <span class="iconfont icondtbz" style="font-size: 22px; color: #e6a23c"></span>
  442. &nbsp; 确认删除选中的{{ multipleSelection.length }}条检测报告吗?
  443. </div>
  444. <span slot="footer" class="dialog-footer">
  445. <el-button size="small" @click="deleteDialogVisible = false">取 消</el-button>
  446. <el-button size="small" type="primary" @click="removeDatas">确 定</el-button>
  447. </span>
  448. </el-dialog>
  449. </div>
  450. <!-- 撤回提示框 -->
  451. <div class="delete-box">
  452. <!-- 撤回提示框 -->
  453. <el-dialog title="提示" :visible.sync="withdrawDialogVisible" width="30%" :modal='false'>
  454. <div style="display: flex; align-items: center">
  455. <!-- <i class="el-icon-info" style="color: #e6a23c"></i> -->
  456. <span class="iconfont icondtbz" style="font-size: 22px; color: #e6a23c"></span>
  457. &nbsp; 确定要撤回这条检测报告吗?
  458. </div>
  459. <span slot="footer" class="dialog-footer">
  460. <el-button size="small" @click="withdrawDialogVisible = false">取 消</el-button>
  461. <el-button size="small" type="primary" @click="isWithdraw">确 定</el-button>
  462. </span>
  463. </el-dialog>
  464. </div>
  465. </div>
  466. </template>
  467. <script>
  468. import {
  469. queryPageTestReportNew,
  470. deleteIdData,
  471. deleteTestReport,
  472. projectPagingQuery,
  473. batchRelease,
  474. withdrawReport,
  475. queryPipecheckDetails,
  476. queryDictionariesId,
  477. oneRelease,
  478. queryProjectDetails,
  479. queryDefectFormDetails,
  480. queryPipeStateDetails,
  481. queryPipeState,
  482. queryDefectdetails,
  483. histroyPipeData,
  484. getDefectDataById,
  485. getDefectData,
  486. getDefectDataBySE
  487. } from '@/views/pipelineDefect/api/pipelineDefect'
  488. // 引入预览pdf插件
  489. import pdfSee from '../../components/OpenPdf.vue'
  490. // 引入管道检测组件
  491. import checkDialog from '../../components/checkDetails.vue'
  492. // 引入公共ip地址
  493. // import { baseAddress } from '@/utils/request.ts'
  494. import { baseAddress } from '@/utils/request'
  495. // 引入发布的组件
  496. import summaryForm from '../../components/summaryForm.vue'
  497. import projectForm from './components/project'
  498. import inspectForm from './components/inspect'
  499. import defectOne from './components/defectOne'
  500. import assessment from './components/assessment'
  501. import proposal from './components/proposal'
  502. import simpleMap from '@/views/pipelineDefect/components/simpleMap.vue'
  503. import * as echarts from 'echarts'
  504. import { appconfig } from 'staticPub/config'
  505. import { mapMixin } from '@/views/pipelineDefect/mixin/map'
  506. import CesiumUtil from '../../common/cesiumUtil'
  507. export default {
  508. props: ['data'],
  509. mixins: [mapMixin],
  510. components: {
  511. summaryForm,
  512. projectForm,
  513. inspectForm,
  514. defectOne,
  515. assessment,
  516. proposal,
  517. pdfSee,
  518. simpleMap,
  519. oneRelease,
  520. checkDialog
  521. },
  522. data() {
  523. return {
  524. initdefectQuantityStatisticsA: [],
  525. initdefectQuantityStatisticsB: [],
  526. isOpen: false, // 打开详情弹框时触发
  527. DetailsId: null, // 检测详情的id
  528. DetailsForm: {}, // 管道缺陷缩略框
  529. imgArrIndex: 0, // 缩略框照片索引
  530. pipDialogFormVisible: false, // 详情弹框显影
  531. lastFileList: [], //上次上次的文件列表
  532. fullscreenLoading: false, // 加载
  533. remark: '', // 备注
  534. pdfUrl: '', // pdf地址
  535. activeName: 'picnum', // 照片视频tab标签
  536. activeNameEV: 'picnum', // 照片视频tab标签
  537. currentForm: [], // 缩略提示框
  538. currentIndex: 0, // 当前页数
  539. // 评估
  540. currentInfoCard: false, // 弹出框
  541. currentInfoCard2: false, // 弹出框
  542. deleteDialogVisible: false, // 删除提示框显影
  543. withdrawDialogVisible: false, // 撤回提示框显影
  544. // 数据为空时的图片
  545. // 上传文件表格
  546. upDataTable: [],
  547. updataParamsId: {
  548. itemId: '',
  549. uploadFileTypeDicId: '',
  550. uploadItemDictId: ''
  551. }, // 上传视频需要的参数id
  552. id: '', // 发布时的id
  553. isRelease: false, // 判断是否从发布按钮进入详情
  554. defectSumObj: { oneSum: 0, twoSum: 0, threeSum: 0, fourSum: 0, total: 0 }, // 合计
  555. defectQuantityStatisticsA: [
  556. { title: '(AJ)支管暗接', type: 'AJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  557. { title: '(BX)变形', type: 'BX', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  558. { title: '(CK)错口', type: 'CK', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  559. { title: '(CR)异物穿入', type: 'CR', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  560. { title: '(FS)腐蚀', type: 'FS', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  561. { title: '(PL)破裂', type: 'PL', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  562. { title: '(QF)起伏', type: 'QF', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  563. { title: '(SL)渗透', type: 'SL', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  564. { title: '(TJ)脱节', type: 'TJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  565. { title: '(TL)接口材料脱落', type: 'TL', oneValue: 0, twoValue: 0, threeValue: '/', fourValue: '/', value: 0 }
  566. ], // 管道缺陷数量统计表
  567. defectQuantityStatisticsB: [
  568. { title: '(CJ)沉积', type: 'CJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  569. { title: '(CQ)残墙、坝根', type: 'CQ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  570. { title: '(FZ)浮渣', type: 'FZ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  571. { title: '(JG)结垢', type: 'JG', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  572. { title: '(SG)树根', type: 'SG', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  573. { title: '(ZW)障碍物', type: 'ZW', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 }
  574. ],
  575. batchReleaseDialog: false, // 批量发布弹框
  576. // 选择框分页参数
  577. selectParm: { current: 1, size: 30 },
  578. selectLoadTotal: 0, // 选择框总页数
  579. selectArr: [], // 选择工程数组(报告上传)
  580. videoSelectArr: [], // 选择工程数组(视频上传)
  581. tableData: [
  582. { wordInfoName: '1' }
  583. ],
  584. // 表格参数
  585. tableContent: [
  586. { sortable: false, label: '检测报告名称', name: 'wordInfoName' },
  587. { sortable: true, label: '检测段数', name: 'jcnum' },
  588. { sortable: true, label: '检测长度(m)', name: 'jclength' },
  589. { sortable: false, label: '工程名称', name: 'prjName' },
  590. { sortable: false, label: '工程地点', name: 'address' },
  591. { sortable: false, label: '检测单位', name: 'sgunit' },
  592. // { sortable: true, label: '检测日期', name: 'jcDate' },
  593. { sortable: false, label: '入库人', name: 'createUserName' },
  594. { sortable: true, label: '入库时间', name: 'createTime' }
  595. ],
  596. // 日期选择器规则
  597. sOpition: {
  598. disabledDate: (time) => {
  599. time = time.getTime()
  600. if (this.searchValue.finishDate) {
  601. return time > new Date(this.searchValue.finishDate).getTime()
  602. }
  603. return time > new Date().getTime()
  604. }
  605. },
  606. eOpition: {
  607. disabledDate: (time) => {
  608. time = time.getTime()
  609. if (this.searchValue.startDate) {
  610. return time < new Date(this.searchValue.startDate).getTime() - 8.64e7 || time > new Date().getTime()
  611. }
  612. return time > new Date().getTime()
  613. }
  614. },
  615. // 搜索功能参数
  616. searchValue: {
  617. startDate: '',
  618. finishDate: '',
  619. checkList: [], // 发布状态
  620. serchValue: '' // 搜索关键字
  621. },
  622. // 上传需要的数据
  623. fileList: [],
  624. vdieofileList: [],
  625. UpdataList: '', // 上传文件携带的参数
  626. updataDialog: false, // 上传对话框
  627. uploadHeaders: {
  628. Authorization: 'bearer ' + sessionStorage.getItem('token')
  629. }, // token值
  630. activeLeft: 'first', // 发布默认激活的导航(左)
  631. activeRight: 'two', // 发布默认激活的导航(右)
  632. multipleSelection: [], // 被选中的表格数据
  633. // 分页需要的值
  634. pagination: { current: 1, size: 30 }, // 分页参数信息
  635. paginationTotal: 0, // 总页数
  636. // ------------
  637. radio: '',
  638. // 报告上传数据
  639. rules: {
  640. name: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
  641. report: [{ required: true, message: '不能为空', trigger: 'blur' }]
  642. },
  643. // 报告上传
  644. dialogFormVisible: false,
  645. // 视频上传
  646. dialogFormVisible2: false,
  647. // 报告发布
  648. dialogFormVisible3: false,
  649. form: {
  650. name: '',
  651. report: '1'
  652. },
  653. formLabelWidth: '84px',
  654. loadingBool: false, // 加载按钮显隐
  655. //
  656. showId: 0,
  657. projUtil: null, // 坐标系工具
  658. currentDataProjName: appconfig.currPRJ, // 当前坐标系
  659. //
  660. vectorLayer: null,
  661. vectorLayer2: null,
  662. hasLoadMap: false,
  663. map: null,
  664. clickEvent: null,
  665. themLayerName: 'pipeAndDefectLayer'
  666. }
  667. },
  668. watch: {
  669. },
  670. computed: {
  671. // ------>
  672. // 设置发布标题
  673. setTitle() {
  674. return this.isRelease ? '检测报告发布' : '检测报告详情'
  675. },
  676. // 统计饼图数据信息
  677. defectTotal() {
  678. let arr = this.defectQuantityStatisticsA.concat(this.defectQuantityStatisticsB)
  679. let newArr = arr.map((v) => {
  680. if (!v.value) {
  681. return { label: { show: false } }
  682. } else {
  683. return { value: v.value, title: v.title }
  684. }
  685. })
  686. return newArr
  687. },
  688. returnTabel() {
  689. let obj = {
  690. defectQuantityStatisticsA: this.defectQuantityStatisticsA,
  691. defectQuantityStatisticsB: this.defectQuantityStatisticsB,
  692. defectSumObj: this.defectSumObj
  693. }
  694. return obj
  695. },
  696. // 加载按钮
  697. isLoading() {
  698. return this.loadingBool ? 'el-icon-loading' : ''
  699. },
  700. // 动态设置上传地址
  701. getBaseAddress() {
  702. return baseAddress + '/psjc/sysUploadFile/uploadFile'
  703. },
  704. // 动态设置上传携带参数
  705. getData() {
  706. return this.updataParamsId
  707. },
  708. getVideoData() {
  709. return this.updataParamsId
  710. }
  711. },
  712. mounted() {
  713. this.upDateTable()
  714. },
  715. destroyed() {
  716. },
  717. methods: {
  718. getThemLayer () {
  719. return this.map.getLayers().getArray().find(layer => layer.get('layername') === this.themLayerName)
  720. },
  721. sDateChange(t) {
  722. if (!this.searchValue.finishDate) {
  723. this.$nextTick(() => {
  724. this.searchValue.finishDate = this.searchValue.startDate
  725. })
  726. }
  727. },
  728. eDateChange(t) {
  729. if (!this.searchValue.startDate) {
  730. this.$nextTick(() => {
  731. this.searchValue.startDate = this.searchValue.finishDate
  732. })
  733. }
  734. },
  735. // 绘制统计饼图
  736. renderEcharts() {
  737. let chartDom = document.getElementById('statistics_echatrs')
  738. let myChart = echarts.init(chartDom)
  739. let option
  740. option = {
  741. tooltip: {
  742. trigger: 'item',
  743. formatter: function (a) {
  744. return `${a['data']['title']} 数量 ${a['data']['value']} `
  745. }
  746. },
  747. color: [
  748. 'red',
  749. 'orange',
  750. 'yellow',
  751. 'green',
  752. 'blue',
  753. 'indigo',
  754. 'purple',
  755. '#ff7f50',
  756. '#87cefa',
  757. '#da70d6',
  758. '#32cd32',
  759. '#6495ed',
  760. '#ff69b4',
  761. '#ba55d3',
  762. '#cd5c5c',
  763. '#ffa500',
  764. '#40e0d0',
  765. '#1e90ff',
  766. '#ff6347',
  767. '#7b68ee',
  768. '#00fa9a',
  769. '#ffd700',
  770. '#6699FF',
  771. '#ff6666',
  772. '#3cb371',
  773. '#b8860b',
  774. '#30e0e0'
  775. ],
  776. series: [
  777. {
  778. name: '管道缺陷数量统计图',
  779. type: 'pie',
  780. radius: '50%',
  781. data: this.defectTotal || [],
  782. label: {
  783. formatter: function (a) {
  784. return `${a['data']['title']} ${a['percent'].toFixed(1) + '%'} `
  785. },
  786. backgroundColor: '#F6F8FC',
  787. borderWidth: 1,
  788. borderRadius: 4
  789. },
  790. emphasis: {
  791. itemStyle: {
  792. shadowBlur: 10,
  793. shadowOffsetX: 0,
  794. shadowColor: 'rgba(0, 0, 0, 0.5)'
  795. }
  796. }
  797. }
  798. ]
  799. }
  800. option && myChart.setOption(option)
  801. },
  802. // 双击打开详情或发布
  803. openDetails(row, column) {
  804. if (row.state == '1') {
  805. this.testReportDetails(row)
  806. } else {
  807. this.testReportDetails(row, true)
  808. }
  809. },
  810. clearAll() {
  811. this.popup && this.popup.setPosition(null)
  812. this.currentInfoCard = false
  813. this.currentInfoCard2 = false
  814. this.lightLayer && this.map.removeLayer(this.lightLayer)
  815. this.$refs.myMap && this.vectorLayer2 && this.$refs.myMap.map.removeLayer(this.vectorLayer2)
  816. this.clickEvent && unByKey(this.clickEvent)
  817. this.lightLayer = this.vectorLayer2 = this.clickEvent = null
  818. },
  819. // 根据状态设置每列表格样式
  820. modality(obj) {
  821. // 通过id标识来改变当前行的文字颜色
  822. let idArr
  823. if (this.multipleSelection != []) {
  824. idArr = this.multipleSelection.map((v) => v.id)
  825. }
  826. if (idArr.some((v) => v == obj.row.id)) {
  827. return 'rowBgBlue'
  828. }
  829. },
  830. lightFea(row) {
  831. console.log('高亮')
  832. this.setViewFromFeas(row.id, 2)
  833. },
  834. /**
  835. * 小地图完成加载后
  836. * */
  837. afterMapLoad() {
  838. this.setSimpleMap(this.id)
  839. this.hasLoadMap = true
  840. this.$refs.myMap.showLegend('testReport', true)
  841. },
  842. /**
  843. * 添加、更新地图管道缺陷
  844. * */
  845. setMainMap () {
  846. this.removeCesiumGraphics()
  847. this.initDefectMap()
  848. },
  849. /**
  850. * 构造管道缺陷地图要素
  851. * @param reportInfos 报告数据
  852. * */
  853. getReportFeatures (defectInfos, hasStyle) {
  854. let style = null, features = { pipeDefectFeatures: [], funcDefectFeatures: [], strucDefectFeatures: [], normal: [] }
  855. if (defectInfos.length === 0) { return features }
  856. defectInfos.forEach(defect => {
  857. let { startPointXLocation, startPointYLocation, endPointXLocation, endPointYLocation } = defect
  858. if (startPointXLocation && startPointYLocation && endPointXLocation && endPointYLocation) {
  859. let startPoint = [Number(startPointXLocation), Number(startPointYLocation)]
  860. let endPoint = [Number(endPointXLocation), Number(endPointYLocation)]
  861. startPoint = this.projUtil.transform(startPoint, this.currentDataProjName, 'proj84')
  862. endPoint = this.projUtil.transform(endPoint, this.currentDataProjName, 'proj84')
  863. let lineCoors = [startPoint, endPoint]
  864. let feature = new Feature({ geometry: new LineString(lineCoors) })
  865. // 健康等级颜色
  866. let colors = [
  867. { level: 'Ⅰ', color: 'green' },
  868. { level: 'Ⅱ', color: 'blue' },
  869. { level: 'Ⅲ', color: 'pink' },
  870. { level: 'Ⅳ', color: 'red' }
  871. ]
  872. let findFuncColor = colors.find(colorObj => defect['funcClass'] && defect['funcClass'].includes(colorObj.level))
  873. let findStrucColor = colors.find(colorObj => defect['structClass'] && defect['structClass'].includes(colorObj.level))
  874. // 功能性缺陷
  875. if (!isExit(defect.expNo, 'funcDefectFeatures')) {
  876. let fFea = feature.clone()
  877. let fColor = findFuncColor ? findFuncColor.color : "#070358"
  878. hasStyle && fFea.setStyle(comSymbol.getLineStyle(5, fColor))
  879. for (let i in defect) {
  880. i !== 'geometry' && fFea.set(i, defect[i])
  881. }
  882. features.funcDefectFeatures.push(fFea)
  883. }
  884. // 结构性缺陷
  885. if (!isExit(defect.expNo, 'strucDefectFeatures')) {
  886. let sFea = feature.clone()
  887. let sColor = findStrucColor ? findStrucColor.color : "#070358"
  888. hasStyle && sFea.setStyle(comSymbol.getLineStyle(5, sColor))
  889. for (let i in defect) {
  890. i !== 'geometry' && sFea.set(i, defect[i])
  891. }
  892. features.strucDefectFeatures.push(sFea)
  893. }
  894. // 缺陷点
  895. if (defect.geometry) {
  896. let coors = JSON.parse(defect.geometry)
  897. let point = this.projUtil.transform([coors.x, coors.y], this.currentDataProjName, 'proj84')
  898. let feature = new Feature({ geometry: new Point(point) })
  899. let imgs = [
  900. { level: ['一级', '1'], img: defectImg1, index: 0 },
  901. { level: ['二级', '2'], img: defectImg2, index: 1 },
  902. { level: ['三级', '3'], img: defectImg3, index: 2 },
  903. { level: ['四级', '4'], img: defectImg4, index: 3 },
  904. // { level: '/', img: defectImg0, index: 4 }
  905. ]
  906. let findimg = null
  907. if (defect.defectLevel) {
  908. findimg = imgs.find((colorObj) => colorObj.level.includes(defect['defectLevel']))
  909. }
  910. // 缺少 defectLevel 字段
  911. if (findimg) {
  912. let rotation = getIconRat(lineCoors)
  913. hasStyle && feature.setStyle( new Style({ image: new Icon({ size: [48, 48], anchor: [0.5, 0], src: findimg.img, scale: 0.4, rotation }) }) )
  914. for (let i in defect) {
  915. i !== 'geometry' && feature.set(i, defect[i])
  916. }
  917. features.pipeDefectFeatures.push(feature)
  918. }
  919. }
  920. }
  921. })
  922. return features
  923. function isExit(pipeId, feasType) {
  924. return features[feasType].some(fea => fea.get('expNo') === pipeId)
  925. }
  926. function getIconRat([startPoint, endPoint]) {
  927. let rotation = 0
  928. // 因为要垂直管线显示,所以图片旋转 90°
  929. let imgRt = Math.PI / 2
  930. // 计算旋转弧度
  931. if (endPoint[0] === startPoint[0]) {
  932. // 竖直
  933. rotation = endPoint[1] > startPoint[1] ? -imgRt : Math.PI - imgRt
  934. } else if (endPoint[1] === startPoint[1]) {
  935. // 水平
  936. rotation = endPoint[1] > startPoint[1] ? Math.PI / 2 - imgRt : (Math.PI * 3) / 2 - imgRt
  937. } else {
  938. // 其他角度
  939. rotation = Math.atan((endPoint[0] - startPoint[0]) / (endPoint[1] - startPoint[1])) - imgRt
  940. }
  941. return rotation
  942. }
  943. },
  944. setSimpleMap (id) {
  945. let map = this.$refs.myMap
  946. map.removeCesiumGraphics()
  947. map.changeLoading(true)
  948. getDefectDataById(id).then(res => {
  949. map.changeLoading(false)
  950. if (res.code === 1 && res.result) {
  951. let { strucDefectFeatures, funcDefectFeatures, pipeDefectFeatures } = map.getFeatures(res.result)
  952. if ([...strucDefectFeatures, ...funcDefectFeatures, ...pipeDefectFeatures].length !== 0) {
  953. map.addLines([...strucDefectFeatures, ...funcDefectFeatures])
  954. setTimeout(() => {
  955. map.addDefects(pipeDefectFeatures)
  956. new CesiumUtil(this.$refs.myMap.viewer).flyTo(pipeDefectFeatures[0])
  957. }, 1000)
  958. console.log('跳转子地图')
  959. }
  960. } else this.$message.error('管线缺陷数据请求失败')
  961. })
  962. },
  963. // 关闭上传弹框时
  964. closeDialogDocx() {
  965. this.loadingBool = false
  966. this.$refs['formDocx'] && this.$refs['formDocx'].resetFields()
  967. this.$refs['updataDocx'] && this.$refs['updataDocx'].clearFiles()
  968. this.selectParm = { current: 1, size: 30 }
  969. this.selectLoadTotal = 0 // 选择框总页数
  970. this.upDataTable = []
  971. this.fileList = []
  972. // this.getPipeDefectData()
  973. this.setMainMap()
  974. this.upDateTable()
  975. },
  976. closeDialogVideo() {
  977. this.loadingBool = false
  978. this.$refs['formVideo'] && this.$refs['formVideo'].resetFields()
  979. this.$refs['updataVideo'] && this.$refs['updataVideo'].clearFiles()
  980. this.selectParm = { current: 1, size: 30 }
  981. this.selectLoadTotal = 0 // 选择框总页数
  982. this.vdieofileList = []
  983. this.upDataTable = []
  984. this.upDateTable()
  985. },
  986. // 获取字典id
  987. async getParamsId(type1, type2) {
  988. // 获取字典id
  989. // uploadFileType
  990. let uploadFileTypeDicId = await queryDictionariesId({ keys: 'uploadFileType' })
  991. // uploadItem
  992. let uploadItemDictId = await queryDictionariesId({ keys: 'uploadItem' })
  993. uploadFileTypeDicId = uploadFileTypeDicId.result.uploadFileType
  994. uploadItemDictId = uploadItemDictId.result.uploadItem
  995. // await this.$refs.upload.submit()
  996. uploadFileTypeDicId.forEach((v) => {
  997. if (v.codeValue == type1) {
  998. this.updataParamsId.uploadFileTypeDicId = v.id
  999. }
  1000. })
  1001. uploadItemDictId.forEach((v) => {
  1002. if (v.codeValue == type2) {
  1003. this.updataParamsId.uploadItemDictId = v.id
  1004. }
  1005. })
  1006. },
  1007. // 判断表格当前行是否可被选中
  1008. checkSelect(row, index) {
  1009. let isChecked = true
  1010. if (row.state == '0') {
  1011. // 判断里面是否存在某个参数
  1012. isChecked = true
  1013. } else {
  1014. isChecked = false
  1015. }
  1016. return isChecked
  1017. },
  1018. // 打开弹框时
  1019. openRelease() {
  1020. },
  1021. // 关闭发布弹框时触发
  1022. closeRelease() {
  1023. this.id = ''
  1024. this.defectQuantityStatisticsA = JSON.parse(JSON.stringify(this.initdefectQuantityStatisticsA))
  1025. this.defectQuantityStatisticsB = JSON.parse(JSON.stringify(this.initdefectQuantityStatisticsB))
  1026. this.defectSumObj = { oneSum: 0, twoSum: 0, threeSum: 0, fourSum: 0, total: 0 }
  1027. this.isOpen = false
  1028. this.isRelease = false
  1029. },
  1030. // 判断是否是'/'
  1031. judge(value) {
  1032. if (value == '/') {
  1033. return 0
  1034. } else {
  1035. return value
  1036. }
  1037. },
  1038. // 单行管段详情
  1039. testReportDetails(row, isRelease) {
  1040. console.log('详情')
  1041. let id = row.id
  1042. let path = row.wordFilePath
  1043. // 显示加载
  1044. const loading = this.$loading({
  1045. lock: true,
  1046. text: '数据加载中',
  1047. spinner: 'el-icon-loading',
  1048. background: 'rgba(0, 0, 0, 0.7)'
  1049. })
  1050. // 判断是否已加载地图
  1051. if (this.hasLoadMap) {
  1052. this.setSimpleMap(id)
  1053. }
  1054. this.id = id
  1055. isRelease ? (this.isRelease = true) : ''
  1056. this.activeLeft = 'first'
  1057. queryPipecheckDetails(id).then(res => {
  1058. console.log('详情')
  1059. // 按缺陷名称给数据分类
  1060. // 缺陷数量统计
  1061. this.defectSumObj = { oneSum: 0, twoSum: 0, threeSum: 0, fourSum: 0, total: 0 }, // 合计
  1062. this.defectQuantityStatisticsA = [
  1063. { title: '(AJ)支管暗接', type: 'AJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  1064. { title: '(BX)变形', type: 'BX', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1065. { title: '(CK)错口', type: 'CK', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1066. { title: '(CR)异物穿入', type: 'CR', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  1067. { title: '(FS)腐蚀', type: 'FS', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  1068. { title: '(PL)破裂', type: 'PL', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1069. { title: '(QF)起伏', type: 'QF', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1070. { title: '(SL)渗透', type: 'SL', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1071. { title: '(TJ)脱节', type: 'TJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1072. { title: '(TL)接口材料脱落', type: 'TL', oneValue: 0, twoValue: 0, threeValue: '/', fourValue: '/', value: 0 }
  1073. ], // 管道缺陷数量统计表
  1074. this.defectQuantityStatisticsB = [
  1075. { title: '(CJ)沉积', type: 'CJ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1076. { title: '(CQ)残墙、坝根', type: 'CQ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1077. { title: '(FZ)浮渣', type: 'FZ', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: '/', value: 0 },
  1078. { title: '(JG)结垢', type: 'JG', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1079. { title: '(SG)树根', type: 'SG', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 },
  1080. { title: '(ZW)障碍物', type: 'ZW', oneValue: 0, twoValue: 0, threeValue: 0, fourValue: 0, value: 0 }
  1081. ]
  1082. res.result.forEach((resValue) => {
  1083. this.defectQuantityStatisticsA.forEach((sumValue) => {
  1084. if (resValue.defectCode == sumValue.type) {
  1085. if (['一级', '1'].includes(resValue.defectLevel)) {
  1086. sumValue.oneValue += resValue.defectNums
  1087. } else if (['二级', '2'].includes(resValue.defectLevel)) {
  1088. sumValue.twoValue += resValue.defectNums
  1089. } else if (['三级', '3'].includes(resValue.defectLevel)) {
  1090. sumValue.threeValue += resValue.defectNums
  1091. } else if (['四级', '4'].includes(resValue.defectLevel)) {
  1092. sumValue.fourValue += resValue.defectNums
  1093. }
  1094. }
  1095. })
  1096. this.defectQuantityStatisticsB.forEach((sumValue) => {
  1097. if (resValue.defectCode == sumValue.type) {
  1098. if (['一级', '1'].includes(resValue.defectLevel)) {
  1099. sumValue.oneValue += resValue.defectNums
  1100. } else if (['二级', '2'].includes(resValue.defectLevel)) {
  1101. sumValue.twoValue += resValue.defectNums
  1102. } else if (['三级', '3'].includes(resValue.defectLevel)) {
  1103. sumValue.threeValue += resValue.defectNums
  1104. } else if (['四级', '4'].includes(resValue.defectLevel)) {
  1105. sumValue.fourValue += resValue.defectNums
  1106. }
  1107. }
  1108. })
  1109. })
  1110. this.defectQuantityStatisticsA.forEach((v) => {
  1111. v.value = this.judge(v.oneValue) + this.judge(v.twoValue) + this.judge(v.threeValue) + this.judge(v.fourValue)
  1112. this.defectSumObj.oneSum += this.judge(v.oneValue)
  1113. this.defectSumObj.twoSum += this.judge(v.twoValue)
  1114. this.defectSumObj.threeSum += this.judge(v.threeValue)
  1115. this.defectSumObj.fourSum += this.judge(v.fourValue)
  1116. this.defectSumObj.total += v.value
  1117. })
  1118. this.defectQuantityStatisticsB.forEach((v) => {
  1119. v.value = this.judge(v.oneValue) + this.judge(v.twoValue) + this.judge(v.threeValue) + this.judge(v.fourValue)
  1120. this.defectSumObj.oneSum += this.judge(v.oneValue)
  1121. this.defectSumObj.twoSum += this.judge(v.twoValue)
  1122. this.defectSumObj.threeSum += this.judge(v.threeValue)
  1123. this.defectSumObj.fourSum += this.judge(v.fourValue)
  1124. this.defectSumObj.total += v.value
  1125. })
  1126. this.pdfUrl = path ? baseAddress + '/psjc/file' + path : ""
  1127. this.remark = row.remark
  1128. this.dialogFormVisible3 = true
  1129. this.$nextTick(() => {
  1130. this.isOpen = true
  1131. this.renderEcharts()
  1132. loading.close()
  1133. })
  1134. })
  1135. },
  1136. // 单个发布
  1137. async oneReleaseBtn() {
  1138. // &remark=${this.remark}
  1139. let param = {
  1140. id: this.id,
  1141. remark: this.remark,
  1142. state: '1'
  1143. }
  1144. let res = await oneRelease(param)
  1145. if (res.result) {
  1146. this.$message({
  1147. message: '发布成功',
  1148. type: 'success'
  1149. })
  1150. this.setMainMap()
  1151. }
  1152. await this.upDateTable()
  1153. this.dialogFormVisible3 = false
  1154. },
  1155. // 单个撤回
  1156. withdrawBtn(id) {
  1157. this.id = id
  1158. this.withdrawDialogVisible = true
  1159. },
  1160. // 确认撤回
  1161. async isWithdraw() {
  1162. let res = await withdrawReport(this.id)
  1163. if (res.result) {
  1164. this.$message({
  1165. message: '撤回成功',
  1166. type: 'success'
  1167. })
  1168. } else {
  1169. this.$message.error('撤回失败')
  1170. }
  1171. this.withdrawDialogVisible = false
  1172. await this.upDateTable()
  1173. this.setMainMap()
  1174. },
  1175. // 批量发布确认
  1176. async confirmRelease() {
  1177. let idArr = this.multipleSelection.map((v) => {
  1178. return v.id
  1179. })
  1180. let res = await batchRelease(idArr.join(','))
  1181. if (res.result) {
  1182. // this.getPipeDefectData() // 刷新地图
  1183. this.$message({
  1184. message: '发布成功',
  1185. type: 'success'
  1186. })
  1187. }
  1188. this.batchReleaseDialog = false
  1189. await this.upDateTable()
  1190. this.setMainMap()
  1191. },
  1192. // 文件发生变化时触发
  1193. getFile(file, fileList) {
  1194. let num = 1024.0 // byte
  1195. this.fileList = fileList
  1196. this.upDataTable = fileList.map((v) => {
  1197. let result = v.response ? v.response.result[0].msg : ''
  1198. let status = v.response ? (v.response.result[0].flag === 'succ' ? "success" : 'error') : v.status
  1199. return {
  1200. name: v.name,
  1201. size: (v.size / Math.pow(num, 2)).toFixed(2) + 'MB',
  1202. status,
  1203. result
  1204. }
  1205. })
  1206. },
  1207. getvideoFile(file, fileList) {
  1208. let num = 1024.0 // byte
  1209. this.vdieofileList = fileList
  1210. let data = fileList.map((v) => {
  1211. let result = v.response ? v.response.result[0].msg : ''
  1212. let status = v.response ? (v.response.result[0].flag === 'succ' ? "success" : 'error') : v.status
  1213. return {
  1214. name: v.name,
  1215. size: (v.size / Math.pow(num, 2)).toFixed(2) + 'MB',
  1216. status,
  1217. result
  1218. }
  1219. })
  1220. this.upDataTable = data
  1221. },
  1222. // 重置
  1223. resetDate() {
  1224. this.searchValue.checkList = []
  1225. this.searchValue.serchValue = ''
  1226. this.searchValue.startDate = ''
  1227. this.searchValue.finishDate = ''
  1228. this.upDateTable()
  1229. },
  1230. // 报告上传取消按钮
  1231. hideUpdataDocx() {
  1232. this.form.name = ''
  1233. this.dialogFormVisible = false
  1234. this.dialogFormVisible2 = false
  1235. return false
  1236. },
  1237. // 失去焦点时
  1238. initSelectDate() {
  1239. this.selectParm.current = 1
  1240. },
  1241. // 选择工程下拉刷新加载更多数据(报告上传)
  1242. async selectLoadMore() {
  1243. if (this.selectParm.current * this.selectParm.size >= this.selectLoadTotal) return
  1244. this.selectParm.current++
  1245. let res = await projectPagingQuery(this.selectParm)
  1246. let data = res.result.records
  1247. data.forEach((v) => {
  1248. this.selectArr.push({
  1249. name: v.wordInfoName,
  1250. No: v.id
  1251. })
  1252. })
  1253. },
  1254. // 报告上传按钮
  1255. async showUpdata() {
  1256. // 选择工程名称的分页查询
  1257. let res = await projectPagingQuery(this.selectParm)
  1258. this.selectLoadTotal = res.result.records
  1259. let data = res.result.records
  1260. this.selectArr = data.map((v) => {
  1261. return {
  1262. name: `${v.prjName}(${v.prjNo})`,
  1263. No: v.id
  1264. }
  1265. })
  1266. this.dialogFormVisible = true
  1267. },
  1268. // 视频上传按钮
  1269. async videoShowUpdata() {
  1270. // 选择工程名称的分页查询
  1271. let res = await projectPagingQuery(this.selectParm)
  1272. this.selectLoadTotal = res.result.records
  1273. let data = res.result.records
  1274. this.selectArr = data.map((v) => {
  1275. return {
  1276. name: `${v.prjName}(${v.prjNo})`,
  1277. No: v.id
  1278. }
  1279. })
  1280. this.dialogFormVisible2 = true
  1281. },
  1282. // 上传按钮
  1283. async uploadWord() {
  1284. this.$refs['formDocx'].validate(async (valid) => {
  1285. if (valid) {
  1286. this.loadingBool = true
  1287. // 获取字典id
  1288. await this.getParamsId('wordInfoDoc', 'tf_ywpn_prjinfo_w')
  1289. this.updataParamsId.itemId = this.form.name
  1290. await this.$refs.updataDocx.submit()
  1291. } else {
  1292. return false
  1293. }
  1294. })
  1295. },
  1296. async uploadVideoWord() {
  1297. this.$refs['formVideo'].validate(async (valid) => {
  1298. if (valid) {
  1299. this.loadingBool = true
  1300. // 获取字典id
  1301. await this.getParamsId('pipeVideo', 'tf_ywpn_prjinfo_w')
  1302. this.updataParamsId.itemId = this.form.name
  1303. await this.$refs.updataVideo.submit()
  1304. } else {
  1305. return false
  1306. }
  1307. })
  1308. },
  1309. // 上传触发的方法
  1310. handleAvatarSuccess(res, file, fileList) {
  1311. let arrState = fileList.every((v) => v.status != 'ready' && v.status != 'uploading')
  1312. if (res.result == null || res.result.length == 0) {
  1313. file.status = 'error'
  1314. }
  1315. if (arrState) {
  1316. this.$message({
  1317. showClose: true,
  1318. message: '文件上传结束'
  1319. })
  1320. this.lastFileList = fileList
  1321. this.loadingBool = false
  1322. }
  1323. },
  1324. // 检测报告是否已被上传成功过
  1325. checkState(file) {
  1326. if (file.status == 'success') {
  1327. this.$message({
  1328. message: '文件都已上传完成',
  1329. type: 'success'
  1330. })
  1331. this.loadingBool = false
  1332. return false
  1333. }
  1334. },
  1335. // 视频
  1336. handleAvatarSuccessVideo(res, file, fileList) {
  1337. let arrState = fileList.every((v) => v.status != 'ready' && v.status != 'uploading')
  1338. if (res.result == null || res.result.length == 0) {
  1339. file.status = 'error'
  1340. }
  1341. if (arrState) {
  1342. this.$message({
  1343. showClose: true,
  1344. message: '文件上传结束'
  1345. })
  1346. this.loadingBool = false
  1347. }
  1348. },
  1349. beforeUpload(event, file, fileList) {
  1350. let num = 1024.0 //byte
  1351. let find = this.upDataTable.find(item => item.name === file.name)
  1352. if (find) {
  1353. find.status = file.status
  1354. find.result = file.response ? file.response.result[0].msg : ''
  1355. }
  1356. },
  1357. handleExceed(files, fileList) {
  1358. this.$message.warning(`本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
  1359. },
  1360. beforeRemove(file, fileList) {
  1361. return this.$confirm(`确定移除 ${file.name}?`)
  1362. },
  1363. // 搜索
  1364. searchApi() {
  1365. this.pagination.current = 1
  1366. let params = { ...this.searchValue }
  1367. if (params.checkList.length == 1) {
  1368. params.checkList = params.checkList[0]
  1369. } else {
  1370. params.checkList = ''
  1371. }
  1372. this.upDateTable(params)
  1373. },
  1374. // 删除按钮
  1375. removeBtn() {
  1376. this.deleteDialogVisible = true
  1377. },
  1378. // 确认删除
  1379. async removeDatas() {
  1380. let res = {}
  1381. if (this.multipleSelection.length == 1) {
  1382. // res = await deleteIdData(this.multipleSelection[0].id)
  1383. res = await deleteTestReport({ ids: this.multipleSelection[0].id })
  1384. } else {
  1385. let idArr = this.multipleSelection.map((v) => v.id)
  1386. res = await deleteTestReport({ ids: idArr.join(',') })
  1387. }
  1388. if (res.result) {
  1389. // this.getPipeDefectData()
  1390. this.setMainMap()
  1391. this.$message({
  1392. message: '删除成功',
  1393. type: 'success'
  1394. })
  1395. this.deleteDialogVisible = false
  1396. this.upDateTable()
  1397. } else {
  1398. this.$message.error('删除失败')
  1399. }
  1400. },
  1401. // 查询数据
  1402. upDateTable(params) {
  1403. let data = { ...this.pagination }
  1404. if (params) {
  1405. data.jcStartDate = params.startDate
  1406. data.jcEndDate = params.finishDate
  1407. data.state = params.checkList
  1408. data.prjNo = params.serchValue
  1409. }
  1410. queryPageTestReportNew(data).then(res => {
  1411. this.tableData = res.result.records
  1412. this.paginationTotal = res.result.total
  1413. })
  1414. },
  1415. // 发布tab标签点击事件
  1416. handleClick(tab, event) {
  1417. },
  1418. add() {},
  1419. // 表格选中事件
  1420. handleSelectionChange(val) {
  1421. this.multipleSelection = val
  1422. },
  1423. // 分页触发的事件
  1424. async handleSizeChange(val) {
  1425. this.pagination.size = val
  1426. await this.upDateTable()
  1427. },
  1428. async handleCurrentChange(val) {
  1429. this.pagination.current = val
  1430. await this.upDateTable()
  1431. }
  1432. },
  1433. // 过滤器
  1434. filters: {
  1435. // 过滤发布状态
  1436. filter_state(value) {
  1437. return value == 0 ? '未发布' : '已发布'
  1438. },
  1439. // 过滤上传进度
  1440. filter_schedule(value) {
  1441. if (value == 'ready') {
  1442. return '未开始'
  1443. } else if (value == 'uploading') {
  1444. return '进行中...'
  1445. } else if (value == 'success') {
  1446. return '√'
  1447. } else if (value == 'error') {
  1448. return '×'
  1449. } else {
  1450. return value
  1451. }
  1452. }
  1453. }
  1454. }
  1455. </script>
  1456. <style lang="scss" scoped>
  1457. $fontSize: 14px !important;
  1458. // 上传进度样式
  1459. .font-green {
  1460. color: #67c23a;
  1461. }
  1462. .font-blue {
  1463. color: #2d74e7;
  1464. }
  1465. .font-red {
  1466. font-weight: bold;
  1467. color: #f65252;
  1468. }
  1469. .engineering-manage {
  1470. height: 100vh;
  1471. margin: 0;
  1472. padding: 20px 0;
  1473. box-sizing: border-box;
  1474. position: relative;
  1475. font-size: $fontSize;
  1476. /deep/.histroyPipeData {
  1477. // 详情卡片的样式
  1478. .detailsCrad {
  1479. position: fixed;
  1480. top: 100px;
  1481. right: 24px;
  1482. z-index: 9;
  1483. .clearfix:before,
  1484. .clearfix:after {
  1485. display: table;
  1486. content: '';
  1487. }
  1488. .clearfix:after {
  1489. clear: both;
  1490. }
  1491. .box-card {
  1492. width: 500px;
  1493. max-height: 80vh;
  1494. .el-card__header {
  1495. height: 48px;
  1496. color: #fff;
  1497. background-color: #2d74e7;
  1498. }
  1499. .el-card__body {
  1500. padding: 0 !important;
  1501. .el-menu-item {
  1502. height: 45px;
  1503. font-size: 16px;
  1504. }
  1505. }
  1506. .content {
  1507. height: 600px;
  1508. /deep/ .content-info {
  1509. overflow-y: scroll;
  1510. // max-height: 545px;
  1511. height: 100%;
  1512. padding: 10px 20px;
  1513. .el-textarea__inner,
  1514. .el-input__inner {
  1515. color: #666;
  1516. }
  1517. .detailsTitle {
  1518. position: relative;
  1519. font-size: 16px;
  1520. padding: 5px 0;
  1521. box-sizing: border-box;
  1522. }
  1523. .detailsTitle::after {
  1524. position: absolute;
  1525. top: 5px;
  1526. left: -10px;
  1527. content: '';
  1528. width: 4px;
  1529. height: 65%;
  1530. background-color: #2d74e7;
  1531. }
  1532. /deep/ .el-form {
  1533. .is-disabled {
  1534. .el-input__inner {
  1535. background-color: transparent;
  1536. }
  1537. .el-textarea__inner {
  1538. background-color: transparent;
  1539. }
  1540. }
  1541. .el-form-item {
  1542. margin-bottom: 10px;
  1543. }
  1544. }
  1545. }
  1546. }
  1547. .table-content {
  1548. padding: 15px;
  1549. .content-info {
  1550. font-size: 12px;
  1551. display: flex;
  1552. // justify-content: space-between;
  1553. flex-direction: column;
  1554. align-content: center;
  1555. .left {
  1556. font-family: 'Microsoft YaHei UI', sans-serif;
  1557. flex: 1;
  1558. }
  1559. .right {
  1560. flex: 1;
  1561. .container {
  1562. height: 100%;
  1563. width: 100%;
  1564. padding: 5px;
  1565. box-sizing: border-box;
  1566. }
  1567. .is-top {
  1568. }
  1569. .el-tabs__item {
  1570. margin: 11px 0 0 0;
  1571. background: transparent;
  1572. }
  1573. .el-tabs__header {
  1574. border-top: 0;
  1575. background: #fff;
  1576. }
  1577. // .el-tabs__nav-wrap::after {
  1578. // z-index: 2;
  1579. // }
  1580. // .el-tabs__active-bar
  1581. }
  1582. .detailsTitle {
  1583. position: relative;
  1584. margin: 6px 0;
  1585. padding-left: 10px;
  1586. box-sizing: border-box;
  1587. margin-bottom: 10px;
  1588. }
  1589. .detailsTitle::after {
  1590. position: absolute;
  1591. left: 0;
  1592. content: '';
  1593. width: 4px;
  1594. height: 100%;
  1595. background-color: #2d74e7;
  1596. }
  1597. }
  1598. }
  1599. }
  1600. }
  1601. }
  1602. /deep/.el-table .el-table__cell {
  1603. padding: 0;
  1604. }
  1605. // 详情卡片的样式
  1606. .PipeEvData {
  1607. position: fixed;
  1608. top: 100px;
  1609. right: 45px;
  1610. z-index: 9;
  1611. .detailsCrad {
  1612. .clearfix:before,
  1613. .clearfix:after {
  1614. display: table;
  1615. content: '';
  1616. }
  1617. .clearfix:after {
  1618. clear: both;
  1619. }
  1620. .box-card {
  1621. width: 550px;
  1622. min-height: 310px;
  1623. border: none;
  1624. border-radius: 5px;
  1625. /deep/ .el-card__header {
  1626. height: 48px;
  1627. color: #fff;
  1628. background-color: #2d74e7;
  1629. }
  1630. /deep/.el-card__body {
  1631. padding: 15px !important;
  1632. .el-menu-item {
  1633. height: 45px;
  1634. font-size: 16px;
  1635. }
  1636. }
  1637. .content {
  1638. .content-info {
  1639. overflow-y: scroll;
  1640. height: 600px;
  1641. padding: 10px 20px;
  1642. .info-title {
  1643. font-size: 14px;
  1644. font-weight: bold;
  1645. margin: 5px 0;
  1646. }
  1647. .info-box {
  1648. height: 100%;
  1649. display: flex;
  1650. justify-content: space-between;
  1651. .info-text {
  1652. width: 37%;
  1653. padding: 10px;
  1654. box-sizing: border-box;
  1655. background-color: #f3f7fe;
  1656. border: 1px solid #dedede;
  1657. }
  1658. .info-video {
  1659. width: 60%;
  1660. border: 1px solid #dedede;
  1661. }
  1662. }
  1663. /deep/.el-form {
  1664. .el-link--inner {
  1665. max-width: 416px;
  1666. /* 1.先强制一行内显示文本 */
  1667. white-space: nowrap;
  1668. /* 2.超出部分隐藏 */
  1669. overflow: hidden;
  1670. /* 3.文字用省略号替代超出的部分 */
  1671. text-overflow: ellipsis;
  1672. }
  1673. /deep/.is-disabled {
  1674. .el-input__inner {
  1675. background-color: transparent;
  1676. }
  1677. .el-textarea__inner {
  1678. background-color: transparent;
  1679. }
  1680. }
  1681. .el-form-item {
  1682. margin-bottom: 10px;
  1683. }
  1684. }
  1685. /deep/.el-textarea__inner,
  1686. .el-input__inner {
  1687. color: #666;
  1688. }
  1689. .detailsTitle {
  1690. position: relative;
  1691. font-size: 16px;
  1692. padding: 5px 0;
  1693. box-sizing: border-box;
  1694. }
  1695. .detailsTitle::after {
  1696. position: absolute;
  1697. top: 5px;
  1698. left: -10px;
  1699. content: '';
  1700. width: 4px;
  1701. height: 65%;
  1702. background-color: #2d74e7;
  1703. }
  1704. }
  1705. }
  1706. .table-content {
  1707. padding: 15px;
  1708. .content-info {
  1709. font-size: 12px;
  1710. display: flex;
  1711. justify-content: space-between;
  1712. .left {
  1713. flex: 1;
  1714. .text-space {
  1715. margin: 10px 0;
  1716. /deep/.el-link--inner {
  1717. max-width: 240px;
  1718. // 1.先强制一行内显示文本
  1719. white-space: nowrap;
  1720. // 2.超出部分隐藏
  1721. overflow: hidden;
  1722. // 3.文字用省略号替换超出的部分
  1723. text-overflow: ellipsis;
  1724. }
  1725. }
  1726. }
  1727. .right {
  1728. flex: 1;
  1729. /deep/.is-top {
  1730. margin: 0 0 10px;
  1731. }
  1732. // .el-tabs__header{
  1733. // border-top: none;
  1734. // margin-bottom: 6px;
  1735. // background-color: transparent !important;
  1736. // }
  1737. /deep/.el-tabs {
  1738. .container {
  1739. height: 100%;
  1740. width: 100%;
  1741. padding-top: 5px;
  1742. box-sizing: border-box;
  1743. }
  1744. .el-tabs__content {
  1745. height: 150px;
  1746. width: 234px;
  1747. }
  1748. .el-tabs__item {
  1749. margin: 11px 0 0 0 !important;
  1750. background: transparent !important;
  1751. }
  1752. .el-tabs__header {
  1753. border-top: 0 !important;
  1754. background: transparent !important;
  1755. }
  1756. }
  1757. // .el-tabs__nav-wrap::after {
  1758. // z-index: 2;
  1759. // }
  1760. // .el-tabs__active-bar
  1761. }
  1762. .detailsTitle {
  1763. position: relative;
  1764. margin: 6px 0;
  1765. padding-left: 10px;
  1766. box-sizing: border-box;
  1767. }
  1768. .detailsTitle::after {
  1769. position: absolute;
  1770. left: 0;
  1771. content: '';
  1772. width: 4px;
  1773. height: 100%;
  1774. background-color: #2d74e7;
  1775. }
  1776. }
  1777. }
  1778. }
  1779. }
  1780. }
  1781. .delete-box {
  1782. /deep/.el-dialog {
  1783. margin-top: 30vh !important;
  1784. .el-dialog__header {
  1785. border-bottom: none;
  1786. }
  1787. }
  1788. }
  1789. /deep/ .el-date-editor {
  1790. }
  1791. // 表格样式
  1792. .table-box {
  1793. width: 96%;
  1794. margin: auto;
  1795. display: flex;
  1796. height: 100%;
  1797. flex-direction: column;
  1798. // 发布状态样式
  1799. .stateRedClass {
  1800. color: #ff0017;
  1801. }
  1802. .stateGreenClass {
  1803. color: #5c9a44;
  1804. }
  1805. .top-tool {
  1806. display: flex;
  1807. justify-content: space-between;
  1808. flex-direction: row;
  1809. flex-wrap: wrap;
  1810. font-size: $fontSize;
  1811. /deep/ .el-radio__label {
  1812. font-size: $fontSize;
  1813. }
  1814. /deep/ .serch-engineering {
  1815. display: flex;
  1816. // justify-content: space-around;
  1817. align-items: center;
  1818. margin-bottom: 14px;
  1819. .sampleTime {
  1820. width: 308px !important;
  1821. .el-input {
  1822. width: 140px;
  1823. }
  1824. }
  1825. .release-radio {
  1826. display: flex;
  1827. align-items: center;
  1828. white-space: nowrap;
  1829. margin-right: 5px;
  1830. font-size: $fontSize;
  1831. .el-radio {
  1832. margin-right: 10px;
  1833. }
  1834. .release-title {
  1835. margin: 0 10px;
  1836. }
  1837. .el-checkbox {
  1838. margin-right: 12px;
  1839. }
  1840. }
  1841. .serch-input {
  1842. width: 240px;
  1843. }
  1844. .el-input__inner {
  1845. height: 34px;
  1846. }
  1847. .el-range-editor {
  1848. width: 270px;
  1849. }
  1850. .date-css {
  1851. width: 140px;
  1852. }
  1853. .title {
  1854. font-size: 14px;
  1855. color: #606266;
  1856. font-family: Arial;
  1857. white-space: nowrap;
  1858. margin-left: 5px;
  1859. }
  1860. }
  1861. .right-btn {
  1862. margin-bottom: 14px;
  1863. display: flex;
  1864. align-items: center;
  1865. font-size: $fontSize;
  1866. // flex-direction: row;
  1867. // flex-wrap: wrap;
  1868. }
  1869. }
  1870. }
  1871. /deep/.el-table .el-table__cell:not(td) {
  1872. padding: 0;
  1873. }
  1874. /deep/ .el-table {
  1875. flex: 1;
  1876. // overflow-y: scroll;
  1877. th.el-table__cell > .cell {
  1878. color: rgb(50, 59, 65);
  1879. height: 40px;
  1880. line-height: 40px;
  1881. background: rgb(234, 241, 253);
  1882. }
  1883. .el-table__row--striped > td {
  1884. background-color: #f3f7fe !important;
  1885. }
  1886. .hover-row {
  1887. color: #e6a23c;
  1888. background-color: rgba($color: #2d74e7, $alpha: 0.1);
  1889. }
  1890. .rowBgBlue {
  1891. & > td {
  1892. color: #fff;
  1893. border-right: 1px solid #ebeef5;
  1894. background-color: #69a8ea !important;
  1895. }
  1896. }
  1897. }
  1898. // 报告上传样式
  1899. .public-box {
  1900. /deep/ .el-dialog__header {
  1901. background-color: #2d74e7;
  1902. .el-dialog__title {
  1903. color: #fff;
  1904. }
  1905. .el-dialog__headerbtn > .el-icon-close {
  1906. color: #fff !important;
  1907. }
  1908. }
  1909. }
  1910. // 发布盒子布局
  1911. .release-box {
  1912. /deep/ .el-dialog {
  1913. display: flex;
  1914. flex-direction: column;
  1915. .el-dialog__body {
  1916. flex: 1;
  1917. padding: 15px 20px !important;
  1918. }
  1919. }
  1920. }
  1921. .hd-input {
  1922. /deep/.el-input__inner {
  1923. width: 70%;
  1924. }
  1925. .upData-class {
  1926. height: 40px;
  1927. display: flex;
  1928. align-items: center;
  1929. font-size: $fontSize;
  1930. font-weight: bold;
  1931. background-color: #dfeffe;
  1932. }
  1933. /deep/ .el-upload-list__item-name {
  1934. text-align: center;
  1935. }
  1936. }
  1937. .release-radio {
  1938. .el-radio {
  1939. margin-right: 8px !important;
  1940. .radio__label {
  1941. padding-left: 4px;
  1942. }
  1943. }
  1944. }
  1945. .el-select {
  1946. width: 70%;
  1947. }
  1948. /deep/ .is-required {
  1949. position: relative;
  1950. .select-btn {
  1951. position: absolute;
  1952. top: 0;
  1953. left: 72%;
  1954. }
  1955. }
  1956. // 报告发布
  1957. .releaseTop-box {
  1958. display: flex;
  1959. justify-content: space-between;
  1960. .left,
  1961. .right {
  1962. /deep/ .el-tabs__header {
  1963. background: transparent;
  1964. border-top: none;
  1965. }
  1966. /deep/.el-tabs__item {
  1967. margin: 0 !important;
  1968. margin-top: 11px !important;
  1969. background: transparent !important;
  1970. }
  1971. /deep/.releaseContent {
  1972. width: 100%;
  1973. height: 78vh;
  1974. max-width: 64vw;
  1975. margin-top: -3px;
  1976. padding: 20px;
  1977. box-sizing: border-box;
  1978. overflow-y: scroll;
  1979. }
  1980. }
  1981. .left {
  1982. flex: 2;
  1983. .releaseContent {
  1984. height: 78vh;
  1985. border: 1px solid #9a9a9a;
  1986. overflow: scroll;
  1987. .detailsTitle {
  1988. margin: 24px 0;
  1989. position: relative;
  1990. }
  1991. .detailsTitle::after {
  1992. position: absolute;
  1993. left: -10px;
  1994. content: '';
  1995. width: 4px;
  1996. height: 100%;
  1997. background-color: #2d74e7;
  1998. }
  1999. }
  2000. }
  2001. .right {
  2002. flex: 1;
  2003. .map-box {
  2004. height: 78vh;
  2005. border: 1px solid #666;
  2006. }
  2007. }
  2008. }
  2009. /deep/ .upload-demo {
  2010. position: relative;
  2011. & > .el-upload {
  2012. // width: 100%;
  2013. }
  2014. .btn-box {
  2015. // cursor: default;
  2016. display: flex;
  2017. justify-content: space-between;
  2018. align-items: center;
  2019. .btns {
  2020. position: absolute;
  2021. right: 0;
  2022. }
  2023. }
  2024. }
  2025. // 详情卡片的样式
  2026. .detailsCrad {
  2027. z-index: 9;
  2028. .clearfix:before,
  2029. .clearfix:after {
  2030. display: table;
  2031. content: '';
  2032. }
  2033. .clearfix:after {
  2034. clear: both;
  2035. }
  2036. /deep/ .box-card {
  2037. width: 500px;
  2038. max-height: 80vh;
  2039. .el-card__header {
  2040. height: 48px;
  2041. color: #fff;
  2042. background-color: #2d74e7;
  2043. }
  2044. .el-card__body {
  2045. padding: 0;
  2046. .el-menu-item {
  2047. height: 45px;
  2048. }
  2049. }
  2050. .content {
  2051. /deep/ .content-info {
  2052. overflow-y: scroll;
  2053. max-height: 545px;
  2054. padding: 10px 20px;
  2055. .el-textarea__inner,
  2056. .el-input__inner {
  2057. color: #666;
  2058. }
  2059. .detailsTitle {
  2060. position: relative;
  2061. font-size: 16px;
  2062. padding: 5px 0;
  2063. box-sizing: border-box;
  2064. }
  2065. .detailsTitle::after {
  2066. position: absolute;
  2067. top: 5px;
  2068. left: -10px;
  2069. content: '';
  2070. width: 4px;
  2071. height: 65%;
  2072. background-color: #2d74e7;
  2073. }
  2074. }
  2075. }
  2076. .table-content {
  2077. padding: 15px;
  2078. .content-info {
  2079. font-size: 12px;
  2080. display: flex;
  2081. justify-content: space-between;
  2082. .left {
  2083. flex: 1;
  2084. }
  2085. /deep/ .right {
  2086. flex: 1;
  2087. .container {
  2088. height: 100%;
  2089. width: 100%;
  2090. padding: 5px;
  2091. box-sizing: border-box;
  2092. }
  2093. .is-top {
  2094. }
  2095. .el-tabs__item {
  2096. margin: 11px 0 0 0;
  2097. background: transparent;
  2098. }
  2099. .el-tabs__header {
  2100. border-top: 0;
  2101. background: #fff;
  2102. }
  2103. // .el-tabs__nav-wrap::after {
  2104. // z-index: 2;
  2105. // }
  2106. // .el-tabs__active-bar
  2107. }
  2108. .detailsTitle {
  2109. position: relative;
  2110. margin: 6px 0;
  2111. padding-left: 10px;
  2112. box-sizing: border-box;
  2113. margin-bottom: 10px;
  2114. }
  2115. .detailsTitle::after {
  2116. position: absolute;
  2117. left: 0;
  2118. content: '';
  2119. width: 4px;
  2120. height: 100%;
  2121. background-color: #2d74e7;
  2122. }
  2123. }
  2124. }
  2125. }
  2126. }
  2127. }
  2128. #popupCardDefRpt {
  2129. &::after {
  2130. content: '';
  2131. display: block;
  2132. width: 45px;
  2133. height: 27px;
  2134. background: url('../../components/testImg/corner.png');
  2135. position: absolute;
  2136. bottom: -26px;
  2137. left: 50%;
  2138. transform: translate(-50%, 0);
  2139. }
  2140. }
  2141. #popupCardRpt {
  2142. &::after {
  2143. content: '';
  2144. display: block;
  2145. width: 45px;
  2146. height: 27px;
  2147. background: url('../../components/testImg/corner.png');
  2148. position: absolute;
  2149. bottom: -26px;
  2150. left: 50%;
  2151. transform: translate(-50%, 0);
  2152. }
  2153. }
  2154. </style>