index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <template>
  2. <div class="abstract">
  3. <el-tabs v-model="activeName" class="demo-tabs h-full" @tab-click="handleClick">
  4. <el-tab-pane label="现场图" name="1">
  5. <div class="xct">
  6. <el-button
  7. style="width: calc(50% - 7px)"
  8. type="primary"
  9. @click="gotoDraw(BoardType.scene, -1)"
  10. >
  11. 绘制平面图
  12. </el-button>
  13. <el-button
  14. style="width: calc(50% - 6px)"
  15. type="primary"
  16. @click="gotoDraw(BoardType.aimap, -1)"
  17. >
  18. AI 平面图
  19. </el-button>
  20. <el-button
  21. class="w-full mt-4"
  22. style="margin-left: 0"
  23. type="primary"
  24. @click="gotoDraw(BoardType.map, -1)"
  25. >
  26. 绘制方位图
  27. </el-button>
  28. <div class="phote my-4 w-full" v-for="item,index in list.xct" :key="index">
  29. <p class="pb-4">{{item.filesTypeName}}</p>
  30. <div class="pmt-phote w-full flex justify-between ">
  31. <viewImg :list="item.caseFilesList || []" @handleItem="handleItem" height="66px" />
  32. </div>
  33. </div>
  34. </div>
  35. </el-tab-pane>
  36. <el-tab-pane class="h-full" label="现场照片" name="2">
  37. <div class="scene h-full">
  38. <el-button class="w-full" @click="handleAdd(['三录材料', '现场照片'])">上传</el-button>
  39. <!-- <el-button class="w-full my-4" style="margin-left: 0; margin-right: 0">添加场景</el-button> -->
  40. <div class="scene-list">
  41. <div class="list">
  42. <div class="listItem py-2" v-for="item,index in list.xczp" :key="index">
  43. <div class="title1">{{item.filesTypeName}}</div>
  44. <div class="list2" v-for="item2,index2 in item.childrenList" :key="index2">
  45. <div class="title2">{{item2.filesTypeName}}</div>
  46. <viewImg :list="item2.caseFilesList || []" @handleItem="handleItem" />
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. <el-button class="w-full" @click="handledrawCasePhotos">照片制卷</el-button>
  52. </div>
  53. </el-tab-pane>
  54. <el-tab-pane label="勘验笔录" name="3">
  55. <div class="blfrom">
  56. <el-upload
  57. class="upload-demo"
  58. :multiple="false"
  59. :show-file-list="false"
  60. drag
  61. :limit="1"
  62. :before-upload="upload"
  63. :file-list="fileList"
  64. :http-request="uploadNewFile"
  65. :on-success="handleSuccess"
  66. :on-preview="previewFile"
  67. :accept="accept"
  68. :before-remove="removeFile"
  69. >
  70. <div type="primary" :disabled="!!file">
  71. <div>点击或拖拽文件上传</div>
  72. <div class="">支持 pdf、word 格式图片上传</div>
  73. </div>
  74. </el-upload>
  75. <el-button class="w-full mt-2" @click="handleRecords">在线填写</el-button>
  76. </div>
  77. <div class="blList">
  78. <div class="bllistItem flex justify-between items-center mt-2" v-for="item,index in list.klbj" :key="index">
  79. <div>{{item.filesTitle}}</div>
  80. <el-dropdown @command="(command)=>{handleCommand(command, item)}">
  81. <el-icon>
  82. <MoreFilled />
  83. </el-icon>
  84. <template #dropdown>
  85. <el-dropdown-menu>
  86. <el-dropdown-item command="edit">编辑</el-dropdown-item>
  87. <el-dropdown-item command="delete">删除</el-dropdown-item>
  88. <el-dropdown-item command="down">下载</el-dropdown-item>
  89. </el-dropdown-menu>
  90. </template>
  91. </el-dropdown>
  92. </div>
  93. </div>
  94. </el-tab-pane>
  95. </el-tabs>
  96. </div>
  97. </template>
  98. <script setup lang="ts">
  99. import { uploadNewFile, addByMediaLiBrary } from "@/store/case";
  100. import { computed, ref, reactive } from "vue";
  101. import { addCaseFile } from "../originalPhoto/quisk";
  102. import { ElMessage, ElMessageBox } from "element-plus";
  103. import { useUpload } from "@/hook/upload";
  104. import { RouteName, router } from "@/router";
  105. import { BoardType } from "@/store/caseFile";
  106. import { updateByTreeFileLists, getByTreeFileLists } from "@/store/case";
  107. import { Delete, Edit } from "@element-plus/icons-vue";
  108. import viewImg from "@/components/viewImg/index.vue"
  109. import { delCaseFile, } from "@/store/caseFile";
  110. const caseId = computed(() => (router.currentRoute.value?.params?.caseId));
  111. const active = ref(true);
  112. const list = ref({
  113. xct:[],
  114. xczp:[],
  115. klbj:[],
  116. });
  117. getList()
  118. const srcList = [
  119. "https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg",
  120. "https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg",
  121. ];
  122. const settype = ref(false);
  123. const ruleFormRef = ref(null);
  124. const klblId = ref(0);
  125. const fmtId = ref(0);
  126. const pmtId = ref(0);
  127. const activeName = ref('1');
  128. const showModal = ref(false);
  129. const { size, fileList, upload, removeFile, previewFile, file, accept } =
  130. useUpload({
  131. maxSize: 10 * 1024 * 1024,
  132. formats: [".doc", ".docx", , ".pdf"],
  133. });
  134. const handleClick = (tab) => {
  135. console.log(tab);
  136. };
  137. const gotoDraw = (type: BoardType, id: number) => {
  138. router.push({
  139. name: RouteName.drawCaseFile,
  140. params: { caseId: caseId.value!, type, id },
  141. });
  142. };
  143. function getList() {
  144. updateByTreeFileLists(caseId.value).then(res => {
  145. let newlist = res.find(ele => ele.filesTypeName == '三录材料')?.childrenList || [];
  146. list.value.xct = newlist.find(ele => ele.filesTypeName == '现场图')?.childrenList || [];
  147. list.value.xczp = newlist.find(ele => ele.filesTypeName == '现场照片')?.childrenList || [];
  148. list.value.klbj = newlist.find(ele => ele.filesTypeName == '勘验笔录')?.caseFilesList || [];
  149. klblId.value = newlist.find(ele => ele.filesTypeName == '勘验笔录').filesTypeId
  150. fmtId.value = list.value.xct.find(ele => ele.filesTypeName == '平面图').filesTypeId
  151. pmtId.value = list.value.xct.find(ele => ele.filesTypeName == '方面图').filesTypeId
  152. console.log('list.value', list.value)
  153. })
  154. }
  155. const submitForm = async (formEl) => {
  156. if (!formEl) return;
  157. await formEl.validate((valid, fields) => {
  158. if (valid) {
  159. console.log("submit!");
  160. } else {
  161. console.log("error submit!", fields);
  162. }
  163. });
  164. };
  165. const resetForm = (formEl) => {
  166. if (!formEl) return;
  167. formEl.resetFields();
  168. };
  169. function handleActive(params) {
  170. console.log("handleActive", params);
  171. }
  172. function handleItem(type, item) {
  173. console.log("handleItem", type, item);
  174. if('edit' == type) {
  175. gotoDraw(item.filesTypeId == pmtId.value? BoardType.scene : BoardType.map, item.filesId)
  176. }
  177. getList()
  178. }
  179. function handleSuccess(item) {
  180. let uploadId = item?.data.id;
  181. addByMediaLiBrary({ caseId: caseId.value, filesTypeId: klblId.value, uploadId }).then((res) => {
  182. getList();
  183. });
  184. }
  185. function handleRecords() {
  186. router.push({
  187. name: RouteName.records,
  188. params: { caseId: caseId.value! },
  189. });
  190. }
  191. async function handledrawCasePhotos() {
  192. router.push({
  193. name: RouteName.drawCasePhotos,
  194. params: { caseId: caseId.value! },
  195. });
  196. console.log("handleAdd");
  197. }
  198. async function handleAdd(filesTypeName) {
  199. await addCaseFile({ caseId: caseId.value, fileType: 1, filesTypeName });
  200. getList()
  201. console.log("handleAdd");
  202. }
  203. const handleCommand = (command: string | number | object, item) => {
  204. switch (command) {
  205. case "edit":
  206. ElMessage(`click on item ${command}`)
  207. break;
  208. case "delete":
  209. handleDel(item)
  210. break;
  211. default:
  212. console.log("other", command);
  213. }
  214. // ElMessage(`click on item ${command}`)
  215. }
  216. function handleDel(item) {
  217. ElMessageBox.confirm("确定删除?", "提示", {
  218. confirmButtonText: "确定",
  219. cancelButtonText: "取消",
  220. type: "warning",
  221. }).then(async () => {
  222. await delCaseFile({ caseId: caseId.value, filesId: item.filesId });
  223. ElMessage({
  224. type: "success",
  225. message: "删除成功",
  226. });
  227. getList()
  228. });
  229. }
  230. </script>
  231. <style lang="scss" scoped>
  232. .abstract {
  233. height: 100%;
  234. .el-tab-pane{
  235. height: 100%;
  236. overflow-y: scroll;
  237. position: relative;
  238. }
  239. .el-form-item--label-top {
  240. margin-bottom: 14px;
  241. }
  242. .form-content {
  243. height: calc(100vh - 225px);
  244. overflow-y: scroll;
  245. }
  246. .demo-tabs {
  247. .el-tabs__item {
  248. height: 32px;
  249. line-height: 32px;
  250. }
  251. }
  252. }
  253. </style>