cameraScene.vue 14 KB

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