Explorar el Código

修改江门1.6.0

tangning hace 9 meses
padre
commit
33c04bada3

+ 97 - 0
src/api/media/index.ts

@@ -0,0 +1,97 @@
+import { defHttp } from '/@/utils/http/axios';
+import { Result } from '/#/axios';
+enum Api {
+  mediaList = '/service/manage/dictFile/pageList/media-library',
+  fileaddOrUpdate = '/service/manage/dictFile/addOrUpdate/media-library',
+  dictFiledel = '/service/manage/dictFile/del/media-library',
+  getByKey = '/service/manage/dict/getByKey/media-library',
+  addOrUpdate = '/service/manage/dict/addOrUpdate/media-library',
+  del = '/service/manage/dict/del/media-library',
+  upload = '/service/manage/common/upload/fileNew',
+}
+
+/**
+ * @description: Get sample list value
+ */
+export const mediaList = (params) =>
+  defHttp.post<Result>({
+    url: Api.mediaList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const fileaddOrUpdate = (params) =>
+  defHttp.post<Result>({
+    url: Api.fileaddOrUpdate,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const dictFiledel = (params) =>
+  defHttp.post<Result>({
+    url: Api.dictFiledel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const getByKey = (params) =>
+  defHttp.get<Result>({
+    url: Api.getByKey,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const addOrUpdate = (params) =>
+  defHttp.post<Result>({
+    url: Api.addOrUpdate,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const del = (params) =>
+  defHttp.post<Result>({
+    url: Api.del,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export function uploadApi(params, onUploadProgress: (progressEvent: ProgressEvent) => void) {
+  return defHttp.uploadFile<Result>(
+    {
+      url: Api.upload,
+      onUploadProgress,
+    },
+    params,
+  );
+}
+export const casePublicApi = (params) =>
+  defHttp.get<Result>({
+    url: Api.caseWithdraw,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      'Content-Type': 'application/x-www-form-urlencoded',
+      ignoreCancelToken: true,
+    },
+  });

+ 1 - 1
src/views/case/list.vue

@@ -315,7 +315,7 @@
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
       const [registerTable, { reload }] = useTable({
         api: operateSceneList,
-        title: `场景列表`,
+        title: ``,
         // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
         columns: columns,
         searchInfo: { type: tableType },

+ 523 - 0
src/views/mediaLibrary/list.vue

@@ -0,0 +1,523 @@
+<template>
+  <div class="scren">
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button type="primary" @click="handleGrounping"> 分组管理</a-button>
+        <a-button type="primary" @click="uploadModal(true, {})"> 上传</a-button>
+      </template>
+
+      <template #href="{ record }">
+        <a
+          v-if="record.status == 1 || (record.status == -2 && record.payStatus == 1)"
+          target="_blank"
+          :title="record.sceneName"
+          :href="record.webSite"
+          >{{ record.sceneName }}</a
+        >
+        <span v-else-if="record.sceneName">{{ record.sceneName }}</span>
+        <span v-else>-</span>
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          v-if="!record.isShare"
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '编辑',
+              disabled: !(record.status == 1 || record.status == -2),
+              ifShow: getTypeCheckPerm('scenes-edit'),
+              onClick: handlegotoEdit.bind(null, record),
+            },
+            {
+              label: '删除',
+              //icon: 'ic:outline-delete-outline',
+              color: 'error',
+              ifShow: getTypeCheckPerm('scenes-delete'),
+              onClick: handleDelete.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <grouping @register="registerGroupingModal" />
+    <uploadModal @register="registeruploadModal" />
+    <detailModal @register="registerdetailModal" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, h, computed, toRefs, ref, onMounted } from 'vue';
+  import Icon from '/@/components/Icon/index';
+  import dayjs from 'dayjs';
+  import { QrCode } from '/@/components/Qrcode/index';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  // import { PageWrapper } from '/@/components/Page';
+  import detailModal from './modal/detailModal.vue';
+  import uploadModal from './modal/uploadModal.vue';
+  import grouping from './modal/grouping.vue';
+  import { Time } from '/@/components/Time';
+  import { Descriptions, Tabs, Progress } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import {
+    mediaList,
+    getByKey
+  } from '/@/api/media';
+  import { message } from 'ant-design-vue';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { useUserStore } from '/@/store/modules/user';
+  import { func } from 'vue-types';
+  export default defineComponent({
+    components: {
+      // DownLoadModal,
+      // MoveModal,
+      // PowersModal,
+      uploadModal,
+      detailModal,
+      grouping,
+      BasicTable,
+      TableAction,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+
+      // Tabs,
+      [Tabs.name]: Tabs,
+      // [Tabs.TabPane?.name]: Tabs.TabPane,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage, createConfirm } = useMessage();
+      const userStore = useUserStore();
+      const userInfo = computed(() => userStore.getUserInfo);
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const loading = ref(false);
+      const tableType = ref<Recordable>(1); //0看看 、1看见、2深时
+      const tabList = ref<Array>(['四维看看', '四维看见', '四维深时', '四维双目Lite']);
+      const qrCodeUrl = ref({
+        show: false,
+        ios: 'http://fir.4dage.com/jmjjios?release_id=671efd5d23389f402726113c',
+        android: 'http://fir.4dage.com/zpnv?release_id=66d18456f945485fa604e3fc',
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '名称',
+          dataIndex: 'name',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 150,
+        },
+        {
+          title: '文件类型',
+          dataIndex: 'fileType',
+          width: 80,
+          customRender: ({ record }) => {
+            let str;
+            switch (record.fileType - 0) {
+              case 0:
+                str = '图片';
+                break;
+              case 1:
+                str = '视频';
+                break;
+              case 2:
+                str = '音频';
+                break;
+              case 3:
+                str = '模型';
+                break;
+              default:
+                str = '其他';
+            }
+            return record.payStatus == -2 ? '封存' : str;
+          },
+        },
+        {
+          title: '文件格式',
+          dataIndex: 'nickName',
+          width: 100,
+          customRender: ({ record }) => {
+            return record.nickName || '-';
+          },
+        },
+        {
+          title: '分组',
+          dataIndex: 'viewCount',
+          width: 80,
+        },
+        // {
+        //   title: '场景码',
+        //   dataIndex: 'num',
+        //   ellipsis: true,
+        //   width: 180,
+        // },
+        {
+          title: '上传时间',
+          dataIndex: 'createTime',
+          width: 180,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
+          },
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 80,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 50,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'sceneName',
+            label: '名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+          {
+            field: 'ryNo',
+            label: '类型',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+          {
+            field: 'dictId',
+            label: '分组',
+            component: 'ApiSelect',
+            componentProps: {
+              api: getByKey,
+              labelField: 'dictName',
+              valueField: 'id',
+              params: {
+                type: 1,
+              },
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+        ],
+      };
+      function cancelDownload() {
+        downloadOption.value = {};
+      }
+      const [registerGroupingModal, { openModal: openGroupingDownModal }] = useModal();
+      const [registeruploadModal, { openModal: uploadModal }] = useModal();
+      const [registerdetailModal, { openModal: detailModal }] = useModal();
+      const [registerTable, { reload }] = useTable({
+        api: mediaList,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { type: tableType },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'num',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      function changeTable(val: string) {
+        tableType.value = val;
+        reload();
+      }
+      async function handleCopy(record: Recordable) {
+        createConfirm({
+          title: '复制场景',
+          content: '确定要复制场景吗?',
+          onOk: async () => {
+            sceneCopy({ num: record.num }).then(() => {
+              message.success({
+                content: '复制成功',
+              });
+              reload();
+            });
+          },
+        });
+      }
+      async function handleDelete(record: Recordable) {
+        console.log('handleDelete', record);
+        createConfirm({
+          title: '提示',
+          content: '确定删除吗?',
+          onOk: async () => {
+        sceneDelete({ num: record.num }).then(() => {
+          message.success({
+            content: '删除成功',
+          });
+
+          reload();
+        });
+          },
+        });
+      }
+      function handleGrounping(record: Recordable) {
+        openGroupingDownModal(true, record)
+      }
+      async function handleMove(record: Recordable) {
+        openMoveModal(true, {
+          ...record,
+        });
+        // sceneMove({ snCode: record.snCode, num: record.num })
+        //   .then(() => {
+        //     message.success({
+        //       content: '迁移成功',
+        //     });
+        //   })
+        //   .catch(() => {
+        //     message.success({
+        //       content: '迁移失败',
+        //     });
+        //   });
+      }
+      let timer: null = ref(null);
+      const downloadOption = ref<Object>({});
+      const canDownload = ref<boolean>(true);
+      function handleDownload(record: Recordable) {
+        console.log('handleDownload', record, canDownload.value);
+        canDownload.value = true;
+        let isObj = tableType.value == 5 || tableType.value == 7 ? 1 : 0;
+        checkDownLoad({ num: record.num, isObj }).then((res) => {
+          console.log(res);
+          if (res.downloadStatus != 3) {
+            // 未下载过,需要打包
+            sceneDownload({ num: record.num, isObj }).then((res) => {
+              console.log(res);
+              openDownModal(true, {
+                ...record,
+              });
+              if (res.downloadStatus == 1) {
+                if (timer.value) {
+                  afterClose();
+                }
+                timer.value = setInterval(() => {
+                  downloadProcess({ num: record.num, isObj }).then((res) => {
+                    if (res.status == '1003') {
+                      createMessage.error('下载失败');
+                      afterClose();
+                      return;
+                    }
+                    if (res.percent >= 100) {
+                      canDownload.value = false;
+                      afterClose();
+                    }
+                    downloadOption.value = res;
+                    console.log(res);
+                  });
+                }, 1000);
+              }
+            });
+          } else {
+            canDownload.value = false;
+            window.open(res.downloadUrl);
+          }
+        });
+      }
+      function handleEdit(record: Recordable) {
+        window.open(record.thumbEdit + '&&token=' + token.value);
+      }
+      function exportExcel(){
+
+      }
+      async function handleGenerate(record: Recordable) {
+        console.log('record', record);
+        let data = await sceneDetail({ id: record.id });
+        console.log('data', data);
+        let { buildObjStatus } = data;
+        let toastText =
+          buildObjStatus == 2
+            ? 'Mesh场景正在计算中,请耐心等待'
+            : buildObjStatus == 1
+            ? '重新生成Mesh场景将覆盖现有场景信息,计算过程中Mesh场景无法打开,确定要重新生成吗?'
+            : '生成obj需要较长时间,请耐心等待';
+        // if (data.code === 200) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '生成 obj'),
+          content: () => h('span', toastText),
+          onOk: async () => {
+            if (buildObjStatus !== 2) {
+              await buildSceneObj({ id: record.id, sceneNum: record.num });
+            }
+            createMessage.success(t('common.optSuccess'));
+            reload();
+          },
+        });
+        // } else {
+        //   createMessage.error(t(`apiCode.errCode${data.code}`));
+        // }
+      }
+      function afterClose() {
+        clearInterval(timer.value);
+        timer.value = null;
+      }
+      function handleReset(record: Recordable) {
+        console.log('handleReset', record);
+        rebuildScene({ num: record.num }).then(() => {
+          message.success({
+            content: '操作成功',
+          });
+          reload();
+        });
+      }
+      function getTypeCheckPerm(val) {
+        let myType = tableType.value;
+        return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
+      }
+      function handlegotoEdit(record: Recordable) {
+        let url = record.webSite.replace('smg', 'epg');
+        if (!record.editAuthTime || (record.editAuthTime && dayjs() < dayjs(record.editAuthTime))) {
+          window.open(url);
+        } else {
+          createMessage.error('编辑权限已过期');
+        }
+      }
+      function handlePowers(record: Recordable) {
+        openPowersModal(true, {
+          ...record,
+        });
+      }
+      onMounted(() => {
+      });
+      return {
+        registerTable,
+        registeruploadModal,
+        registerdetailModal,
+        uploadModal,
+        detailModal,
+        handleDelete,
+        handleCopy,
+        handleMove,
+        handleDownload,
+        handleReset,
+        tableType,
+        loading,
+        changeTable,
+        t,
+        openGroupingDownModal,
+        registerGroupingModal,
+        afterClose,
+        timer,
+        canDownload,
+        downloadOption,
+        cancelDownload,
+        handleGenerate,
+        getTypeCheckPerm,
+        handlegotoEdit,
+        handlePowers,
+        userInfo,
+        qrCodeUrl,
+        exportExcel,
+        handleGrounping
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .scren {
+    .noScene {
+      position: absolute;
+      top: calc(50% - 126px);
+      width: 100%;
+      text-align: center;
+      &-content {
+        font-size: 14px;
+        color: rgba(0, 0, 0, 0.85);
+        line-height: 22px;
+        font-style: normal;
+        text-transform: none;
+        .codelist {
+          margin-top: 36px;
+          width: 424px;
+          height: auto;
+          display: flex;
+          justify-content: space-between;
+          margin: 0 auto;
+          .codediv {
+            font-weight: 400;
+            font-size: 17px;
+            color: rgba(0, 0, 0, 0.85);
+            line-height: 22px;
+            height: auto;
+            padding: 24px;
+            background: #fff;
+            text-align: center;
+            .codetext {
+              margin-top: 10px;
+            }
+          }
+        }
+      }
+    }
+  }
+  // .tableHeader {
+  //   height: 50px;
+  //   display: flex;
+  //   align-items: center;
+
+  //   .item {
+  //     font-size: 14px;
+  //     color: #666;
+  //     margin-right: 10px;
+  //     cursor: pointer;
+  //     &.active {
+  //       font-weight: bold;
+  //       color: #222;
+  //     }
+  //   }
+  // }
+  .desc-wrap-BasicTable {
+    background-color: #f0f2f5;
+    .vben-basic-table-form-container {
+      padding: 0;
+    }
+  }
+</style>

+ 157 - 0
src/views/mediaLibrary/modal/detailModal.vue

@@ -0,0 +1,157 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.title"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { addOrUpdate, uploadApi, getByKey } from '/@/api/media';
+  import { useI18n } from '/@/hooks/web/useI18n';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        file: null,
+        title: '编辑',
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        // {
+        //   field: 'file',
+        //   component: 'Upload',
+        //   label: t('routes.product.file'),
+        //   required: true,
+        //   rules: [{ required: true, message: t('common.uploadMessge') }],
+        //   // helpMessage: t('routes.corporation.uploadHelp'),
+        //   itemProps: {
+        //     validateTrigger: 'onBlur',
+        //   },
+        //   componentProps: {
+        //     api: uploadApi,
+        //     maxNumber: 1,
+        //     maxSize: 5,
+        //     fileFlow: true,
+        //     accept: ['xls', 'xlsx'],
+        //     afterFetch: function (data) {
+        //       console.log('afterFetch', data);
+        //       // Reflect.set(data, 'url', data.name);
+        //       fileFlow.file = data.file;
+        //       return data;
+        //     },
+        //   },
+
+        //   colProps: {
+        //     span: 22,
+        //   },
+        // },
+        {
+          field: 'name',
+          component: 'Input',
+          // defaultValue: '场景标题',
+          label: '名称',
+          colProps: {
+            span: 24,
+          },
+          // required: true,
+        },
+        {
+          field: 'dictId',
+          label: '分组',
+          component: 'ApiSelect',
+          componentProps: {
+            api: getByKey,
+            labelField: 'dictName',
+            valueField: 'id',
+            params: {
+              type: 1,
+            },
+          },
+          colProps: {
+            xl: 6,
+            xxl: 6,
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log(data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+        resetFields();
+        setFieldsValue({
+          type: data.sceneName,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = {
+            snCode: params.snCode,
+            num: modelRef.value.num,
+          };
+          console.log('res', apiData, params);
+          const res = await addOrUpdate(apiData);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          createMessage.success('场景迁移成功。');
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 199 - 0
src/views/mediaLibrary/modal/grouping.vue

@@ -0,0 +1,199 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="分组管理"
+    @visible-change="handleVisibleChange"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="mx-5 BasicForm flex">
+        <div class="input">
+          <a-input v-model:value="fileFlow.dictName" placeholder="请输入" />
+        </div>
+        <a-button type="primary" @click="handleAdd"> 新增</a-button>
+      </div>
+      <BasicTable @register="registerTable">
+        <template #action="{ record }">
+          <TableAction
+            v-if="!record.isShare"
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '删除',
+                //icon: 'ic:outline-delete-outline',
+                color: 'error',
+                onClick: handleDelete.bind(null, record),
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { sceneMove } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { getByKey, addOrUpdate, del } from '/@/api/media';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicTable, TableAction },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        dictName: '',
+        file: null,
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '名称',
+          dataIndex: 'dictName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 150,
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 80,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 50,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'dictName',
+            label: '名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+              placeholder: ' 请名称搜索',
+            },
+            colProps: {
+              xl: 10,
+              xxl: 10,
+            },
+          },
+        ],
+      };
+      const { createMessage, createConfirm } = useMessage();
+      const [registerTable, { reload }] = useTable({
+        api: getByKey,
+        title: ``,
+        showTableSetting: false,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        // searchInfo: { type: tableType },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showIndexColumn: false,
+        rowKey: 'num',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log(data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+      }
+      function handleAdd() {
+        console.log('handleAdd', fileFlow.dictName);
+        let params = {
+          dictName: fileFlow.dictName,
+        };
+        if (!fileFlow.dictName) {
+          return createMessage.warning('请输入名称');
+        }
+        addOrUpdate(params).then((res) => {
+          createMessage.success('添加成功');
+          fileFlow.dictName = '';
+          reload();
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = {
+            snCode: params.snCode,
+            num: modelRef.value.num,
+          };
+          console.log('res', apiData, params);
+          const res = await sceneMove(apiData);
+          console.log('res', res);
+          closeModal();
+          createMessage.success('场景迁移成功。');
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      async function handleDelete(record: Recordable) {
+        console.log('handleDelete', record);
+        createConfirm({
+          title: '删除',
+          content: '确定要删除吗?',
+          onOk: async () => {
+            del({ id: record.id }).then(() => {
+              createMessage.success({
+                content: '删除成功',
+              });
+              reload();
+            });
+          },
+        });
+      }
+      return {
+        register,
+        handleAdd,
+        registerTable,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        handleDelete,
+        t,
+      };
+    },
+  });
+</script>

+ 134 - 0
src/views/mediaLibrary/modal/uploadModal.vue

@@ -0,0 +1,134 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.title"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+      <div style="padding: 0 0 0 82px">
+        <div style="margin-bottom: 20px">支持jpg、png、jpeg、mp4、wav、mp3 、shp格式文件上传。文件大小 ≤ 2G</div>
+        <span>注意:模型需使用zip包上传。包含贴图、模型、mtl文件,包内不得包含文件夹。</span>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+import { BasicModal, useModalInner } from '/@/components/Modal';
+import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+import { useMessage } from '/@/hooks/web/useMessage';
+import { addOrUpdate, uploadApi, getByKey } from '/@/api/media';
+import { useI18n } from '/@/hooks/web/useI18n';
+
+const { t } = useI18n();
+export default defineComponent({
+  components: { BasicModal, BasicForm },
+  props: {
+    userData: { type: Object },
+  },
+  emits: ['update', 'register'],
+  setup(props, { emit }) {
+    const modelRef = ref({});
+    const fileFlow = reactive({
+      file: null,
+      title: '上传',
+    });
+    const { createMessage } = useMessage();
+    const schemas: FormSchema[] = [
+      {
+        field: 'file',
+        component: 'Upload',
+        label: t('routes.product.file'),
+        required: true,
+        rules: [{ required: true, message: t('common.uploadMessge') }],
+        // helpMessage: t('routes.corporation.uploadHelp'),
+        itemProps: {
+          validateTrigger: 'onBlur',
+        },
+        componentProps: {
+          api: uploadApi,
+          maxNumber: 1,
+          maxSize: 2000,
+          fileFlow: false,
+          accept: ['jpg', 'jpg','png','jpeg','mp4','wav','mp3','shp','zip'],
+          // afterFetch: function (data) {
+          //   console.log('afterFetch', data);
+          //   // Reflect.set(data, 'url', data.name);
+          //   fileFlow.file = data.file;
+          //   return data;
+          // },
+        },
+
+        colProps: {
+          span: 22,
+        },
+      },
+    ];
+    const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+      labelWidth: 120,
+      schemas,
+      showActionButtonGroup: false,
+      actionColOptions: {
+        span: 24,
+      },
+    });
+    onMounted(() => {});
+    let addListFunc = () => {};
+    const [register, { closeModal }] = useModalInner((data) => {
+      console.log(data);
+      data && onDataReceive(data);
+    });
+
+    function onDataReceive(data) {
+      modelRef.value = data;
+      resetFields();
+      setFieldsValue({
+        type: data.sceneName,
+      });
+    }
+    const handleSubmit = async () => {
+      try {
+        const params = await validate();
+        const apiData = {
+          snCode: params.snCode,
+          num: modelRef.value.num,
+        };
+        console.log('res', apiData, params);
+        const res = await addOrUpdate(apiData);
+        console.log('res', res);
+        closeModal();
+        resetFields();
+        createMessage.success('场景迁移成功。');
+        emit('update');
+      } catch (error) {
+        console.log('not passing', error);
+      }
+    };
+    function handleVisibleChange(v) {
+      // console.log(v);
+      // v && props.userData && nextTick(() => onDataReceive(props.userData));
+    }
+    return {
+      register,
+      schemas,
+      registerForm,
+      model: modelRef,
+      fileFlow,
+      handleVisibleChange,
+      handleSubmit,
+      addListFunc,
+      resetFields,
+      t,
+    };
+  },
+});
+</script>

+ 25 - 25
src/views/productOperation/cameraScene.vue

@@ -32,16 +32,16 @@
     <PageWrapper v-else contentBackground>
       <template #footer>
         <a-tabs v-model:activeKey="tableType" @change="changeTable">
-          <!-- <a-tab-pane :key="0" tab="四维看看" :disabled="loading"/> -->
-          <Tabs.TabPane :key="1" tab="四维看见" :disabled="loading" />
-          <!-- <a-tab-pane :key="2" tab="四维深时" :disabled="loading"/>
-        <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/> 
-        <a-tab-pane :key="4" tab="四维全景" :disabled="loading"/>  -->
+          <a-tab-pane :key="1" tab="场景列表" :disabled="loading"/>
+          <a-tab-pane :key="2" tab="场景共享" :disabled="loading"/>
+        <!-- <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/> 
+        <a-tab-pane :key="4" tab="四维全景" :disabled="loading"/>  --> -->
+          <!-- <Tabs.TabPane :key="1" tab="四维看见" :disabled="loading" />
           <Tabs.TabPane :key="2" tab="深时点云场景" :disabled="loading" />
           <Tabs.TabPane :key="5" tab="深时Mesh场景" :disabled="loading" />
           <Tabs.TabPane :key="6" tab="深光点云场景" :disabled="loading" />
-          <Tabs.TabPane :key="7" tab="深光Mesh场景" :disabled="loading" /> </a-tabs
-      ></template>
+          <Tabs.TabPane :key="7" tab="深光Mesh场景" :disabled="loading" />  -->
+        </a-tabs></template>
       <div class="desc-wrap-BasicTable">
         <BasicTable @register="registerTable">
           <template #toolbar>
@@ -258,7 +258,7 @@
         },
         {
           title: '人员编号',
-          dataIndex: 'userName',
+          dataIndex: 'ryNo',
           width: 100,
         },
         {
@@ -303,20 +303,20 @@
         //   ellipsis: true,
         //   width: 180,
         // },
-        // {
-        //   title: '拍摄时间',
-        //   dataIndex: 'createTime',
-        //   width: 180,
-        //   customRender: ({ record }) => {
-        //     return (
-        //       record.createTime &&
-        //       h(Time, {
-        //         value: record.createTime,
-        //         mode: 'datetime',
-        //       })
-        //     );
-        //   },
-        // },
+        {
+          title: '拍摄时间',
+          dataIndex: 'createTime',
+          width: 180,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
+          },
+        },
         {
           title: '计算完成时间',
           dataIndex: 'amount',
@@ -396,8 +396,8 @@
             },
           },
           {
-            field: 'snCode',
-            label: 'SN码',
+            field: 'ryNo',
+            label: '人员编号',
             component: 'Input',
             componentProps: {
               maxLength: 100,
@@ -421,7 +421,7 @@
           },
           {
             field: 'userName',
-            label: '人员编号',
+            label: 'SN 码',
             component: 'Input',
             componentProps: {
               maxLength: 100,

+ 7 - 6
src/views/productOperation/modal/MoveModal.vue

@@ -14,6 +14,7 @@
           {{ model[field] }}
         </template>
       </BasicForm>
+      <span>注意:迁移后该场景的权限配置将被清空,如需保留,请复制后再做迁移</span>
     </div>
   </BasicModal>
 </template>
@@ -65,19 +66,19 @@
               // @ts-ignore
               validator: async (rule, value) => {
                 if (!value) {
-                  return Promise.reject('请输入相机SN码');
-                }
-                if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('不支持中文字符');
+                  return Promise.reject('请输入人员编号');
                 }
+                // if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
+                //   /* eslint-disable-next-line */
+                //   return Promise.reject('不支持中文字符');
+                // }
                 return Promise.resolve();
               },
               trigger: 'change',
             },
           ],
           componentProps: {
-            placeholder: '请输入相机SN码',
+            placeholder: '请输入人员编号',
             maxLength: 15,
             onChange: (data) => {
               console.log('data', data);