tangning 3 주 전
부모
커밋
d92e411506

+ 107 - 0
src/api/operate/case.ts

@@ -0,0 +1,107 @@
+import { defHttp } from '/@/utils/http/axios';
+import { PageParams } from './model';
+import { Result } from '/#/axios';
+import { getToken } from '/@/utils/auth';
+
+const token = getToken();
+
+enum Api {
+  caseOverviewList = '/service/manage/caseOverview/list',
+  caseOverviewCopy = '/service/manage/caseOverview/copy',
+  caseOverviewRename = '/service/manage/caseOverview/rename',
+  caseOverviewDel = '/service/manage/caseOverview/del',
+  caseTabulationList = '/service/manage/caseTabulation/list',
+  caseTabulationCopy = '/service/manage/caseTabulation/copy',
+  caseTabulationRename = '/service/manage/caseTabulation/rename',
+  caseTabulationDel = '/service/manage/caseTabulation/del',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+export const caseOverviewList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const caseOverviewRename = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewRename,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseOverviewCopy = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewCopy,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseOverviewDel = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewDel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const caseTabulationRename = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationRename,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationCopy = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationCopy,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationDel = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationDel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 107 - 0
src/api/operate/draw.ts

@@ -0,0 +1,107 @@
+import { defHttp } from '/@/utils/http/axios';
+import { PageParams } from './model';
+import { Result } from '/#/axios';
+import { getToken } from '/@/utils/auth';
+
+const token = getToken();
+
+enum Api {
+  caseOverviewList = '/service/manage/caseOverview/list',
+  caseOverviewCopy = '/service/manage/caseOverview/copy',
+  caseOverviewRename = '/service/manage/caseOverview/rename',
+  caseOverviewDel = '/service/manage/caseOverview/del',
+  caseTabulationList = '/service/manage/caseTabulation/list',
+  caseTabulationCopy = '/service/manage/caseTabulation/copy',
+  caseTabulationRename = '/service/manage/caseTabulation/rename',
+  caseTabulationDel = '/service/manage/caseTabulation/del',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+export const caseOverviewList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const caseOverviewRename = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewRename,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseOverviewCopy = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewCopy,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseOverviewDel = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseOverviewDel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const caseTabulationRename = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationRename,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationCopy = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationCopy,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const caseTabulationDel = (params) =>
+  defHttp.post<Result>({
+    url: Api.caseTabulationDel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 13 - 0
src/api/operate/index.ts

@@ -93,6 +93,7 @@ enum Api {
   sceneList = '/service/manage/jy/userShare/sceneList',
   sceneList = '/service/manage/jy/userShare/sceneList',
   getCaseByNum = '/service/manage/case/getCaseByNum',
   getCaseByNum = '/service/manage/case/getCaseByNum',
   getSceneBuildLog = '/service/manage/scene/getSceneBuildLog/',
   getSceneBuildLog = '/service/manage/scene/getSceneBuildLog/',
+  uploadSceneOrig = '/service/manage/scene/uploadSceneOrig',
 }
 }
 
 
 /**
 /**
@@ -711,3 +712,15 @@ export const getSceneBuildLog = (num) =>
       ignoreCancelToken: true,
       ignoreCancelToken: true,
     },
     },
   });
   });
+
+export const uploadSceneOrig = (filePath) =>
+  defHttp.post<Result>({
+    url: Api.uploadSceneOrig,
+    params: {
+      filePath,
+    },
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 49 - 0
src/components/Prompt/dialog.vue

@@ -0,0 +1,49 @@
+<template>
+  <Modal
+    v-model:open="open"
+    :title="title"
+    @ok="handleSubmit"
+    :destroyOnClose="true"
+    :width="width || '500px'"
+    okText="确定"
+    cancelText="取消"
+  >
+    <div class="pt-5 pr-3px">
+      <BasicForm @register="register" />
+    </div>
+  </Modal>
+</template>
+
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import { Modal } from 'ant-design-vue';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+
+  const props = defineProps<{
+    title: string;
+    addFormSchemas: FormSchema[];
+    onOK?: Fn;
+    width?: string;
+    labelWidth?: number;
+    layout?: 'horizontal' | 'vertical' | 'inline';
+  }>();
+
+  const open = ref<boolean>(true);
+  console.log('handlegoRename', props);
+  const [register, { validate }] = useForm({
+    schemas: props.addFormSchemas,
+    showActionButtonGroup: false,
+    labelWidth: props.labelWidth || 80,
+    layout: props.layout || 'horizontal',
+  });
+
+  async function handleSubmit() {
+    const row = await validate();
+    if (props.onOK) {
+      await props.onOK(row.txt);
+    }
+    open.value = false;
+  }
+</script>
+
+<style scoped></style>

+ 39 - 0
src/components/Prompt/index.ts

@@ -0,0 +1,39 @@
+import { createVNode, VNode, defineComponent, h, render, reactive } from 'vue';
+import { PromptProps, genFormSchemas } from './state';
+import Dialog from './dialog.vue';
+
+export function createPrompt(props: PromptProps) {
+  let vm: Nullable<VNode> = null;
+  const data = reactive({
+    ...props,
+    addFormSchemas: genFormSchemas({
+      label: props.label,
+      required: props.required,
+      inputType: props.inputType,
+      defaultValue: props.defaultValue,
+    }),
+  });
+  const DialogWrap = defineComponent({
+    render() {
+      return h(Dialog, { ...data } as any);
+    },
+  });
+
+  vm = createVNode(DialogWrap);
+  console.log('handlegoRename', data, vm);
+  render(vm, document.createElement('div'));
+
+  function close() {
+    if (vm?.el && vm.el.parentNode) {
+      vm.el.parentNode.removeChild(vm.el);
+    }
+  }
+
+  return {
+    vm,
+    close,
+    get $el() {
+      return vm?.el as HTMLElement;
+    },
+  };
+}

+ 69 - 0
src/components/Prompt/state.ts

@@ -0,0 +1,69 @@
+import { FormSchema } from '/@/components/Form';
+
+type InputType = 'InputTextArea' | 'InputNumber' | 'Input';
+export interface PromptProps {
+  title: string;
+  label?: string;
+  required?: boolean;
+  onOK?: Fn;
+  inputType?: InputType;
+  labelWidth?: number;
+  width?: string;
+  layout?: 'horizontal' | 'vertical' | 'inline';
+  defaultValue?: string | number;
+}
+
+interface genFormSchemasProps {
+  label?: string;
+  required?: boolean;
+  inputType?: InputType;
+  defaultValue?: string | number;
+}
+
+const inputTypeMap: {
+  [key in InputType]: {
+    colProps: { span: number; offset?: number };
+    componentProps: FormSchema['componentProps'];
+  };
+} = {
+  InputTextArea: {
+    colProps: { span: 23 },
+    componentProps: {
+      placeholder: '请输入内容',
+      autoSize: { minRows: 2, maxRows: 6 },
+      maxlength: 255,
+      showCount: true,
+    },
+  },
+  InputNumber: {
+    colProps: { span: 20, offset: 2 },
+    componentProps: {
+      placeholder: '请输入数字',
+      min: 0,
+    },
+  },
+  Input: {
+    colProps: { span: 20, offset: 2 },
+    componentProps: {
+      placeholder: '请输入内容',
+      min: 0,
+    },
+  },
+};
+
+export function genFormSchemas({
+  label = '备注信息',
+  required = true,
+  inputType = 'InputTextArea',
+  defaultValue = '',
+}: genFormSchemasProps) {
+  const formSchema: FormSchema = {
+    field: 'txt',
+    component: inputType,
+    label,
+    defaultValue,
+    required: Boolean(required),
+    ...inputTypeMap[inputType],
+  };
+  return [formSchema];
+}

+ 3 - 0
src/settings/siteSetting.ts

@@ -6,3 +6,6 @@ export const DOC_URL = 'https://vvbin.cn/doc-next/';
 
 
 // site url
 // site url
 export const SITE_URL = 'https://vvbin.cn/next/';
 export const SITE_URL = 'https://vvbin.cn/next/';
+
+// sider preset color
+export const SCENE_TYPE: string[] = ['四维看见', '四维看看', '四维深时', '四维深光', '圆周率'];

+ 213 - 0
src/views/case/addResultModal.vue

@@ -0,0 +1,213 @@
+<template>
+  <div>
+    <BasicModal
+      v-bind="$attrs"
+      @register="register"
+      title="设置权限"
+      okText="查询"
+      @cancel="resetFields"
+      min-height="220px"
+      @ok="handleSubmit"
+    >
+      <div class="pt-2px pr-3px">
+        <div class="text" style="padding: 0 20px 20px 20px"
+          >案件不支持新增权限。您可以搜索指定人员名称查询是否用于有权限,若无可联系场景管理员开通。</div
+        >
+        <BasicForm @register="registerForm">
+          <template #text="{ model, field }">
+            {{ model[field] }}
+          </template>
+        </BasicForm>
+        <div class="text" style="padding: 0 20px"
+          >只要用户拥有至少一个场景的编辑权限,则拥有案件的编辑权限</div
+        >
+        <div class="text" style="padding: 0 20px"
+          >只要用户拥有至少一个场景的查看权限,则拥有案件的查看权限。</div
+        >
+      </div>
+    </BasicModal>
+    <resultListModal @register="registerModal" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, 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 { useI18n } from '/@/hooks/web/useI18n';
+  import { getinnerByRyId, userShareAdd } from '/@/api/operate';
+  import resultListModal from './resultListModal.vue';
+  import { useModal } from '/@/components/Modal';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm, resultListModal },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, { emit }) {
+      const modelRef = ref(false);
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const [registerModal, { openModal }] = useModal();
+      const optionsName = ref([]);
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: 'id',
+          defaultValue: '111',
+          required: false,
+        },
+        {
+          field: 'ryNo',
+          component: 'Input',
+          label: '人员编号',
+          required: true,
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                let myData = await getFieldsValue();
+                if (!value) {
+                  return Promise.reject('请输入人员编号');
+                }
+                let res = await getinnerByRyId({ ryNo: value });
+                console.log('value', value, res);
+                if (res && !res.data) {
+                  return Promise.reject('人员编号不存在');
+                }
+                Promise.resolve();
+                let ryNickName = res && res.data && res.data.ryNickName;
+                if (myData.ryNickName != ryNickName || !myData.ryNickName) {
+                  setFieldsValue({
+                    ryNickName: res && res.data ? res.data.ryNickName : '',
+                    id: res && res.data ? res.data.id : '',
+                  });
+                }
+              },
+              trigger: 'blur',
+            },
+          ],
+          colProps: {
+            span: 20,
+          },
+        },
+        // {
+        //   field: 'ryNo',
+        //   component: 'AutoComplete',
+        //   label: '人员编号',
+        //   required: true,
+        //   componentProps: {
+        //     filterOption: onFilterOption,
+        //     onSearch: onSearch,
+        //     onChange: (data) => {
+        //       setTimeout(() => {
+        //         const item = optionsName.value && optionsName.value.find((ele) => ele.ryNo == data);
+        //         setFieldsValue({
+        //           ryNickName: item && item.ryNickName ? item.ryNickName : '',
+        //           id: item && item.id ? item.id : '',
+        //         });
+        //       }, 100);
+        //     },
+        //   },
+        //   colProps: {
+        //     span: 20,
+        //   },
+        // },
+        {
+          field: 'ryNickName',
+          component: 'Input',
+          label: '姓名',
+          // rules: [
+          //   {
+          //     required: true,
+          //     // @ts-ignore
+          //     validator: async (rule, value) => {
+          //       if (!value) {
+          //         return Promise.reject('请输入正确的人员编号');
+          //       }
+          //       return Promise.resolve();
+          //     },
+          //     trigger: 'change',
+          //   },
+          // ],
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            disabled: true,
+          },
+        },
+      ];
+      const [
+        registerForm,
+        { validate, resetFields, setFieldsValue, getFieldsValue, updateSchema },
+      ] = useForm({
+        labelWidth: 110,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner(async (data) => {
+        console.log('option', data);
+      });
+      function onFilterOption(inputText: string, option) {
+        console.log('option', inputText, option.value);
+        if (option.value) {
+          return option.value.indexOf(inputText) >= 0;
+        }
+        // return option.value.indexOf(inputText.toUpperCase()) >= 0;
+      }
+      async function onSearch(searchText) {
+        const res = await getinnerByRyId({ ryNo: searchText });
+        console.log('res', res.data);
+        if (!res.data) return;
+        optionsName.value = res.data || {};
+        updateSchema({
+          field: 'ryNo',
+          componentProps: {
+            options: [optionsName.value],
+          },
+        });
+      }
+      const handleSubmit = async () => {
+        const params = await validate();
+        try {
+          console.log('params', params);
+          // await userShareAdd(params);
+          // closeModal();
+          // resetFields();
+          // emit('ok');
+          openModal(true, {});
+          createMessage.success('操作成功');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+
+      return {
+        register,
+        schemas,
+        registerForm,
+        modelRef,
+        fileFlow,
+        handleSubmit,
+        addListFunc,
+        registerModal,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

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

@@ -78,6 +78,7 @@
       />
       />
       <MoveModal @register="registerMoveModal" />
       <MoveModal @register="registerMoveModal" />
       <AddModal @register="registerAddModal"  @update="reload"/>
       <AddModal @register="registerAddModal"  @update="reload"/>
+      <AddResultModal @register="registerResultModal"  @update="reload"/>
       <PowersModal @register="registerPowersModal" />
       <PowersModal @register="registerPowersModal" />
     </PageWrapper>
     </PageWrapper>
   </div>
   </div>
@@ -97,6 +98,7 @@
   } from '/@/components/Table';
   } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { PageWrapper } from '/@/components/Page';
   import AddModal from './addCaseModal.vue'
   import AddModal from './addCaseModal.vue'
+  import AddResultModal from './addResultModal.vue'
   import DownLoadModal from './DownLoadModal.vue';
   import DownLoadModal from './DownLoadModal.vue';
   import MoveModal from '/@/views/productOperation/modal/MoveModal.vue';
   import MoveModal from '/@/views/productOperation/modal/MoveModal.vue';
   import PowersModal from '/@/views/productOperation/modal/PowersModal.vue';
   import PowersModal from '/@/views/productOperation/modal/PowersModal.vue';
@@ -138,6 +140,7 @@
       [Descriptions.name]: Descriptions,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
       [Descriptions.Item.name]: Descriptions.Item,
       QrCode,
       QrCode,
+      AddResultModal,
       AddModal,
       AddModal,
       // Tabs,
       // Tabs,
       [Tabs.name]: Tabs,
       [Tabs.name]: Tabs,
@@ -313,6 +316,7 @@
         downloadOption.value = {};
         downloadOption.value = {};
       }
       }
       const [registerAddModal, { openModal: openAddModal }] = useModal();
       const [registerAddModal, { openModal: openAddModal }] = useModal();
+      const [registerResultModal, { openModal: openAddResultModal }] = useModal();
       const [registerDownModal, { openModal: openDownModal }] = useModal();
       const [registerDownModal, { openModal: openDownModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
@@ -508,10 +512,14 @@
         // }
         // }
       }
       }
       function handlePowers(record: Recordable) {
       function handlePowers(record: Recordable) {
-        openPowersModal(true, {
+        openAddResultModal(true, {
           ...record,
           ...record,
           tableType: tableType.value,
           tableType: tableType.value,
         });
         });
+        // openPowersModal(true, {
+        //   ...record,
+        //   tableType: tableType.value,
+        // });
       }
       }
       onMounted(() => {
       onMounted(() => {
       });
       });
@@ -531,6 +539,7 @@
         registerDownModal,
         registerDownModal,
         registerMoveModal,
         registerMoveModal,
         registerAddModal,
         registerAddModal,
+        registerResultModal,
         afterClose,
         afterClose,
         timer,
         timer,
         canDownload,
         canDownload,

+ 160 - 0
src/views/case/resultListModal.vue

@@ -0,0 +1,160 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.name + '查询结果'"
+    okText="我知道了"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    :confirmLoading="loading"
+    min-height="50"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="text"
+        >查询到
+        <span style="color: #0960bd">{{ fileFlow.name }}</span>
+        无以下场景权限,请联系管理员开通</div
+      >
+      <a-tabs class="resultListTab" v-model:activeKey="tableType" @change="changeTable">
+        <a-tab-pane :key="0" tab="查看权限" :disabled="loading" />
+        <a-tab-pane :key="1" tab="编辑权限" :disabled="loading" />
+      </a-tabs>
+      <BasicTable @register="registerTable">
+        <template #href="{ record }">
+          <a
+            v-if="record.caseTitle"
+            target="_blank"
+            :title="record.caseTitle"
+            :href="`/code/index.html?caseId=${record.caseId}#/show`"
+            >{{ record.caseTitle }}</a
+          >
+          <span v-else>-</span>
+        </template>
+      </BasicTable>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicTable, useTable } from '/@/components/Table';
+  import { Tabs } from 'ant-design-vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { InvoiceRegister } from '/@/api/order';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import { caseListApi } from '/@/api/operate';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicTable, [Tabs.name]: Tabs },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const fileFlow = reactive({
+        file: null,
+        name: '',
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const tableType = ref<number>(0); //0查看 、1编辑
+      const columns = [
+        {
+          title: '标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 300,
+        },
+        {
+          title: '姓名',
+          dataIndex: 'userName',
+          ellipsis: true,
+          width: 100,
+        },
+      ];
+      const [registerTable, { reload }] = useTable({
+        api: caseListApi,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isShare: tableType },
+        useSearchForm: false,
+        showIndexColumn: false,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'caseId',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      const okText = ref('确定');
+      const loading = ref(false);
+      const { createMessage } = useMessage();
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        resetFields();
+        setFieldsValue(data);
+      }
+      const handleSubmit = async () => {
+        loading.value = true;
+        try {
+          const params = await validate();
+          const apiData = params;
+          console.log('res', apiData, params);
+          await InvoiceRegister(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+          loading.value = false;
+        } catch (error) {
+          loading.value = false;
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerTable,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        reload,
+        okText,
+        loading,
+        t,
+      };
+    },
+  });
+</script>
+<style lang="less">
+  .resultListTab {
+    .ant-tabs-nav {
+      margin: 0;
+    }
+  }
+</style>

+ 78 - 0
src/views/diversity/DownLoadModal.vue

@@ -0,0 +1,78 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="系统正在为您打包数据"
+    :minHeight="0"
+    @visible-change="handleVisibleChange"
+    @cancel="hundleCancel"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="warp">
+        <p>正在打包场景离线数据{{ downloadPercent }}</p>
+        <span>{{ modelRef.sceneName }}.zip</span>
+        <Progress :percent="downloadOption.percent" />
+        <p>* 打包完成后将关闭弹窗自动下载。</p>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Progress } from 'ant-design-vue';
+  const { t } = useI18n();
+
+  export default defineComponent({
+    components: { BasicModal, Progress },
+    props: {
+      userData: { type: Object },
+      downloadOption: { type: Object },
+    },
+    emits: ['update', 'register', 'cancelDownload'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+
+      const { createMessage } = useMessage();
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        // data && onDataReceive(data);
+        modelRef.value = data;
+      });
+
+      const handleSubmit = async () => {
+        console.log(props.downloadOption);
+        if (props.downloadOption.url) {
+          window.open(props.downloadOption.url);
+        }
+      };
+      const hundleCancel = async () => {
+        emit('cancelDownload');
+      };
+
+      return {
+        register,
+        modelRef,
+        handleSubmit,
+        hundleCancel,
+        addListFunc,
+        t,
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .pt-2px {
+  }
+  .warp {
+    display: flex;
+    align-items: flex-start;
+    justify-content: flex-start;
+    flex-flow: column;
+  }
+</style>

+ 303 - 0
src/views/diversity/addCaseModal.vue

@@ -0,0 +1,303 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增案件"
+    @visible-change="handleVisibleChange"
+    @ok="handleSubmit"
+    :confirmLoading="loading"
+    :width="900"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="mx-5 BasicForm flex">
+        <span style="line-height: 32px; margin-right: 10px">案件名称</span>
+        <div class="input">
+          <a-input style="width: 600px" maxlength="100" showCount v-model:value="fileFlow.caseTitle" placeholder="请输入" />
+        </div>
+        <!-- <a-button type="primary" @click="handleAdd"> 新增</a-button> -->
+      </div>
+      <BasicTable @register="registerTable">
+        <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>
+      </BasicTable>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive, h } 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';
+  import { caseaddOrUpdateApi, operateSceneList } from '/@/api/operate';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicTable, TableAction },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const loading = ref(false);
+      const fileFlow = reactive({
+        caseTitle: '',
+        file: null,
+        dylist: [],
+        mslist: [],
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '场景标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 150,
+        },
+        {
+          title: '场景码',
+          dataIndex: 'num',
+          ellipsis: true,
+          width: 180,
+        },
+        {
+          title: '计算完成时间',
+          dataIndex: 'algorithmTime',
+          width: 180,
+        },
+        {
+          title: '场景大小',
+          dataIndex: 'sceneSize',
+          width: 80,
+          customRender: ({ record }) => {
+            return record.sceneSize && record.sceneSize != 0
+              ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
+              : '-';
+          },
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 80,
+          customRender: ({ record }) => {
+            let str;
+            switch (record.status - 0) {
+              case 0:
+                str = '计算中';
+                break;
+              case 1:
+                str = '计算成功';
+                break;
+              case -2:
+                str = '计算成功';
+                break;
+              case -1:
+                str = '计算失败';
+                break;
+            }
+            return record.payStatus == -2 ? '封存' : str;
+          },
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 60,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'sceneName',
+            label: '名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+              placeholder: ' 请名称搜索',
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+          // {
+          //   field: 'isObj',
+          //   label: '场景类型',
+          //   component: 'Select',
+          //   labelWidth: 80,
+          //   // labelWidth: 50,
+          //   defaultValue: '1',
+          //   componentProps: {
+          //     allowClear: false,
+          //     options: [
+          //       {
+          //         label: '点云场景',
+          //         value: '0',
+          //         key: '0',
+          //       },
+          //       {
+          //         label: 'Mesh 场景',
+          //         value: '1',
+          //         key: '1',
+          //       },
+          //     ],
+          //     onChange: (value) => {
+          //       reload({
+          //         searchInfo: { isObj: value },
+          //       }).then(() => {
+          //         setSelectedRowKeys(value == 0 ? fileFlow.dylist : fileFlow.mslist);
+          //       });
+          //     },
+          //   },
+          //   colProps: {
+          //     xl: 7,
+          //     xxl: 7,
+          //   },
+          // },
+        ],
+      };
+      const { createMessage, createConfirm } = useMessage();
+      const [registerTable, { reload, getForm, setSelectedRowKeys }] = useTable({
+        api: operateSceneList,
+        title: ``,
+        showTableSetting: false,
+        rowSelection: { type: 'checkbox',getCheckboxProps: getRowSelection, onChange: onSelectChange },
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isObj: '1' },
+        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);
+        getForm().resetFields();
+        reload()
+        data && onDataReceive(data);
+      });
+      function getRowSelection(record) {
+        return {
+        disabled: record.inCase || !(record.status == 1 || record.status == -2), // Column configuration not to be checked
+        name: record.name,}
+       }
+      function onSelectChange(selectedRowKeys: any, selectedRows: any) {
+        fileFlow.dylist = [];
+        fileFlow.mslist = selectedRowKeys;
+      }
+      function onDataReceive(data) {
+        fileFlow.caseTitle = '';
+        modelRef.value = data;
+        fileFlow.dylist = [];
+        fileFlow.mslist = [];
+        fileFlow.caseTitle = '';
+        setSelectedRowKeys([]);
+      }
+      function handleAdd() {
+        console.log('handleAdd', fileFlow.dictName);
+        let params = {
+          dictName: fileFlow.dictName.trim(),
+        };
+        if (!fileFlow.dictName.trim()) {
+          return createMessage.warning('请输入名称');
+        }
+        addOrUpdate(params).then((res) => {
+          createMessage.success('添加成功');
+          fileFlow.dictName = '';
+          reload();
+        });
+      }
+      const handleSubmit = async () => {
+        if(!fileFlow.caseTitle?.trim()){
+          return createMessage.warning('请输入案件名称')
+        }
+        try {
+          loading.value = true;
+          const apiData = {
+            caseTitle: fileFlow.caseTitle?.trim(),
+            sceneNumParam: [
+              {
+                type: 0,
+                numList: fileFlow.dylist,
+              },
+              {
+                type: 1,
+                numList: fileFlow.mslist,
+              },
+            ],
+          };
+          console.log('res', apiData);
+          const res = await caseaddOrUpdateApi(apiData);
+          console.log('res', res);
+          closeModal();
+          createMessage.success('新增案件成功。');
+          emit('update');
+          loading.value = false;
+        } catch (error) {
+          loading.value = false;
+          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,
+        loading,
+      };
+    },
+  });
+</script>

+ 611 - 0
src/views/diversity/list.vue

@@ -0,0 +1,611 @@
+<template>
+  <div class="scren">
+    <PageWrapper contentBackground>
+      <!-- <template #footer>
+        <a-tabs v-model:activeKey="tableType" @change="changeTable">
+          <Tabs.TabPane :key="0" tab="案件管理" :disabled="loading" />
+          <Tabs.TabPane :key="1" tab="案件共享" :disabled="loading" />
+        </a-tabs
+      ></template> -->
+      <div class="desc-wrap-BasicTable">
+        <BasicTable @register="registerTable">
+          <template #toolbar>
+            <a-button type="primary"  @click="handleAdd" v-if="getCheckPerm('case-Add') && tableType == 0"> 新增案件</a-button>
+          </template>
+
+          <template #href="{ record }">
+            <a
+              v-if="record.caseTitle"
+              target="_blank"
+              :title="record.caseTitle"
+              :href="`/code/index.html?caseId=${record.caseId}#/show`"
+              >{{ record.caseTitle }}</a
+            >
+            <span v-else>-</span>
+          </template>
+          <template #action="{ record }">
+            <TableAction
+              stopButtonPropagation
+              :actions="[
+                {
+                  label: '编辑',
+                  disabled: tableType == 1 && !record.isEdit,
+                  ifShow: getTypeCheckPerm('case-edit'),
+                  onClick: handlegotoEdit.bind(null, record),
+                },
+                {
+                  label: '权限',
+                  disabled: tableType == 1 && !record.isAuth,
+                  ifShow: getTypeCheckPerm('case-powers'),
+                  onClick: handlePowers.bind(null, record),
+                },
+                {
+                  label: '下载',
+                  ifShow: getTypeCheckPerm('case-download') && !record.isOpen,
+                  //  getTypeCheckPerm('scenes-download') &&
+                  //  tableType != 3 &&
+                  //  (record.userName == userInfo.userName ||
+                  //    userInfo.roleId == 1 ||
+                  //    userInfo.roleId == 45 ||
+                  //    userInfo.roleId == 48),
+                  // disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
+                  //icon: 'carbon:download',
+                  disabled:  tableType == 1,
+                  onClick: createConfirmDownload.bind(null, record),
+                },
+                {
+                  label: '删除',
+                  ifShow: getTypeCheckPerm('case-delete') && !record.isOpen,
+                  //icon: 'ic:outline-delete-outline',
+                  disabled: tableType == 1,
+                  color: 'error',
+                  onClick: handleDelete.bind(null, record),
+                },
+              ]"
+            />
+          </template>
+        </BasicTable>
+      </div>
+      <DownLoadModal
+        :downloadOption="downloadOption"
+        @cancel="afterClose"
+        @register="registerDownModal"
+        @update="reload"
+        cancelText="取消下载"
+        okText="下载"
+        @cancelDownload="cancelDownload"
+        :okButtonProps="{ disabled: canDownload }"
+      />
+      <MoveModal @register="registerMoveModal" />
+      <AddModal @register="registerAddModal"  @update="reload"/>
+      <PowersModal @register="registerPowersModal" />
+    </PageWrapper>
+  </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 AddModal from './addCaseModal.vue'
+  import DownLoadModal from './DownLoadModal.vue';
+  import MoveModal from '/@/views/productOperation/modal/MoveModal.vue';
+  import PowersModal from '/@/views/productOperation/modal/PowersModal.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 {
+    operateSceneList,
+    sceneMove,
+    sceneDelete,
+    sceneReset,
+    sceneDownload,
+    caseCheckDown,
+    downloadProcess,
+    sceneCopy,
+    rebuildScene,
+    buildSceneObj,
+    sceneDetail,
+    sceneCount,
+    caseDelApi,
+    caseListApi,
+    caseProcess,
+    caseDown,
+  } from '/@/api/operate';
+  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,
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+      QrCode,
+      AddModal,
+      // 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<number>(0); //0看看 、1看见、2深时
+      const columns: BasicColumn[] = [
+        {
+          title: '标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 300,
+        },
+        {
+          title: '人员编号',
+          dataIndex: 'userName',
+          ellipsis: true,
+          width: 100,
+        },
+        {
+          title: '姓名',
+          dataIndex: 'nickName',
+          ellipsis: true,
+          width: 100,
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createTime',
+          width: 230,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
+          },
+        },
+        // {
+        //   title: '计算完成时间',
+        //   dataIndex: 'amount',
+        //   width: 180,
+        //   customRender: ({ record }) => {
+        //     return (
+        //       (record.algorithmTime &&
+        //         h(Time, {
+        //           value: record.algorithmTime,
+        //           mode: 'datetime',
+        //         })) ||
+        //       '-'
+        //     );
+        //   },
+        // },
+        // {
+        //   title: 'SN码',
+        //   dataIndex: 'snCode',
+        //   width: 180,
+        // },
+        // {
+        //   title: '场景大小',
+        //   dataIndex: 'sceneSize',
+        //   width: 80,
+        //   customRender: ({ record }) => {
+        //     return record.sceneSize && record.sceneSize != 0
+        //       ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
+        //       : '-';
+        //   },
+        // },
+        // {
+        //   title: '是否复制',
+        //   dataIndex: 'isCopy',
+        //   width: 80,
+        //   customRender: ({ record }) => {
+        //     return record.isCopy ? '是' : '否';
+        //   },
+        // },
+        // {
+        //   title: '复制时间',
+        //   dataIndex: 'copyTime',
+        //   width: 180,
+        //   customRender: ({ record }) => {
+        //     return record.copyTime
+        //       ? h(Time, {
+        //           value: record.copyTime,
+        //           mode: 'datetime',
+        //         })
+        //       : '-';
+        //   },
+        // },
+        // {
+        //   title: '人员编号',
+        //   dataIndex: 'userName',
+        //   width: 100,
+        // },
+        // {
+        //   title: t('routes.staff.userName'),
+        //   dataIndex: 'nickName',
+        //   width: 100,
+        //   customRender: ({ record }) => {
+        //     return record.nickName || '-';
+        //   },
+        // },
+        // {
+        //   title: '浏览量',
+        //   dataIndex: 'viewCount',
+        //   width: 80,
+        // },
+        // {
+        //   title: '状态',
+        //   dataIndex: 'status',
+        //   width: 80,
+        //   customRender: ({ record }) => {
+        //     let str;
+        //     switch (record.status - 0) {
+        //       case 0:
+        //         str = '计算中';
+        //         break;
+        //       case 1:
+        //         str = '计算成功';
+        //         break;
+        //       case -2:
+        //         str = '计算成功';
+        //         break;
+        //       case -1:
+        //         str = '计算失败';
+        //         break;
+        //     }
+        //     return record.payStatus == -2 ? '封存' : str;
+        //   },
+        // },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 200,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'caseTitle',
+            label: '案件名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+        ],
+      };
+      function cancelDownload() {
+        downloadOption.value = {};
+      }
+      const [registerAddModal, { openModal: openAddModal }] = useModal();
+      const [registerDownModal, { openModal: openDownModal }] = useModal();
+      const [registerMoveModal, { openModal: openMoveModal }] = useModal();
+      const [registerPowersModal, { openModal: openPowersModal }] = useModal();
+      const [registerTable, { reload, setColumns }] = useTable({
+        api: caseListApi,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isShare: tableType },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showIndexColumn: false,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'caseId',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },               
+        canResize: true,
+      });
+      function changeTable(val: number) {
+        tableType.value = val;
+        reload();
+      }
+      function handleAdd() {
+        openAddModal(true, {})
+        // router.push({ path: '/scene/add' });
+      }
+      async function handleCopy(record: Recordable) {
+        createConfirm({
+          title: '复制场景',
+          content: '确定要复制场景吗?',
+          onOk: async () => {
+            sceneCopy({ num: record.num }).then(() => {
+              message.success({
+                content: '复制成功',
+              });
+              reload();
+            });
+          },
+        });
+      }
+      async function handleDelete(record: Recordable) {
+        createConfirm({
+          title: '删除',
+          content: '确定要删除吗?',
+          onOk: async () => {
+          caseDelApi({ caseId: record.caseId }).then(() => {
+          message.success({
+            content: '删除成功',
+          });
+
+          reload();
+        });
+          },
+        });
+      }
+      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 createConfirmDownload(record: Recordable) {
+        createConfirm({
+          title: '提示',
+          okText: '继续',
+          content: '案件资源过大会导致离线包下载失败,请尽可能缩小案件资源后再下载。',
+          onOk: async () => {
+            handleDownload(record)
+          },
+        });
+      }
+
+      function handleDownload(record: Recordable) {
+        console.log('handleDownload', record, canDownload.value);
+        canDownload.value = true;
+        let isObj = tableType.value == 5 || tableType.value == 7 ? 1 : 0;
+        caseCheckDown({ caseId: record.caseId }).then((res) => {
+          console.log(res);
+          if (res.downloadStatus != 3) {
+            // 未下载过,需要打包
+            caseDown({ caseId: record.caseId }).then((res) => {
+              console.log(res);
+              openDownModal(true, {
+                ...record,
+              });
+              if (res.downloadStatus == 1) {
+                if (timer.value) {
+                  afterClose();
+                }
+                timer.value = setInterval(() => {
+                  caseProcess({ caseId: record.caseId, }).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);
+      }
+      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) {
+        window.open(`/mix3d/#/home/${record.caseId}`);
+        // 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,
+          tableType: tableType.value,
+        });
+      }
+      onMounted(() => {
+      });
+      return {
+        registerTable,
+        registerPowersModal,
+        handleDelete,
+        handleCopy,
+        handleMove,
+        handleDownload,
+        handleReset,
+        tableType,
+        loading,
+        changeTable,
+        t,
+        openDownModal,
+        registerDownModal,
+        registerMoveModal,
+        registerAddModal,
+        afterClose,
+        timer,
+        canDownload,
+        downloadOption,
+        cancelDownload,
+        handleGenerate,
+        getTypeCheckPerm,
+        handlegotoEdit,
+        handlePowers,
+        userInfo,
+        handleAdd,
+        reload,
+        getCheckPerm,
+        createConfirmDownload,
+      };
+    },
+  });
+</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>

+ 78 - 0
src/views/draw/DownLoadModal.vue

@@ -0,0 +1,78 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="系统正在为您打包数据"
+    :minHeight="0"
+    @visible-change="handleVisibleChange"
+    @cancel="hundleCancel"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="warp">
+        <p>正在打包场景离线数据{{ downloadPercent }}</p>
+        <span>{{ modelRef.sceneName }}.zip</span>
+        <Progress :percent="downloadOption.percent" />
+        <p>* 打包完成后将关闭弹窗自动下载。</p>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Progress } from 'ant-design-vue';
+  const { t } = useI18n();
+
+  export default defineComponent({
+    components: { BasicModal, Progress },
+    props: {
+      userData: { type: Object },
+      downloadOption: { type: Object },
+    },
+    emits: ['update', 'register', 'cancelDownload'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+
+      const { createMessage } = useMessage();
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        // data && onDataReceive(data);
+        modelRef.value = data;
+      });
+
+      const handleSubmit = async () => {
+        console.log(props.downloadOption);
+        if (props.downloadOption.url) {
+          window.open(props.downloadOption.url);
+        }
+      };
+      const hundleCancel = async () => {
+        emit('cancelDownload');
+      };
+
+      return {
+        register,
+        modelRef,
+        handleSubmit,
+        hundleCancel,
+        addListFunc,
+        t,
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .pt-2px {
+  }
+  .warp {
+    display: flex;
+    align-items: flex-start;
+    justify-content: flex-start;
+    flex-flow: column;
+  }
+</style>

+ 303 - 0
src/views/draw/addCaseModal.vue

@@ -0,0 +1,303 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增案件"
+    @visible-change="handleVisibleChange"
+    @ok="handleSubmit"
+    :confirmLoading="loading"
+    :width="900"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="mx-5 BasicForm flex">
+        <span style="line-height: 32px; margin-right: 10px">案件名称</span>
+        <div class="input">
+          <a-input style="width: 600px" maxlength="100" showCount v-model:value="fileFlow.caseTitle" placeholder="请输入" />
+        </div>
+        <!-- <a-button type="primary" @click="handleAdd"> 新增</a-button> -->
+      </div>
+      <BasicTable @register="registerTable">
+        <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>
+      </BasicTable>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive, h } 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';
+  import { caseaddOrUpdateApi, operateSceneList } from '/@/api/operate';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicTable, TableAction },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const loading = ref(false);
+      const fileFlow = reactive({
+        caseTitle: '',
+        file: null,
+        dylist: [],
+        mslist: [],
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '场景标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 150,
+        },
+        {
+          title: '场景码',
+          dataIndex: 'num',
+          ellipsis: true,
+          width: 180,
+        },
+        {
+          title: '计算完成时间',
+          dataIndex: 'algorithmTime',
+          width: 180,
+        },
+        {
+          title: '场景大小',
+          dataIndex: 'sceneSize',
+          width: 80,
+          customRender: ({ record }) => {
+            return record.sceneSize && record.sceneSize != 0
+              ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
+              : '-';
+          },
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 80,
+          customRender: ({ record }) => {
+            let str;
+            switch (record.status - 0) {
+              case 0:
+                str = '计算中';
+                break;
+              case 1:
+                str = '计算成功';
+                break;
+              case -2:
+                str = '计算成功';
+                break;
+              case -1:
+                str = '计算失败';
+                break;
+            }
+            return record.payStatus == -2 ? '封存' : str;
+          },
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 60,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'sceneName',
+            label: '名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+              placeholder: ' 请名称搜索',
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+          // {
+          //   field: 'isObj',
+          //   label: '场景类型',
+          //   component: 'Select',
+          //   labelWidth: 80,
+          //   // labelWidth: 50,
+          //   defaultValue: '1',
+          //   componentProps: {
+          //     allowClear: false,
+          //     options: [
+          //       {
+          //         label: '点云场景',
+          //         value: '0',
+          //         key: '0',
+          //       },
+          //       {
+          //         label: 'Mesh 场景',
+          //         value: '1',
+          //         key: '1',
+          //       },
+          //     ],
+          //     onChange: (value) => {
+          //       reload({
+          //         searchInfo: { isObj: value },
+          //       }).then(() => {
+          //         setSelectedRowKeys(value == 0 ? fileFlow.dylist : fileFlow.mslist);
+          //       });
+          //     },
+          //   },
+          //   colProps: {
+          //     xl: 7,
+          //     xxl: 7,
+          //   },
+          // },
+        ],
+      };
+      const { createMessage, createConfirm } = useMessage();
+      const [registerTable, { reload, getForm, setSelectedRowKeys }] = useTable({
+        api: operateSceneList,
+        title: ``,
+        showTableSetting: false,
+        rowSelection: { type: 'checkbox',getCheckboxProps: getRowSelection, onChange: onSelectChange },
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isObj: '1' },
+        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);
+        getForm().resetFields();
+        reload()
+        data && onDataReceive(data);
+      });
+      function getRowSelection(record) {
+        return {
+        disabled: record.inCase || !(record.status == 1 || record.status == -2), // Column configuration not to be checked
+        name: record.name,}
+       }
+      function onSelectChange(selectedRowKeys: any, selectedRows: any) {
+        fileFlow.dylist = [];
+        fileFlow.mslist = selectedRowKeys;
+      }
+      function onDataReceive(data) {
+        fileFlow.caseTitle = '';
+        modelRef.value = data;
+        fileFlow.dylist = [];
+        fileFlow.mslist = [];
+        fileFlow.caseTitle = '';
+        setSelectedRowKeys([]);
+      }
+      function handleAdd() {
+        console.log('handleAdd', fileFlow.dictName);
+        let params = {
+          dictName: fileFlow.dictName.trim(),
+        };
+        if (!fileFlow.dictName.trim()) {
+          return createMessage.warning('请输入名称');
+        }
+        addOrUpdate(params).then((res) => {
+          createMessage.success('添加成功');
+          fileFlow.dictName = '';
+          reload();
+        });
+      }
+      const handleSubmit = async () => {
+        if(!fileFlow.caseTitle?.trim()){
+          return createMessage.warning('请输入案件名称')
+        }
+        try {
+          loading.value = true;
+          const apiData = {
+            caseTitle: fileFlow.caseTitle?.trim(),
+            sceneNumParam: [
+              {
+                type: 0,
+                numList: fileFlow.dylist,
+              },
+              {
+                type: 1,
+                numList: fileFlow.mslist,
+              },
+            ],
+          };
+          console.log('res', apiData);
+          const res = await caseaddOrUpdateApi(apiData);
+          console.log('res', res);
+          closeModal();
+          createMessage.success('新增案件成功。');
+          emit('update');
+          loading.value = false;
+        } catch (error) {
+          loading.value = false;
+          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,
+        loading,
+      };
+    },
+  });
+</script>

+ 572 - 0
src/views/draw/list.vue

@@ -0,0 +1,572 @@
+<template>
+  <div class="scren">
+    <PageWrapper contentBackground>
+      <template #footer>
+        <a-tabs v-model:activeKey="tableType" @change="changeTable">
+          <Tabs.TabPane :key="0" tab="户型图" :disabled="loading" />
+          <Tabs.TabPane :key="1" tab="方位图" :disabled="loading" /> </a-tabs
+      ></template>
+      <div class="desc-wrap-BasicTable">
+        <BasicTable v-show="tableType" @register="registerTable">
+          <template #toolbar>
+            <a-button
+              type="primary"
+              @click="handleAdd"
+              v-if="getCheckPerm('case-Add') && tableType == 0"
+            >
+              新增</a-button
+            >
+          </template>
+
+          <template #href="{ record }">
+            <a
+              v-if="record.listCover || record.mapUrl"
+              target="_blank"
+              :title="record.title"
+              :href="record.listCover || record.mapUrl"
+              >{{ record.title || '-' }}</a
+            >
+            <span v-else>{{ record.title || '-' }}</span>
+          </template>
+          <template #action="{ record }">
+            <TableAction
+              stopButtonPropagation
+              :actions="[
+                {
+                  label: '复制',
+                  ifShow: getTypeCheckPerm('case-powers'),
+                  onClick: handleCopy.bind(null, record),
+                },
+                {
+                  label: '重命名',
+                  ifShow: getTypeCheckPerm('case-edit'),
+                  onClick: handlegoRename.bind(null, record),
+                },
+                {
+                  label: '编辑',
+                  ifShow: getTypeCheckPerm('case-edit'),
+                  onClick: handlegotoEdit.bind(null, record),
+                },
+                {
+                  label: '下载',
+                  ifShow: getTypeCheckPerm('case-download') && !record.isOpen,
+                  onClick: createConfirmDownload.bind(null, record),
+                },
+                {
+                  label: '删除',
+                  ifShow: getTypeCheckPerm('case-delete') && !record.isOpen,
+                  color: 'error',
+                  onClick: handleDelete.bind(null, record),
+                },
+              ]"
+            />
+          </template>
+        </BasicTable>
+        <BasicTable v-show="!tableType" @register="registerTable1">
+          <template #toolbar>
+            <a-button
+              type="primary"
+              @click="handleAdd"
+              v-if="getCheckPerm('case-Add') && tableType == 0"
+            >
+              新增案件</a-button
+            >
+          </template>
+
+          <template #href="{ record }">
+            <a
+              v-if="record.listCover || record.mapUrl"
+              target="_blank"
+              :title="record.title"
+              :href="record.listCover || record.mapUrl"
+              >{{ record.title || '-' }}</a
+            >
+            <span v-else>{{ record.title || '-' }}</span>
+          </template>
+          <template #action="{ record }">
+            <TableAction
+              stopButtonPropagation
+              :actions="[
+                {
+                  label: '复制',
+                  ifShow: getTypeCheckPerm('case-powers'),
+                  onClick: handleCopy.bind(null, record),
+                },
+                {
+                  label: '重命名',
+                  ifShow: getTypeCheckPerm('case-edit'),
+                  onClick: handlegoRename.bind(null, record),
+                },
+                {
+                  label: '编辑',
+                  ifShow: getTypeCheckPerm('case-edit'),
+                  onClick: handlegotoEdit.bind(null, record),
+                },
+                {
+                  label: '下载',
+                  ifShow: getTypeCheckPerm('case-download') && !record.isOpen,
+                  onClick: createConfirmDownload.bind(null, record),
+                },
+                {
+                  label: '删除',
+                  ifShow: getTypeCheckPerm('case-delete') && !record.isOpen,
+                  color: 'error',
+                  onClick: handleDelete.bind(null, record),
+                },
+              ]"
+            />
+          </template>
+        </BasicTable>
+      </div>
+      <DownLoadModal
+        :downloadOption="downloadOption"
+        @cancel="afterClose"
+        @register="registerDownModal"
+        @update="reload"
+        cancelText="取消下载"
+        okText="下载"
+        @cancelDownload="cancelDownload"
+        :okButtonProps="{ disabled: canDownload }"
+      />
+      <MoveModal @register="registerMoveModal" />
+      <AddModal @register="registerAddModal" @update="reload" />
+      <AddRenameModal :tableType="tableType" @register="registerRenameModal" @update="reload" />
+      <PowersModal @register="registerPowersModal" />
+    </PageWrapper>
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, h, computed, ref, onMounted } from 'vue';
+  import { BasicTable, useTable, TableAction, BasicColumn, FormProps } from '/@/components/Table';
+  import { PageWrapper } from '/@/components/Page';
+  import AddModal from './addCaseModal.vue';
+  import AddRenameModal from './reName.vue';
+  import DownLoadModal from './DownLoadModal.vue';
+  import MoveModal from '/@/views/productOperation/modal/MoveModal.vue';
+  import PowersModal from '/@/views/productOperation/modal/PowersModal.vue';
+  import { Time } from '/@/components/Time';
+  import { Descriptions, Tabs } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { downloadByUrl } from '/@/utils/file/download';
+  import { useModal } from '/@/components/Modal';
+  import {
+    caseOverviewList,
+    caseOverviewDel,
+    caseTabulationList,
+    caseTabulationCopy,
+    caseOverviewCopy,
+    caseTabulationDel,
+  } from '/@/api/operate/case';
+  import { message } from 'ant-design-vue';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { useUserStore } from '/@/store/modules/user';
+  export default defineComponent({
+    components: {
+      DownLoadModal,
+      MoveModal,
+      PowersModal,
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+      AddModal,
+      AddRenameModal,
+      // 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<number>(0); //0看看 、1看见、2深时
+      const columns: BasicColumn[] = [
+        {
+          title: '标题',
+          dataIndex: 'title',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 300,
+        },
+        {
+          title: '来源',
+          dataIndex: 'resource',
+          ellipsis: true,
+          width: 100,
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createTime',
+          width: 230,
+          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: 250,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        schemas: [
+          {
+            field: 'title',
+            label: '名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+        ],
+      };
+      function cancelDownload() {
+        downloadOption.value = {};
+      }
+      const [registerAddModal, { openModal: openAddModal }] = useModal();
+      const [registerDownModal, { openModal: openDownModal }] = useModal();
+      const [registerMoveModal, { openModal: openMoveModal }] = useModal();
+      const [registerRenameModal, { openModal: openRenameModal }] = useModal();
+      const [registerPowersModal, { openModal: openPowersModal }] = useModal();
+      const [registerTable, { reload: reload1 }] = useTable({
+        api: caseOverviewList,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isShare: tableType },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showIndexColumn: false,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'caseId',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      const [registerTable1, { reload: reload2 }] = useTable({
+        api: caseTabulationList,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isShare: tableType },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showIndexColumn: false,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'caseId',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      function changeTable(val: number) {
+        tableType.value = val;
+        reload();
+      }
+      function handlegoRename(record) {
+        openRenameModal(
+          true,
+          tableType.value ? { overviewId: record.id } : { tabulationId: record.id },
+        );
+
+        // createPrompt({
+        //   title: '请输入邮箱',
+        //   required: true,
+        //   label: '邮箱',
+        //   defaultValue: '默认邮箱',
+        //   onOK: async (email: string) => {
+        //     message.success('填写的邮箱地址为' + email);
+        //   },
+        //   inputType: 'Input',
+        // });
+      }
+
+      function handleAdd() {
+        openAddModal(true, {});
+        // router.push({ path: '/scene/add' });
+      }
+      function reload() {
+        reload1();
+        reload2();
+      }
+
+      async function handleCopy(record: Recordable) {
+        let url = tableType.value == 1 ? caseOverviewCopy : caseTabulationCopy;
+        let param =
+          tableType.value == 1
+            ? { overviewId: record.id }
+            : {
+                tabulationId: record.id,
+              };
+        createConfirm({
+          title: '复制',
+          content: '确定要复制吗?',
+          onOk: async () => {
+            url(param).then(() => {
+              message.success({
+                content: '复制成功',
+              });
+              reload();
+            });
+          },
+        });
+      }
+      async function handleDelete(record: Recordable) {
+        let url = tableType.value == 1 ? caseOverviewDel : caseTabulationDel;
+        createConfirm({
+          title: '删除',
+          content: '确定要删除吗?',
+          onOk: async () => {
+            url({ tabulationId: record.id, overviewId: record.id }).then(() => {
+              message.success({
+                content: '删除成功',
+              });
+
+              reload();
+            });
+          },
+        });
+      }
+      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 createConfirmDownload(record: Recordable) {
+        createConfirm({
+          title: '提示',
+          okText: '继续',
+          content: '是否确定下载。',
+          onOk: async () => {
+            handleDownload(record);
+          },
+        });
+      }
+
+      function handleDownload(record: Recordable) {
+        console.log('handleDownload', record, canDownload.value);
+        downloadByUrl({url:record.listCover || record.mapUrl, target: '_blank', fileName: record.title + '.jpg'})
+      }
+      function handleEdit(record: Recordable) {
+        window.open(record.thumbEdit + '&&token=' + token.value);
+      }
+      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) {
+        // window.open(`/mix3d/#/home/${record.caseId}`);
+        // 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,
+          tableType: tableType.value,
+        });
+      }
+      onMounted(() => {});
+      return {
+        registerTable,
+        registerTable1,
+        registerPowersModal,
+        handleDelete,
+        handleCopy,
+        handleMove,
+        handleDownload,
+        handleReset,
+        tableType,
+        loading,
+        changeTable,
+        t,
+        openDownModal,
+        registerRenameModal,
+        registerDownModal,
+        registerMoveModal,
+        registerAddModal,
+        afterClose,
+        timer,
+        canDownload,
+        downloadOption,
+        cancelDownload,
+        handleGenerate,
+        getTypeCheckPerm,
+        handlegotoEdit,
+        handlePowers,
+        userInfo,
+        handleAdd,
+        reload,
+        getCheckPerm,
+        handlegoRename,
+        createConfirmDownload,
+      };
+    },
+  });
+</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>

+ 124 - 0
src/views/draw/reName.vue

@@ -0,0 +1,124 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="重命名"
+    :okText="okText"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    :confirmLoading="loading"
+    min-height="50"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }"> {{ model[field] }}{{ fileFlow.type }} </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { InvoiceRegister } from '/@/api/order';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import { caseOverviewRename, caseTabulationRename } from '/@/api/operate/case';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      tableType: { type: Number, default: 0 },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const fileFlow = reactive({
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const okText = ref('确定');
+      const loading = ref(false);
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'overviewId',
+          component: 'Input',
+          show: false,
+          label: 'overviewId',
+        },
+        {
+          field: 'tabulationId',
+          component: 'Input',
+          show: false,
+          label: 'tabulationId',
+        },
+        {
+          field: 'newTitle',
+          component: 'Input',
+          label: '名称',
+          componentProps: {
+            maxLength: 50,
+          },
+          required: true,
+          colProps: {
+            span: 18,
+          },
+        },
+      ];
+
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 120,
+        schemas: schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        resetFields();
+        setFieldsValue(data);
+      }
+      const handleSubmit = async () => {
+        loading.value = true;
+        try {
+          let url = props.tableType === 1 ? caseOverviewRename : caseTabulationRename;
+          const params = await validate();
+          const apiData = params;
+          console.log('res', apiData, params);
+          await url(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+          loading.value = false;
+        } catch (error) {
+          loading.value = false;
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerForm,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        okText,
+        loading,
+        t,
+      };
+    },
+  });
+</script>

+ 14 - 3
src/views/productOperation/cameraScene.vue

@@ -47,12 +47,13 @@
       <div class="desc-wrap-BasicTable">
       <div class="desc-wrap-BasicTable">
         <BasicTable @register="registerTable">
         <BasicTable @register="registerTable">
           <template #toolbar>
           <template #toolbar>
+            <a-button type="primary" @click="handleUpload"> 上传</a-button>
             <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
             <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
           </template>
           </template>
 
 
           <template #href="{ record }">
           <template #href="{ record }">
             <a
             <a
-              v-if="record.status == 1 || (record.status == -2 && record.payStatus == 1)"
+              v-if="record.status == 1 || record.status == 6 || (record.status == -2 && record.payStatus == 1)"
               target="_blank"
               target="_blank"
               :title="record.sceneName"
               :title="record.sceneName"
               :href="record.webSite"
               :href="record.webSite"
@@ -125,7 +126,7 @@
                 },
                 },
                 {
                 {
                   label: '重算',
                   label: '重算',
-                  disabled: record.status == 0 || (record.status == -2 && record.payStatus != 1),
+                  disabled: record.status == 0 || record.status == 6 || (record.status == -2 && record.payStatus != 1),
                   ifShow:
                   ifShow:
                     getTypeCheckPerm('scenes-recalculate') &&
                     getTypeCheckPerm('scenes-recalculate') &&
                     tableType != 1 &&
                     tableType != 1 &&
@@ -197,6 +198,7 @@
       />
       />
       <MoveModal @register="registerMoveModal" />
       <MoveModal @register="registerMoveModal" />
       <PowersModal @register="registerPowersModal" />
       <PowersModal @register="registerPowersModal" />
+      <uplodaModal @register="registerUplodaModal" @update="reload" />
       <caseListModal @register="registerCaseListModal" />
       <caseListModal @register="registerCaseListModal" />
     </PageWrapper>
     </PageWrapper>
   </div>
   </div>
@@ -214,10 +216,11 @@
     TableImg,
     TableImg,
     FormProps,
     FormProps,
   } from '/@/components/Table';
   } from '/@/components/Table';
-  import { ExclamationCircleOutlined  } from '@ant-design/icons-vue';
+  import { ExclamationCircleOutlined, ToTopOutlined } from '@ant-design/icons-vue';
   import { PageWrapper } from '/@/components/Page';
   import { PageWrapper } from '/@/components/Page';
   import DownLoadModal from './modal/DownLoadModal.vue';
   import DownLoadModal from './modal/DownLoadModal.vue';
   import MoveModal from './modal/MoveModal.vue';
   import MoveModal from './modal/MoveModal.vue';
+  import uplodaModal from './modal/uploadModal.vue';
   import PowersModal from './modal/PowersModal.vue';
   import PowersModal from './modal/PowersModal.vue';
   import caseListModal from './modal/caseListModal.vue';
   import caseListModal from './modal/caseListModal.vue';
   import { Time } from '/@/components/Time';
   import { Time } from '/@/components/Time';
@@ -252,8 +255,10 @@
       PowersModal,
       PowersModal,
       caseListModal,
       caseListModal,
       BasicTable,
       BasicTable,
+      uplodaModal,
       TableAction,
       TableAction,
       PageWrapper,
       PageWrapper,
+      ToTopOutlined,
       [Descriptions.name]: Descriptions,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
       [Descriptions.Item.name]: Descriptions.Item,
       QrCode,
       QrCode,
@@ -556,8 +561,12 @@
       function cancelDownload() {
       function cancelDownload() {
         downloadOption.value = {};
         downloadOption.value = {};
       }
       }
+      function handleUpload(){
+        openUplodaModal(true, {});
+      }
       const [registerDownModal, { openModal: openDownModal, closeModal }] = useModal();
       const [registerDownModal, { openModal: openDownModal, closeModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
+      const [registerUplodaModal, { openModal: openUplodaModal }] = useModal();
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
       const [registerCaseListModal, { openModal: openCaseListModal }] = useModal();
       const [registerCaseListModal, { openModal: openCaseListModal }] = useModal();
       const [registerTable, { reload }] = useTable({
       const [registerTable, { reload }] = useTable({
@@ -801,6 +810,7 @@
         openDownModal,
         openDownModal,
         registerDownModal,
         registerDownModal,
         registerMoveModal,
         registerMoveModal,
+        registerUplodaModal,
         afterClose,
         afterClose,
         timer,
         timer,
         canDownload,
         canDownload,
@@ -814,6 +824,7 @@
         qrCodeUrl,
         qrCodeUrl,
         getStatus,
         getStatus,
         hanleDowm,
         hanleDowm,
+        handleUpload,
       };
       };
     },
     },
   });
   });

+ 147 - 0
src/views/productOperation/modal/resultListModal.vue

@@ -0,0 +1,147 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.name + '查询结果'"
+    okText="我知道了"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    :confirmLoading="loading"
+    min-height="50"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <div class="text">查询到 <span style="color: #0960bd">{{fileFlow.name}}</span> 无以下场景权限,请联系管理员开通</div>
+      <a-tabs v-model:activeKey="tableType" @change="changeTable">
+        <a-tab-pane :key="0" tab="查看权限" :disabled="loading" />
+        <a-tab-pane :key="1" tab="编辑权限" :disabled="loading" />
+      </a-tabs>
+      <BasicTable @register="registerTable">
+        <template #href="{ record }">
+          <a
+            v-if="record.caseTitle"
+            target="_blank"
+            :title="record.caseTitle"
+            :href="`/code/index.html?caseId=${record.caseId}#/show`"
+            >{{ record.caseTitle }}</a
+          >
+          <span v-else>-</span>
+        </template>
+      </BasicTable>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicTable, useTable } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { InvoiceRegister } from '/@/api/order';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import { caseListApi } from '/@/api/operate';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicTable },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const fileFlow = reactive({
+        file: null,
+        name: '',
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const tableType = ref<number>(0); //0查看 、1编辑
+      const columns = [
+        {
+          title: '标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 300,
+        },
+        {
+          title: '姓名',
+          dataIndex: 'userName',
+          ellipsis: true,
+          width: 100,
+        }]
+      const [registerTable, { reload }] = useTable({
+        api: caseListApi,
+        title: ``,
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        searchInfo: { isShare: tableType },
+        useSearchForm: false,
+        showIndexColumn: false,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'caseId',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },               
+        canResize: true,
+      });
+      const okText = ref('确定');
+      const loading = ref(false);
+      const { createMessage } = useMessage();
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        resetFields();
+        setFieldsValue(data);
+      }
+      const handleSubmit = async () => {
+        loading.value = true;
+        try {
+          const params = await validate();
+          const apiData = params;
+          console.log('res', apiData, params);
+          await InvoiceRegister(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+          loading.value = false;
+        } catch (error) {
+          loading.value = false;
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerTable,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        reload,
+        okText,
+        loading,
+        t,
+      };
+    },
+  });
+</script>

+ 124 - 0
src/views/productOperation/modal/uploadModal.vue

@@ -0,0 +1,124 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    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>
+      <!-- <span>注意:迁移后该场景的权限配置将被清空,如需保留,请复制后再做迁移</span> -->
+    </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 { uploadSceneOrig } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+
+  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({
+        filePath: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'filePath',
+          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,
+            // accept: ['xls', 'xlsx'],
+            afterFetch: function (data) {
+              fileFlow.filePath = 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();
+          let filePath = params.filePath[0];
+          const res = await uploadSceneOrig(filePath);
+          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>

+ 18 - 17
src/views/statistics/components/sceneEchart.vue

@@ -11,6 +11,7 @@
   import condition from './condition.vue';
   import condition from './condition.vue';
   import { Card, DatePicker } from 'ant-design-vue';
   import { Card, DatePicker } from 'ant-design-vue';
   import { ref, Ref, watch, defineEmits } from 'vue';
   import { ref, Ref, watch, defineEmits } from 'vue';
+  import { SCENE_TYPE } from '/@/settings/siteSetting';
   import { useECharts } from '/@/hooks/web/useECharts';
   import { useECharts } from '/@/hooks/web/useECharts';
   import { exportElsxFile } from '/@/utils/file/download';
   import { exportElsxFile } from '/@/utils/file/download';
   const props = defineProps({
   const props = defineProps({
@@ -27,7 +28,7 @@
   const yzlList = ref<number[]>([]);
   const yzlList = ref<number[]>([]);
   const yixStringData = ref<string[]>([]);
   const yixStringData = ref<string[]>([]);
   const echartTypr = ref('line');
   const echartTypr = ref('line');
-  const nameList = ref<string[]>(['四维看见', '四维看看', '四维深时', '四维深光', '圆周率']);
+  const nameList = ref<string[]>(SCENE_TYPE);
   const maxSize = ref(0);
   const maxSize = ref(0);
   const chartRef = ref<HTMLDivElement | null>(null);
   const chartRef = ref<HTMLDivElement | null>(null);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
@@ -112,33 +113,33 @@
           barMaxWidth: 80,
           barMaxWidth: 80,
           name: nameList.value[2],
           name: nameList.value[2],
         },
         },
-        {
-          data: ssobjList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#d58b55' },
-          barMaxWidth: 80,
-          name: nameList.value[3],
-        },
+        // {
+        //   data: ssobjList.value,
+        //   type: echartTypr.value,
+        //   itemStyle: { color: '#d58b55' },
+        //   barMaxWidth: 80,
+        //   name: nameList.value[3],
+        // },
         {
         {
           data: sgList.value,
           data: sgList.value,
           type: echartTypr.value,
           type: echartTypr.value,
           itemStyle: { color: '#55d187' },
           itemStyle: { color: '#55d187' },
           barMaxWidth: 80,
           barMaxWidth: 80,
-          name: nameList.value[4],
-        },
-        {
-          data: sgobjList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#faa19d' },
-          barMaxWidth: 80,
-          name: nameList.value[5],
+          name: nameList.value[3],
         },
         },
+        // {
+        //   data: sgobjList.value,
+        //   type: echartTypr.value,
+        //   itemStyle: { color: '#faa19d' },
+        //   barMaxWidth: 80,
+        //   name: nameList.value[5],
+        // },
         {
         {
           data: yzlList.value,
           data: yzlList.value,
           type: echartTypr.value,
           type: echartTypr.value,
           itemStyle: { color: '#00c8af' },
           itemStyle: { color: '#00c8af' },
           barMaxWidth: 80,
           barMaxWidth: 80,
-          name: nameList.value[6],
+          name: nameList.value[4],
         },
         },
       ],
       ],
     });
     });