cameraScene.vue 14 KB

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