cameraScene.vue 14 KB

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