cameraScene.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. <template>
  2. <PageWrapper contentBackground>{{userName}}userName
  3. <template #footer>
  4. <a-tabs v-model:activeKey="tableType" @change="changeTable">
  5. <!-- <a-tab-pane :key="0" tab="四维看看" :disabled="loading"/> -->
  6. <a-tab-pane :key="1" tab="四维看见" :disabled="loading" />
  7. <!-- <a-tab-pane :key="2" tab="四维深时" :disabled="loading"/>
  8. <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/>
  9. <a-tab-pane :key="4" tab="四维全景" :disabled="loading"/> -->
  10. <a-tab-pane :key="2" tab="深时点云场景" :disabled="loading" />
  11. <a-tab-pane :key="5" tab="深时Mesh场景" :disabled="loading" />
  12. <a-tab-pane :key="6" tab="深光点云场景" :disabled="loading" />
  13. <a-tab-pane :key="7" tab="深光Mesh场景" :disabled="loading" /> </a-tabs
  14. ></template>
  15. <div class="desc-wrap-BasicTable">
  16. <BasicTable @register="registerTable">
  17. <template #toolbar>
  18. <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
  19. </template>
  20. <template #href="{ record }">
  21. <a
  22. v-if="record.status == 1 || (record.status == -2 && record.payStatus == 1)"
  23. target="_blank"
  24. :href="record.webSite"
  25. >{{ record.sceneName }}</a
  26. >
  27. <span v-else-if="record.sceneName">{{ record.sceneName }}</span>
  28. <span v-else>-</span>
  29. </template>
  30. <template #action="{ record }">
  31. <TableAction
  32. stopButtonPropagation
  33. :actions="[
  34. {
  35. label: '编辑',
  36. disabled: !(record.status == 1 || record.status == -2),
  37. ifShow: getTypeCheckPerm('scenes-edit') && tableType != 3 && record.isEdit,
  38. onClick: handlegotoEdit.bind(null, record),
  39. },
  40. {
  41. label: '权限',
  42. disabled: (!(record.status == 1 || record.status == -2)) || !record.isAuth,
  43. ifShow: getTypeCheckPerm('scenes-powers'),
  44. onClick: handlePowers.bind(null, record),
  45. },
  46. {
  47. label: '迁移',
  48. disabled: !(record.status == 1 || record.status == -2),
  49. ifShow:
  50. getTypeCheckPerm('scenes-move') && tableType != 3 && (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  51. onClick: handleMove.bind(null, record),
  52. },
  53. {
  54. label: '下载',
  55. ifShow:
  56. getTypeCheckPerm('scenes-download') &&
  57. tableType != 3 &&
  58. (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  59. disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
  60. //icon: 'carbon:download',
  61. onClick: handleDownload.bind(null, record),
  62. },
  63. {
  64. label: '重算',
  65. disabled: record.status == 0 || (record.status == -2 && record.payStatus != 1),
  66. ifShow:
  67. getTypeCheckPerm('scenes-recalculate') &&
  68. tableType != 3 &&
  69. (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  70. popConfirm: {
  71. title: '是否重算?',
  72. confirm: handleReset.bind(null, record),
  73. },
  74. },
  75. {
  76. label: '复制',
  77. disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
  78. ifShow:
  79. getTypeCheckPerm('scenes-copy') && tableType != 3 && (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  80. onClick: handleCopy.bind(null, record),
  81. },
  82. {
  83. label: '生成 obj',
  84. ifShow:
  85. getTypeCheckPerm('scenes-creatobj') &&
  86. record.status == -2 &&
  87. (tableType == 2 || tableType == 6) &&
  88. (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  89. onClick: handleGenerate.bind(null, record),
  90. },
  91. {
  92. label: '删除',
  93. //icon: 'ic:outline-delete-outline',
  94. color: 'error',
  95. ifShow: getTypeCheckPerm('scenes-delete') && (record.userName == userInfo.userName || userInfo.roleId == 1 || userInfo.roleId == 45),
  96. disabled: record.status == 0,
  97. //onClick: handleDelete.bind(null, record),
  98. popConfirm: {
  99. title: '是否删除?',
  100. confirm: handleDelete.bind(null, record),
  101. placement: 'topRight',
  102. },
  103. },
  104. ]"
  105. />
  106. </template>
  107. </BasicTable>
  108. </div>
  109. <DownLoadModal
  110. :downloadOption="downloadOption"
  111. @cancel="afterClose"
  112. @register="registerDownModal"
  113. @update="reload"
  114. cancelText="取消下载"
  115. okText="下载"
  116. @cancelDownload="cancelDownload"
  117. :okButtonProps="{ disabled: canDownload }"
  118. />
  119. <MoveModal @register="registerMoveModal" />
  120. <PowersModal @register="registerPowersModal" />
  121. </PageWrapper>
  122. </template>
  123. <script lang="ts">
  124. import { defineComponent, h, computed, toRefs, ref } from 'vue';
  125. import dayjs from 'dayjs';
  126. import {
  127. BasicTable,
  128. useTable,
  129. TableAction,
  130. BasicColumn,
  131. TableImg,
  132. FormProps,
  133. } from '/@/components/Table';
  134. import { PageWrapper } from '/@/components/Page';
  135. import DownLoadModal from './modal/DownLoadModal.vue';
  136. import MoveModal from './modal/MoveModal.vue';
  137. import PowersModal from './modal/PowersModal.vue';
  138. import { Time } from '/@/components/Time';
  139. import { Descriptions, Tabs, Progress } from 'ant-design-vue';
  140. import { useI18n } from '/@/hooks/web/useI18n';
  141. import { useMessage } from '/@/hooks/web/useMessage';
  142. import { useModal } from '/@/components/Modal';
  143. import {
  144. operateSceneList,
  145. sceneMove,
  146. sceneDelete,
  147. sceneReset,
  148. sceneDownload,
  149. checkDownLoad,
  150. downloadProcess,
  151. sceneCopy,
  152. rebuildScene,
  153. buildSceneObj,
  154. sceneDetail,
  155. } from '/@/api/operate';
  156. import { message } from 'ant-design-vue';
  157. import { usePermissionStore } from '/@/store/modules/permission';
  158. import { useUserStore } from '/@/store/modules/user';
  159. import { func } from 'vue-types';
  160. export default defineComponent({
  161. components: {
  162. DownLoadModal,
  163. MoveModal,
  164. PowersModal,
  165. BasicTable,
  166. TableAction,
  167. PageWrapper,
  168. [Descriptions.name]: Descriptions,
  169. [Descriptions.Item.name]: Descriptions.Item,
  170. [Tabs.name]: Tabs,
  171. [Tabs.TabPane.name]: Tabs.TabPane,
  172. },
  173. setup() {
  174. const { t } = useI18n();
  175. const { createMessage, createConfirm } = useMessage();
  176. const userStore = useUserStore();
  177. const userInfo = computed(() => userStore.getUserInfo);
  178. const permissionStore = usePermissionStore();
  179. const { getCheckPerm } = permissionStore;
  180. const loading = ref(false);
  181. const tableType = ref<Recordable>(1); //0看看 、1看见、2深时
  182. const tabList = ref<Array>(['四维看看', '四维看见', '四维深时', '四维双目Lite']);
  183. const columns: BasicColumn[] = [
  184. {
  185. title: '场景标题',
  186. dataIndex: 'sceneName',
  187. slots: { customRender: 'href' },
  188. width: 150,
  189. },
  190. {
  191. title: '场景码',
  192. dataIndex: 'num',
  193. ellipsis: true,
  194. width: 180,
  195. },
  196. {
  197. title: '拍摄时间',
  198. dataIndex: 'createTime',
  199. width: 180,
  200. customRender: ({ record }) => {
  201. return (
  202. record.createTime &&
  203. h(Time, {
  204. value: record.createTime,
  205. mode: 'datetime',
  206. })
  207. );
  208. },
  209. },
  210. {
  211. title: '计算完成时间',
  212. dataIndex: 'amount',
  213. width: 180,
  214. customRender: ({ record }) => {
  215. return (
  216. (record.algorithmTime &&
  217. h(Time, {
  218. value: record.algorithmTime,
  219. mode: 'datetime',
  220. })) ||
  221. '-'
  222. );
  223. },
  224. },
  225. {
  226. title: 'SN码',
  227. dataIndex: 'snCode',
  228. width: 180,
  229. },
  230. {
  231. title: '场景大小',
  232. dataIndex: 'sceneSize',
  233. width: 80,
  234. customRender: ({ record }) => {
  235. return record.sceneSize && record.sceneSize != 0
  236. ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
  237. : '-';
  238. },
  239. },
  240. {
  241. title: '是否复制',
  242. dataIndex: 'isCopy',
  243. width: 80,
  244. customRender: ({ record }) => {
  245. return record.isCopy ? '是' : '否';
  246. },
  247. },
  248. {
  249. title: '复制时间',
  250. dataIndex: 'copyTime',
  251. width: 180,
  252. customRender: ({ record }) => {
  253. return record.copyTime
  254. ? h(Time, {
  255. value: record.copyTime,
  256. mode: 'datetime',
  257. })
  258. : '-';
  259. },
  260. },
  261. {
  262. title: '人员编号',
  263. dataIndex: 'userName',
  264. width: 100,
  265. },
  266. {
  267. title: '浏览量',
  268. dataIndex: 'viewCount',
  269. width: 80,
  270. },
  271. {
  272. title: '状态',
  273. dataIndex: 'status',
  274. width: 80,
  275. customRender: ({ record }) => {
  276. let str;
  277. switch (record.status - 0) {
  278. case 0:
  279. str = '计算中';
  280. break;
  281. case 1:
  282. str = '计算成功';
  283. break;
  284. case -2:
  285. str = '计算成功';
  286. break;
  287. case -1:
  288. str = '计算失败';
  289. break;
  290. }
  291. return record.payStatus == -2 ? '封存' : str;
  292. },
  293. },
  294. {
  295. title: '操作',
  296. dataIndex: 'action',
  297. slots: { customRender: 'action' },
  298. ifShow: true,
  299. fixed: 'right',
  300. flag: 'ACTION',
  301. width: 400,
  302. },
  303. ];
  304. const searchForm: Partial<FormProps> = {
  305. labelWidth: 100,
  306. schemas: [
  307. {
  308. field: 'sceneName',
  309. label: '场景标题',
  310. component: 'Input',
  311. componentProps: {
  312. maxLength: 100,
  313. },
  314. colProps: {
  315. xl: 7,
  316. xxl: 7,
  317. },
  318. },
  319. {
  320. field: 'snCode',
  321. label: 'SN码',
  322. component: 'Input',
  323. componentProps: {
  324. maxLength: 100,
  325. },
  326. colProps: {
  327. xl: 7,
  328. xxl: 7,
  329. },
  330. },
  331. {
  332. field: 'userName',
  333. label: '绑定账号',
  334. component: 'Input',
  335. componentProps: {
  336. maxLength: 100,
  337. },
  338. colProps: {
  339. xl: 6,
  340. xxl: 6,
  341. },
  342. },
  343. ],
  344. };
  345. function cancelDownload() {
  346. downloadOption.value = {};
  347. }
  348. const [registerDownModal, { openModal: openDownModal }] = useModal();
  349. const [registerMoveModal, { openModal: openMoveModal }] = useModal();
  350. const [registerPowersModal, { openModal: openPowersModal }] = useModal();
  351. const [registerTable, { reload }] = useTable({
  352. api: operateSceneList,
  353. title: `场景列表`,
  354. // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
  355. columns: columns,
  356. searchInfo: { type: tableType },
  357. useSearchForm: true,
  358. formConfig: searchForm,
  359. showTableSetting: true,
  360. beforeFetch: (T) => {
  361. loading.value = true;
  362. return T;
  363. },
  364. afterFetch: (T) => {
  365. loading.value = false;
  366. return T;
  367. },
  368. rowKey: 'num',
  369. fetchSetting: {
  370. pageField: 'pageNum',
  371. sizeField: 'pageSize',
  372. listField: 'list',
  373. totalField: 'total',
  374. },
  375. canResize: true,
  376. });
  377. function changeTable(val: string) {
  378. tableType.value = val;
  379. reload();
  380. }
  381. async function handleCopy(record: Recordable) {
  382. createConfirm({
  383. title: '复制场景',
  384. content: '复制场景,场景归属在原相机下。<br/>确定要复制场景吗?',
  385. onOk: async () => {
  386. sceneCopy({ num: record.num }).then(() => {
  387. message.success({
  388. content: '复制成功',
  389. });
  390. reload();
  391. });
  392. },
  393. });
  394. }
  395. async function handleDelete(record: Recordable) {
  396. console.log('handleDelete', record);
  397. // createConfirm({
  398. // title: '删除',
  399. // content: '确定要删除场景吗?',
  400. // onOk: async () => {
  401. sceneDelete({ num: record.num }).then(() => {
  402. message.success({
  403. content: '删除成功',
  404. });
  405. reload();
  406. });
  407. // },
  408. // });
  409. }
  410. async function handleMove(record: Recordable) {
  411. openMoveModal(true, {
  412. ...record,
  413. });
  414. // sceneMove({ snCode: record.snCode, num: record.num })
  415. // .then(() => {
  416. // message.success({
  417. // content: '迁移成功',
  418. // });
  419. // })
  420. // .catch(() => {
  421. // message.success({
  422. // content: '迁移失败',
  423. // });
  424. // });
  425. }
  426. let timer: null = ref(null);
  427. const downloadOption = ref<Object>({});
  428. const canDownload = ref<boolean>(true);
  429. function handleDownload(record: Recordable) {
  430. console.log('handleDownload', record, canDownload.value);
  431. canDownload.value = true;
  432. checkDownLoad({ num: record.num }).then((res) => {
  433. console.log(res);
  434. if (res.downloadStatus != 3) {
  435. // 未下载过,需要打包
  436. sceneDownload({ num: record.num }).then((res) => {
  437. console.log(res);
  438. openDownModal(true, {
  439. ...record,
  440. });
  441. if (res.downloadStatus == 1) {
  442. if (timer.value) {
  443. afterClose();
  444. }
  445. timer.value = setInterval(() => {
  446. downloadProcess({ num: record.num }).then((res) => {
  447. if (res.status == '1003') {
  448. createMessage.error('下载失败');
  449. afterClose();
  450. return;
  451. }
  452. if (res.percent >= 100) {
  453. canDownload.value = false;
  454. afterClose();
  455. }
  456. downloadOption.value = res;
  457. console.log(res);
  458. });
  459. }, 1000);
  460. }
  461. });
  462. } else {
  463. canDownload.value = false;
  464. window.open(res.downloadUrl);
  465. }
  466. });
  467. }
  468. function handleEdit(record: Recordable) {
  469. window.open(record.thumbEdit + '&&token=' + token.value);
  470. }
  471. async function handleGenerate(record: Recordable) {
  472. console.log('record', record);
  473. let data = await sceneDetail({ id: record.id });
  474. console.log('data', data);
  475. let { buildObjStatus } = data;
  476. let toastText =
  477. buildObjStatus == 2
  478. ? 'Mesh场景正在计算中,请耐心等待'
  479. : buildObjStatus == 1
  480. ? '重新生成Mesh场景将覆盖现有场景信息,计算过程中Mesh场景无法打开,确定要重新生成吗?'
  481. : '生成obj需要较长时间,请耐心等待';
  482. // if (data.code === 200) {
  483. createConfirm({
  484. iconType: 'warning',
  485. title: () => h('span', '生成 obj'),
  486. content: () => h('span', toastText),
  487. onOk: async () => {
  488. if (buildObjStatus !== 2) {
  489. await buildSceneObj({ id: record.id });
  490. }
  491. createMessage.success(t('common.optSuccess'));
  492. reload();
  493. },
  494. });
  495. // } else {
  496. // createMessage.error(t(`apiCode.errCode${data.code}`));
  497. // }
  498. }
  499. function afterClose() {
  500. clearInterval(timer.value);
  501. timer.value = null;
  502. }
  503. function handleReset(record: Recordable) {
  504. console.log('handleReset', record);
  505. rebuildScene({ num: record.num }).then(() => {
  506. message.success({
  507. content: '操作成功',
  508. });
  509. reload();
  510. });
  511. }
  512. function getTypeCheckPerm(val) {
  513. let myType = tableType.value;
  514. return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
  515. }
  516. function handlegotoEdit(record: Recordable) {
  517. let url = record.webSite.replace('smg', 'epg');
  518. if (!record.editAuthTime || (record.editAuthTime && dayjs() < dayjs(record.editAuthTime))) {
  519. window.open(url);
  520. } else {
  521. createMessage.error('编辑权限已过期');
  522. }
  523. }
  524. function handlePowers(record: Recordable) {
  525. openPowersModal(true, {
  526. ...record,
  527. });
  528. }
  529. return {
  530. registerTable,
  531. registerPowersModal,
  532. handleDelete,
  533. handleCopy,
  534. handleMove,
  535. handleDownload,
  536. handleReset,
  537. tableType,
  538. loading,
  539. changeTable,
  540. t,
  541. openDownModal,
  542. registerDownModal,
  543. registerMoveModal,
  544. afterClose,
  545. timer,
  546. canDownload,
  547. downloadOption,
  548. cancelDownload,
  549. handleGenerate,
  550. getTypeCheckPerm,
  551. handlegotoEdit,
  552. handlePowers,
  553. userInfo,
  554. };
  555. },
  556. });
  557. </script>
  558. <style lang="less" scoped>
  559. // .tableHeader {
  560. // height: 50px;
  561. // display: flex;
  562. // align-items: center;
  563. // .item {
  564. // font-size: 14px;
  565. // color: #666;
  566. // margin-right: 10px;
  567. // cursor: pointer;
  568. // &.active {
  569. // font-weight: bold;
  570. // color: #222;
  571. // }
  572. // }
  573. // }
  574. .desc-wrap-BasicTable {
  575. background-color: #f0f2f5;
  576. .vben-basic-table-form-container {
  577. padding: 0;
  578. }
  579. }
  580. </style>