cameraScene.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. <template>
  2. <PageWrapper contentBackground>
  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="5" tab="深时Mesh场景" :disabled="loading" />
  9. <a-tab-pane :key="6" tab="深光点云场景" :disabled="loading" />
  10. <a-tab-pane :key="7" tab="深光Mesh场景" :disabled="loading" />
  11. <a-tab-pane :key="8" tab="深巡点云场景" :disabled="loading" />
  12. <a-tab-pane :key="57" tab="其他点云场景" :disabled="loading" />
  13. <a-tab-pane :key="58" tab="其他Mesh场景" :disabled="loading" />
  14. <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading" />
  15. </a-tabs>
  16. </template>
  17. <div class="desc-wrap-BasicTable">
  18. <BasicTable
  19. @register="registerTable"
  20. ref="tableRef"
  21. :rowSelection="tableType == 3 ? false : rowSelection"
  22. >
  23. <template #toolbar>
  24. <a-button
  25. type="primary"
  26. @click="handleMoveAll"
  27. v-if="
  28. tableType != 3 &&
  29. tableType != 57 &&
  30. tableType != 58 &&
  31. getCheckPerm('scenes-move-batch')
  32. "
  33. >
  34. 批量迁移</a-button
  35. >
  36. </template>
  37. <template #status="{ record }">
  38. <span v-if="record.status != '-1'">{{ record.statusString }}</span>
  39. <Tooltip v-else placement="right">
  40. <template #title>
  41. <span>失败原因:{{ record.buildErrorReason }}</span>
  42. <p>
  43. <span>serverPath:{{ record.dataSource }}</span>
  44. </p>
  45. </template>
  46. <span
  47. >{{ record.statusString }}
  48. <Icon icon="mdi:warning-octagon-outline" />
  49. </span>
  50. </Tooltip>
  51. </template>
  52. <template #href="{ record }">
  53. <a
  54. v-if="record.sceneName && record.webSite"
  55. target="_blank"
  56. style="white-space: pre"
  57. :href="record.webSite || record.thumb"
  58. >{{ record.sceneName }}</a
  59. >
  60. <span style="white-space: pre" v-else-if="record.sceneName">{{ record.sceneName }}</span>
  61. <span v-else>-</span>
  62. </template>
  63. <template #action="{ record }">
  64. <TableAction
  65. stopButtonPropagation
  66. :actions="[
  67. {
  68. label: '迁移',
  69. disabled: !(record.status == 1 || record.status == -2),
  70. ifShow:
  71. getTypeCheckPerm('scenes-move') &&
  72. tableType != 3 &&
  73. tableType != 57 &&
  74. tableType != 58,
  75. onClick: handleMove.bind(null, record),
  76. },
  77. {
  78. label: '优先级',
  79. ifShow: getTypeCheckPerm('scenes-priority') && record.status == -4,
  80. onClick: handlePriority.bind(null, record),
  81. },
  82. {
  83. label: '解冻',
  84. disabled: !record.isColdStorage || !(record.status == 1 || record.status == -2),
  85. ifShow: getTypeCheckPerm('scenes-thaw') && tableType != 57 && tableType != 58,
  86. onClick: handleColdStorage.bind(null, record),
  87. },
  88. {
  89. label: '下载',
  90. ifShow: getTypeCheckPerm('scenes-download') && tableType != 3,
  91. disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
  92. //icon: 'carbon:download',
  93. onClick: handleDownload.bind(null, record),
  94. },
  95. {
  96. label: '重算',
  97. disabled: record.status == 0 || (record.status == -2 && record.payStatus != 1),
  98. ifShow:
  99. getTypeCheckPerm('scenes-recalculate') &&
  100. tableType != 3 &&
  101. record.status != -4 &&
  102. tableType != 57 &&
  103. tableType != 58,
  104. popConfirm: {
  105. title: '是否重算?',
  106. confirm: handleReset.bind(null, record),
  107. },
  108. },
  109. {
  110. label: '复制',
  111. disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
  112. ifShow:
  113. getTypeCheckPerm('scenes-copy') &&
  114. tableType != 3 &&
  115. tableType != 57 &&
  116. tableType != 58,
  117. onClick: handleCopy.bind(null, record),
  118. },
  119. {
  120. label: '删除',
  121. //icon: 'ic:outline-delete-outline',
  122. color: 'error',
  123. ifShow: getTypeCheckPerm('scenes-delete'),
  124. disabled: record.status == 0,
  125. //onClick: handleDelete.bind(null, record),
  126. popConfirm: {
  127. title: '是否删除?',
  128. confirm: handleDelete.bind(null, record),
  129. placement: 'topRight',
  130. },
  131. },
  132. ]"
  133. />
  134. </template>
  135. </BasicTable>
  136. </div>
  137. <!-- @cancel="afterClose" -->
  138. <DownLoadModal
  139. :downloadOption="downloadOption"
  140. @register="registerDownModal"
  141. @update="reload"
  142. cancelText="取消下载"
  143. okText="下载"
  144. @cancelDownload="cancelDownload"
  145. :okButtonProps="{ disabled: canDownload }"
  146. />
  147. <MoveModal @update="reload" @register="registerMoveModal" />
  148. <priorityMoadl
  149. @clearSelected="clearSelectedRowKeys"
  150. @update="reload"
  151. @register="registerPriority"
  152. />
  153. </PageWrapper>
  154. </template>
  155. <script lang="ts">
  156. import { defineComponent, h, reactive, toRefs, ref, unref } from 'vue';
  157. import {
  158. BasicTable,
  159. useTable,
  160. TableAction,
  161. BasicColumn,
  162. TableActionType,
  163. TableImg,
  164. FormProps,
  165. } from '/@/components/Table';
  166. import { PageWrapper } from '/@/components/Page';
  167. import DownLoadModal from './modal/DownLoadModal.vue';
  168. import MoveModal from './modal/MoveModal.vue';
  169. import priorityMoadl from './modal/priorityMoadl.vue';
  170. import { Time } from '/@/components/Time';
  171. import { Icon } from '/@/components/Icon';
  172. import { Descriptions, Tabs, Progress, Tooltip } from 'ant-design-vue';
  173. import { useI18n } from '/@/hooks/web/useI18n';
  174. import { useMessage } from '/@/hooks/web/useMessage';
  175. import { useModal } from '/@/components/Modal';
  176. import {
  177. operateSceneList,
  178. sceneMove,
  179. sceneDelete,
  180. sceneReset,
  181. sceneRestStore,
  182. sceneDownload,
  183. checkDownLoad,
  184. downloadProcess,
  185. sceneCopy,
  186. rebuildScene,
  187. } from '/@/api/operate';
  188. import { message } from 'ant-design-vue';
  189. import { usePermissionStore } from '/@/store/modules/permission';
  190. import { func } from 'vue-types';
  191. import { truncate } from 'fs/promises';
  192. import { getSchemas, getColumns } from './data';
  193. export default defineComponent({
  194. components: {
  195. DownLoadModal,
  196. MoveModal,
  197. BasicTable,
  198. TableAction,
  199. priorityMoadl,
  200. PageWrapper,
  201. Icon,
  202. Tooltip,
  203. [Descriptions.name]: Descriptions,
  204. [Descriptions.Item.name]: Descriptions.Item,
  205. [Tabs.name]: Tabs,
  206. [Tabs.TabPane.name]: Tabs.TabPane,
  207. },
  208. props: {
  209. userName: String,
  210. },
  211. setup(props) {
  212. const { t } = useI18n();
  213. const { createMessage, createConfirm } = useMessage();
  214. const permissionStore = usePermissionStore();
  215. const { getCheckPerm } = permissionStore;
  216. const loading = ref(false);
  217. const tableRef = ref<Nullable<TableActionType>>(null);
  218. const tableType = ref<Number>(0); //0看看 、1看见、2深时
  219. const rowSelection = ref({
  220. type: 'checkbox',
  221. });
  222. const searchFormSs: Partial<FormProps> = {
  223. labelWidth: 100,
  224. autoSubmitOnEnter: true,
  225. autoAdvancedLine: 1,
  226. actionColOptions: {
  227. span: 24,
  228. },
  229. schemas: getSchemas('', props.userName),
  230. };
  231. function cancelDownload() {
  232. downloadOption.value = {
  233. percent: 0,
  234. };
  235. console.log('取消下载', downloadOption.value);
  236. }
  237. const [registerPriority, { openModal: openPriorityModal }] = useModal();
  238. const [registerDownModal, { openModal: openDownModal, closeModal }] = useModal();
  239. const [registerMoveModal, { openModal: openMoveModal }] = useModal();
  240. const [
  241. registerTable,
  242. { setProps, reload, setColumns, getSelectRowKeys, clearSelectedRowKeys, getForm },
  243. ] = useTable({
  244. api: operateSceneList,
  245. title: `场景列表`,
  246. columns: getColumns(false),
  247. // rowSelection: { type: 'checkbox' },
  248. searchInfo: props.userName
  249. ? { type: tableType, userName: props.userName }
  250. : { type: tableType },
  251. useSearchForm: true,
  252. formConfig: searchFormSs,
  253. showTableSetting: true,
  254. beforeFetch: (T) => {
  255. loading.value = true;
  256. if (T.shootCounts) {
  257. let min = T.shootCounts[0] < T.shootCounts[1] ? T.shootCounts[0] : T.shootCounts[1];
  258. let max = T.shootCounts[0] > T.shootCounts[1] ? T.shootCounts[0] : T.shootCounts[1];
  259. T.shootCountMin = min;
  260. T.shootCountMax = max;
  261. }
  262. return T;
  263. },
  264. afterFetch: (T) => {
  265. loading.value = false;
  266. return T;
  267. },
  268. rowKey: 'num',
  269. fetchSetting: {
  270. pageField: 'pageNum',
  271. sizeField: 'pageSize',
  272. listField: 'list',
  273. totalField: 'total',
  274. },
  275. canResize: true,
  276. });
  277. function getTableAction() {
  278. const tableAction = unref(tableRef);
  279. if (!tableAction) {
  280. console.log('tableAction', tableAction, tableRef);
  281. throw new Error('tableAction is null');
  282. }
  283. return tableAction;
  284. }
  285. function changeTable(val: string) {
  286. tableType.value = val;
  287. let sgetForm = getForm();
  288. if (sgetForm) {
  289. sgetForm.resetFields();
  290. sgetForm.updateSchema(getSchemas(val, props.userName));
  291. }
  292. console.log('sgetForm', sgetForm, val);
  293. setColumns(getColumns(val));
  294. clearSelectedRowKeys();
  295. reload();
  296. }
  297. function handlePriority(record) {
  298. openPriorityModal(true, record);
  299. }
  300. function handleMoveAll() {
  301. let numList = getSelectRowKeys() || [];
  302. if (numList.length == 0) {
  303. return createMessage.error('请选择批量迁移的场景');
  304. }
  305. openMoveModal(true, {
  306. numList,
  307. });
  308. }
  309. async function handleCopy(record: Recordable) {
  310. createConfirm({
  311. title: '复制场景',
  312. content: '确定要复制场景吗?',
  313. onOk: async () => {
  314. sceneCopy({ num: record.num }).then(() => {
  315. message.success({
  316. content: '复制成功',
  317. });
  318. reload();
  319. });
  320. },
  321. });
  322. }
  323. async function handleDelete(record: Recordable) {
  324. console.log('handleDelete', record);
  325. // createConfirm({
  326. // title: '删除',
  327. // content: '确定要删除场景吗?',
  328. // onOk: async () => {
  329. sceneDelete({ num: record.num }).then(() => {
  330. message.success({
  331. content: '删除成功',
  332. });
  333. reload();
  334. });
  335. // },
  336. // });
  337. }
  338. async function handleColdStorage(record: Recordable) {
  339. createConfirm({
  340. title: '删除',
  341. content: '确定要解冻场景吗?',
  342. onOk: async () => {
  343. sceneRestStore({ num: record.num }).then(() => {
  344. message.success({
  345. content: '已提交解冻',
  346. });
  347. reload();
  348. });
  349. },
  350. });
  351. }
  352. async function handleMove(record: Recordable) {
  353. openMoveModal(true, {
  354. num: record.num,
  355. sceneName: record.sceneName,
  356. });
  357. }
  358. let timer: null = ref(null);
  359. const downloadOption = ref<Object>({});
  360. const canDownload = ref<boolean>(true);
  361. function handleDownload(record: Recordable) {
  362. let isObj = tableType.value == 5 || tableType.value == 7 || tableType.value == 58 ? 1 : 0;
  363. let params = { num: record.num, isObj: 0 };
  364. if (
  365. tableType.value == 4 ||
  366. tableType.value == 5 ||
  367. tableType.value == 7 ||
  368. tableType.value == 58
  369. ) {
  370. params.isObj = isObj;
  371. }
  372. canDownload.value = true;
  373. checkDownLoad(params).then(async (res) => {
  374. let sceneDownloadRes = res;
  375. if (res.downloadStatus != 3) {
  376. // 未下载过,需要打包
  377. if (res.downloadStatus != 1) {
  378. sceneDownloadRes = await sceneDownload(params);
  379. }
  380. openDownModal(true, {
  381. ...record,
  382. });
  383. if (sceneDownloadRes.downloadStatus == 1) {
  384. if (timer.value) {
  385. afterClose();
  386. }
  387. getProcess(params);
  388. }
  389. } else {
  390. window.open(res.downloadUrl);
  391. }
  392. });
  393. }
  394. function afterClose() {
  395. clearInterval(timer.value);
  396. downloadOption.value = {
  397. percent: 0,
  398. };
  399. timer.value = null;
  400. }
  401. function getProcess(params) {
  402. timer.value = setTimeout(() => {
  403. downloadProcess(params).then((processres) => {
  404. console.log('processres', processres, params);
  405. downloadOption.value = processres;
  406. if (processres.percent >= 100) {
  407. canDownload.value = false;
  408. afterClose();
  409. window.open(processres.url);
  410. closeModal();
  411. cancelDownload();
  412. } else {
  413. getProcess(params);
  414. }
  415. });
  416. }, 1000);
  417. }
  418. function handleReset(record: Recordable) {
  419. console.log('handleReset', record);
  420. rebuildScene({ num: record.num }).then(() => {
  421. message.success({
  422. content: '操作成功',
  423. });
  424. setTimeout(() => {
  425. reload();
  426. }, 500);
  427. });
  428. }
  429. function getTypeCheckPerm(val) {
  430. let myType = tableType.value;
  431. return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
  432. }
  433. return {
  434. registerTable,
  435. handleDelete,
  436. handleCopy,
  437. handleMove,
  438. handleDownload,
  439. handleReset,
  440. handleColdStorage,
  441. handleMoveAll,
  442. handlePriority,
  443. tableType,
  444. loading,
  445. reload,
  446. changeTable,
  447. t,
  448. openDownModal,
  449. registerDownModal,
  450. registerMoveModal,
  451. registerPriority,
  452. afterClose,
  453. timer,
  454. canDownload,
  455. downloadOption,
  456. cancelDownload,
  457. getTypeCheckPerm,
  458. rowSelection,
  459. clearSelectedRowKeys,
  460. getCheckPerm,
  461. userName: props.userName,
  462. };
  463. },
  464. });
  465. </script>
  466. <style lang="less" scoped>
  467. // .tableHeader {
  468. // height: 50px;
  469. // display: flex;
  470. // align-items: center;
  471. // .item {
  472. // font-size: 14px;
  473. // color: #666;
  474. // margin-right: 10px;
  475. // cursor: pointer;
  476. // &.active {
  477. // font-weight: bold;
  478. // color: #222;
  479. // }
  480. // }
  481. // }
  482. .desc-wrap-BasicTable {
  483. background-color: #f0f2f5;
  484. .vben-basic-table-form-container {
  485. padding: 0;
  486. }
  487. }
  488. </style>