viewKankan.vue 15 KB

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