Эх сурвалжийг харах

场景包分配+菜单优化+泛化优化

zhangliang2 2 жил өмнө
parent
commit
79dd407f50

+ 10 - 6
src/api/sceneLibrary.js

@@ -28,11 +28,13 @@ const saveScenePackage = basePart + '/ScenePackage/saveScenePackage'; // 场景
 const queryCsb = basePart + '/ScoringRules/queryCsb'; // 测试包添加评分规则下拉
 
 const querySceneGeneralTemplateList = basePart + '/SceneGeneralTemplate/querySceneGeneralTemplateList'; // 泛化列表
-const queryType = basePart + '/SceneGeneralTemplate/queryType '; // 功能模块查询
-const querySceneGeneralTemplateById = basePart + '/SceneGeneralTemplate/querySceneGeneralTemplateById '; // 选中模板展示详情
-const saveSceneGeneralTemplate = basePart + '/SceneGeneralTemplate/saveSceneGeneralTemplate '; // 新增泛化场景
-const saveSceneGeneralExample = basePart + '/SceneGeneralTemplate/saveSceneGeneralExample '; // 保存泛化场景
-const queryGeneralTemplateByFh = basePart + '/SceneGeneralTemplate/queryGeneralTemplateByFh '; // 泛化过的详情
+const queryType = basePart + '/SceneGeneralTemplate/queryType'; // 功能模块查询
+const querySceneGeneralTemplateById = basePart + '/SceneGeneralTemplate/querySceneGeneralTemplateById'; // 选中模板展示详情
+const saveSceneGeneralTemplate = basePart + '/SceneGeneralTemplate/saveSceneGeneralTemplate'; // 新增泛化场景
+const saveSceneGeneralExample = basePart + '/SceneGeneralTemplate/saveSceneGeneralExample'; // 保存泛化场景
+const queryGeneralTemplateByFh = basePart + '/SceneGeneralTemplate/queryGeneralTemplateByFh'; // 泛化过的详情
+
+const getSceneParam = basePart + '/ScenePackage/getSceneParam'; // 场景测试包创建上限
 
 
 export default {
@@ -67,5 +69,7 @@ export default {
     querySceneGeneralTemplateById,
     saveSceneGeneralTemplate,
     saveSceneGeneralExample,
-    queryGeneralTemplateByFh
+    queryGeneralTemplateByFh,
+
+    getSceneParam
 }

+ 12 - 1
src/api/systemManagement.js

@@ -22,6 +22,12 @@ const deleteSystemScenePackage = basePart + '/SystemScenePackage/deleteSystemSce
 const saveUserByPackageId = basePart + '/SystemScenePackage/saveUserByPackageId' // 新增分配的账户
 const deleteUserByPackageId = basePart + '/SystemScenePackage/deleteUserByPackageId' // 删除分配的账户
 
+//场景包分配
+const queryPackageByUserIdList = basePart + '/SystemScenePackage/queryPackageByUserIdList' // 场景包分配列表
+const queryPackageByUserId = basePart + '/SystemScenePackage/queryPackageByUserId' // 查询场景包分配详情
+const savePackageByUserId = basePart + '/SystemScenePackage/savePackageByUserId' // 保存场景包分配详情
+const querySystemScenePackageListByTJ = basePart + '/SystemScenePackage/querySystemScenePackageListByTJ' // 场景包数量统计
+
 
 export default {
     getUserPageList,
@@ -41,5 +47,10 @@ export default {
     querySystemScenePackageById,
     deleteSystemScenePackage,
     saveUserByPackageId,
-    deleteUserByPackageId
+    deleteUserByPackageId,
+
+    queryPackageByUserIdList,
+    queryPackageByUserId,
+    savePackageByUserId,
+    querySystemScenePackageListByTJ
 }

+ 23 - 15
src/axios/filter.js

@@ -51,9 +51,9 @@ axios.interceptors.request.use(function (config) {
     // 在发送请求之前处理
     // 判断token在前台session中是否存在
     config.headers.common['Authorization'] = localStorage.getItem('Authorization');
-    if(config.noLoading===true){   //如果noLoading为true,不加载loading画面
-
-    }else{
+    if (config.noLoading === true) { //如果noLoading为true,不加载loading画面
+        console.log("noLoading");
+    } else {
         showFullScreenLoading();
     }
     return config;
@@ -78,21 +78,23 @@ axios.interceptors.response.use(function (response) {
     return response;
 }, function (error) {
     tryHideFullScreenLoading();
-    if(error.response.status == 401){  //token失效,弹框提示确认返回login
+    if (error.response.status == 401) { //token失效,弹框提示确认返回login
         //ElementUI.Message.error("用户信息过期,请重新登录");
-        if(isInvalid1 == false){
+        if (isInvalid1 == false) {
             isInvalid1 = true
-            ElementUI.MessageBox.alert('用户信息过期,请重新登陆','提示',{
-                confirmButtonText:'确定',
+            ElementUI.MessageBox.alert('用户信息过期,请重新登陆', '提示', {
+                confirmButtonText: '确定',
                 callback: action => {
                     let loginUrl = window.location.origin + '/login'
                     window.location.href = loginUrl
                 }
             })
-            setTimeout(()=>{isInvalid1 = false}, 5000)
+            setTimeout(() => {
+                isInvalid1 = false
+            }, 5000)
         }
         return Promise.reject(error);
-    }else{
+    } else {
         ElementUI.Message.error("网络异常");
         return Promise.reject(error);
     }
@@ -100,6 +102,10 @@ axios.interceptors.response.use(function (response) {
 
 Vue.prototype.$axios = axios; //定义调用方式
 
+
+
+
+
 // 针对上传大文件
 const instance = axios.create({
     baseURL: '',
@@ -137,20 +143,22 @@ instance.interceptors.response.use(function (response) {
     return response;
 }, function (error) {
     tryHideFullScreenLoading();
-    if(error.response.status == 401){  //token失效,弹框提示确认返回login
-        if(isInvalid2 == false){
+    if (error.response.status == 401) { //token失效,弹框提示确认返回login
+        if (isInvalid2 == false) {
             isInvalid2 = true
-            ElementUI.MessageBox.alert('用户信息过期,请重新登陆','提示',{
-                confirmButtonText:'确定',
+            ElementUI.MessageBox.alert('用户信息过期,请重新登陆', '提示', {
+                confirmButtonText: '确定',
                 callback: action => {
                     let loginUrl = window.location.origin + '/login'
                     window.location.href = loginUrl
                 }
             })
-            setTimeout(()=>{isInvalid2 = false}, 5000)
+            setTimeout(() => {
+                isInvalid2 = false
+            }, 5000)
         }
         return Promise.reject(error);
-    }else{
+    } else {
         ElementUI.Message.error("网络异常");
         return Promise.reject(error);
     }

+ 1 - 1
src/router/filter.js

@@ -15,7 +15,7 @@ router.beforeEach((to, from, next) => {
             code,
             ticket
         } = to.query;
-        
+
         if (code && ticket) {
             next({
                 path: "/mainPage",

+ 120 - 102
src/router/systemManagement.js

@@ -1,117 +1,135 @@
 export default [{
-    path: "/accountManagement",
-    name: "accountManagement",
-    meta: {
-        tabname: "账户管理",
-        menuKind: "systemManagement"
+        path: "/accountManagement",
+        name: "accountManagement",
+        meta: {
+            tabname: "账户管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/accountManagement")
     },
-    component: () => import("@/views/systemManagement/accountManagement")
-},
-{
-    path: "/addAccount",
-    name: "addAccount",
-    meta: {
-        tabname: "创建账户",
-        menuKind: "systemManagement"
+    {
+        path: "/addAccount",
+        name: "addAccount",
+        meta: {
+            tabname: "创建账户",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/addAccount")
     },
-    component: () => import("@/views/systemManagement/addAccount")
-},
-{
-    path: "/editAccount",
-    name: "editAccount",
-    meta: {
-        tabname: "编辑账户",
-        menuKind: "systemManagement"
+    {
+        path: "/editAccount",
+        name: "editAccount",
+        meta: {
+            tabname: "编辑账户",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/editAccount")
     },
-    component: () => import("@/views/systemManagement/editAccount")
-},
-{
-    path: "/parameterManagement",
-    name: "paramenterManagement",
-    meta: {
-        tabname: "参数管理",
-        menuKind: "systemManagement"
+    {
+        path: "/parameterManagement",
+        name: "paramenterManagement",
+        meta: {
+            tabname: "参数管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/parameterManagement")
     },
-    component: () => import("@/views/systemManagement/parameterManagement")    
-},
-{
-    path: "/parameterDetail",
-    name: "parameterDetail",
-    meta: {
-        tabname: "新增参数配置",
-        menuKind: "systemManagement"
+    {
+        path: "/parameterDetail",
+        name: "parameterDetail",
+        meta: {
+            tabname: "新增参数配置",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/parameterDetail")
     },
-    component: () => import("@/views/systemManagement/parameterDetail")
-},
-{
-    path: "/clusteringManagement",
-    name: "clusteringManagement",
-    meta: {
-        tabname: "集群管理",
-        menuKind: "sysyemManagement"
+    {
+        path: "/clusteringManagement",
+        name: "clusteringManagement",
+        meta: {
+            tabname: "集群管理",
+            menuKind: "sysyemManagement"
+        },
+        component: () => import("@/views/systemManagement/clusteringManagement")
     },
-    component: () => import("@/views/systemManagement/clusteringManagement")
-},
-{
-    path: "/clusteringDetail",
-    name: "clusteringDetail",
-    meta: {
-        tabname: "新增集群配置",
-        menuKind: "systemManagement"
+    {
+        path: "/clusteringDetail",
+        name: "clusteringDetail",
+        meta: {
+            tabname: "新增集群配置",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/clusteringDetail")
     },
-    component: () => import("@/views/systemManagement/clusteringDetail")
-},
-{
-    path: "/sceneLibraryManagement",
-    name: "sceneLibraryManagement",
-    meta: {
-        tabname: "场景库管理",
-        menuKind: "systemManagement"
+    {
+        path: "/sceneLibraryManagement",
+        name: "sceneLibraryManagement",
+        meta: {
+            tabname: "场景库管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/sceneLibraryManagement/sceneLibraryManagement")
     },
-    component: () => import("@/views/systemManagement/sceneLibraryManagement/sceneLibraryManagement")
-},
-{
-    path: "/scenePacketListManagement",
-    name: "scenePacketListManagement",
-    meta: {
-        tabname: "场景包管理",
-        menuKind: "systemManagement"
+    {
+        path: "/scenePacketListManagement",
+        name: "scenePacketListManagement",
+        meta: {
+            tabname: "场景包管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/scenePacketListManagement/index")
     },
-    component: () => import("@/views/systemManagement/scenePacketListManagement/index")
-},
-{
-    path: "/scenePacketDetail",
-    name: "scenePacketDetail",
-    meta: {
-        tabname: "场景包详情",
-        menuKind: "systemManagement"
+    {
+        path: "/scenePacketDetail",
+        name: "scenePacketDetail",
+        meta: {
+            tabname: "场景包详情",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/scenePacketListManagement/detail")
     },
-    component: () => import("@/views/systemManagement/scenePacketListManagement/detail")
-},
-{
-    path: "/reportTemplateManagement",
-    name: "reportTemplateManagement",
-    meta: {
-        tabname: "报告模板管理",
-        menuKind: "systemManagement"
+    {
+        path: "/scenePacketDistributionList",
+        name: "scenePacketDistributionList",
+        meta: {
+            tabname: "场景包分配",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/scenePacketDistributionList")
     },
-    component: () => import("@/views/systemManagement/reportTemplateManagement")
-},
-{
-    path: "/reportTemplateDetail",
-    name: "reportTemplateDetail",
-    meta: {
-
+    {
+        path: "/scenePacketDistributionDetail",
+        name: "scenePacketDistributionDetail",
+        meta: {
+            tabname: "场景包分配详情",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/scenePacketDistributionDetail")
+    },
+    {
+        path: "/reportTemplateManagement",
+        name: "reportTemplateManagement",
+        meta: {
+            tabname: "报告模板管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/reportTemplateManagement")
     },
-    component: () => import("@/views/systemManagement/reportTemplateDetail") 
-},
-{
-    path: "/logManagement",
-    name:"logManagement",
-    meta: {
-        tabname: "日志管理",
-        menuKind: "systemManagement"
+    {
+        path: "/reportTemplateDetail",
+        name: "reportTemplateDetail",
+        meta: {
+
+        },
+        component: () => import("@/views/systemManagement/reportTemplateDetail")
     },
-    component: () => import("@/views/systemManagement/logManagement")
-}
+    {
+        path: "/logManagement",
+        name: "logManagement",
+        meta: {
+            tabname: "日志管理",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/logManagement")
+    }
 ]

+ 61 - 36
src/views/page/pageMenu.vue

@@ -64,23 +64,24 @@
                 </li>
             </ul>
 
-            <div class="menuList" v-show="!menuFold">
-                <el-menu
-                    ref="menu"
-                    :default-active="activeMenu"
-                    class="el-menu-vertical-demo"
-                    :background-color="themeColor"
-                    :unique-opened="true"
-                    :router="true"
-                    @select="menuSel"
-                >
-                    <!-- active-text-color="#ffffff" -->
-                    <el-menu-item :index="menus[0]" class="indexMenu">
-                        <i class="my-icon-home"></i>
-                        <span>首页</span>
-                    </el-menu-item>
+            <el-scrollbar id="elScrollBar" ref="scrollbar" view-class="scroll">
+                <div class="menuList" v-show="!menuFold">
+                    <el-menu
+                        ref="menu"
+                        :default-active="activeMenu"
+                        class="el-menu-vertical-demo"
+                        :background-color="themeColor"
+                        :unique-opened="true"
+                        :router="true"
+                        @select="menuSel"
+                    >
+                        <!-- active-text-color="#ffffff" -->
+                        <el-menu-item :index="menus[0]" class="indexMenu">
+                            <i class="my-icon-home"></i>
+                            <span>首页</span>
+                        </el-menu-item>
 
-                    <!--
+                        <!--
                     <el-submenu :index="menus[1]">
                         <template slot="title">
                             <i class="my-icon-model"></i>
@@ -156,29 +157,33 @@
                     </el-submenu>
                     -->
 
-                    <el-submenu
-                        v-for="(item, i) in menuItems"
-                        :index="item.id"
-                        :key="i"
-                    >
-                        <template slot="title">
-                            <i :class="item.icon"></i>
-                            <span>{{ item.name }}</span>
-                        </template>
+                        <el-submenu
+                            v-for="(item, i) in menuItems"
+                            :index="item.id"
+                            :key="i"
+                        >
+                            <template slot="title">
+                                <i :class="item.icon"></i>
+                                <span>{{ item.name }}</span>
+                            </template>
+                            <el-menu-item
+                                v-for="(item2, i2) in item.children"
+                                :index="item2.router"
+                                :key="i2"
+                            >
+                                {{ item2.name }}
+                            </el-menu-item>
+                        </el-submenu>
                         <el-menu-item
-                            v-for="(item2, i2) in item.children"
-                            :index="item2.router"
-                            :key="i2"
+                            index="personalInformation"
+                            class="indexMenu"
                         >
-                            {{ item2.name }}
+                            <i class="el-icon-user-solid"></i>
+                            <span>个人信息</span>
                         </el-menu-item>
-                    </el-submenu>
-                    <el-menu-item index="personalInformation" class="indexMenu">
-                        <i class="el-icon-user-solid"></i>
-                        <span>个人信息</span>
-                    </el-menu-item>
-                </el-menu>
-            </div>
+                    </el-menu>
+                </div>
+            </el-scrollbar>
         </div>
     </div>
 </template>
@@ -386,6 +391,26 @@ export default {
     }
 }
 
+#elScrollBar {
+    width: 100%;
+    height: 100%;
+}
+
+.el-scrollbar__wrap {
+    overflow-y: auto;
+}
+
+.el-scrollbar__bar {
+    opacity: 0.6 !important;
+}
+.el-scrollbar__bar:hover {
+    opacity: 1 !important;
+}
+
+.menuList {
+    padding-bottom: 60px;
+}
+
 .el-submenu [class^="my-icon-"],
 .el-menu-item [class^="my-icon-"] {
     width: 24px;

+ 3 - 3
src/views/personalInformation/personalInformation.vue

@@ -21,8 +21,8 @@
             </div>
             <div class="flexBox">
                 <div class="flexItem"><span class="label2">可创建子账户数量:</span>{{configInfo.numCreateUser}}</div>
-                <div class="flexItem"><span class="label2">可创建场景包数量:</span>{{configInfo.numCreateScenePackage}}</div>
-                <div class="flexItem"><span class="label2">场景包最大场景数量:</span>{{configInfo.numScenePerPackage}}</div>
+                <div class="flexItem"><span class="label2">可创建测试包数量:</span>{{configInfo.numCreateScenePackage}}</div>
+                <div class="flexItem"><span class="label2">测试包最大场景数量:</span>{{configInfo.numScenePerPackage}}</div>
                 <div class="flexItem"></div>
                 <div class="flexItem"><span class="label2">仿真软件license:</span>{{clusterInfo.numSimulationLicense}}</div>
                 <div class="flexItem"><span class="label2">到期时间:</span>{{clusterInfo.dateSimulationLicense}}</div>
@@ -291,7 +291,7 @@
                 }).then(res => {
                     if (res.code == 200) {
                         if(res.info){
-                            this.clusterInfo = res,info
+                            this.clusterInfo = res.info
                         }
                     }else{
                         this.$message.error(res.message || '获取配置信息失败')

+ 1 - 0
src/views/sceneLibrary/components/generalizationDetail.vue

@@ -1551,6 +1551,7 @@ export default {
 
                 this.$axios({
                     method: "post",
+                    noLoading: true,
                     url: this.$api.sceneLibrary.saveSceneGeneralExample,
                     data,
                 })

+ 24 - 1
src/views/sceneLibrary/scenarioTestPackageManagementList.vue

@@ -158,6 +158,8 @@ export default {
                     share: "0",
                 },
             },
+            maxPackageCount: 0, // 可创建的最大场景包数量
+            createdPackageCount: 0, // 已创建的场景包数量
         };
     },
     methods: {
@@ -200,6 +202,11 @@ export default {
             this.doSearch();
         },
         addConfig() {
+            if (this.createdPackageCount >= this.maxPackageCount) {
+                this.$message.error("已达到测试包创建数量上限");
+                return;
+            }
+
             this.$router.push({ path: "/scenePacketList" });
         },
         shareRow(row) {
@@ -252,8 +259,24 @@ export default {
                 query: { packageId: row.packageId, share: row.share },
             });
         },
+        getCount() {
+            this.$axios({
+                method: "post",
+                url: this.$api.sceneLibrary.getSceneParam,
+                data: {},
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    this.maxPackageCount = res.info.numCreateScenePackage || 0;
+                    this.createdPackageCount = res.info.creatNum || 0;
+                } else {
+                    this.$message.error(res.message || "获取信息失败");
+                }
+            });
+        },
+    },
+    mounted() {
+        this.getCount();
     },
-    // created() {},
 };
 </script>
 

+ 22 - 0
src/views/sceneLibrary/scenePacketList.vue

@@ -453,6 +453,7 @@ export default {
             stepActive: 1, // 泛化步骤
             generalizationId: "", // 泛化详情id
             genUrlType: 1, // 1为从列表跳入的模板信息,2为泛化后的详情
+            maxSceneCount: 0, // 可创建的最大场景数量
         };
     },
 
@@ -923,6 +924,13 @@ export default {
                     return;
                 }
 
+                if (element.sceneNum > this.maxSceneCount) {
+                    this.$message.error(
+                        `场景数量不能超过${this.maxSceneCount}`
+                    );
+                    return;
+                }
+
                 if (element.children && element.children.length > 0) {
                     let total = 0;
                     let arr = [];
@@ -1004,6 +1012,19 @@ export default {
             this.templateViewVisible = false;
             this.treeData = [];
         },
+        getCount() {
+            this.$axios({
+                method: "post",
+                url: this.$api.sceneLibrary.getSceneParam,
+                data: {},
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    this.maxSceneCount = res.info.numScenePerPackage || 0;
+                } else {
+                    this.$message.error(res.message || "获取信息失败");
+                }
+            });
+        },
     },
 
     mounted() {
@@ -1029,6 +1050,7 @@ export default {
         }
 
         this.getRuleList();
+        this.getCount();
     },
 };
 </script>

+ 365 - 0
src/views/systemManagement/scenePacketDistributionDetail.vue

@@ -0,0 +1,365 @@
+<template>
+    <div>
+        <div class="infoBox">
+            <div class="info">
+                <span>账户名:</span>
+                <b>{{ info.userName || "" }}</b>
+            </div>
+            <div class="info">
+                <span>所属公司:</span>
+                <b>{{ info.company || "" }}</b>
+            </div>
+        </div>
+
+        <search-layout :needBox="true">
+            <template slot="searchItem1">
+                <span class="label">场景包名称</span>
+                <el-input
+                    v-model="searchParams.packageName"
+                    size="small"
+                    clearable
+                    placeholder="请输入"
+                    maxlength="60"
+                    @keyup.enter.native="doSearch"
+                >
+                </el-input>
+            </template>
+
+            <template slot="searchBtn1">
+                <el-button type="primary" @click="doSearch">查询</el-button>
+            </template>
+            <template slot="searchBtn2">
+                <el-button type="primary" @click="doReset">重置</el-button>
+            </template>
+        </search-layout>
+
+        <div class="flexBox summaryBox">
+            <div class="left flexBox">
+                <div class="num">
+                    场景总数:
+                    {{ total }}
+                </div>
+                <div class="numA">交通事故场景: {{ jtSceneNames }}</div>
+                <div class="numA">自然驾驶场景: {{ zrSceneNames }}</div>
+                <div class="numA">标准法规场景: {{ bzSceneNames }}</div>
+                <div class="num">泛化场景: {{ fhSceneNames }}</div>
+            </div>
+            <div class="right">
+                <el-button type="primary" @click="showNums">汇总</el-button>
+            </div>
+        </div>
+
+        <div class="isSelected">
+            <el-checkbox v-model="selected" @change="selectedShow"
+                >已选择</el-checkbox
+            >
+        </div>
+
+        <tableList
+            ref="table"
+            style="margin: 0 30px"
+            :columns="columns"
+            :getDataWay="getDataWay"
+            :pagination="pagination"
+            :checkedData="checkedArr"
+            :needLoadedCallBack="true"
+            :loadedCallBack="loadedCallBack"
+            :needSelectedCallBack="true"
+            :selectedCallBack="selectedCallBack"
+            :selectedAllCallBack="selectedAllCallBack"
+            index
+            selection
+        >
+        </tableList>
+
+        <div class="btns">
+            <el-button type="primary" @click="save">确定</el-button>
+            <el-button type="primary" plain @click="cancel">取消</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import searchLayout from "@/components/grid/searchLayout";
+import tableList from "@/components/grid/TableList";
+
+export default {
+    name: "scenePacketDistributionDetail", // 场景包分配详情
+    components: { searchLayout, tableList },
+    data() {
+        return {
+            searchParams: {
+                //搜索参数
+                packageName: "", // 账户名称
+            },
+            columns: [
+                {
+                    label: "场景包名称",
+                    prop: "packageName",
+                },
+                {
+                    label: "描述",
+                    prop: "sceneDescribe",
+                    showOverflowTooltip: true,
+                },
+                {
+                    label: "自然驾驶场景",
+                    prop: "zrCount",
+                },
+                {
+                    label: "交通事故场景",
+                    prop: "jtCount",
+                },
+                {
+                    label: "标准法规场景",
+                    prop: "bzCount",
+                },
+                {
+                    label: "泛化场景",
+                    prop: "fhCount",
+                },
+            ],
+            pagination: {
+                //分页使用
+                currentPage: 1,
+                pageSize: 10,
+                position: "right",
+                pageSizes: [10, 30, 50, 100, 200],
+                layout: "sizes, total, prev, pager, next, jumper",
+            },
+            getDataWay: {
+                //加载表格数据
+                dataType: "url",
+                type: "post",
+                // firstRequest: false,
+                data: this.$api.systemManagement.querySystemScenePackageList,
+                param: {},
+            },
+            selected: false, // 是否选中展示已选择项
+            checkedArr: [], // 列表当前页已选
+            checkedNames: [], // 列表所有已选
+            total: 0,
+            jtSceneNames: 0,
+            zrSceneNames: 0,
+            bzSceneNames: 0,
+            fhSceneNames: 0,
+            info: {},
+        };
+    },
+
+    methods: {
+        doSearch() {
+            let data = {
+                ...this.searchParams,
+            };
+
+            if (this.selected) {
+                data.packageNames = this.checkedNames;
+            } else {
+                data.packageNames = null;
+            }
+
+            this.refreshList(data);
+        },
+        //刷新table
+        refreshList(param) {
+            param
+                ? this.$refs["table"].loadData(param)
+                : this.$refs["table"].loadData();
+        },
+        doReset() {
+            this.searchParams = {
+                packageName: "",
+            };
+            this.doSearch();
+        },
+        // 数据加载后的回调
+        loadedCallBack() {
+            this.checkedArr = [];
+            this.$refs.table.tableData.forEach((i) => {
+                if (this.checkedNames.includes(i.packageName)) {
+                    // 显示已选中的项
+                    this.$refs.table.$refs.ListTable.toggleRowSelection(
+                        i,
+                        true
+                    );
+                    this.checkedArr.push(i);
+                }
+            });
+        },
+        // 用户勾选完执行函数后的回调
+        selectedCallBack(row, type) {
+            if (type === 1) {
+                if (!this.checkedNames.includes(row.packageName)) {
+                    this.checkedNames.push(row.packageName);
+                }
+            } else {
+                let index = this.checkedNames.indexOf(row.packageName);
+                if (index > -1) {
+                    this.checkedNames.splice(index, 1);
+                }
+            }
+        },
+        // 用户勾选全选执行函数后的回调
+        selectedAllCallBack(selection, type) {
+            if (type === 1) {
+                selection.forEach((i) => {
+                    if (!this.checkedNames.includes(i.packageName)) {
+                        this.checkedNames.push(i.packageName);
+                    }
+                });
+            } else {
+                this.$refs.table.tableData.forEach((i) => {
+                    let index = this.checkedNames.indexOf(i.packageName);
+                    if (index > -1) {
+                        this.checkedNames.splice(index, 1);
+                    }
+                });
+            }
+        },
+        selectedShow() {
+            this.doSearch();
+        },
+        showNums() {
+            this.$axios({
+                method: "post",
+                url: this.$api.systemManagement.querySystemScenePackageListByTJ,
+                data: { packageNames: this.checkedNames },
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    res.info.forEach((i) => {
+                        switch (i.scene_type) {
+                            case "1":
+                                this.zrSceneNames = i.aaa;
+                                break;
+                            case "2":
+                                this.bzSceneNames = i.aaa;
+                                break;
+                            case "3":
+                                this.jtSceneNames = i.aaa;
+                                break;
+                            case "4":
+                                this.fhSceneNames = i.aaa;
+                                break;
+                            default:
+                                break;
+                        }
+                    });
+
+                    this.total =
+                        this.zrSceneNames +
+                        this.bzSceneNames +
+                        this.jtSceneNames +
+                        this.fhSceneNames;
+                } else {
+                    this.$message.error(res.message || "获取信息失败");
+                }
+            });
+        },
+        save() {
+            if (this.checkedNames.length === 0) {
+                this.$message.error("请先选择场景包");
+                return;
+            }
+
+            let data = Object.assign({}, this.info, {
+                packageNames: this.checkedNames,
+            });
+
+            this.$axios({
+                method: "post",
+                url: this.$api.systemManagement.savePackageByUserId,
+                data,
+            }).then((res) => {
+                if (res.code == 200) {
+                    this.$message.success("保存成功");
+                    this.cancel();
+                } else {
+                    this.$message.error(res.message || "保存失败");
+                }
+            });
+        },
+        cancel() {
+            this.$router.replace({ path: "/scenePacketDistributionList" });
+        },
+    },
+
+    mounted() {
+        if (this.$route.query.userName) {
+            this.$axios({
+                method: "post",
+                url: this.$api.systemManagement.queryPackageByUserId,
+                data: { userName: this.$route.query.userName },
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    this.info = res.info;
+                    this.checkedNames = res.info.packageNames || [];
+                    this.loadedCallBack();
+                    this.showNums();
+                } else {
+                    this.$message.error(res.message || "获取信息失败");
+                }
+            });
+        }
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.infoBox {
+    display: flex;
+    padding: 24px 12px 0;
+
+    .info {
+        display: flex;
+        flex: 1;
+        margin-right: 20px;
+        word-break: break-all;
+
+        span {
+            display: block;
+            width: 70px;
+            padding-right: 10px;
+            text-align: right;
+        }
+
+        b {
+            flex: 1;
+            font-weight: normal;
+        }
+    }
+}
+
+.summaryBox {
+    padding: 30px 40px 0;
+    color: @themeColor;
+    font-size: 18px;
+    font-weight: bold;
+
+    .left {
+        margin-right: 30px;
+        line-height: 32px;
+
+        > div {
+            margin-right: 30px;
+        }
+
+        .num {
+            min-width: 120px;
+        }
+
+        .numA {
+            min-width: 156px;
+        }
+    }
+}
+
+.isSelected {
+    padding: 30px 0 10px 40px;
+}
+
+.btns {
+    padding-top: 30px;
+    text-align: center;
+}
+</style>

+ 164 - 0
src/views/systemManagement/scenePacketDistributionList.vue

@@ -0,0 +1,164 @@
+<template>
+    <div>
+        <search-layout :needBox="true">
+            <template slot="searchItem1">
+                <span class="label">账户名称</span>
+                <el-input
+                    v-model="searchParams.userName"
+                    size="small"
+                    clearable
+                    placeholder="请输入"
+                    maxlength="60"
+                    @keyup.enter.native="doSearch"
+                >
+                </el-input>
+            </template>
+            <template slot="searchItem2">
+                <span class="label">操作时间</span>
+                <el-date-picker
+                    v-model="createDate"
+                    type="daterange"
+                    format="yyyy-MM-dd"
+                    value-format="yyyy-MM-dd"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                >
+                </el-date-picker>
+            </template>
+
+            <template slot="searchBtn1">
+                <el-button type="primary" @click="doSearch">查询</el-button>
+            </template>
+            <template slot="searchBtn2">
+                <el-button type="primary" @click="doReset">重置</el-button>
+            </template>
+        </search-layout>
+
+        <tableList
+            ref="table"
+            style="margin: 30px"
+            :columns="columns"
+            :getDataWay="getDataWay"
+            :pagination="pagination"
+            index
+        >
+            <el-table-column
+                label="操作"
+                slot="cgInfos"
+                align="center"
+                width="100"
+            >
+                <template v-slot="scope">
+                    <i
+                        @click="editRow(scope.row.userName)"
+                        class="el-icon-edit-outline elIcon"
+                        title="编辑"
+                    ></i>
+                </template>
+            </el-table-column>
+        </tableList>
+    </div>
+</template>
+
+<script>
+import searchLayout from "@/components/grid/searchLayout";
+import tableList from "@/components/grid/TableList";
+
+export default {
+    name: "scenePacketDistributionList", // 场景包分配列表
+    components: { searchLayout, tableList },
+    data() {
+        return {
+            searchParams: {
+                //搜索参数
+                userName: "", // 账户名称
+                yearMin: "", // 操作时间起
+                yearMax: "", // 操作时间止
+            },
+            createDate: "",
+            columns: [
+                {
+                    label: "账户名称",
+                    prop: "userName",
+                },
+                {
+                    label: "场景包名称",
+                    prop: "packageName",
+                    showOverflowTooltip: true,
+                },
+                {
+                    label: "操作时间",
+                    prop: "modifyTime",
+                },
+                {
+                    label: "操作",
+                    prop: "cgInfos",
+                    template: true,
+                },
+            ],
+            pagination: {
+                //分页使用
+                currentPage: 1,
+                pageSize: 10,
+                position: "right",
+                pageSizes: [10, 30, 50, 100, 200],
+                layout: "sizes, total, prev, pager, next, jumper",
+            },
+            getDataWay: {
+                //加载表格数据
+                dataType: "url",
+                type: "post",
+                // firstRequest: false,
+                data: this.$api.systemManagement.queryPackageByUserIdList,
+                param: {},
+            },
+        };
+    },
+
+    methods: {
+        doSearch() {
+            if (this.createDate) {
+                this.searchParams.yearMin = `${this.createDate[0]}`;
+                this.searchParams.yearMax = `${this.createDate[1]}`;
+            } else {
+                this.searchParams.yearMin = "";
+                this.searchParams.yearMax = "";
+            }
+
+            let pageMap = {
+                userName: this.searchParams.userName,
+                yearMin: this.searchParams.yearMin,
+                yearMax: this.searchParams.yearMax,
+            };
+            this.refreshList(pageMap);
+        },
+        //刷新table
+        refreshList(param) {
+            param
+                ? this.$refs["table"].loadData(param)
+                : this.$refs["table"].loadData();
+        },
+        doReset() {
+            this.searchParams = {
+                userName: "",
+                yearMin: "",
+                yearMax: "",
+            };
+            this.createDate = "";
+            this.doSearch();
+        },
+        editRow(userName) {
+            this.$router.push({
+                path: "/scenePacketDistributionDetail",
+                query: { userName },
+            });
+        },
+    },
+
+    // mounted() {},
+};
+</script>
+
+<style lang='less' scoped>
+</style>

+ 4 - 5
src/views/systemManagement/scenePacketListManagement/index.vue

@@ -153,9 +153,9 @@ export default {
         return {
             searchParams: {
                 //搜索参数
-                packageName: "", //场景包名称
-                yearMin: "", //创建时间起
-                yearMax: "", //创建时间止
+                packageName: "", // 场景包名称
+                yearMin: "", // 创建时间起
+                yearMax: "", // 创建时间止
             },
             createDate: "",
             columns: [
@@ -185,8 +185,7 @@ export default {
                 },
                 {
                     label: "创建时间",
-                    prop: "asd",
-                    template: true,
+                    prop: "createTime",
                 },
                 {
                     label: "已配置账户",