caseFile.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <template>
  2. <com-head
  3. :options="options"
  4. v-model="currentTypeId"
  5. notContent
  6. v-if="options.length"
  7. />
  8. <div class="body-layer">
  9. <template v-if="currentTypeId === 2">
  10. <Photos :caseId="caseId" />
  11. </template>
  12. <template v-else-if="currentTypeId === 3">
  13. <Records :caseId="caseId" :title="caseInfoData.caseTitle" />
  14. </template>
  15. <template v-else-if="currentTypeId === 4">
  16. <Manifest :caseId="caseId" :title="caseInfoData.caseTitle" />
  17. </template>
  18. <template v-else>
  19. <div class="body-head">
  20. <h3 style="visibility: hidden">场景管理</h3>
  21. <div>
  22. <template v-if="isDraw">
  23. <el-button type="primary" @click="gotoDraw(BoardType.map, -1)">
  24. 创建{{ BoardTypeDesc[BoardType.map] }}
  25. </el-button>
  26. <el-button type="primary" @click="gotoDraw(BoardType.scene, -1)">
  27. 创建{{ BoardTypeDesc[BoardType.scene] }}
  28. </el-button>
  29. </template>
  30. <el-button type="primary" @click="addCaseFileHandler">
  31. 上传
  32. </el-button>
  33. </div>
  34. </div>
  35. <el-table
  36. :data="files"
  37. tooltip-effect="dark"
  38. style="width: 100%"
  39. size="large"
  40. >
  41. <el-table-column label="序号" width="70" v-slot:default="{ $index }">
  42. <div style="text-align: center">
  43. {{ $index + 1 }}
  44. </div>
  45. </el-table-column>
  46. <el-table-column
  47. label="名称"
  48. v-slot:default="{ row }: { row: CaseFile }"
  49. >
  50. <span v-if="!inputCaseTitles.includes(row)">
  51. {{ row.filesTitle }}
  52. <el-icon class="edit-title" @click="inputCaseTitles.push(row)">
  53. <EditPen />
  54. </el-icon>
  55. </span>
  56. <template v-else>
  57. <ElInput
  58. v-model="row.filesTitle"
  59. placeholder="请输入文件名"
  60. focus
  61. :maxlength="50"
  62. style="width: 280px"
  63. >
  64. <template #append>
  65. <el-button type="primary" plain @click="updateFileTitle(row)">
  66. 确定
  67. </el-button>
  68. </template>
  69. </ElInput>
  70. </template>
  71. </el-table-column>
  72. <el-table-column label="创建时间" prop="createTime"></el-table-column>
  73. <el-table-column
  74. label="操作"
  75. v-slot:default="{ row }: { row: CaseFile }"
  76. >
  77. <span class="oper-span" @click="query(row)"> 查看 </span>
  78. <span
  79. class="oper-span"
  80. @click="gotoDraw(row.imgType!, row.filesId)"
  81. v-if="row.imgType !== null"
  82. >
  83. 编辑
  84. </span>
  85. <span class="oper-span delBtn" @click="del(row)"> 删除 </span>
  86. </el-table-column>
  87. </el-table>
  88. </template>
  89. </div>
  90. </template>
  91. <script setup lang="ts">
  92. import comHead from "@/components/head/index.vue";
  93. import { confirm } from "@/helper/message";
  94. import { RouteName, router } from "@/router";
  95. import { FileDrawType, BoardTypeDesc } from "@/constant/caseFile";
  96. import { computed, onMounted, onUnmounted, ref, watchEffect } from "vue";
  97. import { addCaseFile } from "./quisk";
  98. import { title, desc } from "@/store/system";
  99. import {
  100. CaseFile,
  101. CaseFileType,
  102. getCaseFileTypes,
  103. getCaseFiles,
  104. delCaseFile,
  105. BoardType,
  106. } from "@/store/caseFile";
  107. import { getCaseInfo, updateCaseInfo } from "@/store/case";
  108. import { appConstant } from "@/app";
  109. import { ElIcon, ElInput, ElMessage } from "element-plus";
  110. import Photos from "./photos/index.vue";
  111. import Records from "./records/index.vue";
  112. import Manifest from "./records/manifest.vue";
  113. const caseId = computed(() => {
  114. const caseId = router.currentRoute.value.params.caseId;
  115. if (caseId) {
  116. return Number(caseId);
  117. }
  118. });
  119. const caseInfoData = ref<any>();
  120. const inputCaseTitles = ref<CaseFile[]>([]);
  121. const updateFileTitle = async (caseFile: CaseFile) => {
  122. if (!caseFile.filesTitle.trim()) {
  123. return ElMessage.error("卷宗标题不能为空!");
  124. }
  125. await updateCaseInfo(caseFile);
  126. inputCaseTitles.value = inputCaseTitles.value.filter(
  127. (item) => item !== caseFile
  128. );
  129. };
  130. const currentTypeId = ref<number>();
  131. const types = ref<CaseFileType[]>([]);
  132. const options = computed(() =>
  133. types.value.map((item) => ({
  134. name: item.filesTypeName,
  135. value: item.filesTypeId,
  136. }))
  137. );
  138. const isDraw = computed(() => currentTypeId.value === FileDrawType);
  139. const files = ref<CaseFile[]>([]);
  140. const refresh = async () => {
  141. files.value = await getCaseFiles({
  142. caseId: caseId.value!,
  143. filesTypeId: currentTypeId.value,
  144. });
  145. };
  146. watchEffect(() => caseId.value && currentTypeId.value && refresh());
  147. const query = (file: CaseFile) => {
  148. const ext = file.filesUrl
  149. .substring(file.filesUrl.lastIndexOf("."))
  150. .toLocaleLowerCase();
  151. if ([".raw", ".dcm"].includes(ext)) {
  152. window.open(
  153. `/xfile-viewer/index.html?file=${file.filesUrl}&name=${file.filesTitle}&time=` +
  154. Date.now()
  155. );
  156. } else {
  157. window.open(file.filesUrl + "?time=" + Date.now());
  158. }
  159. };
  160. const del = async (file: CaseFile) => {
  161. if (await confirm("确定要删除此数据?")) {
  162. await delCaseFile({ caseId: caseId.value!, filesId: file.filesId });
  163. refresh();
  164. }
  165. };
  166. const addCaseFileHandler = async () => {
  167. await addCaseFile({ caseId: caseId.value!, fileType: currentTypeId.value! });
  168. refresh();
  169. };
  170. const gotoDraw = (type: BoardType, id: number) => {
  171. router.push({
  172. name: RouteName.drawCaseFile,
  173. params: { caseId: caseId.value!, type, id },
  174. });
  175. };
  176. onMounted(async () => {
  177. try {
  178. types.value = await getCaseFileTypes();
  179. currentTypeId.value = types.value[0].filesTypeId;
  180. const caseInfo = await getCaseInfo(caseId.value!);
  181. if (caseInfo) {
  182. caseInfoData.value = caseInfo;
  183. title.value =
  184. (await getCaseInfo(caseId.value!)).caseTitle + " | 卷宗管理";
  185. desc.value = "";
  186. } else {
  187. console.error("该案件不存在!");
  188. throw "该案件不存在!";
  189. // router.replace({ name: RouteName.noCase });
  190. }
  191. } catch (error) {
  192. console.error("该案件不存在!");
  193. router.replace({ name: RouteName.noCase });
  194. }
  195. });
  196. onUnmounted(() => {
  197. title.value = appConstant.title;
  198. desc.value = appConstant.desc;
  199. });
  200. </script>
  201. <style scoped lang="scss">
  202. .edit-title {
  203. cursor: pointer;
  204. margin-left: 10px;
  205. }
  206. </style>