cameraScene.vue 15 KB

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