fireDetails.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div class="fire-details">
  3. <div class="sidebar">
  4. <el-menu
  5. :default-active="currentMenuKey"
  6. class="menu-vertical"
  7. >
  8. <div class="el-menu-item" slot="Menu-Item" @click="expandFireNews">
  9. 火调信息
  10. </div>
  11. <el-menu-item
  12. v-for="menu in menus"
  13. :key="menu.key"
  14. :index="menu.key"
  15. @click="handleMenuClick(menu)"
  16. >
  17. {{ menu.label }}
  18. </el-menu-item>
  19. </el-menu>
  20. </div>
  21. <div class="content">
  22. <!-- 内容区域 -->
  23. <div class="content-placeholder">
  24. <!-- 这里可以根据选中的菜单项显示对应的内容 -->
  25. <SceneList
  26. v-if="currentMenuKey === 'scene'"
  27. :case-id="caseId"
  28. :on-add-scenes="() => addCaseScenes({ caseId })"
  29. />
  30. <newCaseFile
  31. v-if="!['info', 'scene', 'screenRecord'].includes(currentMenuKey)"
  32. :currentMenuKey = currentMenuKey
  33. :case-id="caseId"
  34. />
  35. <div v-if="currentMenuKey === 'screenRecord'" style="height: 100%;display: flex;flex-direction: column;justify-content: center;align-items: center;">
  36. 基于查看页,实操录制。可录制视频、语音
  37. <el-button type="primary" @click="startRecording" style="margin-top: 10px;">
  38. 开始录制
  39. </el-button>
  40. </div>
  41. </div>
  42. </div>
  43. </div>
  44. </template>
  45. <script setup lang="ts">
  46. import { computed, ref, onMounted } from "vue";
  47. import { useRoute, useRouter } from 'vue-router';
  48. import { Fire } from "@/app/fire/store/fire";
  49. import { getFuseCodeLink, checkScenesOpen, MenuItem, getSWKKSyncLink } from "@/view/case/help";
  50. import { showCaseScenes, addCaseScenes, shareCase, downloadCase } from "@/view/case/quisk";
  51. import { RouteName, router } from "@/router";
  52. import { copyCase, getCaseSceneList, getCaseInfo, updateCaseInfo } from "@/store/case";
  53. import SceneList from "@/view/case/sceneList.vue";
  54. import newCaseFile from "@/view/case/newCaseFile.vue";
  55. import { title as pageTitle, desc } from "@/store/system"; // 重命名为 pageTitle
  56. import { appConstant } from "@/app/criminal/constant"; // 导入 appConstant 以便在组件卸载时恢复默认值
  57. import { addFire, editFire, showLeaveMsgList, addLeaveMsg } from "./quisk";
  58. import { useFirePagging } from "./pagging";
  59. const { pagging } = useFirePagging();
  60. // 从路由获取参数
  61. const route = useRoute();
  62. const vueRouter = useRouter();
  63. const caseId = computed(() => Number(route.params.caseId));
  64. const title = computed(() => route.query.title as string);
  65. // 从路由查询参数中获取当前菜单项,如果没有则默认为 'scene'
  66. const currentMenuKey = ref(route.query.tab as string || 'scene');
  67. // 页面加载时自动触发当前选中的菜单项的点击事件
  68. let currentRecord = ref<any>({}); // 当前的caseID获取的row
  69. onMounted(() => {
  70. setTimeout(async() => {
  71. const caseInfo = await getCaseInfo(caseId.value!);
  72. if (caseInfo) {
  73. // 设置页面标题,使用案件信息
  74. pageTitle.value = caseInfo.caseTitle + " | 详情"; // 使用 pageTitle
  75. desc.value = "";
  76. currentRecord.value = caseInfo;
  77. } else {
  78. console.error("该案件不存在!");
  79. throw "该案件不存在!";
  80. }
  81. const menu = menus.value.find(menu => menu.key === currentMenuKey.value);
  82. if (menu) {
  83. menu.onClick();
  84. }
  85. }, 0);
  86. });
  87. // 处理菜单点击事件
  88. const handleMenuClick = async(menu) => {
  89. currentMenuKey.value = menu.key;
  90. // 更新路由,保留当前的 tab 参数
  91. vueRouter.replace({
  92. path: route.path,
  93. query: {
  94. ...route.query,
  95. tab: menu.key
  96. }
  97. });
  98. // 执行菜单项的点击事件
  99. menu.onClick();
  100. const caseInfo = await getCaseInfo(caseId.value!);
  101. if (caseInfo) {
  102. // 设置页面标题,使用案件信息
  103. pageTitle.value = caseInfo.caseTitle + " | 详情"; // 使用 pageTitle
  104. desc.value = "";
  105. }
  106. };
  107. const expandFireNews = () => {
  108. // 不切换标签页,只打开编辑弹窗
  109. editHandler(currentRecord.value.tmProject);
  110. }
  111. // 开始录制方法
  112. const startRecording = () => {
  113. if (!caseId.value) return;
  114. const currentCaseId = caseId.value;
  115. const fuseLink = getFuseCodeLink(currentCaseId);
  116. checkScenesOpen(currentCaseId, `${fuseLink}#sceneEdit/record`);
  117. };
  118. const editHandler = async (row: any) => {
  119. (await editFire({ fire: row }));
  120. };
  121. const menus = computed(() => {
  122. if (!caseId.value) {
  123. return [];
  124. }
  125. const currentCaseId = caseId.value;
  126. const fuseLink = getFuseCodeLink(currentCaseId);
  127. return [
  128. // {
  129. // key: "info",
  130. // disabled: false, // 默认不禁用,与原来不同
  131. // label: "火调信息",
  132. // onClick: () => {
  133. // // 不切换标签页,只打开编辑弹窗
  134. // editHandler(currentRecord.value.tmProject);
  135. // // 恢复之前的标签页
  136. // currentMenuKey.value = route.query.tab as string || 'scene';
  137. // },
  138. // },
  139. {
  140. key: "scene",
  141. disabled: false, // 默认不禁用,与原来不同
  142. label: "场景管理",
  143. onClick: () => {
  144. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  145. },
  146. },
  147. {
  148. key: "drawing",
  149. disabled: false,
  150. label: "绘图管理",
  151. onClick: () => {
  152. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  153. },
  154. },
  155. {
  156. key: "photo",
  157. disabled: false,
  158. label: "照片制卷",
  159. onClick: () => {
  160. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  161. },
  162. },
  163. {
  164. key: "record",
  165. disabled: false,
  166. label: "勘验笔录",
  167. onClick: () => {
  168. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  169. },
  170. },
  171. {
  172. key: "list",
  173. disabled: false,
  174. label: "提取清单",
  175. onClick: () => {
  176. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  177. },
  178. },
  179. {
  180. key: "other",
  181. disabled: false,
  182. label: "其他资料",
  183. onClick: () => {
  184. // 不需要再次设置 currentMenuKey,因为已经在 handleMenuClick 中设置了
  185. },
  186. },
  187. {
  188. key: "screenRecord", // 修改为唯一的 key,避免与勘验笔录冲突
  189. label: "屏幕录制",
  190. onClick: () => {
  191. checkScenesOpen(currentCaseId, `${fuseLink}#sceneEdit/record`);
  192. },
  193. },
  194. ];
  195. });
  196. // 获取当前选中的菜单项
  197. const currentMenu = computed(() => {
  198. return menus.value.find(menu => menu.key === currentMenuKey.value);
  199. });
  200. </script>
  201. <style>
  202. .layer .content .view .main{
  203. margin: 0!important;
  204. }
  205. </style>
  206. <style lang="scss" scoped>
  207. .fire-details {
  208. display: flex;
  209. height: 100%;
  210. .sidebar {
  211. width: 200px;
  212. border-right: 1px solid #e6e6e6;
  213. .menu-vertical {
  214. width: 200px;
  215. padding-left: 30px;
  216. height: 100%;
  217. text-align: center;
  218. }
  219. }
  220. .content {
  221. flex: 1;
  222. padding: 0 16px 16px 16px;
  223. .content-placeholder {
  224. text-align: center;
  225. background: #fff;
  226. padding: 20px;
  227. height: calc(100% - 40px);
  228. overflow: auto;
  229. }
  230. }
  231. }
  232. </style>