1
0

index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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. class="w-full mt-4"
  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="handleAiItem"
  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" v-show="item.caseFilesList?.length">
  29. <p class="pb-2 title1">{{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 pb-2">{{item.filesTypeName}}</div>
  44. <viewImg :list="item.caseFilesList || []" @handleItem="handleItems" />
  45. <div class="list2" v-for="item2,index2 in item.childrenList" :key="index2" v-show="item2.caseFilesList?.length">
  46. <div class="title2">{{item2.filesTypeName}}</div>
  47. <viewImg :list="item2.caseFilesList || []" @handleItem="handleItems" />
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. <el-button class="w-full" @click="handledrawCasePhotos">照片制卷</el-button>
  53. </div>
  54. </el-tab-pane>
  55. <el-tab-pane label="勘验笔录" name="3">
  56. <div class="blfrom">
  57. <el-upload
  58. class="upload-demo"
  59. :multiple="false"
  60. :show-file-list="false"
  61. drag
  62. :limit="1"
  63. :before-upload="upload"
  64. :file-list="fileLists"
  65. :http-request="uploadNewFile"
  66. :on-success="handleSuccess"
  67. :on-preview="previewFile"
  68. :accept="accept"
  69. :before-remove="removeFile"
  70. >
  71. <div type="primary" :disabled="!!file">
  72. <div>点击或拖拽文件上传</div>
  73. <div class="">支持 pdf、word 上传</div>
  74. </div>
  75. </el-upload>
  76. <el-button class="w-full mt-4" @click="handleRecords(-1)">在线填写</el-button>
  77. </div>
  78. <div class="blList">
  79. <div class="bllistItem flex justify-between items-center mt-4" v-for="item,index in list.klbj" :key="index">
  80. <div class="truncate" :title="item.filesTitle">{{item.filesTitle}}</div>
  81. <el-dropdown style="width: 20px" @command="(command)=>{handleCommand(command, item)}">
  82. <el-icon>
  83. <MoreFilled />
  84. </el-icon>
  85. <template #dropdown>
  86. <el-dropdown-menu>
  87. <el-dropdown-item v-if="item.createType == 'online'" command="edit">编辑</el-dropdown-item>
  88. <el-dropdown-item command="delete">删除</el-dropdown-item>
  89. <el-dropdown-item command="down">下载</el-dropdown-item>
  90. </el-dropdown-menu>
  91. </template>
  92. </el-dropdown>
  93. </div>
  94. </div>
  95. </el-tab-pane>
  96. </el-tabs>
  97. <el-dialog
  98. v-model="dialogVisible"
  99. title="请选择场景"
  100. width="500"
  101. :before-close="handleClose"
  102. >
  103. <div>
  104. <el-radio-group v-model="radio">
  105. <el-radio style=" width: 100%;" v-for="item,index in radioList" :key="index" :value="item.num">{{item.title}}</el-radio>
  106. </el-radio-group>
  107. </div>
  108. <template #footer>
  109. <div class="dialog-footer">
  110. <el-button @click="dialogVisible = false">取消</el-button>
  111. <el-button type="primary" @click="handleRadioItem"> 确认</el-button>
  112. </div>
  113. </template>
  114. </el-dialog>
  115. </div>
  116. </template>
  117. <script setup lang="ts">
  118. import { uploadNewFile, addByMediaLiBrary, getSceneListHasAi } from "@/store/case";
  119. import { computed, ref, reactive } from "vue";
  120. import { addCaseFile } from "../originalPhoto/quisk";
  121. import { ElMessage, ElMessageBox } from "element-plus";
  122. import { useUpload } from "@/hook/upload";
  123. import { RouteName, router } from "@/router";
  124. import { BoardType } from "@/store/caseFile";
  125. import { updateByTreeFileLists, getByTreeFileLists } from "@/store/case";
  126. import { Delete, Edit } from "@element-plus/icons-vue";
  127. import { setTypeFile } from "../originalPhoto/quisk";
  128. import viewImg from "@/components/viewImg/index.vue"
  129. import { delCaseFile, } from "@/store/caseFile";
  130. const caseId = computed(() => (router.currentRoute.value?.params?.caseId));
  131. const active = ref(true);
  132. const radio = ref(null);
  133. const radioList = ref([]);
  134. const dialogVisible = ref(false);
  135. const list = ref({
  136. xct:[],
  137. xczp:[],
  138. klbj:[],
  139. });
  140. getList()
  141. const srcList = [
  142. "https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg",
  143. "https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg",
  144. ];
  145. const settype = ref(false);
  146. const ruleFormRef = ref(null);
  147. const klblId = ref(0);
  148. const fmtId = ref(0);
  149. const pmtId = ref(0);
  150. const activeName = ref('1');
  151. const fileLists = ref([]);
  152. const showModal = ref(false);
  153. const { size, fileList, upload, removeFile, previewFile, file, accept } =
  154. useUpload({
  155. maxSize: 10 * 1024 * 1024,
  156. formats: [".doc", ".docx", ".pdf"],
  157. });
  158. const handleClick = (tab) => {
  159. console.log(tab);
  160. };
  161. const gotoDraw = (type: BoardType, id: number) => {
  162. router.push({
  163. name: RouteName.drawCaseFile,
  164. params: { caseId: caseId.value!, type, id },
  165. });
  166. };
  167. function getList() {
  168. updateByTreeFileLists(caseId.value).then(res => {
  169. let newlist = res.find(ele => ele.filesTypeName == '三录材料')?.childrenList || [];
  170. list.value.xct = newlist.find(ele => ele.filesTypeName == '现场图')?.childrenList || [];
  171. list.value.xczp = newlist.find(ele => ele.filesTypeName == '现场照片')?.childrenList || [];
  172. list.value.klbj = newlist.find(ele => ele.filesTypeName == '勘验笔录')?.caseFilesList || [];
  173. klblId.value = newlist.find(ele => ele.filesTypeName == '勘验笔录').filesTypeId
  174. fmtId.value = list.value.xct.find(ele => ele.filesTypeName == '平面图').filesTypeId
  175. pmtId.value = list.value.xct.find(ele => ele.filesTypeName == '方位图').filesTypeId
  176. console.log('list.value', list.value)
  177. })
  178. }
  179. const submitForm = async (formEl) => {
  180. if (!formEl) return;
  181. await formEl.validate((valid, fields) => {
  182. if (valid) {
  183. console.log("submit!");
  184. } else {
  185. console.log("error submit!", fields);
  186. }
  187. });
  188. };
  189. const resetForm = (formEl) => {
  190. if (!formEl) return;
  191. formEl.resetFields();
  192. };
  193. function handleActive(params) {
  194. console.log("handleActive", params);
  195. }
  196. function handleItem(type, item) {
  197. console.log("handleItem", type, item);
  198. if('edit' == type) {
  199. gotoDraw(item.filesTypeId != pmtId.value? BoardType.scene : BoardType.map, item.filesId)
  200. }
  201. getList()
  202. }
  203. async function handleItems(type, item) {
  204. console.log("handleItem", type, item);
  205. if('edit' == type) {
  206. await setTypeFile({
  207. ...item,caseId:caseId.value,
  208. fileOptions: list.value.xczp,
  209. })
  210. }
  211. getList()
  212. }
  213. function handleSuccess(item) {
  214. let uploadId = item?.data.id;
  215. addByMediaLiBrary({ caseId: caseId.value, filesTypeId: klblId.value, uploadId }).then((res) => {
  216. fileLists.value = []
  217. getList();
  218. });
  219. }
  220. function handleRecords(fileId = -1) {
  221. router.push({
  222. name: RouteName.records,
  223. params: { caseId:caseId.value, fileId },
  224. });
  225. }
  226. async function handledrawCasePhotos() {
  227. router.push({
  228. name: RouteName.drawCasePhotos,
  229. params: { caseId: caseId.value! },
  230. });
  231. console.log("handleAdd");
  232. }
  233. async function handleAdd(filesTypeName) {
  234. await addCaseFile({ caseId: caseId.value, filesTypeName });
  235. getList()
  236. console.log("handleAdd");
  237. }
  238. const handleCommand = (command: string | number | object, item) => {
  239. switch (command) {
  240. case "edit":
  241. handleRecords(item.filesId)
  242. break;
  243. case "delete":
  244. handleDel(item)
  245. break;
  246. default:
  247. // window.open(item.filesUrl)
  248. console.log("other", item);
  249. downloadFile(item.filesUrl, item.filesTitle)
  250. }
  251. // ElMessage(`click on item ${command}`)
  252. }
  253. function getExtension (name) {
  254. return name.substring(name.lastIndexOf("."))
  255. }
  256. // 下载文件
  257. function downloadFile(sourceUrl, fileName,) {
  258. const link = document.createElement('a');
  259. link.style.display = 'none';
  260. // 设置下载地址
  261. link.setAttribute('href', sourceUrl);
  262. // 设置文件名
  263. link.setAttribute('download', fileName + getExtension(sourceUrl));
  264. document.body.appendChild(link);
  265. link.click();
  266. document.body.removeChild(link);
  267. }
  268. function handleClose(e) {
  269. console.log("handleClose", e);
  270. dialogVisible.value = false
  271. }
  272. function handleRadioItem() {
  273. console.log('handleRadioItem', radio.value)
  274. if(radio.value == null){
  275. ElMessage.error('请选择对应的场景!');
  276. return;
  277. }
  278. dialogVisible.value = false
  279. window.open(`/floorplan/index.html?m=${radio.value}`)
  280. }
  281. function handleAiItem() {
  282. getSceneListHasAi(caseId.value).then((res) => {
  283. console.log('getSceneListHasAi', res)
  284. let newradioList = []
  285. res.data.map(ele => {
  286. newradioList.push(ele)
  287. })
  288. radioList.value = newradioList
  289. if(newradioList.length){
  290. dialogVisible.value = true
  291. }else{
  292. ElMessage.error('暂无支持AI 平面图的场景');
  293. }
  294. });
  295. }
  296. function handleDel(item) {
  297. ElMessageBox.confirm("确定删除?", "提示", {
  298. confirmButtonText: "确定",
  299. cancelButtonText: "取消",
  300. type: "warning",
  301. }).then(async () => {
  302. await delCaseFile({ caseId: caseId.value, filesId: item.filesId });
  303. ElMessage({
  304. type: "success",
  305. message: "删除成功",
  306. });
  307. getList()
  308. });
  309. }
  310. </script>
  311. <style lang="scss" scoped>
  312. .abstract {
  313. height: 100%;
  314. .el-tab-pane{
  315. height: 100%;
  316. overflow-y: scroll;
  317. position: relative;
  318. }
  319. .el-form-item--label-top {
  320. margin-bottom: 14px;
  321. }
  322. .form-content {
  323. height: calc(100vh - 225px);
  324. overflow-y: scroll;
  325. }
  326. .demo-tabs {
  327. .el-tabs__item {
  328. height: 32px;
  329. line-height: 32px;
  330. }
  331. }
  332. }
  333. </style>