tangning 1 deň pred
rodič
commit
d420e12aae

+ 21 - 0
src/api/jyUserPlatform/index.ts

@@ -18,8 +18,10 @@ enum Api {
   yhdel = '/service/manage/jyUserPlatform/del',
   addressKey = '/service/manage/index/addressKey/',
   sceneGroupCount = '/service/manage/scene/sceneGroupCount/',
+  cameraList = '/service/manage/data/cameraList',
   getDistrict = '/service/manage/data/getDistrict',
   getJyType = '/service/manage/data/getJyType',
+  pageAuthList = '/service/manage/data/pageAuthList',
 }
 
 /**
@@ -47,7 +49,17 @@ export const sceneGroupCount = ({ type = 'platform' }) =>
       ignoreCancelToken: true,
     },
   });
+export const cameraList = (params) =>
+  defHttp.get<userList>({
+    url: Api.cameraList,
+    params: params,
 
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 export const jyPlatformlist = (params: PageParams) =>
   defHttp.post({
     url: Api.list,
@@ -145,6 +157,15 @@ export const yhList = (params: PageParams) =>
     },
   });
 
+export const pageAuthList = (params) =>
+  defHttp.post({
+    url: Api.pageAuthList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 //添加用户权益
 export const AddUserIncrementApi = (params: PageParams) =>
   defHttp.post<userList>({

+ 98 - 90
src/api/product/index.ts

@@ -1,6 +1,13 @@
 import { defHttp } from '/@/utils/http/axios';
-import { PageParams, RentListGetResultModel,InvoiceListResul, addCameraParams, updateParams,getItemParams } from './model';
-import { Result,UploadFileParams } from '/#/axios';
+import {
+  PageParams,
+  RentListGetResultModel,
+  InvoiceListResul,
+  addCameraParams,
+  updateParams,
+  getItemParams,
+} from './model';
+import { Result, UploadFileParams } from '/#/axios';
 import { ContentTypeEnum } from '/@/enums/httpEnum';
 
 enum Api {
@@ -20,7 +27,7 @@ enum Api {
   appFileUpload = '/service/manage/appFile/upload',
   spaceSdkDelete = '/service/manage/spaceSdk/delete',
   appFileList = '/service/manage/appFile/list',
-  appFileDelete = '/service/manage/appFile/delete'
+  appFileDelete = '/service/manage/appFile/delete',
 }
 
 /**
@@ -41,43 +48,42 @@ export const CameraList = (params: PageParams) =>
 /**
  * @description: 新增固件
  */
-export const AddAndUpload = (params: PageParams) =>{
+export const AddAndUpload = (params: PageParams) => {
   return defHttp.uploadFile<Result>(
     {
       url: Api.addAndUpload,
     },
-    params
+    params,
   );
-}
+};
 /**
  * @description: 编辑固件
  */
 
 export const EditAndUpload = (params: PageParams) =>
-defHttp.post<Result>({
-  url: Api.editAndUpload,
-  params,
-  // data: params,
-  headers: {
-    // @ts-ignore
-    ignoreCancelToken: true,
-  },
-});
-
+  defHttp.post<Result>({
+    url: Api.editAndUpload,
+    params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 /**
  * @description: 删除固件
  */
- export const DelAndUpload = (params: PageParams) =>
- defHttp.post<Result>({
-   url: Api.delAndUpload,
-   params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+export const DelAndUpload = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.delAndUpload,
+    params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const SpaceSdkOnline = (params: PageParams) =>
   defHttp.post<Result>({
@@ -104,76 +110,76 @@ export const SpaceSdkUpdate = (params: PageParams) =>
 /**
  * @description: SDK list
  */
- export const SpaceSdkList = (params: PageParams) =>
- defHttp.post<Result>({
-   url: Api.spaceSdkList,
-   params,
-   // data: params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+export const SpaceSdkList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.spaceSdkList,
+    params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const SpaceSdkTop = (params: addCameraParams) =>
- defHttp.post<RentListGetResultModel>({
-   url: Api.spaceSdkTop,
-   params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+  defHttp.post<RentListGetResultModel>({
+    url: Api.spaceSdkTop,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const SpaceSdkDelete = (params: updateParams) =>
- defHttp.post<Result>({
-   url: Api.spaceSdkDelete,
-   params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+  defHttp.post<Result>({
+    url: Api.spaceSdkDelete,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 //app 管理
 export const AppFileAdd = (params: updateParams) =>
- defHttp.post<Result>({
-   url: Api.appFileAdd,
-   params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+  defHttp.post<Result>({
+    url: Api.appFileAdd,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
- export const AppFileAgentList = (params: updateParams) =>
- defHttp.get<Result>({
-   url: Api.appFileAgentList,
-   params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
+export const AppFileAgentList = (params: updateParams) =>
+  defHttp.get<Result>({
+    url: Api.appFileAgentList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const AppFileList = (params: updateParams) =>
- defHttp.post<Result>({
-   url: Api.appFileList,
-   params,
-   headers: {
-     // @ts-ignore
-     ignoreCancelToken: true,
-   },
- });
- 
+  defHttp.post<Result>({
+    url: Api.appFileList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const AppFileDelete = (params: updateParams) =>
-defHttp.post<Result>({
-  url: Api.appFileDelete,
-  params,
-  headers: {
-    // @ts-ignore
-    ignoreCancelToken: true,
-  },
-});
+  defHttp.post<Result>({
+    url: Api.appFileDelete,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 //上传文件
 export function SpaceSdkUpload(
   params: UploadFileParams,
@@ -186,20 +192,22 @@ export function SpaceSdkUpload(
     },
     params,
   );
- }
+}
 export function uploadApi(
   params: UploadFileParams,
   onUploadProgress: (progressEvent: ProgressEvent) => void,
+  cancelToken,
 ) {
   return defHttp.uploadFile<Result>(
     {
       url: Api.upload,
       onUploadProgress,
+      cancelToken,
     },
     params,
   );
- }
- 
+}
+
 export function AppFileUpload(
   params: UploadFileParams,
   onUploadProgress: (progressEvent: ProgressEvent) => void,
@@ -211,4 +219,4 @@ export function AppFileUpload(
     },
     params,
   );
- }
+}

+ 1 - 0
src/components/Form/src/components/ApiSelect.vue

@@ -43,6 +43,7 @@
     props: {
       value: [Array, Object, String, Number],
       numberToString: propTypes.bool,
+      ups: propTypes.bool,
       api: {
         type: Function as PropType<(arg?: Recordable) => Promise<OptionsItem[]>>,
         default: null,

+ 41 - 4
src/views/productOperation/cameraScene.vue

@@ -51,7 +51,39 @@
         </a-tabs></template
       >
       <div class="desc-wrap-BasicTable">
-        <BasicTable @register="registerTable">
+        <BasicTable v-show="tableType == 2" @register="registerTable1">
+          <template #toolbar>
+            <a-button
+              type="primary"
+              v-if="tableType == 0 && getCheckPerm('scenes-upload')"
+              @click="handleUpload"
+            >
+              上传</a-button
+            >
+            <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
+          </template>
+
+          <template #href="{ record }">
+            <span v-if="record.sceneName">{{ record.sceneName }}</span>
+            <span v-else>-</span>
+          </template>
+          <template #status="{ record }">
+            <span v-if="record.status != '-1'">{{ record.statusString }}</span>
+            <Tooltip v-else placement="right">
+              <template #title>
+                <span>失败原因:{{ record.buildErrorReason || record.buildFailReason }}</span>
+                <p v-if="record.dataSource">
+                  <span>serverPath:{{ record.dataSource }}</span>
+                </p>
+              </template>
+              <span
+                >{{ record.statusString }}
+                <ExclamationCircleOutlined />
+              </span>
+            </Tooltip>
+          </template>
+        </BasicTable>
+        <BasicTable  v-show="tableType != 2" @register="registerTable">
           <template #toolbar>
             <a-button
               type="primary"
@@ -327,7 +359,7 @@
       const [registerUplodaModal, { openModal: openUplodaModal }] = useModal();
       const [registerPowersModal, { openModal: openPowersModal }] = useModal();
       const [registerCaseListModal, { openModal: openCaseListModal }] = useModal();
-      const [registerTable, { reload: reload1 }] = useTable({
+      const [registerTable, { reload: reload1, getForm }] = useTable({
         api: operateSceneList,
         title: `场景列表`,
         // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
@@ -386,7 +418,11 @@
       });
       function changeTable(val: string) {
         tableType.value = val;
-        // getForm().updateSchema({ field: 'platform', show: val == '2' });
+        getForm().updateSchema({ field: 'type',
+        componentProps: {
+            ups: true,
+            params: { sceneType: val },
+        } });
         // let listColumns = columns.map((item) => {
         //   if (item.dataIndex == 'action') {
         //     return {
@@ -407,7 +443,7 @@
       }
       function reload() {
         reload1();
-        // reload2();
+        reload2();
       }
       async function handleCopy(record: Recordable) {
         createConfirm({
@@ -617,6 +653,7 @@
       });
       return {
         registerTable,
+        registerTable1,
         registerPowersModal,
         registerCaseListModal,
         handleDelete,

+ 6 - 6
src/views/productOperation/data.ts

@@ -1,7 +1,7 @@
 import { BasicColumn } from '/@/components/Table';
 import { SCENE_TYPE } from '/@/settings/siteSetting';
 import { Time } from '/@/components/Time';
-import { jyPlatformlist, sceneGroupCount } from '/@/api/jyUserPlatform/index'; //roleLIstApi
+import { pageAuthList, sceneGroupCount, cameraList } from '/@/api/jyUserPlatform/index'; //roleLIstApi
 import dayjs from 'dayjs';
 import { h } from 'vue';
 export const columns: BasicColumn[] = [
@@ -392,12 +392,12 @@ export const searchFormData = (show) => [
     componentProps: {
       style: { maxWidth: '250px', placeholder: '全部' },
       placeholder: '全部',
-      api: sceneGroupCount,
-      immediate: false,
+      api: cameraList,
+      immediate: true,
       resultField: 'list',
       labelField: 'name',
       valueField: 'id',
-      params: { type: 'camera' },
+      params: { sceneType: !!show ? 2 : 1 },
     },
     colProps: {
       span: 6,
@@ -433,10 +433,10 @@ export const searchFormData = (show) => [
     componentProps: {
       style: { maxWidth: '250px', placeholder: '全部' },
       placeholder: '全部',
-      api: sceneGroupCount,
+      api: pageAuthList,
       immediate: false,
       resultField: 'list',
-      labelField: 'name',
+      labelField: 'platformName',
       valueField: 'id',
     },
     colProps: {

+ 33 - 10
src/views/productOperation/modal/uploadModal.vue

@@ -34,12 +34,19 @@
         </template>
       </BasicForm>
       <div v-if="fileFlow.list.length == 0" style="padding-left: 83px">
-        <span v-if="fileFlow.sourceType == 'orig'" >‌支持采集完成后,U 盘导出的场景原始数据上传计算。</span>
+        <span v-if="fileFlow.sourceType == 'orig'"
+          >‌支持采集完成后,U 盘导出的场景原始数据上传计算。</span
+        >
         <div style="width: 360px" v-else>
           <div>重要提醒:</div>
-          <div>数据上传规则‌:只接收‌其他单位/部门私有化部署的系统‌(比如XX分局自建的平台)下载的数据,本平台已有的场景‌‌不能重复上传‌;</div>
-          <div>‌版本号核对‌:请确保来源平台和本平台的版本号完全一致,如来源平台是 v2.2.0,本平台也必须是 v2.2.0。</div>
-      </div>
+          <div
+            >数据上传规则‌:只接收‌其他单位/部门私有化部署的系统‌(比如XX分局自建的平台)下载的数据,本平台已有的场景‌‌不能重复上传‌;</div
+          >
+          <div
+            >‌版本号核对‌:请确保来源平台和本平台的版本号完全一致,如来源平台是
+            v2.2.0,本平台也必须是 v2.2.0。</div
+          >
+        </div>
       </div>
     </div>
   </BasicModal>
@@ -53,7 +60,10 @@
   import { Upload } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
-
+  import axios from 'axios';
+  // 存储每个文件的 AbortController
+  let controller = null;
+  let uid = null;
   const { t } = useI18n();
   export default defineComponent({
     components: { BasicModal, BasicForm, Upload },
@@ -63,6 +73,7 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const modelRef = ref({});
+      const abortControllers = ref(new Map());
       const fileFlow = reactive({
         list: [],
         sourceType: 'orig',
@@ -135,7 +146,6 @@
         fileFlow.sourceType = 'orig';
         loading.value = false;
         resetFields();
-        if(uploadRef.value) uploadRef.value.clearFiles();
         // setFieldsValue({
         //   type: data.sceneName,
         // });
@@ -216,10 +226,17 @@
       }
 
       function handleVisibleChange(v) {
-        // console.log(v);
-        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+        console.log(v, uploadRef.value);
+        abortControllers.value.forEach((controller) => {
+          controller.abort();
+        });
+        abortControllers.value.clear();
+        if (!v && uploadRef.value) {
+          uploadRef.value.clearFiles();
+        }
       }
-      async function Submit(filePath) {
+      // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      const Submit = async (filePath) => {
         loading.value = true;
         try {
           const params = await validate();
@@ -234,7 +251,7 @@
         } catch (error) {
           loading.value = false;
         }
-      }
+      };
       function handleProgress(file) {
         // file 对象包含了上传进度信息
         console.log('上传进度:', file.percent);
@@ -252,13 +269,19 @@
             dictId: params.dictId,
           },
         };
+        // 方法1:使用 AbortController(现代浏览器)
+        const controller = new AbortController();
+        abortControllers.value.set(file.uid, controller);
         loading.value = true;
         fileFlow.complete = 0;
+        // const CancelToken = axios.CancelToken;
+        // source = CancelToken.source();
         function onUploadProgress(progressEvent: ProgressEvent) {
           const complete = ((progressEvent.loaded / progressEvent.total) * 100) | 0;
           fileFlow.complete = complete;
         }
         let url = await uploadApi(apiData, onUploadProgress);
+        abortControllers.value.delete(file.uid);
         option.onSuccess && option.onSuccess();
         console.log('uploadApi', url);
         fileFlow.filePath = url;

+ 1 - 1
src/views/statistics/components/VisitSource.vue

@@ -27,7 +27,7 @@
           />
         </div>
         <div class="selct" style="display: inline-block; margin-right: 0px">
-          <RangePicker @change="handleType" valueFormat="YYYY-MM-DD" :getCalendarContainer="trigger => trigger.parentNode" v-model:value="SearchData.timeList" :picker="picker" />
+          <RangePicker :allowClear="false" @change="handleType" valueFormat="YYYY-MM-DD" :getCalendarContainer="trigger => trigger.parentNode" v-model:value="SearchData.timeList" :picker="picker" />
         </div>
       </div>
     </template>

+ 1 - 0
src/views/statistics/components/lineEcharts2.vue

@@ -30,6 +30,7 @@
         </div>
         <div class="selct" style="display: inline-block; margin-right: 0px">
           <RangePicker
+            :allowClear="false"
             :locale="locale"
             @change="handleTime"
             valueFormat="YYYY-MM-DD"

+ 1 - 1
src/views/statistics/components/orderEchart.vue

@@ -38,7 +38,7 @@
           />
         </div>
         <div class="selct" style="display: inline-block; margin-right: 0px">
-          <RangePicker @change="handleType" valueFormat="YYYY-MM-DD" :getCalendarContainer="trigger => trigger.parentNode" v-model:value="SearchData.timeList" :picker="picker" />
+          <RangePicker :allowClear="false" @change="handleType" valueFormat="YYYY-MM-DD" :getCalendarContainer="trigger => trigger.parentNode" v-model:value="SearchData.timeList" :picker="picker" />
         </div>
       </div>
     </template>