sceneImg.vue 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130
  1. <template>
  2. <div class="scene abstract sceneImg">
  3. <div class="demo-image__preview">
  4. <el-image-viewer
  5. hide-on-click-modal
  6. @close="
  7. () => {
  8. urlindex = -1;
  9. }
  10. "
  11. :initial-index="urlindex"
  12. show-progress
  13. v-if="urlindex != -1"
  14. :url-list="ImgsrcList"
  15. fit="cover"
  16. />
  17. </div>
  18. <div class="scene-list">
  19. <div class="list">
  20. <el-tabs
  21. v-model="active1"
  22. class="demo-tabs"
  23. ref="tabsRef"
  24. @tab-click="handleClick"
  25. >
  26. <el-tab-pane
  27. v-for="(item, index) in list"
  28. :key="index"
  29. :label="showText?item.filesTypeName:''"
  30. :childrenList="item.childrenList"
  31. :class="`handleIsShow show${handleIsShow(item)}`"
  32. :name="index"
  33. >
  34. <div class="leftCenter" v-if="active1 == 1">
  35. <div v-for="(a, b) in item.childrenList" :key="b">
  36. <div
  37. class="listTitle"
  38. v-if="!show || (a.caseFilesList && a.caseFilesList.length)"
  39. >
  40. <span>{{ a.filesTypeName }}</span>
  41. <el-dropdown
  42. v-show="!show"
  43. @command="
  44. (command) => {
  45. handleCommand(command, a);
  46. }
  47. "
  48. >
  49. <span class="el-dropdown-link">
  50. <el-icon class="el-icon--right" title="新增"><Plus /></el-icon>
  51. </span>
  52. <template #dropdown>
  53. <el-dropdown-menu>
  54. <el-dropdown-item command="绘图">新增</el-dropdown-item>
  55. <el-dropdown-item command="导入">导入</el-dropdown-item>
  56. </el-dropdown-menu>
  57. </template>
  58. </el-dropdown>
  59. </div>
  60. <div
  61. class="itemList"
  62. v-for="(items, indexs) in a.caseFilesList"
  63. @click="handlItem0(items)"
  64. :class="{
  65. active:
  66. childrenList.src == items.filesUrl &&
  67. childrenList.filesId == items.filesId,
  68. }"
  69. :key="indexs"
  70. >
  71. <div class="ItemTitle">
  72. <div class="text" :title="items.filesTypeName || items.filesTitle">
  73. {{ items.filesTypeName || items.filesTitle }}
  74. </div>
  75. <div
  76. class="operation"
  77. v-if="
  78. !show &&
  79. childrenList.src == items.filesUrl &&
  80. childrenList.filesId == items.filesId
  81. "
  82. >
  83. <el-icon title="下载"
  84. v-if="items.filesUrl"
  85. @click="
  86. downloadByUrl({
  87. url: items.filesUrl,
  88. fileName: items.filesTitle,
  89. })
  90. "
  91. ><Download
  92. /></el-icon>
  93. <el-icon title="编辑"
  94. @click="handleoverviewEdit(a.filesTypeName, items)"
  95. ><Edit
  96. /></el-icon>
  97. <el-icon @click="OverviewDel(items, a.filesTypeName)" title="删除"
  98. ><CircleClose
  99. /></el-icon>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. <div class="leftCenter" v-if="active1 == 0">
  106. <div v-for="(a, b) in item.childrenList" :key="b" v-show="show?recursiveSearch(a.childrenList):true">
  107. <div class="listTitle">{{ a.filesTypeName }}</div>
  108. <div
  109. class="itemList"
  110. v-for="(items, indexs) in a.childrenList"
  111. @click="handleClick2(items)"
  112. :class="{ active: childrenList.value == items.filesTypeId }"
  113. :key="indexs"
  114. >
  115. <div class="ItemTitle">{{ items.filesTypeName }}</div>
  116. </div>
  117. </div>
  118. </div>
  119. <div class="leftCenter" v-if="active1 == 2">
  120. <div
  121. class="addButton flex"
  122. v-show="!show"
  123. style="margin-bottom: 10px"
  124. >
  125. <el-button
  126. class="newbut"
  127. :icon="Edit"
  128. @click="handleRecords(-1)"
  129. >填写</el-button
  130. >
  131. <el-upload
  132. class="upload-demo"
  133. style="display: inline-block"
  134. :show-file-list="false"
  135. :before-upload="upload"
  136. :http-request="uploadNewFile"
  137. :on-success="handleSuccess"
  138. :on-preview="previewFile"
  139. :accept="accept"
  140. :before-remove="removeFile"
  141. multiple
  142. >
  143. <el-button class="newbut" :icon="Upload">上传</el-button>
  144. </el-upload>
  145. </div>
  146. <div
  147. class="itemList"
  148. v-for="(items, indexs) in item.caseFilesList"
  149. @click="handlItem1(items)"
  150. :class="{ active: childrenList.value == items.filesId }"
  151. :key="indexs"
  152. >
  153. <div class="ItemTitle">
  154. <div class="text">
  155. {{ items.filesTypeName || items.filesTitle }}
  156. </div>
  157. <div
  158. class="operation"
  159. v-if="childrenList.value == items.filesId"
  160. >
  161. <el-icon title="下载"
  162. @click="
  163. downloadByUrl({
  164. url: items.filesUrl,
  165. fileName: items.filesTitle,
  166. })
  167. "
  168. ><Download
  169. /></el-icon>
  170. <el-icon title="编辑"
  171. v-if="!show && items.createType != 'upload'"
  172. @click="handleRecords(items.filesId)"
  173. ><Edit
  174. /></el-icon>
  175. <el-icon v-if="!show" @click="del(items)" title="删除"
  176. ><CircleClose
  177. /></el-icon>
  178. </div>
  179. </div>
  180. </div>
  181. </div>
  182. </el-tab-pane>
  183. </el-tabs>
  184. </div>
  185. </div>
  186. <div class="abstractCentenr" v-if="active1 == 0">
  187. <div class="centerTop" v-show="!show">
  188. <div class="import" @click="handleYr">
  189. <el-icon size="26" color="#26559B">
  190. <i
  191. style="font-size: 26px; color: #26559b"
  192. class="iconfont icon-import"
  193. ></i
  194. ></el-icon>
  195. <div class="name">导入</div>
  196. </div>
  197. <el-upload
  198. class="upload-demo upload"
  199. multiple
  200. :show-file-list="false"
  201. :before-upload="imgupload"
  202. :file-list="imgfileLists"
  203. :http-request="uploadNewFile"
  204. :on-success="handleSuccess"
  205. :on-preview="imgpreviewFile"
  206. :accept="imgaccept"
  207. drag
  208. action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
  209. >
  210. <el-icon class="el-icon--upload" style="margin-top: 20px" size="26">
  211. <i
  212. style="font-size: 26px; color: #26559b"
  213. class="iconfont icon-Upload"
  214. ></i
  215. ></el-icon>
  216. <div class="el-upload__text">
  217. 点击或拖拽文件上传<br />支持 jpg、png、jpeg ≤ 50MB
  218. </div>
  219. </el-upload>
  220. </div>
  221. <div class="centerBottom">
  222. <div class="imgList">
  223. <viewImg
  224. :key="childrenList.value"
  225. :list="childrenList.caseFilesList || []"
  226. @handleEdit="handleEdit"
  227. @refresh="getList"
  228. />
  229. </div>
  230. </div>
  231. </div>
  232. <div class="abstractCentenr" v-if="active1 == 1">
  233. <div class="imgSrcimport noView" v-if="!childrenList.src">暂无数据</div>
  234. <div class="imgSrccentenr" v-else>
  235. <img
  236. @click="handleView(childrenList.src)"
  237. :src="childrenList.src"
  238. class="noView viewImg"
  239. alt=""
  240. />
  241. </div>
  242. </div>
  243. <div class="abstractCentenr" v-if="active1 == 2">
  244. <div
  245. class="kybl"
  246. v-if="childrenList.item && childrenList.item.createType == 'online'"
  247. >
  248. <div class="title">现场勘验笔录</div>
  249. <div class="kyblid">勘验号:{{ data.inquestNum }}</div>
  250. <div>现场勘验单位:{{ data.deptName }}</div>
  251. <div>指派/报告单位:{{ data.reportDept }}</div>
  252. <div>时间:{{ data.inquestTime }}</div>
  253. <div>勘验事由:{{ data.inquestResource }}</div>
  254. <div>现场勘验时间:
  255. <span v-if="data.times && data.times[0]">{{ dayjs(data.times[0]).format("YYYY-MM-DD HH:mm:ss") }} ~ {{ dayjs(data.times[1]).format("YYYY-MM-DD HH:mm:ss") }}</span>
  256. </div>
  257. <div>现场地点:{{ data.address }}</div>
  258. <div>现场保护情况:{{ data.protectionSituation }}</div>
  259. <div>
  260. 现场保护人:姓名 {{ data.protector.name }}单位
  261. {{ data.protector.unit }}职务 {{ data.protector.job }}
  262. </div>
  263. <div>
  264. 保护措施:
  265. <el-checkbox-group class="checkbox" v-model="data.protectionMeasures">
  266. <el-checkbox :value="0" label="专人看护现场,防止他人进入" />
  267. <el-checkbox :value="1" checked label="设立警戒带,划定禁行区域" />
  268. <el-checkbox :value="2" label="其他措施" />
  269. </el-checkbox-group>
  270. </div>
  271. <div>
  272. 现场情况:
  273. <el-checkbox-group class="checkbox" v-model="data.situation">
  274. <el-checkbox :value="0" label="原始现场" />
  275. <el-checkbox :value="1" checked label="变动现场" />
  276. </el-checkbox-group>
  277. </div>
  278. <div>
  279. 变动原因:
  280. <el-checkbox-group class="checkbox" v-model="data.changeReason">
  281. <el-checkbox :value="0" label="事主进入" />
  282. <el-checkbox :value="1" label="报案人进入" />
  283. <el-checkbox :value="2" label="其他" />
  284. </el-checkbox-group>
  285. <span style="margin-left: 20px" v-if="data.changeReasonOtherValue">{{ data.changeReasonOtherValue }}</span>
  286. </div>
  287. <div>
  288. 天气:
  289. <el-checkbox-group class="checkbox" v-model="data.weatherInfo.type">
  290. <el-checkbox :value="0" label="阴" />
  291. <el-checkbox :value="1" label="晴" />
  292. <el-checkbox :value="2" label="雨" />
  293. <el-checkbox :value="3" label="雾" />
  294. </el-checkbox-group>
  295. </div>
  296. <div>
  297. 现场勘验利用的光线:
  298. <el-checkbox-group class="checkbox" v-model="data.light">
  299. <el-checkbox :value="0" checked label="自然光" />
  300. <el-checkbox :value="1" checked label="灯光" />
  301. <el-checkbox :value="2" label="特种光" />
  302. </el-checkbox-group>
  303. </div>
  304. <div>
  305. 现场勘验指挥人:姓名{{ data.inquestCommander.name }}单位{{
  306. data.inquestCommander.unit
  307. }}职务{{ data.inquestCommander.job }}
  308. </div>
  309. <div>现场勘验情况:{{ data.inquestSituation }}</div>
  310. <div>
  311. 现场勘验制图 {{ data.imageNum }} 张;照相 {{
  312. data.photographNum
  313. }} 张;摄像 {{ data.photographyMinNum }} 分{{
  314. data.photographySecNum
  315. }}秒;录音{{ data.recordingMinNum }} 分{{ data.recordingSecNum }}秒;
  316. </div>
  317. <div>
  318. 现场勘验记录人员:
  319. <div class="list">
  320. <div
  321. v-for="(info, index) in data.recorderInfo"
  322. :key="index"
  323. v-show="info.name || info.unit || info.job"
  324. >
  325. {{ info.typeLabel }} 姓名: {{ info.name }} 单位:
  326. {{ info.unit }} 职务:
  327. {{ info.job }}
  328. </div>
  329. </div>
  330. </div>
  331. <div>
  332. 现场勘验人员:
  333. <div class="list">
  334. <div
  335. v-for="(info, index) of data.signatureInfo"
  336. :key="index"
  337. v-show="info.name || info.unit || info.job"
  338. >
  339. 姓名: {{ info.name || "_____" }} 单位: {{ info.unit }} 职务:
  340. {{ info.job }}
  341. </div>
  342. </div>
  343. </div>
  344. <div>
  345. 现场勘验见证人:
  346. <div class="list">
  347. <div
  348. v-for="(info, index) of data.witnessInfo"
  349. :key="index"
  350. v-show="info.sex || info.birthday || info.address"
  351. >
  352. 姓名: {{ info.name || "_____" }} 性别:
  353. {{ info.sex ? "女" : "男" }}出生日期:
  354. {{
  355. info.birthday && dayjs(info.birthday).format("YYYY-MM-DD")
  356. }}
  357. 住址: {{ info.address }}
  358. </div>
  359. </div>
  360. </div>
  361. <div>备注:{{ data.remark }}</div>
  362. </div>
  363. <div class="imgSrccentenr" v-else-if="isImage(childrenList.src)">
  364. <img
  365. @click="handleView(childrenList.src)"
  366. :src="childrenList.src"
  367. class="noView viewImg"
  368. alt=""
  369. />
  370. </div>
  371. <div class="noView" v-else>
  372. <div
  373. class="noViewTitle"
  374. v-if="childrenList.item && childrenList.item.filesUrl"
  375. >
  376. <div class="zbzc">暂不支持预览</div>
  377. <div
  378. class="cursor-pointer down"
  379. @click="
  380. downloadByUrl({
  381. fileName: childrenList.item && childrenList.item.filesTitle,
  382. url: childrenList.item && childrenList.item.filesUrl,
  383. })
  384. "
  385. >
  386. 下载
  387. </div>
  388. </div>
  389. <div v-else class="noViewTitle">暂无数据</div>
  390. </div>
  391. </div>
  392. </div>
  393. </template>
  394. <script setup lang="ts">
  395. import viewImg from "@/components/viewImg/list.vue";
  396. import { computed, ref, reactive } from "vue";
  397. import { addCaseScenes } from "./quisk";
  398. import {
  399. updateByTreeFileLists,
  400. getByTreeFileLists,
  401. caseExportImg,
  402. overviewAdd,
  403. TabulationAdd,
  404. } from "@/store/case";
  405. import { ElMessage, ElMessageBox } from "element-plus";
  406. import { delCaseFile } from "@/store/caseFile";
  407. import {
  408. uploadNewFile,
  409. addByMediaLiBrary,
  410. getSceneListHasAi,
  411. getCaseInquestInfoOld,
  412. show,
  413. } from "@/store/case";
  414. import {
  415. downloadFile,
  416. downloadByUrl,
  417. isImage,
  418. recursiveSearch,
  419. } from "@/util/index.ts";
  420. import { caseOverviewDel } from "@/store/case";
  421. import dayjs from "dayjs";
  422. import { recorderInfoType, ChangeReasonType } from "./formData.ts";
  423. import {
  424. Upload,
  425. DocumentAdd,
  426. CircleCheck,
  427. Delete,
  428. Download,
  429. CircleClose,
  430. Edit,
  431. Plus,
  432. } from "@element-plus/icons-vue";
  433. import { RouteName, router } from "@/router";
  434. import { useUpload } from "@/hook/upload";
  435. import { addCaseFile, setTypeFile, addSceneImg1, addSceneImg2 } from "./quisk";
  436. const caseId = computed(() => router.currentRoute.value?.params?.caseId);
  437. const filesTypeId = ref(0);
  438. const ImgsrcList = ref([]);
  439. const active1 = ref(0);
  440. const active = ref(true);
  441. const urlindex = ref(-1);
  442. const tabsRef = ref(null);
  443. const showText = ref(show.value?false:true);
  444. const settype = ref(false);
  445. const childrenList = ref({
  446. list: [],
  447. value: "",
  448. parentId: 0,
  449. src: "",
  450. filesId: 0,
  451. item: {},
  452. caseFilesList: [],
  453. });
  454. const data = reactive({
  455. title: "",
  456. inquestNum: "", //现场勘验号
  457. deptName: "", //单位名称
  458. sendDept: "", //发送单位
  459. issuanceCount: "", // 份数
  460. makeTime: "", //制作时间
  461. recorder: "", // 笔录人
  462. issuanceOpinion: "", //签发意见
  463. reportDept: "", //报告单位
  464. times: [], // startTime ,endTime
  465. address: "", // 勘验地址
  466. inquestTime: "", //勘验时间
  467. inquestResource:
  468. "x年x月x日x单位接到报警称;x年x月x日x地点发生一起什么案事件,需要勘验现场, 接通知后,技术员xx,xx前往现场考察", //勘验范围
  469. protector: {
  470. name: "",
  471. unit: "",
  472. job: "",
  473. }, // 现场保护人
  474. protectionSituation: "", // 现场保护情况
  475. situation: [], //现场情况
  476. changeReason: [],
  477. changeReasonOtherValue: "",
  478. protectionMeasures: [], //保护措施
  479. weatherInfo: {
  480. type: [],
  481. temperature: "",
  482. humidity: "",
  483. windDirection: "",
  484. }, //天气情况
  485. light: [], //光线
  486. painter: "",
  487. photographer: "",
  488. inquestCommander: {
  489. name: "",
  490. unit: "",
  491. job: "",
  492. }, //现场勘验指挥人
  493. inquestSituation:
  494. "案发现场以XXX小区为中心,东侧为XXX路,西侧是XXX街,北侧为XXX路,南侧是XXX路。", //现场勘验情况
  495. imageNum: 0, //现场勘验制图数量
  496. photographNum: 0, //照相数量
  497. photographyMinNum: 0, //摄影数量
  498. photographySecNum: 0, //摄影数量
  499. recordingMinNum: "",
  500. recordingSecNum: "",
  501. recorderInfo: JSON.parse(JSON.stringify(recorderInfoType)),
  502. signatureInfo: [], //现场勘验人员
  503. witnessInfo: [],
  504. remark: "",
  505. });
  506. const showModal = ref(false);
  507. const srcList = ref([]);
  508. const klblId = ref(0);
  509. const fileLists = ref([]);
  510. const imgfileLists = ref([]);
  511. const list = ref([]);
  512. const fileList = ref([]);
  513. const activeNames = ref(["1"]);
  514. const { size, upload, removeFile, previewFile, file, accept } = useUpload({
  515. maxSize: 10 * 1024 * 1024,
  516. formats: [".doc", ".docx", ".pdf"],
  517. });
  518. const {
  519. size: imgSize,
  520. fileList: imgfileList,
  521. upload: imgupload,
  522. file: imgfile,
  523. previewFile: imgpreviewFile,
  524. accept: imgaccept,
  525. } = useUpload({
  526. maxSize: 50 * 1024 * 1024,
  527. formats: [".jpg", ".png", ".jpeg", ".bmp"], //".mp4", ".wav", ".mp3", ".shp"
  528. });
  529. const handleChange = (val: string[]) => {
  530. console.log(val);
  531. };
  532. getList();
  533. function handleActive(params) {
  534. console.log("handleActive", params);
  535. }
  536. const initInfo = async (inquestFileId) => {
  537. const res = await getCaseInquestInfoOld(inquestFileId || fileId.value);
  538. for (var k in data) {
  539. if (res.data && res.data.hasOwnProperty(k)) {
  540. // console.log("Key is " + k);
  541. if (res.data[k]) {
  542. data[k] = res.data[k];
  543. }else{
  544. data[k] = '';
  545. }
  546. }
  547. }
  548. };
  549. function handleSuccess(item) {
  550. let uploadId = item?.data.id;
  551. addByMediaLiBrary({
  552. caseId: caseId.value,
  553. filesTypeId: active1.value == 2 ? klblId.value : childrenList.value.value,
  554. uploadId,
  555. }).then((res) => {
  556. fileLists.value = [];
  557. imgfileLists.value = [];
  558. getList(true);
  559. });
  560. }
  561. function getList(refresh = false) {
  562. updateByTreeFileLists(caseId.value).then((res) => {
  563. list.value =
  564. res.find((ele) => ele.filesTypeName == "三录材料")?.childrenList || [];
  565. klblId.value = list.value.find(
  566. (ele) => ele.filesTypeName == "勘验笔录"
  567. ).filesTypeId;
  568. if (show.value) {
  569. //展示也过滤现场照片空数据
  570. list.value[0].childrenList.map((ele) => {
  571. ele.childrenList =
  572. ele.childrenList?.filter((element) => element.caseFilesList) || [];
  573. return ele;
  574. });
  575. console.log("list", list.value);
  576. list.value[1].childrenList.map((ele) => {
  577. ele.caseFilesList =
  578. ele.caseFilesList?.filter((element) => element.filesUrl) || [];
  579. return ele;
  580. });
  581. }
  582. if (!refresh) {
  583. handleClick({
  584. index: active1.value,
  585. childrenListvalue: childrenList.value,
  586. });
  587. return;
  588. }
  589. let item = active1.value
  590. ? list.value[active1.value]
  591. : list.value.find(
  592. (item) => item.childrenList && item.childrenList.length
  593. );
  594. let arr2 = [];
  595. if (active1.value == 2 || active1.value == 1) {
  596. item.childrenList.map((ele) => {
  597. if (ele.caseFilesList && ele.caseFilesList.length) {
  598. ele.caseFilesList.map((element) => {
  599. element.filesUrl && arr2.push(element);
  600. });
  601. } else {
  602. arr2.push(...ele.childrenList);
  603. }
  604. });
  605. }
  606. console.log("activeItem", list.value, "arr2", arr2);
  607. if (active1.value == 0 && childrenList.value.parentId) {
  608. item = item.childrenList.find(
  609. (ele) => ele.filesTypeId == childrenList.value.parentId
  610. );
  611. }
  612. if (active1.value == 0 && !childrenList.value.parentId) {
  613. item = item.childrenList[0];
  614. }
  615. srcList.value =
  616. active1.value == 2 || active1.value == 1 ? arr2 : item.childrenList;
  617. let activeIndex =
  618. srcList.value.findIndex(
  619. (item) => item.filesTypeId == childrenList.value.value
  620. ) || 0;
  621. if (!childrenList.value.value) {
  622. activeIndex = 0;
  623. }
  624. let activeItem = srcList.value[activeIndex];
  625. console.log(
  626. "activeItem",
  627. activeItem,
  628. activeIndex,
  629. "arr2",
  630. list.value,
  631. item
  632. );
  633. if (!activeItem) return;
  634. childrenList.value.value = activeItem.filesTypeId;
  635. childrenList.value.parentId = activeItem.parentId;
  636. childrenList.value.filesId = activeItem.filesId;
  637. childrenList.value.item = activeItem;
  638. childrenList.value.src =
  639. activeItem.filesUrl ||
  640. (activeItem.caseFilesList && activeItem.caseFilesList[0]?.filesUrl);
  641. childrenList.value.caseFilesList =
  642. active1.value == 2 || active1.value == 0
  643. ? activeItem.caseFilesList
  644. : activeItem.childrenList;
  645. });
  646. }
  647. async function handleAdd() {
  648. await addCaseFile({ caseId: caseId.value, filesTypeName: ["三录材料"] });
  649. getList(true);
  650. }
  651. const handleClick = ({ index, childrenListvalue }) => {
  652. let newImgsrcList = [];
  653. let childrenLists = list.value[index].childrenList;
  654. console.log("handleClick", index, childrenListvalue);
  655. if (childrenListvalue && show.value) {
  656. setTimeout(() => {
  657. let indexshow1 = recursiveSearch(list.value[0].childrenList);
  658. let indexshow2 = recursiveSearch(list.value[1].childrenList);
  659. let indexshow3 = recursiveSearch([list.value[2]]);
  660. let tabsdom0 = document.getElementById("tab-0");
  661. let tabsdom1 = document.getElementById("tab-1");
  662. let tabsdom2 = document.getElementById("tab-2");
  663. if (!indexshow1 && tabsdom0) tabsdom0.style.display = "none";
  664. if (!indexshow2 && tabsdom1) tabsdom1.style.display = "none";
  665. if (!indexshow3 && tabsdom2) tabsdom2.style.display = "none";
  666. if (indexshow1) {
  667. } else if (indexshow2) {
  668. active1.value = 1;
  669. handleClick({index: active1.value})
  670. } else {
  671. active1.value = 2;
  672. handleClick({index: active1.value})
  673. }
  674. showText.value = true
  675. }, 500);
  676. }
  677. if (index == 1) {
  678. //现场照片
  679. let newindex = childrenLists.findIndex(
  680. (items) => items.caseFilesList && items.caseFilesList.length
  681. );
  682. newindex = newindex == -1?0:newindex
  683. let activeItem =
  684. (childrenLists[newindex]?.caseFilesList &&
  685. childrenLists[newindex]?.caseFilesList[0]) ||
  686. {};
  687. console.log("handleClick", activeItem, !activeItem);
  688. if(!activeItem) return
  689. childrenList.value.value = activeItem.filesTypeId;
  690. childrenList.value.parentId = activeItem.parentId;
  691. childrenList.value.filesId = activeItem.filesId;
  692. childrenList.value.src = activeItem.filesUrl;
  693. childrenList.value.caseFilesList = activeItem.caseFilesList || [];
  694. let newSrc = [];
  695. childrenLists &&
  696. childrenLists.map((ele) => {
  697. ele.caseFilesList && newSrc.push(...ele.caseFilesList);
  698. });
  699. newImgsrcList = newSrc.map((ele) => ele.filesUrl);
  700. } else if (index == 2) {
  701. //笔录
  702. let activeItem =
  703. (list.value[index].caseFilesList && list.value[index].caseFilesList[0]) ||
  704. {};
  705. childrenList.value.value = activeItem.filesId;
  706. childrenList.value.parentId = activeItem.parentId;
  707. childrenList.value.src = activeItem.filesUrl;
  708. childrenList.value.item = activeItem;
  709. childrenList.value.caseFilesList = [];
  710. activeItem.createType == "online" && initInfo(activeItem.filesId);
  711. let newSrc =
  712. (list.value[index].caseFilesList &&
  713. list.value[index].caseFilesList.map((ele) => ele.filesUrl)) ||
  714. [];
  715. console.log("handleClick", newSrc, childrenLists.caseFilesList);
  716. newImgsrcList = newSrc.filter((ele) => isImage(ele));
  717. } else {
  718. //现场图
  719. let ArrList = [];
  720. let index1 = 0,
  721. index2 = 0;
  722. index1 = childrenLists.findIndex((ele) => {
  723. index2 = ele.childrenList.findIndex(
  724. (element) => element.caseFilesList && element.caseFilesList.length
  725. );
  726. return index2 != -1;
  727. });
  728. console.log("handleClick", childrenLists, ArrList,index1,index2);
  729. let activeItem =
  730. list.value[index].childrenList[index1 == -1?0:index1]?.childrenList[index2 == -1?0:index2] || {};
  731. childrenList.value.value = activeItem.filesTypeId;
  732. childrenList.value.parentId = activeItem.parentId;
  733. childrenList.value.caseFilesList = activeItem.caseFilesList || [];
  734. }
  735. getList(true);
  736. ImgsrcList.value = newImgsrcList.filter((ele) => isImage(ele));
  737. };
  738. function handlItem0(item) {
  739. childrenList.value.value = item.filesTypeId;
  740. childrenList.value.parentId = item.parentId;
  741. childrenList.value.src = item.filesUrl;
  742. childrenList.value.filesId = item.filesId;
  743. childrenList.value.caseFilesList = item.caseFilesList;
  744. console.log("handleClick", item, childrenList.value);
  745. }
  746. function handlItem1(item) {
  747. childrenList.value.value = item.filesId;
  748. childrenList.value.filesId = item.filesId;
  749. childrenList.value.item = item;
  750. childrenList.value.src = item.filesUrl;
  751. item.createType == "online" && initInfo(item.filesId);
  752. // childrenList.value.caseFilesList = item.caseFilesList || [];
  753. console.log("handleClick", item, childrenList.value);
  754. }
  755. const handleClick2 = (item) => {
  756. console.log("handleClick2", item);
  757. childrenList.value.value = item.filesTypeId;
  758. childrenList.value.parentId = item.parentId;
  759. childrenList.value.caseFilesList =
  760. (item.caseFilesList &&
  761. item.caseFilesList.map((ele) => {
  762. return {
  763. ...ele,
  764. checked: false,
  765. };
  766. })) ||
  767. [];
  768. console.log("handleClick2", item);
  769. };
  770. const handleCommand = async (command, a) => {
  771. if (command == "绘图") {
  772. let addurl = a.filesTypeName == "方位图" ? TabulationAdd : overviewAdd;
  773. let resData = await addurl({
  774. type: a.filesTypeName == "方位图" ? 1 : 0,
  775. title: "",
  776. caseId: caseId.value,
  777. });
  778. // let params = {
  779. // caseId: caseId.value,
  780. // tabulationIds: a.filesTypeName == "方位图" ? [resData.id] : undefined,
  781. // overviewIds : a.filesTypeName != "方位图" ? [resData.id] : undefined,
  782. // };
  783. // await caseExportImg(params);
  784. getList(true);
  785. // window.open(a.filesTypeName != "方位图"?`/draw/#/overview?caseId=${caseId.value}&overviewId=${resData.id}`:`/draw/#/tabulation?caseId=${caseId.value}&tabulationId=${resData.id}`);
  786. } else {
  787. let addFun = a.filesTypeName == "方位图" ? addSceneImg1 : addSceneImg2;
  788. let ids = await addFun({
  789. type: a.filesTypeName == "方位图" ? 1 : 0,
  790. title: a.filesTypeName,
  791. // dictId: filesTypeId,
  792. });
  793. let params = {
  794. caseId: caseId.value,
  795. overviewIds: a.filesTypeName != "方位图" ? ids : undefined,
  796. tabulationIds: a.filesTypeName == "方位图" ? ids : undefined,
  797. };
  798. if (ids && ids.length) {
  799. await caseExportImg(params);
  800. getList(true);
  801. }
  802. }
  803. };
  804. const del = async (file) => {
  805. console.log(file, "file");
  806. ElMessageBox.confirm("确定删除?", "提示", {
  807. confirmButtonText: "确定",
  808. cancelButtonText: "取消",
  809. type: "warning",
  810. }).then(async () => {
  811. await delCaseFile({ caseId: caseId.value, filesId: file.filesId });
  812. ElMessage({
  813. type: "success",
  814. message: "删除成功",
  815. });
  816. childrenList.value.src = "";
  817. childrenList.value.value = "";
  818. getList(true);
  819. });
  820. };
  821. const OverviewDel = async (file, filesTypeName) => {
  822. console.log(file, "file");
  823. ElMessageBox.confirm("确定删除?", "提示", {
  824. confirmButtonText: "确定",
  825. cancelButtonText: "取消",
  826. type: "warning",
  827. }).then(async () => {
  828. await delCaseFile({ caseId: caseId.value, filesId: file.filesId });
  829. // await caseOverviewDel({ tabulationId: file.tabulationId ,overviewId:file.overviewId, type: filesTypeName });
  830. ElMessage({
  831. type: "success",
  832. message: "删除成功",
  833. });
  834. childrenList.value.value = "";
  835. childrenList.value.src = "";
  836. getList(true);
  837. });
  838. };
  839. async function handleItem(type, item) {
  840. console.log("handleItem", type, item);
  841. if (type == "edit") {
  842. await setTypeFile({
  843. ...item,
  844. caseId: caseId.value,
  845. fileOptions: list.value,
  846. });
  847. }
  848. getList(true);
  849. }
  850. function handleoverviewEdit(type, item) {
  851. let url = `/draw/#/tabulation?caseId=${caseId.value}&tabulationId=${item.tabulationId}`;
  852. if ("平面图" == type) {
  853. url = `/draw/#/overview?caseId=${caseId.value}&overviewId=${item.overviewId}`;
  854. // gotoDraw(item.filesTypeId != pmtId.value? BoardType.scene : BoardType.map, item.filesId)
  855. }
  856. window.open(url);
  857. // getList();
  858. }
  859. function handleRecords(fileId) {
  860. router.push({
  861. name: RouteName.records,
  862. params: { caseId: caseId.value, fileId: fileId || -1 },
  863. });
  864. }
  865. async function handleYr() {
  866. let uploadIds = await addCaseScenes({
  867. caseId: caseId.value,
  868. fileTypes: [0],
  869. formats: [".jpg", ".png", ".jpeg", ".bmp"],
  870. filesTypeId: childrenList.value.value,
  871. });
  872. if (uploadIds == false || (uploadIds && uploadIds.length == 0)) {
  873. return;
  874. }
  875. await addByMediaLiBrary({
  876. caseId: caseId.value,
  877. uploadIds,
  878. filesTypeId: childrenList.value.value,
  879. });
  880. getList(true);
  881. }
  882. const handleEdit = async (lists) => {
  883. console.log(
  884. "handleEdit",
  885. list.value,
  886. lists,
  887. lists.map((ele) => ele.filesId)
  888. );
  889. await setTypeFile({
  890. caseId: caseId.value,
  891. // filesId: lists.map(ele => ele.filesId),
  892. filesTypeId: childrenList.value.value,
  893. fileOptions: list.value[active1.value].childrenList,
  894. filesIds: lists.map((ele) => ele.filesId),
  895. });
  896. getList(true);
  897. };
  898. const handleView = (src) => {
  899. if (src && !ImgsrcList.value.includes(src)) {
  900. ImgsrcList.value.push(src);
  901. }
  902. urlindex.value = ImgsrcList.value.findIndex((ele) => ele == src);
  903. };
  904. const handleIsShow = (item) => {
  905. if (!show.value) return true;
  906. return !recursiveSearch(item && item.childrenList);
  907. };
  908. </script>
  909. <style scoped lang="scss">
  910. .scene {
  911. height: 100%;
  912. display: flex;
  913. .scene-list {
  914. width: var(--leftwidth);
  915. height: 100%;
  916. overflow-x: scroll;
  917. .list {
  918. .addButton {
  919. padding: 0 34px;
  920. margin-left: 0px;
  921. }
  922. .listTitle {
  923. padding: 29px 48px 13px 48px;
  924. font-weight: bold;
  925. font-size: 16px;
  926. color: rgba(0, 0, 0, 0.85);
  927. line-height: 22px;
  928. display: flex;
  929. justify-content: space-between;
  930. align-items: center;
  931. .el-icon {
  932. cursor: pointer;
  933. }
  934. }
  935. .itemList {
  936. &:hover{
  937. background: rgba(69,144,255,0.1);;
  938. }
  939. .ItemTitle {
  940. padding: 25px 48px;
  941. font-weight: 400;
  942. font-size: 14px;
  943. color: rgba(0, 0, 0, 0.85);
  944. line-height: 22px;
  945. .text{
  946. overflow: hidden;
  947. text-overflow: ellipsis;
  948. display: -webkit-box;
  949. -webkit-line-clamp: 2;
  950. /*! autoprefixer: off */
  951. -webkit-box-orient: vertical;
  952. word-break: break-all;
  953. }
  954. }
  955. .operation {
  956. text-align: right;
  957. margin-top: 16px;
  958. .el-icon {
  959. cursor: pointer;
  960. margin-left: 32px;
  961. }
  962. }
  963. }
  964. .active {
  965. background: rgba(69, 144, 255, 0.1);
  966. }
  967. }
  968. }
  969. .abstractCentenr {
  970. background: #f5f5f5;
  971. height: 100%;
  972. width: calc(100% - var(--leftwidth));
  973. padding: 32px;
  974. position: relative;
  975. .noView {
  976. position: absolute;
  977. left: 50%;
  978. top: 50%;
  979. transform: translate(-50%, -50%);
  980. text-align: center;
  981. .down {
  982. margin-top: 20px;
  983. line-height: 32px;
  984. box-shadow: 0px 2px 0px 0px rgba(0, 0, 0, 0.04);
  985. border-radius: 2px;
  986. border: 1px solid #26559b;
  987. font-size: 14px;
  988. color: #26559b;
  989. }
  990. }
  991. .viewImg {
  992. max-width: 95%;
  993. max-height: 95%;
  994. object-fit: contain;
  995. }
  996. .import {
  997. margin-right: 20px;
  998. padding-top: 40px;
  999. height: 100%;
  1000. width: 148px;
  1001. text-align: center;
  1002. background: #fafafa;
  1003. cursor: pointer;
  1004. }
  1005. .centerTop {
  1006. height: 148px;
  1007. display: flex;
  1008. justify-content: space-between;
  1009. margin-bottom: 32px;
  1010. .upload {
  1011. height: 100%;
  1012. width: calc(100% - 170px);
  1013. }
  1014. }
  1015. .centerBottom {
  1016. .selcet {
  1017. // float: right;
  1018. // text-align: right;
  1019. display: flex;
  1020. justify-content: space-between;
  1021. }
  1022. }
  1023. .kybl {
  1024. padding: 60px;
  1025. background: #ffffff;
  1026. font-weight: 400;
  1027. font-size: 14px;
  1028. color: #000000;
  1029. margin: 24px auto;
  1030. line-height: 28px;
  1031. text-align: left;
  1032. max-width: 1024px;
  1033. word-break: break-all;
  1034. .checkbox {
  1035. display: inline-block;
  1036. }
  1037. .title {
  1038. font-weight: 600;
  1039. font-size: 18px;
  1040. color: rgba(0, 0, 0, 0.85);
  1041. line-height: 24px;
  1042. text-align: center;
  1043. }
  1044. .kyblid {
  1045. text-align: right;
  1046. margin: 16px 0;
  1047. }
  1048. }
  1049. .imgSrcimport {
  1050. display: flex;
  1051. height: 148px;
  1052. }
  1053. .imgSrccentenr {
  1054. max-width: 100%;
  1055. height: auto;
  1056. }
  1057. }
  1058. .title0 {
  1059. font-family: Microsoft YaHei, Microsoft YaHei;
  1060. font-weight: bold;
  1061. font-size: 16px;
  1062. color: rgba(0, 0, 0, 0.85);
  1063. line-height: 22px;
  1064. }
  1065. .demo-tabs {
  1066. margin: 12px 0;
  1067. }
  1068. }
  1069. </style>
  1070. <style lang="scss">
  1071. .sceneImg {
  1072. .el-tabs__header {
  1073. padding: 17px 0 13px 24px;
  1074. .el-tabs__active-bar {
  1075. display: none;
  1076. }
  1077. .el-tabs__item {
  1078. font-weight: 400;
  1079. font-size: 16px;
  1080. color: rgba(0, 0, 0, 0.45);
  1081. &:hover {
  1082. // font-weight: bold;
  1083. font-size: 16px;
  1084. color: #26559b;
  1085. line-height: 22px;
  1086. }
  1087. }
  1088. .is-active {
  1089. // font-weight: bold;
  1090. font-size: 16px;
  1091. color: #26559b;
  1092. line-height: 22px;
  1093. }
  1094. }
  1095. .el-icon:focus-visible {
  1096. outline: none !important;
  1097. }
  1098. .el-dropdown {
  1099. width: auto;
  1100. .el-dropdown-link {
  1101. outline: none !important;
  1102. }
  1103. &:focus-visible {
  1104. }
  1105. }
  1106. .el-checkbox {
  1107. height: 28px;
  1108. // pointer-events: none;
  1109. }
  1110. .kybl {
  1111. .el-checkbox {
  1112. height: 28px;
  1113. pointer-events: none;
  1114. }
  1115. }
  1116. .el-checkbox__label {
  1117. color: rgba(0, 0, 0, 0.85) !important;
  1118. }
  1119. .el-tabs__nav-next, .el-tabs__nav-prev{
  1120. top: -9px;
  1121. }
  1122. }
  1123. </style>