sceneImg.vue 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549
  1. <template>
  2. <div class="scene abstract sceneImg">
  3. <el-dialog v-model="casePhotoItem.show" title="重命名" width="500">
  4. <el-form :model="casePhotoItem">
  5. <el-form-item :label-width="0">
  6. <el-input
  7. v-model="casePhotoItem.name"
  8. maxlength="15"
  9. show-word-limit
  10. autocomplete="off"
  11. />
  12. </el-form-item>
  13. </el-form>
  14. <template #footer>
  15. <div class="dialog-footer text-center">
  16. <el-button @click="casePhotoItem.show = false">取消</el-button>
  17. <el-button type="primary" @click="handleConfirm"> 确定 </el-button>
  18. </div>
  19. </template>
  20. </el-dialog>
  21. <!-- <el-button class="w-full" @click="handledrawCasePhotos">照片卷</el-button> -->
  22. <div class="demo-image__preview">
  23. <el-image-viewer
  24. hide-on-click-modal
  25. @close="
  26. () => {
  27. urlindex = -1;
  28. }
  29. "
  30. :initial-index="urlindex"
  31. show-progress
  32. v-if="urlindex != -1"
  33. :url-list="ImgsrcList"
  34. fit="cover"
  35. />
  36. </div>
  37. <div class="scene-list">
  38. <div class="list">
  39. <el-tabs
  40. v-model="active1"
  41. class="demo-tabs"
  42. ref="tabsRef"
  43. @tab-click="handleClick"
  44. >
  45. <!-- //new 0 现场图 1 照片卷 2 现场照片 3 勘验笔录 -->
  46. <el-tab-pane
  47. v-for="(item, index) in list"
  48. :key="item.filesTypeName"
  49. :label="showText ? item.filesTypeName : ''"
  50. :childrenList="item.childrenList"
  51. :class="`handleIsShow show${handleIsShow(item)}`"
  52. :name="item.filesTypeName"
  53. >
  54. <div class="leftCenter" v-if="active1 == '现场图'">
  55. <div v-for="(a, b) in item.childrenList" :key="b">
  56. <div
  57. class="listTitle"
  58. v-if="!show || (a.caseFilesList && a.caseFilesList.length)"
  59. >
  60. <span>{{ a.filesTypeName }}</span>
  61. <el-dropdown
  62. v-show="!show"
  63. @command="
  64. (command) => {
  65. handleCommand(command, a);
  66. }
  67. "
  68. >
  69. <span class="el-dropdown-link">
  70. <el-icon class="el-icon--right" title="新增"
  71. ><Plus
  72. /></el-icon>
  73. </span>
  74. <template #dropdown>
  75. <el-dropdown-menu>
  76. <el-dropdown-item command="绘图">新增</el-dropdown-item>
  77. <el-dropdown-item command="导入">导入</el-dropdown-item>
  78. </el-dropdown-menu>
  79. </template>
  80. </el-dropdown>
  81. </div>
  82. <div
  83. class="itemList"
  84. v-for="(items, indexs) in a.caseFilesList"
  85. @click="handlItem0(items)"
  86. :class="{
  87. active:
  88. childrenList.src == items.filesUrl &&
  89. childrenList.filesId == items.filesId,
  90. }"
  91. :key="indexs"
  92. >
  93. <div class="ItemTitle">
  94. <div
  95. class="text"
  96. :title="items.filesTypeName || items.filesTitle"
  97. >
  98. {{ items.filesTypeName || items.filesTitle }}
  99. </div>
  100. <div
  101. class="operation"
  102. v-if="
  103. !show &&
  104. childrenList.src == items.filesUrl &&
  105. childrenList.filesId == items.filesId
  106. "
  107. >
  108. <el-icon
  109. title="下载"
  110. v-if="items.filesUrl"
  111. @click="
  112. downloadByUrl({
  113. url: items.filesUrl,
  114. fileName: items.filesTitle,
  115. })
  116. "
  117. ><Download
  118. /></el-icon>
  119. <el-icon
  120. title="编辑"
  121. v-if="items.oldData != 1"
  122. @click="handleoverviewEdit(a.filesTypeName, items)"
  123. ><Edit
  124. /></el-icon>
  125. <el-icon
  126. @click="OverviewDel(items, a.filesTypeName)"
  127. title="删除"
  128. ><CircleClose
  129. /></el-icon>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <div class="leftCenter" v-if="active1 == '现场照片'">
  136. <div
  137. v-for="(a, b) in item.childrenList"
  138. :key="b"
  139. v-show="show ? recursiveSearch(a.childrenList) : true"
  140. >
  141. <div class="listTitle">{{ a.filesTypeName }}</div>
  142. <div
  143. class="itemList"
  144. v-for="(items, indexs) in a.childrenList"
  145. @click="handleClick2(items)"
  146. :class="{ active: childrenList.value == items.filesTypeId }"
  147. :key="indexs"
  148. >
  149. <div class="ItemTitle">{{ items.filesTypeName }}</div>
  150. </div>
  151. </div>
  152. </div>
  153. <div class="leftCenter" v-if="active1 == '勘验笔录'">
  154. <div
  155. class="addButton flex"
  156. v-show="!show"
  157. style="margin-bottom: 10px"
  158. >
  159. <el-button
  160. class="newbut"
  161. :icon="Edit"
  162. @click="handleRecords(-1)"
  163. >填写</el-button
  164. >
  165. <el-upload
  166. class="upload-demo"
  167. style="display: inline-block"
  168. :show-file-list="false"
  169. :before-upload="upload"
  170. :http-request="uploadNewFile"
  171. :on-success="handleSuccess"
  172. :on-preview="previewFile"
  173. :accept="accept"
  174. :before-remove="removeFile"
  175. multiple
  176. >
  177. <el-button class="newbut" :icon="Upload">上传</el-button>
  178. </el-upload>
  179. </div>
  180. <div
  181. class="itemList"
  182. v-for="(items, indexs) in item.caseFilesList"
  183. @click="handlItem1(items)"
  184. :class="{ active: childrenList.value == items.filesId }"
  185. :key="indexs"
  186. >
  187. <div class="ItemTitle">
  188. <div class="text">
  189. {{ items.filesTypeName || items.filesTitle }}
  190. </div>
  191. <div
  192. class="operation"
  193. v-if="childrenList.value == items.filesId"
  194. >
  195. <el-icon
  196. title="下载"
  197. @click="
  198. downloadByUrl({
  199. url: items.filesUrl,
  200. fileName: items.filesTitle,
  201. })
  202. "
  203. ><Download
  204. /></el-icon>
  205. <el-icon
  206. title="编辑"
  207. v-if="!show && items.createType != 'upload'"
  208. @click="handleRecords(items.filesId)"
  209. ><Edit
  210. /></el-icon>
  211. <el-icon v-if="!show" @click="del(items)" title="删除"
  212. ><CircleClose
  213. /></el-icon>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. <div class="leftCenter" v-if="active1 == '照片卷'">
  219. <div
  220. class="addButton flex"
  221. v-show="!show"
  222. style="margin-bottom: 10px"
  223. >
  224. <el-button
  225. class="newbut"
  226. :icon="Edit"
  227. @click="handledrawCasePhotos([])"
  228. >制卷</el-button
  229. >
  230. <el-button
  231. class="newbut"
  232. @click="exportToPDF(true)"
  233. :disabled="!casePhotoList.length"
  234. :icon="Download"
  235. >下载</el-button
  236. >
  237. <!-- -->
  238. <el-button style="display: none;" class="newbut" :icon="Edit" @click="openAIdrawCase"
  239. >AI制卷</el-button
  240. >
  241. </div>
  242. <div
  243. class="itemList"
  244. v-for="(items, indexs) in casePhotoList"
  245. @click="handlItem2(items)"
  246. :class="{ active: childrenList.value == items.id }"
  247. :key="indexs"
  248. >
  249. <div class="ItemTitle">
  250. <div class="text">
  251. {{ items.name }}
  252. </div>
  253. <div
  254. class="operation"
  255. v-if="!show && childrenList.value == items.id"
  256. >
  257. <el-icon title="下载" @click="exportToPDF(false, items)"
  258. ><Download
  259. /></el-icon>
  260. <i
  261. title="重命名"
  262. class="el-icon iconfont icon-rename"
  263. @click="handlemtk(items)"
  264. ></i>
  265. <el-icon
  266. title="编辑"
  267. v-if="!show && items.createType != 'upload'"
  268. @click="handledrawCasePhotos(items.id)"
  269. ><Edit
  270. /></el-icon>
  271. <el-icon v-if="!show" @click="del2(items)" title="删除"
  272. ><CircleClose
  273. /></el-icon>
  274. </div>
  275. </div>
  276. </div>
  277. </div>
  278. </el-tab-pane>
  279. </el-tabs>
  280. </div>
  281. </div>
  282. <!-- 现场照片 -->
  283. <div class="abstractCentenr" v-if="active1 == '现场照片'">
  284. <div class="centerTop" v-show="!show">
  285. <div class="import" @click="handleYr">
  286. <el-icon size="26" color="#26559B">
  287. <i
  288. style="font-size: 26px; color: #26559b"
  289. class="iconfont icon-import"
  290. ></i
  291. ></el-icon>
  292. <div class="name">导入</div>
  293. </div>
  294. <el-upload
  295. class="upload-demo upload"
  296. multiple
  297. :show-file-list="false"
  298. :before-upload="imgupload"
  299. :file-list="imgfileLists"
  300. :http-request="uploadNewFile"
  301. :on-success="handleSuccess"
  302. :on-preview="imgpreviewFile"
  303. :accept="imgaccept"
  304. drag
  305. action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
  306. >
  307. <el-icon class="el-icon--upload" style="margin-top: 20px" size="26">
  308. <i
  309. style="font-size: 26px; color: #26559b"
  310. class="iconfont icon-Upload"
  311. ></i
  312. ></el-icon>
  313. <div class="el-upload__text">
  314. 点击或拖拽文件上传<br />支持 jpg、png、jpeg ≤ 50MB
  315. </div>
  316. </el-upload>
  317. </div>
  318. <div class="centerBottom">
  319. <div class="imgList">
  320. <viewImg
  321. :key="childrenList.value"
  322. :list="childrenList.caseFilesList || []"
  323. @handleEdit="handleEdit"
  324. @refresh="getList"
  325. />
  326. </div>
  327. </div>
  328. </div>
  329. <!-- 现场图 -->
  330. <div class="abstractCentenr" v-if="active1 == '现场图'">
  331. <div class="imgSrcimport noView" v-if="!childrenList.src">暂无数据</div>
  332. <div class="imgSrccentenr" v-else>
  333. <img
  334. @click="handleView(childrenList.src)"
  335. :src="childrenList.src"
  336. class="noView viewImg"
  337. alt=""
  338. />
  339. </div>
  340. </div>
  341. <!-- 勘验笔录 -->
  342. <div class="abstractCentenr" v-if="active1 == '勘验笔录'">
  343. <div
  344. class="kybl"
  345. v-if="childrenList.item && childrenList.item.createType == 'online'"
  346. >
  347. <div class="title">现场勘验笔录</div>
  348. <div class="kyblid">勘验号:{{ data.inquestNum }}</div>
  349. <div>现场勘验单位:{{ data.deptName }}</div>
  350. <div>指派/报告单位:{{ data.reportDept }}</div>
  351. <div>时间:{{ data.inquestTime }}</div>
  352. <div>勘验事由:{{ data.inquestResource }}</div>
  353. <div>
  354. 现场勘验时间:
  355. <span v-if="data.times && data.times[0]"
  356. >{{ dayjs(data.times[0]).format("YYYY-MM-DD HH:mm:ss") }} ~
  357. {{ dayjs(data.times[1]).format("YYYY-MM-DD HH:mm:ss") }}</span
  358. >
  359. </div>
  360. <div>现场地点:{{ data.address }}</div>
  361. <div>现场保护情况:{{ data.protectionSituation }}</div>
  362. <div>
  363. 现场保护人:姓名 {{ data.protector.name }}单位
  364. {{ data.protector.unit }}职务 {{ data.protector.job }}
  365. </div>
  366. <div>
  367. 保护措施:
  368. <el-checkbox-group class="checkbox" v-model="data.protectionMeasures">
  369. <el-checkbox :value="0" label="专人看护现场,防止他人进入" />
  370. <el-checkbox :value="1" checked label="设立警戒带,划定禁行区域" />
  371. <el-checkbox :value="2" label="其他措施" />
  372. </el-checkbox-group>
  373. </div>
  374. <div>
  375. 现场情况:
  376. <el-checkbox-group class="checkbox" v-model="data.situation">
  377. <el-checkbox :value="0" label="原始现场" />
  378. <el-checkbox :value="1" checked label="变动现场" />
  379. </el-checkbox-group>
  380. </div>
  381. <div>
  382. 变动原因:
  383. <el-checkbox-group class="checkbox" v-model="data.changeReason">
  384. <el-checkbox :value="0" label="事主进入" />
  385. <el-checkbox :value="1" label="报案人进入" />
  386. <el-checkbox :value="2" label="其他" />
  387. </el-checkbox-group>
  388. <span style="margin-left: 20px" v-if="data.changeReasonOtherValue">{{
  389. data.changeReasonOtherValue
  390. }}</span>
  391. </div>
  392. <div>
  393. 天气:
  394. <el-checkbox-group class="checkbox" v-model="data.weatherInfo.type">
  395. <el-checkbox :value="0" label="阴" />
  396. <el-checkbox :value="1" label="晴" />
  397. <el-checkbox :value="2" label="雨" />
  398. <el-checkbox :value="3" label="雾" />
  399. </el-checkbox-group>
  400. <span>温度:{{ data.weatherInfo.temperature }}℃</span>
  401. <span>湿度:{{ data.weatherInfo.humidity }}%</span>
  402. <span>风向:{{ data.weatherInfo.windDirection }}</span>
  403. </div>
  404. <div>
  405. 现场勘验利用的光线:
  406. <el-checkbox-group class="checkbox" v-model="data.light">
  407. <el-checkbox :value="0" checked label="自然光" />
  408. <el-checkbox :value="1" checked label="灯光" />
  409. <el-checkbox :value="2" label="特种光" />
  410. </el-checkbox-group>
  411. </div>
  412. <div>
  413. 现场勘验指挥人:姓名{{ data.inquestCommander.name }}单位{{
  414. data.inquestCommander.unit
  415. }}职务{{ data.inquestCommander.job }}
  416. </div>
  417. <div>现场勘验情况:{{ data.inquestSituation }}</div>
  418. <div>
  419. 现场勘验制图 {{ data.imageNum }} 张;照相 {{
  420. data.photographNum
  421. }} 张;摄像 {{ data.photographyMinNum }} 分{{
  422. data.photographySecNum
  423. }}秒;录音{{ data.recordingMinNum }} 分{{ data.recordingSecNum }}秒;
  424. </div>
  425. <div>
  426. 现场勘验记录人员:
  427. <div class="list">
  428. <div
  429. v-for="(info, index) in data.recorderInfo"
  430. :key="index"
  431. v-show="info.name || info.unit || info.job"
  432. >
  433. {{ info.typeLabel }} 姓名: {{ info.name }} 单位:
  434. {{ info.unit }} 职务:
  435. {{ info.job }}
  436. </div>
  437. </div>
  438. </div>
  439. <div>
  440. 现场勘验人员:
  441. <div class="list">
  442. <div
  443. v-for="(info, index) of data.signatureInfo"
  444. :key="index"
  445. v-show="info.name || info.unit || info.job"
  446. >
  447. 姓名: {{ info.name || "_____" }} 单位: {{ info.unit }} 职务:
  448. {{ info.job }}
  449. </div>
  450. </div>
  451. </div>
  452. <div>
  453. 现场勘验见证人:
  454. <div class="list">
  455. <div
  456. v-for="(info, index) of data.witnessInfo"
  457. :key="index"
  458. v-show="info.sex || info.birthday || info.address"
  459. >
  460. 姓名: {{ info.name || "_____" }} 性别:
  461. {{ info.sex ? "女" : "男" }}出生日期:
  462. {{ info.birthday && dayjs(info.birthday).format("YYYY-MM-DD") }}
  463. 住址: {{ info.address }}
  464. </div>
  465. </div>
  466. </div>
  467. <div>备注:{{ data.remark }}</div>
  468. </div>
  469. <div class="imgSrccentenr" v-else-if="isImage(childrenList.src)">
  470. <img
  471. @click="handleView(childrenList.src)"
  472. :src="childrenList.src"
  473. class="noView viewImg"
  474. alt=""
  475. />
  476. </div>
  477. <div class="noView" v-else>
  478. <div
  479. class="noViewTitle"
  480. v-if="childrenList.item && childrenList.item.filesUrl"
  481. >
  482. <div class="zbzc">暂不支持预览</div>
  483. <div
  484. class="cursor-pointer down"
  485. @click="
  486. downloadByUrl({
  487. fileName: childrenList.item && childrenList.item.filesTitle,
  488. url: childrenList.item && childrenList.item.filesUrl,
  489. })
  490. "
  491. >
  492. 下载
  493. </div>
  494. </div>
  495. <div v-else class="noViewTitle">暂无数据</div>
  496. </div>
  497. </div>
  498. <div class="abstractCentenr" style="padding: 0" v-if="active1 == '照片卷'">
  499. <iframe id="iframe-outside" frameborder="0"></iframe>
  500. <showpages
  501. ref="showPagesRef"
  502. :photos="photos"
  503. v-if="childrenList.src"
  504. :pageCount="childrenList.item.pageCount"
  505. :content="childrenList.src"
  506. />
  507. <div v-else class="noView">
  508. <div
  509. class="noViewTitle"
  510. v-if="childrenList.item && childrenList.item.filesUrl"
  511. >
  512. <div class="zbzc">暂不支持预览</div>
  513. </div>
  514. <div v-else class="noViewTitle">暂无数据</div>
  515. </div>
  516. </div>
  517. </div>
  518. </template>
  519. <script setup lang="ts">
  520. import viewImg from "@/components/viewImg/list.vue";
  521. import { computed, ref, reactive } from "vue";
  522. import { addCaseScenes, exportCasePhotos, tableModelScene } from "./quisk";
  523. import showpages from "./showpages.vue";
  524. import {
  525. updateByTreeFileLists,
  526. getByTreeFileLists,
  527. getCasePhotoRollList,
  528. caseExportImg,
  529. overviewAdd,
  530. TabulationAdd,
  531. } from "@/store/case";
  532. import { ElMessage, ElMessageBox, ElLoading } from "element-plus";
  533. import { delCaseFile } from "@/store/caseFile";
  534. import {
  535. uploadNewFile,
  536. addByMediaLiBrary,
  537. getSceneListHasAi,
  538. getCaseInquestInfoOld,
  539. casePhotoUpdate,
  540. casePhotodel,
  541. getAllPhotoList,
  542. getCaseInfoData,
  543. show,
  544. } from "@/store/case";
  545. import {
  546. downloadFile,
  547. downloadByUrl,
  548. isImage,
  549. recursiveSearch,
  550. } from "@/util/index.ts";
  551. import { caseOverviewDel } from "@/store/case";
  552. import dayjs from "dayjs";
  553. import { recorderInfoType, ChangeReasonType } from "./formData.ts";
  554. import {
  555. Upload,
  556. DocumentAdd,
  557. CircleCheck,
  558. Delete,
  559. Download,
  560. CircleClose,
  561. Edit,
  562. Plus,
  563. } from "@element-plus/icons-vue";
  564. import { RouteName, router } from "@/router";
  565. import { useUpload } from "@/hook/upload";
  566. import { addCaseFile, setTypeFile, addSceneImg1, addSceneImg2 } from "./quisk";
  567. const caseId = computed(() => router.currentRoute.value?.params?.caseId);
  568. const filesTypeId = ref(0);
  569. const ImgsrcList = ref([]);
  570. const active1 = ref("现场图");
  571. const active = ref(true);
  572. const urlindex = ref(-1);
  573. const selectNum = ref(null)
  574. const canvas = ref(null);
  575. const editor = ref(null);
  576. const tabsRef = ref(null);
  577. const showText = ref(show.value ? false : true);
  578. const settype = ref(false);
  579. const childrenList = ref({
  580. list: [],
  581. value: "",
  582. parentId: 0,
  583. src: "",
  584. filesId: 0,
  585. item: {},
  586. caseFilesList: [],
  587. });
  588. const casePhotoItem = ref({
  589. id: "",
  590. name: "",
  591. content: "",
  592. show: false,
  593. });
  594. const showPagesRef = ref(null);
  595. const data = reactive({
  596. title: "",
  597. inquestNum: "", //现场勘验号
  598. deptName: "", //单位名称
  599. sendDept: "", //发送单位
  600. issuanceCount: "", // 份数
  601. makeTime: "", //制作时间
  602. recorder: "", // 笔录人
  603. issuanceOpinion: "", //签发意见
  604. reportDept: "", //报告单位
  605. times: [], // startTime ,endTime
  606. address: "", // 勘验地址
  607. inquestTime: "", //勘验时间
  608. inquestResource:
  609. "x年x月x日x单位接到报警称;x年x月x日x地点发生一起什么案事件,需要勘验现场, 接通知后,技术员xx,xx前往现场考察", //勘验范围
  610. protector: {
  611. name: "",
  612. unit: "",
  613. job: "",
  614. }, // 现场保护人
  615. protectionSituation: "", // 现场保护情况
  616. situation: [], //现场情况
  617. changeReason: [],
  618. changeReasonOtherValue: "",
  619. protectionMeasures: [], //保护措施
  620. weatherInfo: {
  621. type: [],
  622. temperature: "",
  623. humidity: "",
  624. windDirection: "",
  625. }, //天气情况
  626. light: [], //光线
  627. painter: "",
  628. photographer: "",
  629. inquestCommander: {
  630. name: "",
  631. unit: "",
  632. job: "",
  633. }, //现场勘验指挥人
  634. inquestSituation:
  635. "案发现场以XXX小区为中心,东侧为XXX路,西侧是XXX街,北侧为XXX路,南侧是XXX路。", //现场勘验情况
  636. imageNum: 0, //现场勘验制图数量
  637. photographNum: 0, //照相数量
  638. photographyMinNum: 0, //摄影数量
  639. photographySecNum: 0, //摄影数量
  640. recordingMinNum: "",
  641. recordingSecNum: "",
  642. recorderInfo: JSON.parse(JSON.stringify(recorderInfoType)),
  643. signatureInfo: [], //现场勘验人员
  644. witnessInfo: [],
  645. remark: "",
  646. });
  647. const xczpfilesTypeId = ref(1);
  648. const photos = ref([]);
  649. const showModal = ref(false);
  650. const srcList = ref([]);
  651. const klblId = ref(0);
  652. const fileLists = ref([]);
  653. const imgfileLists = ref([]);
  654. const list = ref([]);
  655. const fileList = ref([]);
  656. const casePhotoList = ref([
  657. {
  658. id: 0,
  659. name: "现场照片",
  660. caseId: 336,
  661. content: "现场照片",
  662. },
  663. ]);
  664. const caseInfo = computed(() => getCaseInfoData());
  665. const activeNames = ref(["1"]);
  666. const { size, upload, removeFile, previewFile, file, accept } = useUpload({
  667. maxSize: 10 * 1024 * 1024,
  668. formats: [".doc", ".docx", ".pdf"],
  669. });
  670. const {
  671. size: imgSize,
  672. fileList: imgfileList,
  673. upload: imgupload,
  674. file: imgfile,
  675. previewFile: imgpreviewFile,
  676. accept: imgaccept,
  677. } = useUpload({
  678. maxSize: 50 * 1024 * 1024,
  679. formats: [".jpg", ".png", ".jpeg", ".bmp"], //".mp4", ".wav", ".mp3", ".shp"
  680. });
  681. const handleChange = (val: string[]) => {
  682. console.log(val);
  683. };
  684. const getImgList = async () => {
  685. let imgList = await getAllPhotoList(filesTypeId.value);
  686. photos.value =
  687. imgList.map((ele) => ({
  688. ...ele,
  689. url: ele.filesUrl,
  690. id: ele.filesId,
  691. name: ele.filesTitle,
  692. })) || [];
  693. };
  694. getList();
  695. function handleActive(params) {
  696. console.log("handleActive", params);
  697. }
  698. const initInfo = async (inquestFileId) => {
  699. const res = await getCaseInquestInfoOld(inquestFileId || fileId.value);
  700. for (var k in data) {
  701. if (res.data && res.data.hasOwnProperty(k)) {
  702. // console.log("Key is " + k);
  703. if (res.data[k]) {
  704. data[k] = res.data[k];
  705. } else {
  706. data[k] = "";
  707. }
  708. }
  709. }
  710. };
  711. function handleSuccess(item) {
  712. let uploadId = item?.data.id;
  713. addByMediaLiBrary({
  714. caseId: caseId.value,
  715. filesTypeId:
  716. active1.value == "勘验笔录" ? klblId.value : childrenList.value.value,
  717. uploadId,
  718. }).then((res) => {
  719. fileLists.value = [];
  720. imgfileLists.value = [];
  721. getList(true);
  722. });
  723. }
  724. function getList(refresh = false) {
  725. //new 0 现场图 1 照片卷 2 现场照片 3 勘验笔录
  726. //old 0 现场照片 1 现场图 2 勘验笔录
  727. getCasePhotoRollList(caseId.value).then((res) => {
  728. casePhotoList.value = res || [];
  729. let count = 0;
  730. casePhotoList.value = res.map((ele) => {
  731. let content = ele.content && JSON.parse(ele.content);
  732. let number = content.pages?.length;
  733. count = count + number;
  734. return {
  735. ...ele,
  736. pageCount: count - number,
  737. };
  738. });
  739. if (
  740. active1.value == "照片卷" &&
  741. casePhotoList.value &&
  742. casePhotoList.value.length
  743. ) {
  744. let item = res.find((ele) => ele.id == casePhotoItem.value.id) || res[0];
  745. handlItem2(item);
  746. }
  747. });
  748. updateByTreeFileLists(caseId.value).then((res) => {
  749. list.value =
  750. res.find((ele) => ele.filesTypeName == "三录材料")?.childrenList || [];
  751. klblId.value = list.value.find(
  752. (ele) => ele.filesTypeName == "勘验笔录"
  753. ).filesTypeId;
  754. let zpj = list.value.find((ele) => ele.filesTypeName == "现场照片");
  755. filesTypeId.value = zpj.filesTypeId;
  756. getImgList();
  757. if (show.value) {
  758. //展示也过滤现场照片空数据
  759. list.value[0].childrenList.map((ele) => {
  760. ele.childrenList =
  761. ele.childrenList?.filter((element) => element.caseFilesList) || [];
  762. return ele;
  763. });
  764. console.log("list", list.value);
  765. list.value[1].childrenList.map((ele) => {
  766. ele.caseFilesList =
  767. ele.caseFilesList?.filter((element) => element.filesUrl) || [];
  768. return ele;
  769. });
  770. }
  771. if (!refresh) {
  772. handleClick({
  773. paneName: active1.value,
  774. childrenListvalue: childrenList.value,
  775. });
  776. return;
  777. }
  778. let item = list.value.find((item) => item.filesTypeName == active1.value);
  779. let arr2 = [];
  780. if (active1.value == "现场照片" || active1.value == "现场图") {
  781. //现场图和勘验笔录
  782. item.childrenList.map((ele) => {
  783. if (ele.caseFilesList && ele.caseFilesList.length) {
  784. ele.caseFilesList.map((element) => {
  785. element.filesUrl && arr2.push(element);
  786. });
  787. } else {
  788. arr2.push(...ele.childrenList);
  789. }
  790. });
  791. }
  792. if (active1.value == "现场照片" && childrenList.value.parentId) {
  793. //现场照片
  794. item = item.childrenList.find(
  795. (ele) => ele.filesTypeId == childrenList.value.parentId
  796. );
  797. }
  798. if (active1.value == "现场图" && !childrenList.value.parentId) {
  799. item = item.childrenList[0];
  800. }
  801. console.log("activeItem", list.value, "arr2", arr2, item);
  802. srcList.value =
  803. active1.value == "现场照片" || active1.value == "现场图"
  804. ? arr2
  805. : item.childrenList;
  806. console.log("srcList", srcList.value, item, childrenList, active1.value);
  807. let activeIndex =
  808. srcList.value.findIndex(
  809. (item) => item.filesTypeId == childrenList.value.value
  810. ) || 0;
  811. if (!childrenList.value.value) {
  812. activeIndex = 0;
  813. }
  814. let activeItem = srcList.value[activeIndex];
  815. console.log(
  816. "activeItem",
  817. activeItem,
  818. activeIndex,
  819. "arr2",
  820. list.value,
  821. item
  822. );
  823. if (!activeItem) return;
  824. childrenList.value.value = activeItem.filesTypeId;
  825. childrenList.value.parentId = activeItem.parentId;
  826. childrenList.value.filesId = activeItem.filesId;
  827. childrenList.value.item = activeItem;
  828. childrenList.value.src =
  829. activeItem.filesUrl ||
  830. (activeItem.caseFilesList && activeItem.caseFilesList[0]?.filesUrl);
  831. childrenList.value.caseFilesList =
  832. active1.value == "勘验笔录" || active1.value == "现场照片"
  833. ? activeItem.caseFilesList
  834. : activeItem.childrenList;
  835. });
  836. }
  837. async function handleAdd() {
  838. await addCaseFile({ caseId: caseId.value, filesTypeName: ["三录材料"] });
  839. getList(true);
  840. }
  841. const handleClick = (a) => {
  842. let { paneName, childrenListvalue } = a;
  843. let newImgsrcList = [];
  844. casePhotoItem.value.id = "";
  845. let index = list.value.findIndex((item) => item.filesTypeName == paneName);
  846. let childrenLists = list.value[index].childrenList;
  847. if (childrenListvalue && show.value) {
  848. setTimeout(() => {
  849. let indexshow1 = recursiveSearch(list.value[0].childrenList);
  850. let indexshow2 = recursiveSearch(list.value[1].childrenList);
  851. let indexshow3 = recursiveSearch([list.value[3]]);
  852. let indexshow4 = casePhotoList.value.length;
  853. let tabsdom0 = document.getElementById("tab-现场图");
  854. let tabsdom1 = document.getElementById("tab-现场照片");
  855. let tabsdom2 = document.getElementById("tab-勘验笔录");
  856. let tabsdom3 = document.getElementById("tab-照片卷");
  857. if (!indexshow1 && tabsdom0) tabsdom0.style.display = "none";
  858. if (!indexshow2 && tabsdom1) tabsdom1.style.display = "none";
  859. if (!indexshow3 && tabsdom2) tabsdom2.style.display = "none";
  860. if (!indexshow4 && tabsdom3) tabsdom3.style.display = "none";
  861. if (indexshow1) {
  862. } else if (indexshow2) {
  863. active1.value = "现场照片";
  864. handleClick({ paneName: active1.value });
  865. } else if (indexshow4) {
  866. active1.value = "照片卷";
  867. handleClick({ paneName: active1.value });
  868. } else {
  869. active1.value = "勘验笔录";
  870. handleClick({ paneName: active1.value });
  871. }
  872. showText.value = true;
  873. }, 500);
  874. }
  875. if (paneName == "现场照片") {
  876. //现场照片
  877. let ArrList = [];
  878. childrenLists.map((ele) => {
  879. ArrList.push(...ele.childrenList);
  880. });
  881. let newindex = ArrList.findIndex(
  882. (items) => items.caseFilesList && items.caseFilesList.length
  883. );
  884. newindex = newindex == -1 ? 0 : newindex;
  885. let activeItem = ArrList[newindex] || {};
  886. console.log("handleClick", activeItem, childrenLists);
  887. if (!activeItem) return;
  888. childrenList.value.value = activeItem.filesTypeId;
  889. childrenList.value.parentId = activeItem.parentId;
  890. childrenList.value.filesId = activeItem.filesId;
  891. childrenList.value.src = activeItem.filesUrl;
  892. childrenList.value.caseFilesList = activeItem.caseFilesList || [];
  893. let newSrc = [];
  894. childrenLists &&
  895. childrenLists.map((ele) => {
  896. ele.caseFilesList && newSrc.push(...ele.caseFilesList);
  897. });
  898. newImgsrcList = newSrc.map((ele) => ele.filesUrl);
  899. } else if (paneName == "勘验笔录") {
  900. //笔录
  901. let activeItem =
  902. (list.value[index].caseFilesList && list.value[index].caseFilesList[0]) ||
  903. {};
  904. childrenList.value.value = activeItem.filesId;
  905. childrenList.value.parentId = activeItem.parentId;
  906. childrenList.value.src = activeItem.filesUrl;
  907. childrenList.value.item = activeItem;
  908. childrenList.value.caseFilesList = [];
  909. activeItem.createType == "online" && initInfo(activeItem.filesId);
  910. let newSrc =
  911. (list.value[index].caseFilesList &&
  912. list.value[index].caseFilesList.map((ele) => ele.filesUrl)) ||
  913. [];
  914. console.log("handleClick", newSrc, childrenLists.caseFilesList);
  915. newImgsrcList = newSrc.filter((ele) => isImage(ele));
  916. } else if (paneName == "照片卷") {
  917. childrenList.value.src = "";
  918. //照片卷
  919. let activeItem = casePhotoList.value[0] || {};
  920. console.log("handleClick", childrenLists, activeItem);
  921. childrenList.value.src = activeItem.content;
  922. childrenList.value.item = activeItem;
  923. childrenList.value.filesId = activeItem.id;
  924. childrenList.value.value = activeItem.id;
  925. } else {
  926. //现场图
  927. let ArrList = [];
  928. let index1 = 0,
  929. index2 = 0;
  930. index1 = childrenLists.findIndex((ele) => {
  931. index2 = ele.childrenList.findIndex(
  932. (element) => element.caseFilesList && element.caseFilesList.length
  933. );
  934. return index2 != -1;
  935. });
  936. console.log("handleClick", childrenLists, ArrList, index1, index2);
  937. let activeItem =
  938. list.value[index].childrenList[index1 == -1 ? 0 : index1]?.childrenList[
  939. index2 == -1 ? 0 : index2
  940. ] || {};
  941. childrenList.value.value = activeItem.filesTypeId;
  942. childrenList.value.parentId = activeItem.parentId;
  943. childrenList.value.caseFilesList = activeItem.caseFilesList || [];
  944. }
  945. getList(true);
  946. ImgsrcList.value = newImgsrcList.filter((ele) => isImage(ele));
  947. };
  948. function handlItem0(item) {
  949. childrenList.value.value = item.filesTypeId;
  950. childrenList.value.parentId = item.parentId;
  951. childrenList.value.src = item.filesUrl;
  952. childrenList.value.filesId = item.filesId;
  953. childrenList.value.caseFilesList = item.caseFilesList;
  954. console.log("handleClick", item, childrenList.value);
  955. }
  956. function handlItem1(item) {
  957. childrenList.value.value = item.filesId;
  958. childrenList.value.filesId = item.filesId;
  959. childrenList.value.item = item;
  960. childrenList.value.src = item.filesUrl;
  961. item.createType == "online" && initInfo(item.filesId);
  962. // childrenList.value.caseFilesList = item.caseFilesList || [];
  963. console.log("handleClick", item, childrenList.value);
  964. }
  965. const handlItem2 = (item) => {
  966. console.log("handlItem2", item, childrenList.value);
  967. childrenList.value.value = item.id;
  968. childrenList.value.filesId = item.id;
  969. childrenList.value.item = item;
  970. childrenList.value.src = item.content;
  971. };
  972. const handleClick2 = (item) => {
  973. console.log("handleClick2", item);
  974. childrenList.value.value = item.filesTypeId;
  975. childrenList.value.parentId = item.parentId;
  976. childrenList.value.caseFilesList =
  977. (item.caseFilesList &&
  978. item.caseFilesList.map((ele) => {
  979. return {
  980. ...ele,
  981. checked: false,
  982. };
  983. })) ||
  984. [];
  985. console.log("handleClick2", item);
  986. };
  987. const handleCommand = async (command, a) => {
  988. if (command == "绘图") {
  989. let addurl = a.filesTypeName == "方位图" ? TabulationAdd : overviewAdd;
  990. let resData = await addurl({
  991. type: a.filesTypeName == "方位图" ? 1 : 0,
  992. title: "",
  993. caseId: caseId.value,
  994. });
  995. // let params = {
  996. // caseId: caseId.value,
  997. // tabulationIds: a.filesTypeName == "方位图" ? [resData.id] : undefined,
  998. // overviewIds : a.filesTypeName != "方位图" ? [resData.id] : undefined,
  999. // };
  1000. // await caseExportImg(params);
  1001. getList(true);
  1002. // window.open(a.filesTypeName != "方位图"?`/draw/#/overview?caseId=${caseId.value}&overviewId=${resData.id}`:`/draw/#/tabulation?caseId=${caseId.value}&tabulationId=${resData.id}`);
  1003. } else {
  1004. let addFun = a.filesTypeName == "方位图" ? addSceneImg1 : addSceneImg2;
  1005. let ids = await addFun({
  1006. type: a.filesTypeName == "方位图" ? 1 : 0,
  1007. title: a.filesTypeName,
  1008. // dictId: filesTypeId,
  1009. });
  1010. let params = {
  1011. caseId: caseId.value,
  1012. overviewIds: a.filesTypeName != "方位图" ? ids : undefined,
  1013. tabulationIds: a.filesTypeName == "方位图" ? ids : undefined,
  1014. };
  1015. if (ids && ids.length) {
  1016. await caseExportImg(params);
  1017. getList(true);
  1018. }
  1019. }
  1020. };
  1021. const del = async (file) => {
  1022. console.log(file, "file");
  1023. ElMessageBox.confirm("确定删除?", "提示", {
  1024. confirmButtonText: "确定",
  1025. cancelButtonText: "取消",
  1026. type: "warning",
  1027. }).then(async () => {
  1028. await delCaseFile({ caseId: caseId.value, filesId: file.filesId });
  1029. ElMessage({
  1030. type: "success",
  1031. message: "删除成功",
  1032. });
  1033. childrenList.value.src = "";
  1034. childrenList.value.value = "";
  1035. getList(true);
  1036. });
  1037. };
  1038. const del2 = async (file) => {
  1039. console.log(file, "file");
  1040. ElMessageBox.confirm("确定删除?", "提示", {
  1041. confirmButtonText: "确定",
  1042. cancelButtonText: "取消",
  1043. type: "warning",
  1044. }).then(async () => {
  1045. await casePhotodel({ caseId: caseId.value, id: file.id });
  1046. ElMessage({
  1047. type: "success",
  1048. message: "删除成功",
  1049. });
  1050. childrenList.value.src = "";
  1051. childrenList.value.value = "";
  1052. getList(true);
  1053. });
  1054. };
  1055. const OverviewDel = async (file, filesTypeName) => {
  1056. console.log(file, "file");
  1057. ElMessageBox.confirm("确定删除?", "提示", {
  1058. confirmButtonText: "确定",
  1059. cancelButtonText: "取消",
  1060. type: "warning",
  1061. }).then(async () => {
  1062. await delCaseFile({ caseId: caseId.value, filesId: file.filesId });
  1063. // await caseOverviewDel({ tabulationId: file.tabulationId ,overviewId:file.overviewId, type: filesTypeName });
  1064. ElMessage({
  1065. type: "success",
  1066. message: "删除成功",
  1067. });
  1068. childrenList.value.value = "";
  1069. childrenList.value.src = "";
  1070. getList(true);
  1071. });
  1072. };
  1073. async function handleItem(type, item) {
  1074. console.log("handleItem", type, item);
  1075. if (type == "edit") {
  1076. await setTypeFile({
  1077. ...item,
  1078. caseId: caseId.value,
  1079. fileOptions: list.value,
  1080. });
  1081. }
  1082. getList(true);
  1083. }
  1084. function handleoverviewEdit(type, item) {
  1085. console.log("handleoverviewEdit", type, item);
  1086. let url = `/draw/#/tabulation?caseId=${caseId.value}&tabulationId=${item.tabulationId}`;
  1087. if ("平面图" == type) {
  1088. url = `/draw/#/overview?caseId=${caseId.value}&overviewId=${item.overviewId}&title=${item.filesTitle}`;
  1089. // gotoDraw(item.filesTypeId != pmtId.value? BoardType.scene : BoardType.map, item.filesId)
  1090. }
  1091. window.open(url);
  1092. // getList();
  1093. }
  1094. function handleRecords(fileId) {
  1095. router.push({
  1096. name: RouteName.records,
  1097. params: { caseId: caseId.value, fileId: fileId || -1 },
  1098. });
  1099. }
  1100. async function handleYr() {
  1101. let uploadIds = await addCaseScenes({
  1102. caseId: caseId.value,
  1103. fileTypes: [0],
  1104. formats: [".jpg", ".png", ".jpeg", ".bmp"],
  1105. filesTypeId: childrenList.value.value,
  1106. });
  1107. if (uploadIds == false || (uploadIds && uploadIds.length == 0)) {
  1108. return;
  1109. }
  1110. await addByMediaLiBrary({
  1111. caseId: caseId.value,
  1112. uploadIds,
  1113. filesTypeId: childrenList.value.value,
  1114. });
  1115. getList(true);
  1116. }
  1117. const handleEdit = async (lists) => {
  1118. console.log(
  1119. "handleEdit",
  1120. list.value,
  1121. lists,
  1122. lists.map((ele) => ele.filesId)
  1123. );
  1124. let item = list.value.find((ele) => ele.filesTypeName == active1.value);
  1125. await setTypeFile({
  1126. caseId: caseId.value,
  1127. // filesId: lists.map(ele => ele.filesId),
  1128. filesTypeId: childrenList.value.value,
  1129. fileOptions: item.childrenList,
  1130. filesIds: lists.map((ele) => ele.filesId),
  1131. });
  1132. getList(true);
  1133. };
  1134. async function handledrawCasePhotos(val) {
  1135. const id = Array.isArray(val) ? val.toString() : val;
  1136. router.push({
  1137. name: RouteName.drawCasePhotos,
  1138. params: { caseId: caseId.value! },
  1139. query: {
  1140. id: id,
  1141. filesTypeId: filesTypeId.value,
  1142. },
  1143. });
  1144. console.log("handleAdd");
  1145. }
  1146. function frameLoad(sdk) {
  1147. // 这里可以获取到mesh方法
  1148. const player = sdk.core.get("Player");
  1149. sdk.Scene.on("loaded", () => {
  1150. // if (isTest) {
  1151. player.model.panos.list.forEach((pano) => pano.addLabel2());
  1152. // } else {
  1153. // sdk.core.get("SceneRenderer").suspend();
  1154. // }
  1155. });
  1156. console.log("--------frameLoad!---------");
  1157. const list = sdk.Camera.routeSnapGenerate();
  1158. console.log("返回数据", list);
  1159. const iframe = document.getElementById("iframe-outside");
  1160. iframe?.classList.remove('show');
  1161. // sdk.Scene.whenLoaded(()=>{
  1162. // console.log("返回数据",sdk.Camera.getPose())
  1163. // })
  1164. }
  1165. async function openAIdrawCase() {
  1166. const { num } = await tableModelScene({ numList: [] });
  1167. selectNum.value = num;
  1168. handleAIdrawCasePhotos(num);
  1169. console.log("返回数据", num);
  1170. }
  1171. function handleAIdrawCasePhotos(num) {
  1172. const iframe = document.getElementById("iframe-outside");
  1173. console.log(iframe, "iframe");
  1174. if (iframe && iframe.classList.contains("show") == false) {
  1175. iframe.classList.add("show");
  1176. iframe.onload = () => {
  1177. console.log(iframe.contentWindow, "contentWindow");
  1178. frameLoad(iframe.contentWindow.__sdk);
  1179. };
  1180. iframe.src = "./model.html?m=" + num;
  1181. }
  1182. }
  1183. const handleView = (src) => {
  1184. if (src && !ImgsrcList.value.includes(src)) {
  1185. ImgsrcList.value.push(src);
  1186. }
  1187. urlindex.value = ImgsrcList.value.findIndex((ele) => ele == src);
  1188. };
  1189. const handleIsShow = (item) => {
  1190. if (!show.value) return true;
  1191. return !recursiveSearch(item && item.childrenList);
  1192. };
  1193. const handlemtk = (item) => {
  1194. casePhotoItem.value = {
  1195. show: true,
  1196. ...item,
  1197. };
  1198. // ElMessageBox.prompt("", "重命名", {
  1199. // confirmButtonText: "确定",
  1200. // customClass: "promptClass",
  1201. // cancelButtonText: "取消",
  1202. // showClose: true,
  1203. // inputValue: item.name,
  1204. // inputValidator: (value) => {
  1205. // if (!value) {
  1206. // return false;
  1207. // }
  1208. // return true;
  1209. // },
  1210. // inputErrorMessage: "请输入名称",
  1211. // })
  1212. // .then(async ({ value }) => {
  1213. // ElMessage({
  1214. // type: "success",
  1215. // message: `修改成功`,
  1216. // });
  1217. // })
  1218. // .catch(() => {
  1219. // });
  1220. };
  1221. const handleConfirm = async () => {
  1222. let value = casePhotoItem.value.name;
  1223. if (!value || value.trim() == "") {
  1224. return ElMessage.error("请输入修改名称");
  1225. }
  1226. await casePhotoUpdate({
  1227. ...casePhotoItem.value,
  1228. name: value,
  1229. });
  1230. ElMessage({
  1231. type: "success",
  1232. message: `修改成功`,
  1233. });
  1234. casePhotoItem.value.show = false;
  1235. await getList(true);
  1236. };
  1237. const exportToPDF = async (isAll, item) => {
  1238. if (isAll === true) {
  1239. await handleOpen(true);
  1240. }
  1241. await exportCasePhotos({
  1242. showPagesRef: showPagesRef.value,
  1243. title: (isAll ? caseInfo.value.caseTitle : item.name) + "照片卷",
  1244. });
  1245. console.log("exportToPDF完毕");
  1246. if (isAll) {
  1247. await handleOpen(false);
  1248. }
  1249. };
  1250. const handleOpen = (val) => {
  1251. // 关闭时重置到照片卷标签页
  1252. if (!val) {
  1253. setTimeout(() => {
  1254. handleClick({ paneName: "照片卷" });
  1255. }, 500);
  1256. } else {
  1257. console.log("handleOpen");
  1258. // 初始化汇总数据结构
  1259. let Alllist = {
  1260. pages: [],
  1261. indexingLineList: [],
  1262. };
  1263. // 遍历所有照片数据,合并页面和标引线
  1264. casePhotoList.value.map((ele) => {
  1265. let content = ele.content && JSON.parse(ele.content);
  1266. let { pages, indexingLineList } = content;
  1267. // 计算横向偏移量,每张图片宽度600+间距4
  1268. let xAdd = (600 + 4) * Alllist.pages.length;
  1269. // 根据偏移量调整标引线坐标
  1270. if (xAdd) {
  1271. indexingLineList = indexingLineList.map((element) => {
  1272. let points = element.points.map((item) => ({
  1273. ...item,
  1274. x: item.x + xAdd,
  1275. }));
  1276. return { ...element, points };
  1277. });
  1278. }
  1279. // 合并当前照片的页面和标引线到汇总数据
  1280. Alllist.pages.push(...pages);
  1281. Alllist.indexingLineList.push(...indexingLineList);
  1282. console.log("handleOpen", content);
  1283. });
  1284. // 将汇总数据赋值给子组件
  1285. childrenList.value.src = Alllist;
  1286. childrenList.value.value = -1;
  1287. console.log("handleOpen", Alllist);
  1288. }
  1289. };
  1290. </script>
  1291. <style scoped lang="scss">
  1292. .scene {
  1293. height: 100%;
  1294. display: flex;
  1295. .scene-list {
  1296. width: var(--leftwidth);
  1297. height: 100%;
  1298. overflow-x: scroll;
  1299. .list {
  1300. .addButton {
  1301. padding: 20px 34px 0 34px;
  1302. margin-left: 0px;
  1303. }
  1304. .listTitle {
  1305. padding: 29px 48px 13px 48px;
  1306. font-weight: bold;
  1307. font-size: 16px;
  1308. color: rgba(0, 0, 0, 0.85);
  1309. line-height: 22px;
  1310. display: flex;
  1311. justify-content: space-between;
  1312. align-items: center;
  1313. .el-icon {
  1314. cursor: pointer;
  1315. }
  1316. }
  1317. .itemList {
  1318. &:hover {
  1319. background: rgba(69, 144, 255, 0.1);
  1320. }
  1321. .ItemTitle {
  1322. padding: 25px 48px;
  1323. font-weight: 400;
  1324. font-size: 14px;
  1325. color: rgba(0, 0, 0, 0.85);
  1326. line-height: 22px;
  1327. .text {
  1328. overflow: hidden;
  1329. text-overflow: ellipsis;
  1330. display: -webkit-box;
  1331. -webkit-line-clamp: 2;
  1332. /*! autoprefixer: off */
  1333. -webkit-box-orient: vertical;
  1334. word-break: break-all;
  1335. }
  1336. }
  1337. .operation {
  1338. text-align: right;
  1339. margin-top: 16px;
  1340. .el-icon {
  1341. cursor: pointer;
  1342. margin-left: 32px;
  1343. }
  1344. }
  1345. }
  1346. .active {
  1347. background: rgba(69, 144, 255, 0.1);
  1348. }
  1349. }
  1350. }
  1351. .abstractCentenr {
  1352. background: #f5f5f5;
  1353. height: 100%;
  1354. width: calc(100% - var(--leftwidth));
  1355. padding: 32px;
  1356. position: relative;
  1357. .noView {
  1358. position: absolute;
  1359. left: 50%;
  1360. top: 50%;
  1361. transform: translate(-50%, -50%);
  1362. text-align: center;
  1363. .down {
  1364. margin-top: 20px;
  1365. line-height: 32px;
  1366. box-shadow: 0px 2px 0px 0px rgba(0, 0, 0, 0.04);
  1367. border-radius: 2px;
  1368. border: 1px solid #26559b;
  1369. font-size: 14px;
  1370. color: #26559b;
  1371. }
  1372. }
  1373. .viewImg {
  1374. max-width: 95%;
  1375. max-height: 95%;
  1376. object-fit: contain;
  1377. }
  1378. .import {
  1379. margin-right: 20px;
  1380. padding-top: 40px;
  1381. height: 100%;
  1382. width: 148px;
  1383. text-align: center;
  1384. background: #fafafa;
  1385. cursor: pointer;
  1386. }
  1387. .centerTop {
  1388. height: 148px;
  1389. display: flex;
  1390. justify-content: space-between;
  1391. margin-bottom: 32px;
  1392. .upload {
  1393. height: 100%;
  1394. width: calc(100% - 170px);
  1395. }
  1396. }
  1397. .centerBottom {
  1398. .selcet {
  1399. // float: right;
  1400. // text-align: right;
  1401. display: flex;
  1402. justify-content: space-between;
  1403. }
  1404. }
  1405. .kybl {
  1406. padding: 60px;
  1407. background: #ffffff;
  1408. font-weight: 400;
  1409. font-size: 14px;
  1410. color: #000000;
  1411. margin: 24px auto;
  1412. line-height: 28px;
  1413. text-align: left;
  1414. max-width: 1024px;
  1415. word-break: break-all;
  1416. .checkbox {
  1417. display: inline-block;
  1418. }
  1419. .title {
  1420. font-weight: 600;
  1421. font-size: 18px;
  1422. color: rgba(0, 0, 0, 0.85);
  1423. line-height: 24px;
  1424. text-align: center;
  1425. }
  1426. .kyblid {
  1427. text-align: right;
  1428. margin: 16px 0;
  1429. }
  1430. }
  1431. .imgSrcimport {
  1432. display: flex;
  1433. height: 148px;
  1434. }
  1435. .imgSrccentenr {
  1436. max-width: 100%;
  1437. height: auto;
  1438. }
  1439. }
  1440. .title0 {
  1441. font-family: Microsoft YaHei, Microsoft YaHei;
  1442. font-weight: bold;
  1443. font-size: 16px;
  1444. color: rgba(0, 0, 0, 0.85);
  1445. line-height: 22px;
  1446. }
  1447. .demo-tabs {
  1448. margin: 12px 0;
  1449. }
  1450. }
  1451. </style>
  1452. <style lang="scss">
  1453. .sceneImg {
  1454. .el-tabs__header {
  1455. padding: 17px 0 13px 24px;
  1456. .el-tabs__active-bar {
  1457. display: none;
  1458. }
  1459. .el-tabs__item {
  1460. font-weight: 400;
  1461. font-size: 16px;
  1462. color: rgba(0, 0, 0, 0.45);
  1463. &:hover {
  1464. // font-weight: bold;
  1465. font-size: 16px;
  1466. color: #26559b;
  1467. line-height: 22px;
  1468. }
  1469. }
  1470. .is-active {
  1471. // font-weight: bold;
  1472. font-size: 16px;
  1473. color: #26559b;
  1474. line-height: 22px;
  1475. }
  1476. }
  1477. .el-icon:focus-visible {
  1478. outline: none !important;
  1479. }
  1480. .el-dropdown {
  1481. width: auto;
  1482. .el-dropdown-link {
  1483. outline: none !important;
  1484. }
  1485. &:focus-visible {
  1486. }
  1487. }
  1488. .el-checkbox {
  1489. height: 28px;
  1490. // pointer-events: none;
  1491. }
  1492. .kybl {
  1493. .el-checkbox {
  1494. height: 28px;
  1495. pointer-events: none;
  1496. }
  1497. }
  1498. .el-checkbox__label {
  1499. color: rgba(0, 0, 0, 0.85) !important;
  1500. }
  1501. .el-tabs__nav-next,
  1502. .el-tabs__nav-prev {
  1503. top: -9px;
  1504. }
  1505. }
  1506. #iframe-hiddens,
  1507. #iframe-outside {
  1508. display: none;
  1509. position: absolute;
  1510. z-index: -999;
  1511. width: 600px;
  1512. height: 500px;
  1513. pointer-events: none;
  1514. }
  1515. #iframe-hiddens.show {
  1516. display: block;
  1517. visibility: hidden;
  1518. right: 0;
  1519. bottom: 0;
  1520. }
  1521. #iframe-hiddens.visible {
  1522. pointer-events: all;
  1523. display: block;
  1524. visibility: visible;
  1525. z-index: 999;
  1526. }
  1527. #iframe-outside.show {
  1528. display: block;
  1529. left: -9999px;
  1530. }
  1531. #iframe-outside.visible {
  1532. pointer-events: all;
  1533. display: block;
  1534. left: auto;
  1535. right: 0;
  1536. bottom: 0;
  1537. z-index: 999;
  1538. }
  1539. </style>