cameraScene.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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" v-if="tableType != 3 && getCheckPerm('scenes-move-batch')"> 批量迁移</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. <!-- @cancel="afterClose" -->
  111. <DownLoadModal
  112. :downloadOption="downloadOption"
  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. percent: 0,
  204. };
  205. console.log('取消下载', downloadOption.value);
  206. }
  207. const [registerPriority, { openModal: openPriorityModal }] = useModal();
  208. const [registerDownModal, { openModal: openDownModal, closeModal }] = useModal();
  209. const [registerMoveModal, { openModal: openMoveModal }] = useModal();
  210. const [
  211. registerTable,
  212. { setProps, reload, setColumns, getSelectRowKeys, clearSelectedRowKeys, getForm },
  213. ] = useTable({
  214. api: operateSceneList,
  215. title: `场景列表`,
  216. columns: getColumns(false),
  217. // rowSelection: { type: 'checkbox' },
  218. searchInfo: { type: tableType },
  219. useSearchForm: true,
  220. formConfig: searchFormSs,
  221. showTableSetting: true,
  222. beforeFetch: (T) => {
  223. loading.value = true;
  224. if (T.shootCounts) {
  225. let min = T.shootCounts[0]<T.shootCounts[1]?T.shootCounts[0]:T.shootCounts[1];
  226. let max = T.shootCounts[0]>T.shootCounts[1]?T.shootCounts[0]:T.shootCounts[1];
  227. T.shootCountMin = min;
  228. T.shootCountMax = max;
  229. }
  230. return T;
  231. },
  232. afterFetch: (T) => {
  233. loading.value = false;
  234. return T;
  235. },
  236. rowKey: 'num',
  237. fetchSetting: {
  238. pageField: 'pageNum',
  239. sizeField: 'pageSize',
  240. listField: 'list',
  241. totalField: 'total',
  242. },
  243. canResize: true,
  244. });
  245. function getTableAction() {
  246. const tableAction = unref(tableRef);
  247. if (!tableAction) {
  248. console.log('tableAction', tableAction, tableRef);
  249. throw new Error('tableAction is null');
  250. }
  251. return tableAction;
  252. }
  253. function changeTable(val: string) {
  254. tableType.value = val;
  255. let sgetForm = getForm();
  256. if(sgetForm){
  257. sgetForm.resetFields()
  258. sgetForm.updateSchema(getSchemas(val))
  259. }
  260. console.log('sgetForm', sgetForm);
  261. setColumns(getColumns(val));
  262. clearSelectedRowKeys();
  263. reload();
  264. }
  265. function handlePriority(record) {
  266. openPriorityModal(true, record);
  267. }
  268. function handleMoveAll() {
  269. let numList = getSelectRowKeys() || [];
  270. if (numList.length == 0) {
  271. return createMessage.error('请选择批量迁移的场景');
  272. }
  273. openMoveModal(true, {
  274. numList,
  275. });
  276. }
  277. async function handleCopy(record: Recordable) {
  278. createConfirm({
  279. title: '复制场景',
  280. content: '复制场景,场景归属在原相机下。<br/>确定要复制场景吗?',
  281. onOk: async () => {
  282. sceneCopy({ num: record.num }).then(() => {
  283. message.success({
  284. content: '复制成功',
  285. });
  286. reload();
  287. });
  288. },
  289. });
  290. }
  291. async function handleDelete(record: Recordable) {
  292. console.log('handleDelete', record);
  293. // createConfirm({
  294. // title: '删除',
  295. // content: '确定要删除场景吗?',
  296. // onOk: async () => {
  297. sceneDelete({ num: record.num }).then(() => {
  298. message.success({
  299. content: '删除成功',
  300. });
  301. reload();
  302. });
  303. // },
  304. // });
  305. }
  306. async function handleColdStorage(record: Recordable) {
  307. createConfirm({
  308. title: '删除',
  309. content: '确定要解冻场景吗?',
  310. onOk: async () => {
  311. sceneRestStore({ num: record.num }).then(() => {
  312. message.success({
  313. content: '已提交解冻',
  314. });
  315. reload();
  316. });
  317. },
  318. });
  319. }
  320. async function handleMove(record: Recordable) {
  321. openMoveModal(true, {
  322. num: record.num,
  323. sceneName: record.sceneName,
  324. });
  325. }
  326. let timer: null = ref(null);
  327. const downloadOption = ref<Object>({});
  328. const canDownload = ref<boolean>(true);
  329. function handleDownload(record: Recordable) {
  330. let isObj = tableType.value == 5 || tableType.value == 7 ? 1 : 0;
  331. let params = { num: record.num, isObj: 0 };
  332. if (tableType.value == 4 || tableType.value == 5 || tableType.value == 7) {
  333. params.isObj = isObj;
  334. }
  335. canDownload.value = true;
  336. checkDownLoad(params).then((res) => {
  337. if (res.downloadStatus != 3) {
  338. // 未下载过,需要打包
  339. sceneDownload(params).then((res) => {
  340. console.log(res);
  341. openDownModal(true, {
  342. ...record,
  343. isObj: params.isObj,
  344. });
  345. if (res.downloadStatus == 1) {
  346. if (timer.value) {
  347. afterClose();
  348. }
  349. timer.value = setInterval(() => {
  350. downloadProcess(params).then((res) => {
  351. if (res.status == '1003') {
  352. createMessage.error('下载失败');
  353. afterClose();
  354. return;
  355. }
  356. if (res.percent >= 100) {
  357. canDownload.value = false;
  358. afterClose();
  359. window.open(res.url);
  360. closeModal();
  361. cancelDownload();
  362. return;
  363. }
  364. downloadOption.value = res;
  365. console.log(res);
  366. });
  367. }, 1000);
  368. }
  369. });
  370. } else {
  371. canDownload.value = false;
  372. window.open(res.downloadUrl);
  373. }
  374. });
  375. }
  376. function afterClose() {
  377. clearInterval(timer.value);
  378. timer.value = null;
  379. }
  380. function handleReset(record: Recordable) {
  381. console.log('handleReset', record);
  382. rebuildScene({ num: record.num }).then(() => {
  383. message.success({
  384. content: '操作成功',
  385. });
  386. setTimeout(() => {
  387. reload();
  388. }, 500);
  389. });
  390. }
  391. function getTypeCheckPerm(val) {
  392. let myType = tableType.value;
  393. return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
  394. }
  395. return {
  396. registerTable,
  397. handleDelete,
  398. handleCopy,
  399. handleMove,
  400. handleDownload,
  401. handleReset,
  402. handleColdStorage,
  403. handleMoveAll,
  404. handlePriority,
  405. tableType,
  406. loading,
  407. reload,
  408. changeTable,
  409. t,
  410. openDownModal,
  411. registerDownModal,
  412. registerMoveModal,
  413. registerPriority,
  414. afterClose,
  415. timer,
  416. canDownload,
  417. downloadOption,
  418. cancelDownload,
  419. getTypeCheckPerm,
  420. rowSelection,
  421. clearSelectedRowKeys,
  422. getCheckPerm,
  423. };
  424. },
  425. });
  426. </script>
  427. <style lang="less" scoped>
  428. // .tableHeader {
  429. // height: 50px;
  430. // display: flex;
  431. // align-items: center;
  432. // .item {
  433. // font-size: 14px;
  434. // color: #666;
  435. // margin-right: 10px;
  436. // cursor: pointer;
  437. // &.active {
  438. // font-weight: bold;
  439. // color: #222;
  440. // }
  441. // }
  442. // }
  443. .desc-wrap-BasicTable {
  444. background-color: #f0f2f5;
  445. .vben-basic-table-form-container {
  446. padding: 0;
  447. }
  448. }
  449. </style>