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

坐席电话控件面板对接

zhangchong 2 жил өмнө
parent
commit
93f19f6af4
41 өөрчлөгдсөн 1011 нэмэгдсэн , 689 устгасан
  1. 0 8
      index.html
  2. BIN
      public/favicon1.ico
  3. 3 3
      src/api/deviceManagement/tels.ts
  4. 65 20
      src/api/login/user.ts
  5. 12 1
      src/api/system/user.ts
  6. 14 3
      src/layout/logo/index.vue
  7. 13 7
      src/layout/navBars/breadcrumb/index.vue
  8. 0 181
      src/layout/navBars/breadcrumb/phoneControls.vue
  9. 364 0
      src/layout/navBars/breadcrumb/telControl.vue
  10. 0 5
      src/layout/navBars/breadcrumb/user.vue
  11. 11 5
      src/layout/navBars/tagsView/tagsView.vue
  12. 14 26
      src/layout/navMenu/subThreeItem.vue
  13. 3 2
      src/stores/interface/index.ts
  14. 31 0
      src/stores/telStatus.ts
  15. 1 1
      src/stores/themeConfig.ts
  16. 4 2
      src/stores/userInfo.ts
  17. 0 31
      src/stores/userState.ts
  18. 30 16
      src/views/deviceManagement/ivrCategroy/index.vue
  19. 16 10
      src/views/deviceManagement/ivrList/index.vue
  20. 2 2
      src/views/deviceManagement/tels/index.vue
  21. 13 5
      src/views/deviceManagement/telsGroup/index.vue
  22. 1 1
      src/views/home/index.vue
  23. 1 1
      src/views/system/dept/component/addDept.vue
  24. 1 1
      src/views/system/dic/component/addDic.vue
  25. 1 1
      src/views/system/institutionalUsers/roles/component/addRole.vue
  26. 2 2
      src/views/system/institutionalUsers/roles/component/editRole.vue
  27. 37 24
      src/views/system/institutionalUsers/roles/component/permission.vue
  28. 4 4
      src/views/system/institutionalUsers/roles/index.vue
  29. 74 11
      src/views/system/institutionalUsers/user/component/addUser.vue
  30. 70 6
      src/views/system/institutionalUsers/user/component/editUser.vue
  31. 0 133
      src/views/system/institutionalUsers/user/component/setOrg.vue
  32. 16 7
      src/views/system/institutionalUsers/user/component/setRole.vue
  33. 6 13
      src/views/system/institutionalUsers/user/index.vue
  34. 34 25
      src/views/system/menu/component/addMenu.vue
  35. 47 32
      src/views/system/menu/component/editMenu.vue
  36. 4 4
      src/views/system/menu/index.vue
  37. 21 19
      src/views/system/organizational/component/addOrg.vue
  38. 31 23
      src/views/system/organizational/component/editOrg.vue
  39. 56 45
      src/views/system/organizational/index.vue
  40. 1 1
      src/views/system/systemParameter/index.vue
  41. 8 8
      src/views/telslog/blacklist/index.vue

+ 0 - 8
index.html

@@ -1,11 +1,3 @@
-<!--
- * @Author: zc
- * @Description: 
- * @version: 
- * @Date: 2022-10-21 09:01:23
- * @LastEditors: 
- * @LastEditTime: 2022-11-09 14:24:15
--->
 <!DOCTYPE html>
 <html lang="zh-CN">
 	<head>

BIN
public/favicon1.ico


+ 3 - 3
src/api/deviceManagement/tels.ts

@@ -4,18 +4,18 @@
  * @version: 
  * @Date: 2022-08-26 14:43:12
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-10 11:49:34
+ * @LastEditTime: 2022-11-15 14:17:01
  */
 import request from '/@/utils/request';
 
 /**
- * @description: 获取分机列表
+ * @description: 获取所有分机列表
  * @param {object} params
  * @return {*}
  */
 export const getTelsList = (params?: object) => {
 	return request({
-		url: '/api/v1/Tel/tels-frequency',
+		url: '/api/v1/Pbx/query-tels',
 		method: 'get',
 		params: params,
 	});

+ 65 - 20
src/api/login/user.ts

@@ -4,22 +4,70 @@
  * @version:
  * @Date: 2022-08-09 16:19:55
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-12 11:01:03
+ * @LastEditTime: 2022-11-15 15:45:50
  */
 import request from '/@/utils/request';
 /**
- * 上班
+ * 修改密码
+ * @param data
+ */
+export function changePwd(data:object) {
+    return request({
+        url: `/api/v1/User/change-pwd`,
+        method: 'post',
+        data
+    });
+}
+/**
+ * 获取当前用户所有按钮
+ * @param 
+ */
+ export function getMyBtns() {
+    return request({
+        url: `/api/v1/Home/get-my-auth-button`,
+        method: 'get'
+    });
+}
+/**
+ * @description: 获取所有分机列表
+ * @param {object} params
+ * @return {*}
+ */
+ export const getTelsList = (params?: object) => {
+    return request({
+        url: '/api/v1/Tel/tels-frequency',
+        method: 'get',
+        params: params,
+    });
+};
+/**
+ * @description: 获取当前用户分机列表
+ * @param {object} params
+ * @return {*}
+ */
+ export const getTelList = (params?: object) => {
+    return request({
+        url: '/api/v1/Tel/tel-frequency',
+        method: 'get',
+        params: params,
+    });
+};
+
+
+ /*  下面是话机状态操作 */
+/**
+ * 签入
  * @param telNo 分机编号
  * @returns 返回接口数据
  */
-export function onDuty(telNo: string) {
+ export function onDuty(telNo: string) {
     return request({
         url: `/api/v1/User/on-duty/${telNo}`,
         method: 'post',
     });
 }
 /**
- * 下班
+ * 签出
  * @param data 分机编号
  * @returns 返回接口数据
  */
@@ -31,9 +79,9 @@ export function offDuty(data?: string) {
     });
 }
 /**
- * 查寻当前用户状态
+ * 查寻当前用户分机状态
  */
-export function getUserState() {
+export function getTelStatus() {
     return request({
         url: `/api/v1/User/state`,
         method: 'get'
@@ -44,7 +92,7 @@ export function getUserState() {
  */
 export function telRest() {
     return request({
-        url: `/api/v1/Tel/rest`,
+        url: `/api/v1/Pbx/rest`,
         method: 'put',
     });
 }
@@ -53,28 +101,25 @@ export function telRest() {
  */
 export function telUnrest() {
     return request({
-        url: `/api/v1/Tel/unrest`,
+        url: `/api/v1/Pbx/un-rest`,
         method: 'put'
     });
 }
 /**
- * 修改密码
- * @param data
+ * 通话保持
  */
-export function changePwd(data:object) {
+ export function telHold() {
     return request({
-        url: `/api/v1/User/change-pwd`,
-        method: 'post',
-        data
+        url: `/api/v1/Pbx/hold`,
+        method: 'put'
     });
 }
 /**
- * 获取当前用户所有按钮
- * @param 
+ * 结束保持
  */
- export function getMyBtns() {
+ export function telUnhold() {
     return request({
-        url: `/api/v1/Home/get-my-auth-button`,
-        method: 'get'
+        url: `/api/v1/Pbx/un-hold`,
+        method: 'put'
     });
-} 
+}

+ 12 - 1
src/api/system/user.ts

@@ -4,7 +4,7 @@
  * @version:
  * @Date: 2022-08-09 16:19:55
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-11 16:42:27
+ * @LastEditTime: 2022-11-15 10:21:44
  */
 import request from '/@/utils/request';
 
@@ -102,3 +102,14 @@ export const restPwd = (userId: string) => {
 		data
 	});
 };
+/**
+ * @description: 获取可用组织架构树形
+ * @param {string}  
+ * @return {*}
+ */
+ export const getcanuseorg = () => {
+	return request({
+		url: `/api/v1/Org/getcanuseorg`,
+		method: 'get'
+	});
+};

+ 14 - 3
src/layout/logo/index.vue

@@ -4,13 +4,13 @@
  * @version: 
  * @Date: 2022-10-21 09:01:22
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-09 10:04:06
+ * @LastEditTime: 2022-11-15 16:19:26
 -->
 <template>
-	<div class="layout-logo" v-if="setShowLogo" @click="onThemeConfigChange">
+	<div class="layout-logo" :style="'height:'+height+'px;'" v-if="setShowLogo" @click="onThemeConfigChange">
 		<img :src="logo" class="layout-logo-medium-img" alt=""/>
 	</div>
-	<div class="layout-logo-size" v-else @click="onThemeConfigChange">
+	<div class="layout-logo-size" :style="'height:'+height+'px;'" v-else @click="onThemeConfigChange">
 		<img src="/src/assets/images/logoMini.png" class="layout-logo-size-img" alt=""/>
 	</div>
 </template>
@@ -19,6 +19,7 @@
 import { computed, defineComponent } from 'vue';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
+import { useUserInfo } from '/@/stores/userInfo';
 
 import logo from '/@/assets/images/logo.png';
 export default defineComponent({
@@ -26,11 +27,20 @@ export default defineComponent({
 	setup() {
 		const storesThemeConfig = useThemeConfig();
 		const { themeConfig } = storeToRefs(storesThemeConfig);
+		const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
 		// 设置 logo 的显示。classic 经典布局默认显示 logo
 		const setShowLogo = computed(() => {
 			let { isCollapse, layout } = themeConfig.value;
 			return !isCollapse || layout === 'classic' || document.body.clientWidth < 1000;
 		});
+		const height = computed(()=>{
+			if(userInfos.value.showTelControl){// 是否展示坐席话机控制面板
+				return 110;
+			}else{
+				return 91;
+			}
+		})
 		// logo 点击实现菜单展开/收起
 		const onThemeConfigChange = () => {
 			if (themeConfig.value.layout === 'transverse') return false;
@@ -41,6 +51,7 @@ export default defineComponent({
 			setShowLogo,
 			themeConfig,
 			onThemeConfigChange,
+			height,
 		};
 	},
 });

+ 13 - 7
src/layout/navBars/breadcrumb/index.vue

@@ -1,8 +1,8 @@
 <template>
-	<div class="layout-navbars-breadcrumb-index" :class="isShowControls ? 'showControl' : ''">
+	<div class="layout-navbars-breadcrumb-index" :class="userInfosConfig.showTelControl ? 'showControl' : ''">
 		<Logo v-if="setIsShowLogo" />
 		<Breadcrumb />
-		<PhoneControls v-if="isShowControls"/>
+		<TelControl v-if="userInfosConfig.showTelControl"/>
 		<div v-else style="flex:1"></div>
 		<Horizontal :menuList="menuList" v-if="isLayoutTransverse" />
 		<User />
@@ -10,16 +10,17 @@
 </template>
 
 <script lang="ts">
-import { computed, reactive, toRefs, onMounted, onUnmounted, getCurrentInstance, defineComponent, ref } from 'vue';
+import { computed, reactive, toRefs, onMounted, onUnmounted, getCurrentInstance, defineComponent } from 'vue';
 import { useRoute } from 'vue-router';
 import { storeToRefs } from 'pinia';
 import { useRoutesList } from '/@/stores/routesList';
 import { useThemeConfig } from '/@/stores/themeConfig';
+import { useUserInfo } from '/@/stores/userInfo';
 import Breadcrumb from '/@/layout/navBars/breadcrumb/breadcrumb.vue';
 import User from '/@/layout/navBars/breadcrumb/user.vue';
 import Logo from '/@/layout/logo/index.vue';
 import Horizontal from '/@/layout/navMenu/horizontal.vue';
-import PhoneControls from "/@/layout/navBars/breadcrumb/phoneControls.vue"
+import TelControl from "/@/layout/navBars/breadcrumb/telControl.vue"
 
 // 定义接口来定义对象的类型
 interface IndexState {
@@ -28,18 +29,23 @@ interface IndexState {
 
 export default defineComponent({
 	name: 'layoutBreadcrumbIndex',
-	components: { Breadcrumb, User, Logo, Horizontal, PhoneControls },
+	components: { Breadcrumb, User, Logo, Horizontal, TelControl },
 	setup() {
 		const { proxy } = <any>getCurrentInstance();
 		const stores = useRoutesList();
 		const storesThemeConfig = useThemeConfig();
 		const { themeConfig } = storeToRefs(storesThemeConfig);
 		const { routesList } = storeToRefs(stores);
+		const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
 		const route = useRoute();
-		const isShowControls = ref(true)
 		const state = reactive<IndexState>({
 			menuList: [],
 		});
+		// 获取用户信息配置
+		const userInfosConfig = computed(() => {
+			return userInfos.value;
+		});
 		// 设置 logo 显示/隐藏
 		const setIsShowLogo = computed(() => {
 			let { isShowLogo, layout } = themeConfig.value;
@@ -106,7 +112,7 @@ export default defineComponent({
 		return {
 			setIsShowLogo,
 			isLayoutTransverse,
-			isShowControls,
+			userInfosConfig,
 			...toRefs(state),
 		};
 	},

+ 0 - 181
src/layout/navBars/breadcrumb/phoneControls.vue

@@ -1,181 +0,0 @@
-<!--
- * @Author: zc
- * @Description: 电话控件
- * @version: 
- * @Date: 2022-11-08 14:16:48
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-09 14:17:20
--->
-<template>
-    <div class="phoneControls">
-        <div class="infos">
-            <div><span>分机号:</span>1123131</div>
-            <div class="bottom_line"><span>状态:</span><b class="qianru_status">签入</b></div>
-        </div>
-        <div class="btns">
-            <div class="item" :class="active.includes('qianru') ? 'active' : ''" v-if="status === 1" @click="onControlClick('qianru')">
-                <img v-if="active.includes('qianru')" src="/src/assets/images/phoneControls/qianru_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/qinaru_grey.png' : '/src/assets/images/phoneControls/qinaru_blue.png'" alt="">
-                <span>签入</span>
-            </div>
-            <div class="item" v-else @click="onControlClick('qianchu')">
-                <img src="/src/assets/images/phoneControls/qianchu_blue.png" alt="">
-                <span>签出</span>
-            </div>
-            <div class="item" :class="active.includes('guaduan') ? 'active' : ''"  @click="onControlClick('guaduan')">
-                <img v-if="active.includes('guaduan')" src="/src/assets/images/phoneControls/guaduan_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/guaduan_grey.png' : '/src/assets/images/phoneControls/guaduan_blue.png'" alt="">
-                <span>挂断</span>
-            </div>
-            <div class="item" :class="active.includes('xiaoxiu') ? 'active' : ''"  @click="onControlClick('xiaoxiu')">
-                <img v-if="active.includes('xiaoxiu')" src="/src/assets/images/phoneControls/xiaoxiu_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/xiaoxiu_grey.png' : '/src/assets/images/phoneControls/xiaoxiu_blue.png'" alt="">
-                <span>小休</span>
-            </div>
-            <div class="item" :class="active.includes('baochi') ? 'active' : ''"  @click="onControlClick('baochi')">
-                <img v-if="active.includes('baochi')" src="/src/assets/images/phoneControls/baochi_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/baochi_grey.png' : '/src/assets/images/phoneControls/baochi_blue.png'" alt="">
-                <span>保持</span>
-            </div>
-            <div class="item" :class="active.includes('jingyin') ? 'active' : ''" @click="onControlClick('jingyin')">
-                <img v-if="active.includes('jingyin')" src="/src/assets/images/phoneControls/jingyin_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/jingyin_grey.png' : '/src/assets/images/phoneControls/jingyin_blue.png'" alt="">
-                <span>静音</span>
-            </div>
-            <div class="item" :class="active.includes('zhuanjie') ? 'active' : ''" @click="onControlClick('zhuanjie')">
-                <img v-if="active.includes('zhuanjie')" src="/src/assets/images/phoneControls/zhuanjie_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/zhuanjie_grey.png' : '/src/assets/images/phoneControls/zhuanjie_blue.png'" alt="">
-                <span>转接</span>
-            </div>
-            <div class="item" :class="active.includes('sanfang') ? 'active' : ''" @click="onControlClick('sanfang')">
-                <img v-if="active.includes('sanfang')" src="/src/assets/images/phoneControls/sanfang_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/sanfang_grey.png' : '/src/assets/images/phoneControls/sanfang_blue.png'" alt="">
-                <span>三方会议</span>
-            </div>
-            <div class="item" :class="active.includes('waihu') ? 'active' : ''" @click="onControlClick('waihu')">
-                <img v-if="active.includes('waihu')" src="/src/assets/images/phoneControls/waihu_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/waihu_grey.png' : '/src/assets/images/phoneControls/waihu_blue.png'" alt="">
-                <span>外呼</span>
-            </div>
-            <div class="item" :class="active.includes('hujiaozhuanyi') ? 'active' : ''" @click="onControlClick('zhuanyi')">
-                <img v-if="active.includes('hujiaozhuanyi')" src="/src/assets/images/phoneControls/hujiaozhuanyi_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/hujiaozhuanyi_grey.png' : '/src/assets/images/phoneControls/hujiaozhuanyi_blue.png'" alt="">
-                <span>呼叫转移</span>
-            </div>
-            <div class="item" :class="active.includes('pingjia') ? 'active' : ''" @click="onControlClick('pingjia')">
-                <img v-if="active.includes('pingjia')" src="/src/assets/images/phoneControls/pingjia_white.png" alt="">
-                <img v-else :src="status === 1 ? '/src/assets/images/phoneControls/pingjia_grey.png' : '/src/assets/images/phoneControls/pingjia_blue.png'" alt="">
-                <span>评价</span>
-            </div>
-        </div>
-    </div>
-    <div class="seizeSeat-box">
-
-    </div>
-</template>
-
-<script setup lang="ts">
-import {reactive,toRefs} from "vue";
-const state = reactive({
-    status:2,
-    active:['guaduan','waihu','pingjia']
-})
-const {status,active} = toRefs(state);
-// 点击事件
-const onControlClick = (val:string)=>{
-    // console.log(val)
-    switch (val) {
-        case 'qianru':
-            
-            break;
-    
-        default:
-            break;
-    }
-}
-</script>
-
-<style scoped lang="scss">
-.seizeSeat-box{
-    display: none;
-}
-.phoneControls {
-    display: flex;
-    flex: 1;
-    background: #FFFFFF;
-    box-shadow: 0px 1px 8px 0px rgba(0, 15, 49, 0.1);
-    border-bottom-left-radius: 90px;
-    border-bottom-right-radius: 90px;
-    padding: 0 52px;
-    color: #333;
-    height: 100%;
-    .infos {
-        margin: 20px 0;
-        text-align: left;
-        width: 120px;
-        .bottom_line {
-            padding-top: 5px;
-        }
-
-        .qianru_status {
-            color: var(--el-color-primary);
-            font-weight: normal;
-        }
-
-        span {
-            display: inline-block;
-            width: 60px;
-            text-align: right;
-        }
-    }
-
-    .btns {
-        display: flex;
-        margin-left: 10px;
-        width: calc(100% - 120px);
-        justify-content: space-between;
-        .item {
-            text-align: center;
-            cursor: pointer;
-            width: 100%;
-            height: 100%;
-            &:hover{
-                transition: inherit;
-                color: var(--el-color-primary) !important;
-                background-color: var(--hotline-color-seting-main) !important;
-            }
-            img {
-                display: block;
-                margin: 0 auto;
-                padding-top: 20px;
-            }
-            span {
-                padding-top: 10px;
-            }
-        }
-        .active{
-            color: #fff;
-            background-image: url('src/assets/images/phoneControls/active.png');
-            background-repeat: no-repeat;
-            background-size: 100% 100%;
-            height: calc(100% + 20px);
-            background-color: var(--hotline-bg-main-color);
-            img {
-                display: block;
-                margin: 0 auto;
-                padding-top: 30px;
-            }
-            span {
-                padding-top: 10px;
-            }
-             &:hover{
-                transition: inherit;
-                color: var(--hotline-color-white) !important;
-                background-color: var(--hotline-bg-main-color) !important;
-            }
-        }
-        
-    }
-
-}
-</style>

+ 364 - 0
src/layout/navBars/breadcrumb/telControl.vue

@@ -0,0 +1,364 @@
+<!--
+ * @Author: zc
+ * @Description: 电话控件
+ * @version: 
+ * @Date: 2022-11-08 14:16:48
+ * @LastEditors: Please set LastEditors
+ * @LastEditTime: 2022-11-15 16:36:17
+-->
+<template>
+    <div class="phoneControls">
+        <!-- {{telStatus.isOnDuty}} -->
+        <div class="infos">
+            <div><span>分机号:</span>{{telStatus.telNo}}</div>
+            <div class="bottom_line"><span>状态:</span><b class="qianru_status">{{telStatus.isOnDuty ? '签入' : '签出'}}</b></div>
+        </div>
+        <div class="btns">
+            <!-- 签入签出 -->
+            <div class="item"  :class="active.includes('qianchu') ? 'active' : '',userInfos.authBtnList.includes('999101') ? '' : 'disabled'"  @click="onControlClick('qianchu')" v-if="telStatus.isOnDuty">
+                <img v-if="active.includes('qianchu')" src="/src/assets/images/phoneControls/qianru_white.png" alt="">
+                <img v-else src="/src/assets/images/phoneControls/qianchu_blue.png" alt="">
+                <span>签出</span>
+            </div>
+            <div class="item " :class="active.includes('qianru') ? 'active' : '',userInfos.authBtnList.includes('999102') ? '' : 'disabled'"  @click="onControlClick('qianru')" v-else>
+                <img v-if="active.includes('qianru')" src="/src/assets/images/phoneControls/qianru_white.png" alt="">
+                <img v-else src="/src/assets/images/phoneControls/qinaru_grey.png" alt="">
+                <span>签入</span>
+            </div>
+            <!-- 挂断 -->
+            <div class="item" :class="active.includes('guaduan') ? 'active' : ''"  @click="onControlClick('guaduan')">
+                <img v-if="active.includes('guaduan')" src="/src/assets/images/phoneControls/guaduan_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/guaduan_blue.png' : '/src/assets/images/phoneControls/guaduan_grey.png'" alt="">
+                <span>挂断</span>
+            </div>
+            <!-- 小休和结束休息 -->
+            <div class="item" :class="active.includes('xiaoxiu') ? 'active' : '',userInfos.authBtnList.includes('999104') ? '' : 'disabled'"  @click="onControlClick('xiaoxiuEnd')" v-if="telStatus.isResting">
+                <img v-if="active.includes('xiaoxiu')" src="/src/assets/images/phoneControls/xiaoxiu_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/xiaoxiu_blue.png' : '/src/assets/images/phoneControls/xiaoxiu_grey.png'" alt="">
+                <span>结束小休</span>
+            </div>
+            <div class="item" :class="active.includes('xiaoxiu') ? 'active' : '',userInfos.authBtnList.includes('999103') ? '' : 'disabled'"  @click="onControlClick('xiaoxiu')" v-else>
+                <img v-if="active.includes('xiaoxiu')" src="/src/assets/images/phoneControls/xiaoxiu_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/xiaoxiu_blue.png' : '/src/assets/images/phoneControls/xiaoxiu_grey.png'" alt="">
+                <span>小休</span>
+            </div>
+            
+            <!-- 保持和取消保持 -->
+            <div class="item" :class="active.includes('baochi') ? 'active' : ''"  @click="onControlClick('baochi')">
+                <img v-if="active.includes('baochi')" src="/src/assets/images/phoneControls/baochi_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/baochi_blue.png' : '/src/assets/images/phoneControls/baochi_grey.png'" alt="">
+                <span>保持</span>
+            </div>
+
+            <div class="item" :class="active.includes('jingyin') ? 'active' : ''" @click="onControlClick('jingyin')">
+                <img v-if="active.includes('jingyin')" src="/src/assets/images/phoneControls/jingyin_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/jingyin_blue.png' : '/src/assets/images/phoneControls/jingyin_grey.png'" alt="">
+                <span>静音</span>
+            </div>
+
+            <div class="item" :class="active.includes('zhuanjie') ? 'active' : ''" @click="onControlClick('zhuanjie')">
+                <img v-if="active.includes('zhuanjie')" src="/src/assets/images/phoneControls/zhuanjie_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/zhuanjie_blue.png' : '/src/assets/images/phoneControls/zhuanjie_grey.png'" alt="">
+                <span>转接</span>
+            </div>
+
+            <div class="item" :class="active.includes('sanfang') ? 'active' : ''" @click="onControlClick('sanfang')">
+                <img v-if="active.includes('sanfang')" src="/src/assets/images/phoneControls/sanfang_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/sanfang_blue.png' : '/src/assets/images/phoneControls/sanfang_grey.png'" alt="">
+                <span>三方会议</span>
+            </div>
+
+            <div class="item" :class="active.includes('waihu') ? 'active' : ''" @click="onControlClick('waihu')">
+                <img v-if="active.includes('waihu')" src="/src/assets/images/phoneControls/waihu_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/waihu_blue.png' : '/src/assets/images/phoneControls/waihu_grey.png'" alt="">
+                <span>外呼</span>
+            </div>
+
+            <div class="item" :class="active.includes('hujiaozhuanyi') ? 'active' : ''" @click="onControlClick('zhuanyi')">
+                <img v-if="active.includes('hujiaozhuanyi')" src="/src/assets/images/phoneControls/hujiaozhuanyi_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/hujiaozhuanyi_blue.png' : '/src/assets/images/phoneControls/hujiaozhuanyi_grey.png'" alt="">
+                <span>呼叫转移</span>
+            </div>
+
+            <div class="item" :class="active.includes('pingjia') ? 'active' : ''" @click="onControlClick('pingjia')">
+                <img v-if="active.includes('pingjia')" src="/src/assets/images/phoneControls/pingjia_white.png" alt="">
+                <img v-else :src="telStatus.isOnDuty ? '/src/assets/images/phoneControls/pingjia_blue.png' : '/src/assets/images/phoneControls/pingjia_grey.png'" alt="">
+                <span>评价</span>
+            </div>
+        </div>
+    </div>
+    <!-- 占位标签 -->
+    <div class="seizeSeat-box"></div>
+    <!-- 功能 -->
+    <!-- 签入 -->
+    <el-dialog v-model="showDutyDialog" draggable title="签入" width="400px">
+        <el-form :model="dutyForm" label-width="80px" ref="dutyFormRef">
+            <el-form-item label="分机" prop="telNo" :rules="[{required: true,message: '请选择需要签入的分机',trigger: 'change'}]">
+                <el-select v-model="dutyForm.telNo" placeholder="请选择需要签入的分机" class="w100">
+                    <el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+                </el-select>
+            </el-form-item>
+        </el-form>
+        
+        <template #footer>
+            <span class="dialog-footer">
+                <el-button @click="showDutyDialog = false">取 消</el-button>
+                <el-button type="primary" @click="clickOnDuty" :loading="loading">确 定</el-button>
+            </span>
+        </template>
+    </el-dialog>
+</template>
+
+<script setup lang="ts" name="telControl">
+import {reactive,toRefs,getCurrentInstance,nextTick} from "vue";
+import { ElMessageBox,ElNotification } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+import { useTelStatus } from '/@/stores/telStatus';
+
+import { getTelsList } from '/@/api/login/user';
+import { onDuty,offDuty,telRest,telUnrest } from '/@/api/login/user';
+const { proxy } = <any>getCurrentInstance();
+const state = reactive({
+    active:<any>[], // 当前选中
+    showDutyDialog:false, //签入选分机弹窗
+    dutyForm:{
+        telNo:'' //分机号
+    },
+    telsList:<any>[],// 分机列表
+    loading:false,
+})
+const {active,showDutyDialog,dutyForm,loading,telsList} = toRefs(state);
+const useTelStatusStore = useTelStatus();
+const { telStatus } = storeToRefs(useTelStatusStore);
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
+nextTick(() => {
+    useTelStatusStore.getTelStatusAction(); // 查询当前用户签入状态
+});
+const getTelsLists = () =>{// 查询所有分机
+    getTelsList().then((res: any) => {
+        state.telsList = res?.result ?? [];
+    })
+}
+// 点击事件
+const onControlClick = (val:string)=>{
+    switch (val) {
+        case 'qianru': //签入
+            if(userInfos.value.authBtnList.includes('999101')){ // 签入权限
+				onDutyFn();
+			}else{
+				console.warn('您没有签入权限')
+			}
+            break;
+        case 'qianchu': //签出
+            if(userInfos.value.authBtnList.includes('999102')){ // 签出权限
+                
+				offDutyFn();
+			}else{
+				console.warn('您没有签出权限')
+			}
+            break;
+        case 'guaduan': //挂断
+            hangupFn();
+            break;
+        case 'xiaoxiu': //小休
+            if(userInfos.value.authBtnList.includes('999103')){ // 小休权限
+				xiaoxiuFn();
+			}else{
+				console.warn('您没有小休权限')
+			}
+            break;
+        case 'xiaoxiuEnd': //结束小休
+            if(userInfos.value.authBtnList.includes('999104')){ // 结束小休权限
+				xiaoxiuEndFn();
+			}else{
+				console.warn('您没有结束小休权限')
+			}
+            break;
+        default:
+            break;
+    }
+}
+const onDutyFn = ()=>{ //签入
+    getTelsLists();
+    //  重置表单
+    if(proxy.$refs.dutyFormRef){
+        proxy.$refs.dutyFormRef.resetFields();
+    }
+    state.showDutyDialog = true;
+}
+const clickOnDuty = ()=>{// 确认签入
+    proxy.$refs.dutyFormRef.validate((valid: boolean) => {
+        if (valid) {
+            state.showDutyDialog = true;
+            onDuty(state.dutyForm.telNo).then(()=>{
+                // 开启 signalr 链接
+                // if (Session.get('token')) {
+                // 	proxy.signalr.start();
+                // 	proxy.signalr.SR.on("Ring", (data:any) =>{// 接收消息
+                // 		console.log(data)
+                // 	})
+                // }
+                ElNotification({
+                    title: '成功',
+                    message: '签入成功',
+                    type: 'success',
+                })
+                state.showDutyDialog = false;
+                state.loading = false;
+                useTelStatusStore.getTelStatusAction(); // 查询当前用户签入状态
+            }).catch(()=>{
+                state.showDutyDialog = false;
+                state.loading = false;
+            })
+        } else {
+            return false;
+        }
+    });
+}
+// 签出
+const offDutyFn = ()=>{
+    ElMessageBox.confirm(`确定要签出,是否继续?`, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+    }).then(() => {
+        offDuty().then(()=>{
+            ElNotification({
+                title: '成功',
+                message: '签出成功',
+                type: 'success',
+            })
+            useTelStatusStore.getTelStatusAction(); // 查询当前用户签入状态
+        })
+    }).catch(() => {});
+}
+// 挂断
+const hangupFn = ()=>{
+    
+}
+// 小休
+const xiaoxiuFn = ()=>{
+    ElMessageBox.confirm(`确定要开始小休,是否继续?`, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+    }).then(() => {
+        telRest().then(()=>{
+            ElNotification({
+                title: '成功',
+                message: '小休开始',
+                type: 'success',
+            })
+            useTelStatusStore.getTelStatusAction(); // 查询当前用户签入状态
+        })
+    }).catch(() => {});
+}
+// 小休结束
+const xiaoxiuEndFn = ()=>{
+    ElMessageBox.confirm(`确定要结束小休,是否继续?`, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+    }).then(() => {
+        telUnrest().then(()=>{
+            ElNotification({
+                title: '成功',
+                message: '小休结束',
+                type: 'success',
+            })
+            useTelStatusStore.getTelStatusAction(); // 查询当前用户签入状态
+        })
+    }).catch(() => {});
+}
+</script>
+
+<style scoped lang="scss">
+.seizeSeat-box{
+    display: none;
+}
+.phoneControls {
+    display: flex;
+    flex: 1;
+    background: #FFFFFF;
+    box-shadow: 0px 1px 8px 0px rgba(0, 15, 49, 0.1);
+    border-bottom-left-radius: 90px;
+    border-bottom-right-radius: 90px;
+    padding: 0 52px;
+    color: #333;
+    height: 100%;
+    .infos {
+        margin: 20px 0;
+        text-align: left;
+        width: 120px;
+        .bottom_line {
+            padding-top: 5px;
+        }
+
+        .qianru_status {
+            color: var(--el-color-primary);
+            font-weight: normal;
+        }
+
+        span {
+            display: inline-block;
+            width: 60px;
+            text-align: right;
+        }
+    }
+
+    .btns {
+        display: flex;
+        width: calc(100% - 120px);
+        justify-content: space-between;
+        .item {
+            text-align: center;
+            cursor: pointer;
+            width: 100%;
+            height: 100%;
+            &:hover{
+                transition: inherit;
+                color: var(--el-color-primary) !important;
+                background-color: var(--hotline-color-seting-main) !important;
+            }
+            img {
+                display: block;
+                margin: 0 auto;
+                padding-top: 20px;
+            }
+            span {
+                margin-top: 5px;
+                display: inline-block;
+            }
+            &.disabled{
+                cursor: not-allowed;
+            }
+        }
+        .active{
+            color: #fff;
+            background-image: url('src/assets/images/phoneControls/active.png');
+            background-repeat: no-repeat;
+            background-size: 100% 100%;
+            height: calc(100% + 20px);
+            background-color: var(--hotline-bg-main-color);
+            img {
+                display: block;
+                margin: 0 auto;
+                padding-top: 30px;
+            }
+            span {
+                margin-top: 5px;
+                display: inline-block;
+            }
+             &:hover{
+                transition: inherit;
+                color: var(--hotline-color-white) !important;
+                background-color: var(--hotline-bg-main-color) !important;
+            }
+        }
+        
+    }
+
+}
+</style>

+ 0 - 5
src/layout/navBars/breadcrumb/user.vue

@@ -152,7 +152,6 @@ import { UserFilled } from '@element-plus/icons-vue'
 import screenfull from 'screenfull';
 import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
-import { useUserState } from '/@/stores/userState';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { Session, Local } from '/@/utils/storage';
 // import UserNews from '/@/layout/navBars/breadcrumb/userNews.vue';
@@ -169,11 +168,8 @@ export default defineComponent({
 		const { proxy } = <any>getCurrentInstance();
 		const router = useRouter();
 		const stores = useUserInfo();
-		const userStateStores = useUserState();
-		userStateStores.getUserStateAction(); // 查询用户状态
 		const storesThemeConfig = useThemeConfig();
 		const { userInfos } = storeToRefs(stores);
-		const { userStates } = storeToRefs(userStateStores);
 		const { themeConfig } = storeToRefs(storesThemeConfig);
 		const searchRef = ref();
 		const state = reactive({
@@ -415,7 +411,6 @@ export default defineComponent({
 			save,
 			UserFilled,
 			isShowPassword,
-			userStates,
 			rules,
 			...toRefs(state),
 		};

+ 11 - 5
src/layout/navBars/tagsView/tagsView.vue

@@ -1,5 +1,5 @@
 <template>
-	<div class="layout-navbars-tagsview" :class="{ 'layout-navbars-tagsview-shadow': getThemeConfig.layout === 'classic','isShowControls':isShowControls }">
+	<div class="layout-navbars-tagsview" :class="{ 'layout-navbars-tagsview-shadow': getThemeConfig.layout === 'classic','isShowControls':userInfosConfig.showTelControl }">
 		<el-scrollbar ref="scrollbarRef" @wheel.prevent="onHandleScroll">
 			<ul class="layout-navbars-tagsview-ul" :class="setTagsStyle" ref="tagsUlRef">
 				<li
@@ -68,6 +68,7 @@ import pinia from '/@/stores/index';
 import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { useKeepALiveNames } from '/@/stores/keepAliveNames';
+import { useUserInfo } from '/@/stores/userInfo';
 import { Session } from '/@/utils/storage';
 import { isObjectValueEqual } from '/@/utils/arrayOperation';
 import other from '/@/utils/other';
@@ -116,10 +117,11 @@ export default defineComponent({
 		const storesTagsViewRoutes = useTagsViewRoutes();
 		const { themeConfig } = storeToRefs(storesThemeConfig);
 		const { tagsViewRoutes } = storeToRefs(storesTagsViewRoutes);
+		const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
 		const storesKeepALiveNames = useKeepALiveNames();
 		const route = useRoute();
 		const router = useRouter();
-		const isShowControls = ref(true)
 		const state = reactive<TagsViewState>({
 			routeActive: '',
 			routePath: route.path,
@@ -137,6 +139,10 @@ export default defineComponent({
 		const getThemeConfig = computed(() => {
 			return themeConfig.value;
 		});
+		// 获取用户信息配置
+		const userInfosConfig = computed(() => {
+			return userInfos.value;
+		});
 		// 设置 自定义 tagsView 名称、 自定义 tagsView 名称国际化
 		const setTagsViewNameI18n = computed(() => {
 			return (v: any) => {
@@ -593,7 +599,7 @@ export default defineComponent({
 			getThemeConfig,
 			setTagsStyle,
 			setTagsViewNameI18n,
-			isShowControls,
+			userInfosConfig,
 			refreshCurrentTagsView,
 			closeCurrentTagsView,
 			onCurrentContextmenuClick,
@@ -606,7 +612,7 @@ export default defineComponent({
 <style scoped lang="scss">
 .layout-navbars-tagsview {
 	background-color: var(--el-color-white);
-	border-bottom: 1px solid var(--hotline-border-color-light);
+	// border-bottom: 1px solid var(--hotline-border-color-light);
 	position: relative;
 	z-index: 4;
 	:deep(.el-scrollbar__wrap) {
@@ -651,7 +657,7 @@ export default defineComponent({
 				width: 14px;
 				text-align: center;
 				line-height: 14px;
-				right: -5px;
+				right: -10px;
 				&:hover {
 					color: var(--el-color-white);
 					background-color: var(--el-color-primary-light-3);

+ 14 - 26
src/layout/navMenu/subThreeItem.vue

@@ -4,7 +4,7 @@
  * @version: 
  * @Date: 2022-11-14 14:14:33
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-14 17:13:48
+ * @LastEditTime: 2022-11-14 17:20:45
 -->
 <template>
 	<el-popover placement="right" :width="popWidtn" trigger="click" v-model:visible="showPop">
@@ -85,12 +85,6 @@ export default defineComponent({
 });
 </script>
 <style lang="scss" scoped>
-.open{
-	padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding));
-}
-.close{
-	padding: 0 var(--el-menu-base-level-padding);
-}
 .itemThree {
 	display: flex;
 	align-items: center;
@@ -107,7 +101,12 @@ export default defineComponent({
 	height: 56px !important;
 	line-height: 56px !important;
 	color: var(--hotline-bg-menuBarColor);
-
+	&.close{
+		padding: 0 var(--el-menu-base-level-padding);
+	}
+	&.open{
+		padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding));
+	}
 	&:focus {
 		color: #fff;
 		background-color: var(--hotline-color-menu-hover) !important;
@@ -117,11 +116,10 @@ export default defineComponent({
 		color: #fff;
 		background-color: var(--hotline-color-menu-hover) !important;
 	}
-}
-
-.itemThree.is-active {
-	color: #fff;
-	background-color: var(--hotline-color-menu-hover) !important;
+	&.is-active{
+		color: #fff;
+		background-color: var(--hotline-color-menu-hover) !important;
+	}
 }
 .warp{
 	flex-wrap: wrap;
@@ -136,30 +134,20 @@ export default defineComponent({
 		border-right: 1px solid var(--el-border-color);
 		cursor: pointer;
 		text-overflow: ellipsis;
-		/*让截断的文字显示为点点。还有一个值是clip意截断不显示点点*/
 		white-space: nowrap;
-		/*让文字不换行*/
 		overflow: hidden;
-		/*超出要隐藏*/
 		&:nth-child(4n) {
 			border: none;
 		}
-
 		&:last-child {
 			border: none;
 		}
-
 		span {
 			margin-left: 3px;
 		}
+		&.active{
+			color: var(--el-color-primary);
+		}
 	}
-
-	.active {
-		color: var(--el-color-primary);
-	}
-}
-.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item, .el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title, .el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title{
-	white-space: nowrap;
-    padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding));
 }
 </style>

+ 3 - 2
src/stores/interface/index.ts

@@ -4,7 +4,7 @@
  * @version: 
  * @Date: 2022-08-09 16:19:56
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-12 11:07:10
+ * @LastEditTime: 2022-11-15 16:10:16
  */
 /**
  * 定义接口来定义对象的类型
@@ -17,6 +17,7 @@ export interface UserInfosState {
 	photo: string;
 	userName: string;
 	token?:string;
+	showTelControl:boolean;
 }
 export interface UserInfosStates {
 	userInfos: UserInfosState;
@@ -99,7 +100,7 @@ export interface ThemeConfigStates {
 }
 
 export interface UserStateInfos {
-	userStates:{
+	telStatus:{
 		isOnDuty:boolean,
 		isResting:boolean,
 		telNo:string

+ 31 - 0
src/stores/telStatus.ts

@@ -0,0 +1,31 @@
+/*
+ * @Author: zc
+ * @Description: 当前用户分机的状态
+ * @version: 
+ * @Date: 2022-09-29 09:37:40
+ * @LastEditors: Please set LastEditors
+ * @LastEditTime: 2022-11-15 16:09:37
+ */
+import {defineStore} from 'pinia';
+import {UserStateInfos} from './interface';
+import {getTelStatus} from "/@/api/login/user";
+/**
+ * 
+ * @methods telStatus 当前用户签入的状态
+ */
+export const useTelStatus = defineStore('telStatus', {
+	state: (): UserStateInfos => ({
+        telStatus:{
+            isOnDuty:false, //是否签入
+            isResting:false,  // 是否休息
+			telNo:""  //分级号
+        }
+	}),
+	actions: {
+		getTelStatusAction() { //更新状态
+			getTelStatus().then((res: any) => {//获取当前用户分机状态
+				this.telStatus = res?.result ?? false;
+			})
+		}
+	},
+});

+ 1 - 1
src/stores/themeConfig.ts

@@ -138,7 +138,7 @@ export const useThemeConfig = defineStore('themeConfig', {
 			// 默认全局组件大小,可选值"<large|'default'|small>",默认 'default'
 			globalComponentSize: 'default',
 			globalCorporateName: '丰窝科技', //公司名称
-			globalCorporateLink: ""  //点击链接
+			globalCorporateLink: "",  //点击链接	
 		},
 	}),
 	actions: {

+ 4 - 2
src/stores/userInfo.ts

@@ -4,7 +4,7 @@
  * @version: 
  * @Date: 2022-10-21 09:01:22
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-12 11:57:47
+ * @LastEditTime: 2022-11-15 16:12:09
  */
 import {defineStore} from 'pinia';
 import Cookies from 'js-cookie';
@@ -23,11 +23,12 @@ export const useUserInfo = defineStore('userInfo', {
 			photo: '',
 			authBtnList: [],
 			token:Cookies.get('token'),
+			showTelControl:false, // 是否展示坐席操作电话面板
 		},
 	}),
 	actions: {
 		async setUserInfos() {
-			if (Session.get('userInfo')) {
+			if (Session.get('userInfo')) { //有缓存 取缓存
 				this.userInfos = Session.get('userInfo');
 			} else {
 				this.userInfos = this.getApiUserInfo() as any;
@@ -38,6 +39,7 @@ export const useUserInfo = defineStore('userInfo', {
 			this.userInfos.userName =  Cookies.get('userName');
 			this.userInfos.token =  Cookies.get('token');
 			this.userInfos.photo =  "";
+			this.userInfos.showTelControl =  infos.result.includes('999125'); // 查询是否有展示面板权限
 			this.userInfos.authBtnList = infos.result;
 			Session.set('userInfo', this.userInfos);
 			return this.userInfos;

+ 0 - 31
src/stores/userState.ts

@@ -1,31 +0,0 @@
-/*
- * @Author: zc
- * @Description: 当前用户的状态
- * @version: 
- * @Date: 2022-09-29 09:37:40
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-10 13:40:22
- */
-import {defineStore} from 'pinia';
-import {UserStateInfos} from './interface';
-import {getUserState} from "/@/api/login/user";
-/**
- * 用户状态
- * @methods userStates 当前用户状态
- */
-export const useUserState = defineStore('userState', {
-	state: (): UserStateInfos => ({
-        userStates:{
-            isOnDuty:false,
-            isResting:false,
-			telNo:""
-        }
-	}),
-	actions: {
-		getUserStateAction() {
-			getUserState().then((res: any) => {//获取用户状态
-				this.userStates = res?.content ?? false;
-			})
-		}
-	},
-});

+ 30 - 16
src/views/deviceManagement/ivrCategroy/index.vue

@@ -3,7 +3,7 @@
         <el-card shadow="hover">
             <!-- 刷新和隐藏搜索 -->
             <el-row :gutter="10" class="mb8">
-                <el-col :span="1.5">
+                <el-col :span="1.5" v-auth="'300302'">
                     <el-button type="primary" @click="onAddCategory" v-waves>
                         <el-icon style="margin-right: 5px">
                             <Plus />
@@ -13,19 +13,24 @@
                 </el-col>
                 <right-toolbar :showSearchContent="false" @queryTable="handleQuery"></right-toolbar>
             </el-row>
-            <!-- 表格 -->
-            <el-table :data="list" v-loading="loading">
-                <el-table-column prop="name" label="分类名称" show-overflow-tooltip></el-table-column>
-                <el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
-                <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170"></el-table-column>
-                <el-table-column label="操作" width="150" fixed="right" align="center">
-                    <template #default="scope">
-                        <el-button text type="primary" @click="onEditCategroy(scope.row)">修改</el-button>
-                        <!-- <el-button text type="success" @click="configIvr(scope.row)">配置ivr</el-button> -->
-                        <el-button text type="danger" @click="onDelCategroy(scope.row)">删除</el-button>
-                    </template>
-                </el-table-column>
-            </el-table>
+            <template v-if="authShow">
+                <!-- 表格 -->
+                <el-table :data="list" v-loading="loading">
+                    <el-table-column prop="name" label="分类名称" show-overflow-tooltip></el-table-column>
+                    <el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
+                    <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170"></el-table-column>
+                    <el-table-column label="操作" width="150" fixed="right" align="center">
+                        <template #default="scope">
+                            <el-button text type="primary" @click="onEditCategroy(scope.row)"  v-auth="'300303'">修改</el-button>
+                            <!-- <el-button text type="success" @click="configIvr(scope.row)">配置ivr</el-button> -->
+                            <el-button text type="danger" @click="onDelCategroy(scope.row)"  v-auth="'300304'">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </template>
+            <template v-else>
+                 <el-alert title="您暂无权限查看" type="warning" show-icon :closable="false"/>
+            </template>
         </el-card>
         
         <el-dialog v-model="isShowDialog" width="600px" draggable :title="dialogTitle">
@@ -53,11 +58,13 @@
     </div>
 </template>
 <script lang="ts" setup name="ivrCategroy">
-import { getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import { getCurrentInstance, onMounted, reactive, ref, toRefs ,computed} from "vue";
 import {ElMessage, ElMessageBox} from 'element-plus'
 import { Plus } from '@element-plus/icons-vue';
 import {getIvrCategories,addIvrCategroies, updateIvrCategroies, deleteIvrCategroies} from "/@/api/deviceManagement/ivr";
 import { formatDate } from '/@/utils/formatTime';
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 // import { useRouter } from "vue-router";
 const loading = ref(false);
 const list = ref<any>([]);
@@ -143,6 +150,11 @@ const onSubmit = ()=>{// 保存
         }
     });
 }
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
+const authShow = computed(()=>{ // 校验是否有查看权限
+    return userInfos.value.authBtnList.includes('300301')
+})
 // const configIvr = (row:any)=>{ // 配置ivr
 //     router.push({
 //         // path:"/ivrConfig/details",
@@ -155,7 +167,9 @@ const onSubmit = ()=>{// 保存
 // }
 const {ruleForm} = toRefs(state);
 onMounted(()=>{
-    handleQuery();
+    if(userInfos.value.authBtnList.includes('300301')){
+        handleQuery();
+    }
 })
 
 </script>

+ 16 - 10
src/views/deviceManagement/ivrList/index.vue

@@ -3,7 +3,7 @@
         <el-card shadow="hover">
             <!-- 刷新和隐藏搜索 -->
             <el-row :gutter="10" class="mb8">
-                <el-col :span="1.5">
+                <el-col :span="1.5"  v-auth="'300401'">
                     <el-button type="primary" @click="onAddIvr" v-waves>
                         <el-icon style="margin-right: 5px">
                             <Plus />
@@ -24,9 +24,9 @@
                     <el-table-column prop="exit" label="按键结束符" show-overflow-tooltip></el-table-column>
                     <el-table-column label="操作" width="250" fixed="right" align="center">
                         <template #default="scope">
-                            <el-button text type="primary" @click="configure(scope.row)">基础配置</el-button>
-                            <el-button text type="success" @click="ivrConfigure(scope.row)">策略配置</el-button>
-                            <el-button text type="danger" @click="resetIvrConfigure(scope.row)">重置策略配置</el-button>
+                            <el-button text type="primary" @click="configure(scope.row)"  v-auth="'300402'">基础配置</el-button>
+                            <el-button text type="success" @click="ivrConfigure(scope.row)"  v-auth="'300403'">策略配置</el-button>
+                            <el-button text type="danger" @click="resetIvrConfigure(scope.row)"  v-auth="'300404'">重置策略配置</el-button>
                         </template>
                     </el-table-column>
                 </el-table>
@@ -532,6 +532,7 @@ import { Plus } from '@element-plus/icons-vue';
 import {useThemeConfig} from '/@/stores/themeConfig';
 import {useTagsViewRoutes} from '/@/stores/tagsViewRoutes';
 import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 // 引入api
 import {getIvrCategories,baseInfo,addIvr,updateIvr,getIvrById,addEditIvr,getIvrList, voicequerylist,resetConfig} from "/@/api/deviceManagement/ivr";
 import { getTelsGroupList } from '/@/api/deviceManagement/telsGroup';
@@ -713,7 +714,9 @@ const getIvrCategorieList = ()=>{ // 获取分类列表
 
     })
 }
-const ivrTypes = ref<any>([])
+const ivrTypes = ref<any>([]);
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
 const getBaseInfo = ()=>{ // 获取页面基础信息
     getTelsList().then((res: any) => {//查询所有的分机
         state.telsList = res?.result ?? [];
@@ -721,11 +724,14 @@ const getBaseInfo = ()=>{ // 获取页面基础信息
     getTelsGroupList().then((res: any) => { // 查询所有的分机组
         state.telsGroup = res?.result ?? [];
     })
-    baseInfo().then((res: any) => {// 获取页面基础信息
-        ivrTypes.value = res?.result.ivrTypes ?? [];
-        state.ivrAnswerTypes = res?.result.ivrAnswerTypes ?? [];
-        state.ivrStrategeTypes = res?.result.ivrStrategeTypes ?? [];
-    })
+    
+    if(userInfos.value.authBtnList.includes('300407')){ // 校验是否有权限 页面基础信息
+        baseInfo().then((res: any) => {// 获取页面基础信息
+            ivrTypes.value = res?.result.ivrTypes ?? [];
+            state.ivrAnswerTypes = res?.result.ivrAnswerTypes ?? [];
+            state.ivrStrategeTypes = res?.result.ivrStrategeTypes ?? [];
+        })
+    }
 }
 
 const addFruitConfig = () => { // 新增按键ivr

+ 2 - 2
src/views/deviceManagement/tels/index.vue

@@ -4,14 +4,14 @@
  * @version: 
  * @Date: 2022-08-16 13:42:46
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-11 10:53:14
+ * @LastEditTime: 2022-11-15 11:41:43
 -->
 <template>
     <div class="tels">
         <el-card shadow="hover">
             <!-- 刷新和隐藏搜索 -->
             <el-row :gutter="10" class="mb8">
-                <el-col :span="1.5">
+                <el-col :span="1.5" v-auth="'300101'">
                     <el-button type="primary" @click="asyncDevice" v-waves>
                         <el-icon style="margin-right: 5px">
                             <Refresh />

+ 13 - 5
src/views/deviceManagement/telsGroup/index.vue

@@ -3,7 +3,7 @@
         <el-card shadow="hover">
             <!-- 刷新和隐藏搜索 -->
             <el-row :gutter="10" class="mb8">
-                <el-col :span="1.5">
+                <el-col :span="1.5" v-auth="'300202'">
                     <el-button type="primary" @click="onAddTelsGroup" v-waves>
                         <el-icon style="margin-right: 5px">
                             <Plus />
@@ -29,7 +29,7 @@
                     <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip  width="170"></el-table-column>
                     <el-table-column label="操作" width="100" fixed="right" align="center">
                         <template #default="scope">
-                            <el-button text type="primary" @click="configure(scope.row)">配置分机组</el-button>
+                            <el-button text type="primary" @click="configure(scope.row)" v-auth="'300203'">配置分机组</el-button>
                         </template>
                     </el-table-column>
                 </el-table>
@@ -119,10 +119,12 @@ import {useThemeConfig} from '/@/stores/themeConfig';
 import {useTagsViewRoutes} from '/@/stores/tagsViewRoutes';
 import {storeToRefs} from 'pinia';
 import { formatDate } from '/@/utils/formatTime';
+import { useUserInfo } from '/@/stores/userInfo';
 // 引入需要的api
 import { getTelsGroupList,addTelsGroup,updateTelsGroup,baseInfoTelsGroup } from '/@/api/deviceManagement/telsGroup';
 import { getTelsList } from '/@/api/deviceManagement/tels';
 import { voicequerylist} from '/@/api/deviceManagement/ivr';
+
 const loading = ref(false);
 const list = ref<any>([]);
 const voiceData = ref<any>([]); // 音频文件
@@ -143,6 +145,8 @@ const state = reactive({
     },
     distributions:[] as unknown as any
 })
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
 const {ruleForm,distributions} = toRefs(state);
 /** 获取所有语音文件列表 */
 const getAudioList = () => {
@@ -159,9 +163,13 @@ const getAudioList = () => {
     }).catch(() => {
         loading.value = false;
     });
-    baseInfoTelsGroup().then((res: any) => {// 获取页面基础信息
-        state.distributions = res?.result.distributions ?? [];
-    })
+    if(userInfos.value.authBtnList.includes('300201')){ // 校验是否有权限 页面基础信息
+        baseInfoTelsGroup().then((res: any) => {// 获取页面基础信息
+            state.distributions = res?.result.distributions ?? [];
+        })
+    }else{
+        console.warn('您没有权限查看页面基础信息')
+    }
 };
 /** 获取分机列表 */
 const getList = () => {

+ 1 - 1
src/views/home/index.vue

@@ -4,7 +4,7 @@
  * @version: 
  * @Date: 2022-08-09 16:19:57
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-09 10:12:42
+ * @LastEditTime: 2022-11-15 16:34:33
 -->
 <template>
 	<div class="error" :style="{ height: `calc(100vh - ${initTagViewHeight}` }">

+ 1 - 1
src/views/system/dept/component/addDept.vue

@@ -60,7 +60,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel" size="default">取 消</el-button>
-					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>

+ 1 - 1
src/views/system/dic/component/addDic.vue

@@ -56,7 +56,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel" size="default">取 消</el-button>
-					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>

+ 1 - 1
src/views/system/institutionalUsers/roles/component/addRole.vue

@@ -28,7 +28,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">新 增</el-button>
+					<el-button type="primary" @click="onSubmit">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>

+ 2 - 2
src/views/system/institutionalUsers/roles/component/editRole.vue

@@ -28,7 +28,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">新 增</el-button>
+					<el-button type="primary" @click="onSubmit">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -54,7 +54,7 @@ export default defineComponent({
 		const { proxy } = <any>getCurrentInstance()
 		// 打开弹窗
 		const openDialog = (row: any) => {
-			state.ruleForm = row;
+			state.ruleForm = JSON.parse(JSON.stringify(row));
 			state.isShowDialog = true;
 		};
 		// 关闭弹窗

+ 37 - 24
src/views/system/institutionalUsers/roles/component/permission.vue

@@ -21,10 +21,9 @@
 								@change="handleCheckAllChangeBtn">按钮</el-checkbox>
 						</template>
 						<template #default="scope">
-							<!-- {{scope.row.buttonArr}} -->
 							<el-checkbox-group v-model="systemButtonArr" @change="handleCheckedBtnChange">
 								<el-checkbox v-for="(item) in scope.row.buttonArr" :key="item.id"
-									:label="item.permissionCode">{{ item.btnName }}</el-checkbox>
+									:label="item.permissionCode">{{ item.btnName }},{{ item.permissionCode }}</el-checkbox>
 							</el-checkbox-group>
 						</template>
 					</el-table-column>
@@ -33,7 +32,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">新 增</el-button>
+					<el-button type="primary" @click="onSubmit">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -43,6 +42,8 @@
 <script lang="ts">
 import { reactive, toRefs, defineComponent, onMounted, ref } from 'vue';
 import { ElMessage } from 'element-plus';
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 import { getMenuList } from "/@/api/system/menu";
 import { getRolePower, setRolePower } from "/@/api/system/roles"
 export default defineComponent({
@@ -61,32 +62,44 @@ export default defineComponent({
 		const checkAllMenu = ref(false)
 		const checkAllBtn = ref(false)
 		const isIndeterminateMenu = ref(false)
-		const isIndeterminateBtn = ref(false)
+		const isIndeterminateBtn = ref(false);
+		const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
 		// 打开弹窗
 		const openDialog = (row: any) => {
 			state.currentRow = row;
 			state.systemMenuArr = <any>[];
 			state.systemButtonArr = <any>[];
-			getRolePower({ roleid: row.id }).then((res: any) => {
-				state.systemMenuArr = res.result?.systemMenuArr ?? [];
-				state.systemButtonArr = res.result?.systemButtonArr ?? [];
-				// 设置全选状态
-				if (state.allButtonArr.length === res.result?.systemButtonArr.length) {
-					checkAllBtn.value = true;
-					isIndeterminateBtn.value = false;
-				} else {
-					checkAllBtn.value = false;
-					isIndeterminateBtn.value = false;
-				}
-				if (state.allMenuArr.length === res.result?.systemMenuArr.length) {
-					checkAllMenu.value = true;
-					isIndeterminateMenu.value = false;
-				} else {
-					checkAllMenu.value = false;
-					isIndeterminateMenu.value = false;
-				}
-				state.isShowDialog = true;
-			})
+			if(userInfos.value.authBtnList.includes('100205')){ // 校验是否有权限 页面基础信息
+				getRolePower({ roleid: row.id }).then((res: any) => {
+					state.systemMenuArr = res.result?.systemMenuArr ?? [];
+					state.systemButtonArr = res.result?.systemButtonArr ?? [];
+					// 设置全选状态
+					if (state.allButtonArr.length === state.systemButtonArr.length) {
+						checkAllBtn.value = true;
+						isIndeterminateBtn.value = false;
+					} else if(state.systemButtonArr.length !== 0){
+						checkAllBtn.value = false;
+						isIndeterminateBtn.value = true;
+					}else{
+						checkAllBtn.value = false;
+						isIndeterminateBtn.value = false;
+					}
+					if (state.allMenuArr.length === state.systemMenuArr.length) {
+						checkAllMenu.value = true;
+						isIndeterminateMenu.value = false;
+					} else if(state.systemMenuArr.length !== 0){
+						checkAllMenu.value = false;
+						isIndeterminateMenu.value = true;
+					} else {
+						checkAllMenu.value = false;
+						isIndeterminateMenu.value = false;
+					}
+					state.isShowDialog = true;
+				})
+			}else{
+				console.warn('您没有获取角色权限的权限')
+			}
 		};
 		// 关闭弹窗
 		const closeDialog = () => {

+ 4 - 4
src/views/system/institutionalUsers/roles/index.vue

@@ -16,7 +16,7 @@
 
       <!-- 刷新和隐藏搜索 -->
       <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
+        <el-col :span="1.5" v-auth="'100201'">
           <el-button type="primary" class="ml10" @click="onOpenAddRole">
               <el-icon style="margin-right: 5px">
                 <ele-Plus />
@@ -40,9 +40,9 @@
         <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip></el-table-column>
         <el-table-column label="操作" width="160" fixed="right" align="center">
           <template #default="scope">
-            <el-button type="primary" text @click="onOpenEditRole(scope.row)">修改</el-button>
-            <el-button type="success" text @click="onPermissions(scope.row)">配置权限</el-button>
-            <el-button text type="danger" @click="onRowDel(scope.row)">删除</el-button>
+            <el-button type="primary" text @click="onOpenEditRole(scope.row)"  v-auth="'100203'">修改</el-button>
+            <el-button type="success" text @click="onPermissions(scope.row)"  v-auth="'100204'">配置权限</el-button>
+            <el-button text type="danger" @click="onRowDel(scope.row)"  v-auth="'100202'">删除</el-button>
           </template>
         </el-table-column>
       </el-table>

+ 74 - 11
src/views/system/institutionalUsers/user/component/addUser.vue

@@ -4,18 +4,48 @@
 			<el-form :model="ruleForm" label-width="90px"  ref="ruleFormRef">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="手机号" prop="phoneNo" :rules="[{ required: true, message: '请输入手机号', trigger: 'blur' }]">
-							<el-input v-model="ruleForm.phoneNo" placeholder="请输入手机号" clearable></el-input>
+						<el-form-item label="账号" prop="name" :rules="[{required: true,message: '请输入账号',trigger: 'blur'}]">
+							<el-input v-model="ruleForm.name" placeholder="请输入账号" clearable></el-input>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="姓名" prop="name" :rules="[{required: true,message: '请输入用户姓名',trigger: 'blur'}]">
-							<el-input v-model="ruleForm.name" placeholder="请输入用户姓名" clearable></el-input>
+						<el-form-item label="用户昵称" prop="userName" :rules="[{required: false,message: '请输入用户昵称',trigger: 'blur'}]">
+							<el-input v-model="ruleForm.userName" placeholder="请输入用户昵称" clearable></el-input>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="用户昵称" prop="nickName" :rules="[{required: false,message: '请输入用户昵称',trigger: 'blur'}]">
-							<el-input v-model="ruleForm.nickName" placeholder="请输入用户昵称" clearable></el-input>
+						<el-form-item label="手机号" prop="phoneNo" :rules="[{ required: false, message: '请输入手机号', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.phoneNo" placeholder="请输入手机号" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+                        <el-form-item label="上级组织" prop="parentId" :rules="[{ required: false, message: '请选择上级组织', trigger: 'change' }]">
+                            <el-cascader
+                                :options="OrgData"
+                                :props="{ checkStrictly: true, value: 'id', label: 'orgName',emitPath:false }"
+                                placeholder="请选择上级组织"
+                                clearable
+                                class="w100"
+                                v-model="ruleForm.orgId"
+								ref="cascaderRef" @change="getselKnowledgeList"
+                            >
+                                <template #default="{ node, data }">
+                                <span>{{ data.orgName }}</span>
+                                <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                                </template>
+                            </el-cascader>
+                        </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="默认分机" prop="defaultTelNo" :rules="[{required: false,message: '请选择默认分机',trigger: 'change'}]">
+                            <el-select v-model="ruleForm.defaultTelNo"  placeholder="请选择默认分机" class="w100">
+                                <el-option
+                                v-for="item in telsList"
+                                :key="item.no"
+                                :label="item.no"
+                                :value="item.no"
+                                />
+                            </el-select>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -32,17 +62,24 @@
 
 <script lang="ts">
 import { reactive, toRefs, defineComponent,getCurrentInstance,ref } from 'vue';
-import { addUser } from '/@/api/system/user';
 import { ElMessage } from 'element-plus';
 import { throttle } from '/@/utils/tools';
+import { addUser,getcanuseorg } from '/@/api/system/user';
+import { getTelsList } from '/@/api/deviceManagement/tels';
 // 定义接口来定义对象的类型
 interface UserState {
 	isShowDialog: boolean;
 	ruleForm: {
-		phoneNo: string;
-		name: string;
-		nickName: string;
+		phoneNo: '', // 手机号
+		name: '', // 姓名
+		userName: '', // 用户昵称
+		orgId:'', // 组织id
+		orgCode:'', //组织code
+		staffNo:'', //工号
+		defaultTelNo:'' ,//默认分机
 	};
+	OrgData:Array<any>;
+	telsList:Array<any>;
 }
 
 export default defineComponent({
@@ -53,8 +90,14 @@ export default defineComponent({
 			ruleForm: {
 				phoneNo: '', // 手机号
 				name: '', // 姓名
-				nickName: '', // 用户昵称
+				userName: '', // 用户昵称
+				orgId:'', // 组织id
+				orgCode:'', //组织code
+				staffNo:'', //工号
+				defaultTelNo:'' ,//默认分机
 			},
+			OrgData:[], //可用组织
+			telsList:[] // 所有分机
 		});
 		const { proxy } = <any>getCurrentInstance()
 		let loading = ref<boolean>(false);
@@ -63,6 +106,8 @@ export default defineComponent({
 			if(proxy.$refs.ruleFormRef){
 				proxy.$refs.ruleFormRef.resetFields();
 			}
+			getOrgListFn();
+			getTelsListFn();
 			state.isShowDialog = true;
 		};
 		// 关闭弹窗
@@ -73,6 +118,23 @@ export default defineComponent({
 		const onCancel = () => {
 			closeDialog();
 		};
+		// 获取可用组织
+        const getOrgListFn = ()=>{
+            getcanuseorg().then((res:any)=>{
+                state.OrgData = res?.result ?? [];
+            })
+        }
+		// 获取选择组织name值
+		const getselKnowledgeList = ()=>{
+			let currentNode = proxy.$refs.cascaderRef.getCheckedNodes();
+			state.ruleForm.orgCode = currentNode[0].data.orgCode;
+		}
+		// 获取分机列表
+		const getTelsListFn = ()=>{
+			getTelsList().then((res:any)=>{
+                state.telsList = res?.result ?? [];
+            })
+		}
 		// 新增
 		const onSubmit = throttle(() => {
 			proxy.$refs.ruleFormRef.validate((valid: boolean) => {
@@ -101,6 +163,7 @@ export default defineComponent({
 			onCancel,
 			onSubmit,
 			loading,
+			getselKnowledgeList,
 			...toRefs(state),
 		};
 	},

+ 70 - 6
src/views/system/institutionalUsers/user/component/editUser.vue

@@ -4,6 +4,36 @@
 			<el-form :model="ruleForm" label-width="90px" ref="ruleFormRef">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+                        <el-form-item label="上级组织" prop="parentId" :rules="[{ required: false, message: '请选择上级组织', trigger: 'change' }]">
+                            <el-cascader
+                                :options="OrgData"
+                                :props="{ checkStrictly: true, value: 'id', label: 'orgName',emitPath:false }"
+                                placeholder="请选择上级组织"
+                                clearable
+                                class="w100"
+                                v-model="ruleForm.orgId"
+								ref="cascaderRef" @change="getselKnowledgeList"
+                            >
+                                <template #default="{ node, data }">
+                                <span>{{ data.orgName }}</span>
+                                <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                                </template>
+                            </el-cascader>
+                        </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="默认分机" prop="defaultTelNo" :rules="[{required: false,message: '请选择默认分机',trigger: 'change'}]">
+                            <el-select v-model="ruleForm.defaultTelNo"  placeholder="请选择默认分机" class="w100">
+                                <el-option
+                                v-for="item in telsList"
+                                :key="item.no"
+                                :label="item.no"
+                                :value="item.no"
+                                />
+                            </el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="手机号" prop="phoneNo" :rules="[{ required: true, message: '请输入手机号', trigger: 'blur' },{pattern: /^((12\d)|(13\d)|(14[5|7])|(15([0-3]|[5-9]))|(18[0|1,5-9]))\d{8}$/, message: '手机号格式错误'}]">
 							<el-input v-model="ruleForm.phoneNo" placeholder="请输入手机号" clearable></el-input>
 						</el-form-item>
@@ -14,8 +44,8 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="用户昵称" prop="nickName" :rules="[{required: false,message: '请输入用户昵称',trigger: 'blur'}]">
-							<el-input v-model="ruleForm.nickName" placeholder="请输入用户昵称" clearable></el-input>
+						<el-form-item label="用户昵称" prop="userName" :rules="[{required: false,message: '请输入用户昵称',trigger: 'blur'}]">
+							<el-input v-model="ruleForm.userName" placeholder="请输入用户昵称" clearable></el-input>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -31,19 +61,26 @@
 </template>
 
 <script lang="ts">
-import { reactive, toRefs, defineComponent,ref } from 'vue';
+import { reactive, toRefs, defineComponent,ref,getCurrentInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { updateUser } from '/@/api/system/user';
 import { ElMessage } from 'element-plus';
 import { throttle } from '/@/utils/tools';
+import { updateUser,getcanuseorg } from '/@/api/system/user';
+import { getTelsList } from '/@/api/deviceManagement/tels';
 // 定义接口来定义对象的类型
 interface UserState {
 	isShowDialog: boolean;
 	ruleForm: {
 		phoneNo: string;
 		name: string;
-		nickName: string;
+		userName: string;
+		orgId:string;
+		orgCode:string;
+		staffNo:string;
+		defaultTelNo:string
 	};
+	OrgData:Array<any>;
+	telsList:Array<any>;
 }
 export default defineComponent({
 	name: 'systemEditUser',
@@ -53,14 +90,23 @@ export default defineComponent({
 			ruleForm: {
 				phoneNo: '', // 手机号
 				name: '', // 姓名
-				nickName: '', // 用户昵称
+				userName: '', // 用户昵称
+				orgId:'', // 组织id
+				orgCode:'', //组织code
+				staffNo:'', //工号
+				defaultTelNo:'' ,//默认分机
 			},
+			OrgData:[], //可用组织
+			telsList:[] // 所有分机
 		});
 		const ruleFormRef = ref<FormInstance>()
+		const { proxy } = <any>getCurrentInstance()
 		let loading = ref<boolean>(false);
 		// 打开弹窗
 		const openDialog = (row: any) => {
 			state.ruleForm = JSON.parse(JSON.stringify(row));
+			getOrgListFn();
+			getTelsListFn();
 			state.isShowDialog = true;
 		};
 		// 关闭弹窗
@@ -71,6 +117,23 @@ export default defineComponent({
 		const onCancel = () => {
 			closeDialog();
 		};
+		// 获取可用组织
+        const getOrgListFn = ()=>{
+            getcanuseorg().then((res:any)=>{
+                state.OrgData = res?.result ?? [];
+            })
+        }
+		// 获取选择组织name值
+		const getselKnowledgeList = ()=>{
+			let currentNode = proxy.$refs.cascaderRef.getCheckedNodes();
+			state.ruleForm.orgCode = currentNode[0].data.orgCode;
+		}
+		// 获取分机列表
+		const getTelsListFn = ()=>{
+			getTelsList().then((res:any)=>{
+                state.telsList = res?.result ?? [];
+            })
+		}
 		// 新增
 		const onSubmit =  throttle( async(formEl: FormInstance | undefined) => {
 			if (!formEl) return
@@ -101,6 +164,7 @@ export default defineComponent({
 			onSubmit,
 			ruleFormRef,
 			loading,
+			getselKnowledgeList,
 			...toRefs(state),
 		};
 	},

+ 0 - 133
src/views/system/institutionalUsers/user/component/setOrg.vue

@@ -1,133 +0,0 @@
-<!--
- * @Author: zc
- * @Description: 设置所属组织
- * @version: 
- * @Date: 2022-11-11 15:27:02
- * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-14 13:10:57
--->
-<template>
-	<div class="system-add-user-container">
-		<el-dialog v-model="isShowDialog" width="500px" draggable title="设置组织">
-			<el-form :model="ruleForm" label-width="90px"  ref="ruleFormRef">
-				<el-row :gutter="35">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                        <el-form-item label="上级组织" prop="parentId" :rules="[{ required: false, message: '请选择上级组织', trigger: 'change' }]">
-                            <el-cascader
-                                :options="OrgData"
-                                :props="{ checkStrictly: true, value: 'id', label: 'title',emitPath:false }"
-                                placeholder="请选择上级组织"
-                                clearable
-                                class="w100"
-                                v-model="ruleForm.orgId"
-                            >
-                                <template #default="{ node, data }">
-                                <span>{{ data.title }}</span>
-                                <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-                                </template>
-                            </el-cascader>
-                        </el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit()" :loading="loading">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent,getCurrentInstance,ref, onMounted } from 'vue';
-import { ElMessage } from 'element-plus';
-import { throttle } from '/@/utils/tools';
-import { setRole,getCurrentRoles} from '/@/api/system/user';
-import {getOrgList} from "/@/api/system/organizational";
-// 定义接口来定义对象的类型
-interface UserState {
-	isShowDialog: boolean;
-	ruleForm: {
-		orgId: string
-	};
-    OrgData:Array<any>;
-    currentRow:any
-}
-
-export default defineComponent({
-	name: 'systemSetOrg',
-	setup(props:any, {emit}:any) {
-		const state = reactive<UserState>({
-			isShowDialog: false,
-			ruleForm: {
-				orgId: "", // 组织id
-			},
-            OrgData:[],
-            currentRow:{}
-		});
-		const { proxy } = <any>getCurrentInstance()
-		let loading = ref<boolean>(false);
-		// 打开弹窗
-		const openDialog = (row:any)=> {
-            state.currentRow = row;
-			getCurrentRoles({id:1}).then((res:any)=>{
-                console.log(res)
-            })
-			state.isShowDialog = true;
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-        // 获取所有组织
-        const getOrgListFn = ()=>{
-            getOrgList().then((res:any)=>{
-                state.OrgData = res?.result.items ?? [];
-            })
-        }
-		// 新增
-		const onSubmit = throttle(() => {
-			proxy.$refs.ruleFormRef.validate((valid: boolean) => {
-				if (valid) {
-						loading.value = true;
-                        let req = {
-                            roleIds:state.ruleForm.orgId,
-                            userId:state.currentRow.id
-                        }
-						setRole(req).then(()=>{
-							ElMessage({
-								message: '操作成功',
-								type: 'success',
-							})
-							loading.value = false;
-							closeDialog();
-							emit("updateList")
-						}).catch(()=>{ // 新增失败
-							loading.value = false;
-							closeDialog();
-						})
-				} else {
-					return false;
-				}
-			});
-		},1000);
-        onMounted(()=>{
-            getOrgListFn();
-        })
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			loading,
-			...toRefs(state),
-		};
-	},
-});
-</script>

+ 16 - 7
src/views/system/institutionalUsers/user/component/setRole.vue

@@ -4,7 +4,7 @@
  * @version: 
  * @Date: 2022-11-11 15:27:02
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-14 13:27:59
+ * @LastEditTime: 2022-11-15 13:33:49
 -->
 <template>
 	<div class="system-add-user-container">
@@ -38,6 +38,8 @@
 <script lang="ts">
 import { reactive, toRefs, defineComponent,getCurrentInstance,ref, onMounted } from 'vue';
 import { ElMessage } from 'element-plus';
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 import { throttle } from '/@/utils/tools';
 import { getRoles,setRole,getCurrentRoles} from '/@/api/system/user';
 // 定义接口来定义对象的类型
@@ -47,7 +49,8 @@ interface UserState {
 		roleIds: Array<any>
 	};
     options:Array<any>;
-    currentRow:any
+    currentRow:any,
+	
 }
 
 export default defineComponent({
@@ -63,15 +66,21 @@ export default defineComponent({
 		});
 		const { proxy } = <any>getCurrentInstance()
 		let loading = ref<boolean>(false);
+		const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
 		// 打开弹窗
 		const openDialog = (row:any)=> {
 			state.ruleForm.roleIds = <any>[];
             state.currentRow = row;
-			getCurrentRoles({PageIndex:1,PageSize:999,UserId:row.id}).then((res:any)=>{
-                res.result?.items.forEach((element:any) => {
-					state.ruleForm.roleIds.push(element.id);
-				});
-            })
+			if(userInfos.value.authBtnList.includes('100106')){ // 校验是否有权限 页面基础信息
+				getCurrentRoles({PageIndex:1,PageSize:999,UserId:row.id}).then((res:any)=>{
+					res.result?.items.forEach((element:any) => {
+						state.ruleForm.roleIds.push(element.id);
+					});
+				})
+			}else{
+				console.warn('您没有权限查看分页用户角色')
+			}
 			state.isShowDialog = true;
 		};
 		// 关闭弹窗

+ 6 - 13
src/views/system/institutionalUsers/user/index.vue

@@ -21,7 +21,7 @@
       </transition>
       <!-- 刷新和隐藏搜索 -->
       <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
+        <el-col :span="1.5" v-auth="'100102'">
           <el-button type="primary" @click="onOpenAddUser" v-waves>
             <el-icon style="margin-right: 5px">
               <Plus />
@@ -42,14 +42,14 @@
         <el-table-column prop="name" label="账号" show-overflow-tooltip></el-table-column>
         <el-table-column prop="phoneNo" label="手机号码" show-overflow-tooltip></el-table-column>
         <el-table-column prop="staffNo" label="工号" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="defaultTelNo" label="默认分机号" show-overflow-tooltip></el-table-column>
         <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip  width="170"></el-table-column>
-        <el-table-column label="操作" width="330" fixed="right" align="center">
+        <el-table-column label="操作" width="250" fixed="right" align="center">
           <template #default="scope">
-            <el-button text type="primary" @click="onOpenEditUser(scope.row)">修改</el-button>
-            <el-button text type="success" @click="onSetRole(scope.row)">设置角色</el-button>
-            <el-button text type="info" @click="onSetOrg(scope.row)">设置所属组织</el-button>
+            <el-button text type="primary" @click="onOpenEditUser(scope.row)" v-auth="'100103'">修改</el-button>
+            <el-button text type="success" @click="onSetRole(scope.row)"  v-auth="'100105'">设置角色</el-button>
             <el-button text type="warning" @click="onRestPwd(scope.row)">重置密码</el-button>
-            <el-button text type="danger" @click="onRowDel(scope.row)">删除</el-button>
+            <el-button text type="danger" @click="onRowDel(scope.row)"  v-auth="'100104'">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -59,7 +59,6 @@
     <AddUer ref="addUserRef" @updateList="handleQuery" />
     <EditUser ref="editUserRef" @updateList="handleQuery" />
     <SetRole ref="setRoleRef" @updateList="handleQuery" />
-    <SetOrg ref="setOrgRef" @updateList="handleQuery" />
   </div>
 </template>
 
@@ -73,7 +72,6 @@ import { formatDate } from '/@/utils/formatTime';
 import AddUer from '/@/views/system/institutionalUsers/user/component/addUser.vue';
 import EditUser from '/@/views/system/institutionalUsers/user/component/editUser.vue';
 import SetRole from '/@/views/system/institutionalUsers/user/component/setRole.vue';
-import SetOrg from "/@/views/system/institutionalUsers/user/component/setOrg.vue"
 import { delUser, getUserListPaged,restPwd } from '/@/api/system/user';
 // import FileSaver from 'file-saver';
 // import * as XLSX from 'xlsx'//这是vue3导入XLSX的方法
@@ -103,7 +101,6 @@ const ruleFormRef = ref<FormInstance>();
 const addUserRef = ref();
 const editUserRef = ref();
 const setRoleRef = ref();
-const setOrgRef = ref();
 /** 搜索按钮操作 节流操作 */
 const handleQuery = throttle(()=> {
   data.queryParams.PageIndex = 1;
@@ -133,10 +130,6 @@ const onOpenAddUser = () => {
 const onSetRole = (row: any) => {
   setRoleRef.value.openDialog(row);
 };
-// 设置所属组织弹窗
-const onSetOrg = (row: any) => {
-  setOrgRef.value.openDialog(row);
-};
 const multipleSelection = ref<any>([]) //多选
 const handleSelectionChange = (val: any) => {
   multipleSelection.value = val;

+ 34 - 25
src/views/system/menu/component/addMenu.vue

@@ -64,42 +64,52 @@
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否隐藏">
-              <el-radio-group v-model="ruleForm.isHide">
-                <el-radio :label="true">隐藏</el-radio>
-                <el-radio :label="false">不隐藏</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isHide"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-            <el-form-item label="页面缓存">
-              <el-radio-group v-model="ruleForm.isKeepAlive">
-                <el-radio :label="true">缓存</el-radio>
-                <el-radio :label="false">不缓存</el-radio>
-              </el-radio-group>
+            <el-form-item label="是否缓存">
+              <el-switch
+                v-model="ruleForm.isKeepAlive"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否固定">
-              <el-radio-group v-model="ruleForm.isAffix">
-                <el-radio :label="true">固定</el-radio>
-                <el-radio :label="false">不固定</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isAffix"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否外链">
-              <el-radio-group v-model="ruleForm.isLink" :disabled="ruleForm.isLink && ruleForm.isIframe">
-                <el-radio :label="true">是</el-radio>
-                <el-radio :label="false">否</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isLink" :disabled="ruleForm.isLink && ruleForm.isIframe"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否内嵌">
-              <el-radio-group v-model="ruleForm.isIframe" @change="onSelectIframeChange">
-                <el-radio :label="true">是</el-radio>
-                <el-radio :label="false">否</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isIframe" @change="onSelectIframeChange"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -107,7 +117,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit(ruleFormRef)"  v-waves="'light'" :loading="loading">新 增</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)"  v-waves="'light'" :loading="loading">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -120,7 +130,7 @@ import IconSelector from '/@/components/iconSelector/index.vue';
 import {  ElMessage } from 'element-plus';
 import { setBackEndControlRefreshRoutes } from "/@/router/backEnd";
 import {FormInstance} from "element-plus";
-import {addMenu, getMenuList, updateMenu} from "/@/api/system/menu";
+import {addMenu, getMenuList} from "/@/api/system/menu";
 
 export default defineComponent({
 	name: 'systemAddMenu',
@@ -187,7 +197,7 @@ export default defineComponent({
       if (!formEl) return;
       await formEl.validate((valid, fields) => {
         if (valid) {
-          addMenu(state.ruleForm).then((res:any)=>{
+          addMenu(state.ruleForm).then(()=>{
             emit("updateList");
             closeDialog(); // 关闭弹窗
             ElMessage.success('添加成功');
@@ -197,7 +207,6 @@ export default defineComponent({
           console.log('error submit!', fields)
         }
       })
-			// setBackEndControlRefreshRoutes() // 刷新菜单,未进行后端接口测试
 		};
 		// 页面加载时
 		onMounted(() => {

+ 47 - 32
src/views/system/menu/component/editMenu.vue

@@ -64,42 +64,52 @@
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否隐藏">
-              <el-radio-group v-model="ruleForm.isHide">
-                <el-radio :label="true">隐藏</el-radio>
-                <el-radio :label="false">不隐藏</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isHide"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-            <el-form-item label="页面缓存">
-              <el-radio-group v-model="ruleForm.isKeepAlive">
-                <el-radio :label="true">缓存</el-radio>
-                <el-radio :label="false">不缓存</el-radio>
-              </el-radio-group>
+            <el-form-item label="是否缓存">
+              <el-switch
+                v-model="ruleForm.isKeepAlive"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否固定">
-              <el-radio-group v-model="ruleForm.isAffix">
-                <el-radio :label="true">固定</el-radio>
-                <el-radio :label="false">不固定</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isAffix"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否外链">
-              <el-radio-group v-model="ruleForm.isLink" :disabled="ruleForm.isLink && ruleForm.isIframe">
-                <el-radio :label="true">是</el-radio>
-                <el-radio :label="false">否</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isLink" :disabled="ruleForm.isLink && ruleForm.isIframe"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否内嵌">
-              <el-radio-group v-model="ruleForm.isIframe" @change="onSelectIframeChange">
-                <el-radio :label="true">是</el-radio>
-                <el-radio :label="false">否</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="ruleForm.isIframe" @change="onSelectIframeChange"
+                inline-prompt
+                active-text="是"
+                inactive-text="否"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -116,12 +126,12 @@
 
 <script lang="ts">
 import {reactive, toRefs, onMounted, defineComponent, ref, getCurrentInstance} from 'vue';
-import {  ElMessage } from 'element-plus';
+import {  ElMessage,FormInstance } from 'element-plus';
 import IconSelector from '/@/components/iconSelector/index.vue';
-// import { setBackEndControlRefreshRoutes } from "/@/router/backEnd";
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+import { setBackEndControlRefreshRoutes } from "/@/router/backEnd";
 import {updateMenu,getMenuList,getMenuById} from "/@/api/system/menu";
-import {FormInstance} from "element-plus";
-import {RouteRecordRaw} from "vue-router";
 
 export default defineComponent({
 	name: 'systemEditMenu',
@@ -151,6 +161,8 @@ export default defineComponent({
       menuData: [], // 上级菜单数据
       loading:false,
 		});
+    const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
     // 获取全部菜单
     const getMenuData = (routes: any) => {
       const arr: any = [];
@@ -169,11 +181,14 @@ export default defineComponent({
       if(proxy.$refs.ruleFormRef){
         proxy.$refs.ruleFormRef.resetFields();
       }
-      getMenuById(row.id).then((res:any)=>{
-        state.ruleForm = res.result;
-        state.isShowDialog = true;
-      })
-
+      if(userInfos.value.authBtnList.includes('100408')){ // 校验是否有权限 获取菜单详情
+        getMenuById(row.id).then((res:any)=>{
+          state.ruleForm = res.result;
+          state.isShowDialog = true;
+        })
+      }else{
+        console.warn('您没有权限获取组织详情')
+      }
 		};
 		// 关闭弹窗
 		const closeDialog = () => {
@@ -192,17 +207,17 @@ export default defineComponent({
       if (!formEl) return;
       await formEl.validate((valid, fields) => {
         if (valid) {
-          updateMenu(state.ruleForm).then((res:any)=>{
+          updateMenu(state.ruleForm).then(()=>{
             emit("updateList");
             closeDialog(); // 关闭弹窗
             ElMessage.success('修改成功');
+            setBackEndControlRefreshRoutes();
           })
 
         } else {
           console.log('error submit!', fields)
         }
       })
-      // setBackEndControlRefreshRoutes() // 刷新菜单,未进行后端接口测试
     };
 		// 页面加载时
 		onMounted(() => {

+ 4 - 4
src/views/system/menu/index.vue

@@ -4,13 +4,13 @@
  * @version: 
  * @Date: 2022-10-21 09:01:23
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-11 10:51:57
+ * @LastEditTime: 2022-11-15 13:49:44
 -->
 <template>
 	<div class="system-menu-container">
 		<el-card shadow="hover">
 			<div class="system-menu-search mb15">
-				<el-button type="primary" @click="onOpenAddMenu">
+				<el-button type="primary" @click="onOpenAddMenu" v-auth="'100401'">
 					<el-icon>
 						<ele-Plus/>
 					</el-icon>
@@ -37,8 +37,8 @@
 				</el-table-column>
 				<el-table-column label="操作" show-overflow-tooltip width="160" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="onOpenEditMenu(scope.row)">修改</el-button>
-						<el-button text type="danger" @click="onTabelRowDel(scope.row)">删除</el-button>
+						<el-button text type="primary" @click="onOpenEditMenu(scope.row)"  v-auth="'100402'">修改</el-button>
+						<el-button text type="danger" @click="onTabelRowDel(scope.row)"  v-auth="'100403'">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>

+ 21 - 19
src/views/system/organizational/component/addOrg.vue

@@ -7,14 +7,14 @@
             <el-form-item label="上级组织" prop="parentId" :rules="[{ required: false, message: '请选择上级组织', trigger: 'change' }]">
               <el-cascader
                   :options="OrgData"
-                  :props="{ checkStrictly: true, value: 'id', label: 'title',emitPath:false }"
-                  placeholder="请选择上级组织"
+                  :props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false }" placeholder="请选择上级组织"
                   clearable
                   class="w100"
                   v-model="ruleForm.parentId"
+                  ref="cascaderRef" @change="getselKnowledgeList"
               >
                 <template #default="{ node, data }">
-                  <span>{{ data.title }}</span>
+                  <span>{{ data.orgName }}</span>
                   <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                 </template>
               </el-cascader>
@@ -25,6 +25,11 @@
               <el-input v-model="ruleForm.orgName" placeholder="请输入组织名称" clearable></el-input>
             </el-form-item>
           </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="组织编码" prop="orgCode" :rules="[{ required: true, message: '请输入组织编码', trigger: 'blur' }]">
+              <el-input v-model="ruleForm.orgCode" placeholder="请输入组织编码" clearable></el-input>
+            </el-form-item>
+          </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="是否启用" prop="name" :rules="[{ required: false, message: '请输入角色状态', trigger: 'blur' }]">
 							<el-switch v-model="ruleForm.isEnable" inline-prompt active-text="启" inactive-text="禁"></el-switch>
@@ -35,7 +40,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit(ruleFormRef)"  v-waves="'light'" :loading="loading">新 增</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)"  v-waves="'light'" :loading="loading">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -63,25 +68,16 @@ export default defineComponent({
 			OrgData: [], // 上级组织数据
       loading:false,
 		});
-		// 获取全部组织
-		const getOrgData = (routes: any) => {
-			const arr: any = [];
-			routes.map((val: any) => {
-				val['title'] = val.pageName;
-				arr.push({ ...val });
-				if (val.children) getOrgData(val.children);
-			});
-			return arr;
-		};
 		// 打开弹窗
 		const openDialog = () => {
       getOrgList().then((res:any)=>{
-        state.OrgData = getOrgData(res.result);
+        state.OrgData = res?.result ?? [];
+        console.log(state.OrgData)
+        if(proxy.$refs.ruleFormRef){
+          proxy.$refs.ruleFormRef.resetFields();
+        }
+        state.isShowDialog = true;
       })
-      if(proxy.$refs.ruleFormRef){
-        proxy.$refs.ruleFormRef.resetFields();
-      }
-			state.isShowDialog = true;
 		};
 		// 关闭弹窗
 		const closeDialog = () => {
@@ -91,6 +87,11 @@ export default defineComponent({
 		const onCancel = () => {
 			closeDialog();
 		};
+    // 获取选择name值
+    const getselKnowledgeList = ()=>{
+        let currentNode = proxy.$refs.cascaderRef.getCheckedNodes();
+        state.ruleForm.parentName = currentNode[0].label;
+    }
 		// 新增
 		const onSubmit =  async (formEl: FormInstance | undefined) =>{
       if (!formEl) return;
@@ -116,6 +117,7 @@ export default defineComponent({
       ruleFormRef,
 			onCancel,
 			onSubmit,
+      getselKnowledgeList,
 			...toRefs(state),
 		};
 	},

+ 31 - 23
src/views/system/organizational/component/editOrg.vue

@@ -7,10 +7,10 @@
             <el-form-item label="上级组织" prop="parentId"
               :rules="[{ required: false, message: '请选择上级组织', trigger: 'change' }]">
               <el-cascader :options="OrgData"
-                :props="{ checkStrictly: true, value: 'id', label: 'title', emitPath: false }" placeholder="请选择上级组织"
-                clearable class="w100" v-model="ruleForm.parentId">
+                :props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false }" placeholder="请选择上级组织"
+                clearable class="w100" v-model="ruleForm.parentId" ref="cascaderRef" @change="getselKnowledgeList">
                 <template #default="{ node, data }">
-                  <span>{{ data.title }}</span>
+                  <span>{{ data.orgName }}</span>
                   <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                 </template>
               </el-cascader>
@@ -22,6 +22,11 @@
               <el-input v-model="ruleForm.orgName" placeholder="请输入组织名称" clearable></el-input>
             </el-form-item>
           </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="组织编码" prop="orgCode" :rules="[{ required: true, message: '请输入组织编码', trigger: 'blur' }]">
+              <el-input v-model="ruleForm.orgCode" placeholder="请输入组织编码" clearable></el-input>
+            </el-form-item>
+          </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
             <el-form-item label="是否启用" prop="name" :rules="[{ required: false, message: '请输入角色状态', trigger: 'blur' }]">
               <el-switch v-model="ruleForm.isEnable" inline-prompt active-text="启" inactive-text="禁"></el-switch>
@@ -42,13 +47,15 @@
 <script lang="ts">
 import { reactive, toRefs, onMounted, defineComponent, ref, getCurrentInstance } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 import { getOrgList, updateOrg, getOrgById } from "/@/api/system/organizational";
 
 export default defineComponent({
   name: 'systemEditOrg',
   setup(props: any, { emit }: any) {
     const ruleFormRef = ref<FormInstance>()
-    const { proxy } = <any>getCurrentInstance()
+    const { proxy } = <any>getCurrentInstance();
     const state = reactive({
       isShowDialog: false,
       ruleForm: {
@@ -56,35 +63,30 @@ export default defineComponent({
         orgCode: '',
         parentId: '',
         parentName: '',
-        isEnable: true
+        isEnable: true,
+        children:[]
       },
       OrgData: [], // 上级组织数据
       loading: false,
     });
-    // 获取全部组织
-    const getOrgData = (routes: any) => {
-      const arr: any = [];
-      routes.map((val: any) => {
-        val['title'] = val.pageName;
-        arr.push({ ...val });
-        if (val.children) getOrgData(val.children);
-      });
-      return arr;
-    };
+    const storesUserInfo = useUserInfo();
+		const {userInfos} = storeToRefs(storesUserInfo);
     // 打开弹窗
     const openDialog = (row: any) => {
-      getOrgList().then((res: any) => {
-        state.OrgData = getOrgData(res.result);
+      getOrgList().then((res:any)=>{
+        state.OrgData = res?.result ?? [];
       })
       if (proxy.$refs.ruleFormRef) {
         proxy.$refs.ruleFormRef.resetFields();
       }
-      state.isShowDialog = true;
-      getOrgById(row.id).then((res: any) => {
-        state.ruleForm = res.result;
-        state.isShowDialog = true;
-      })
-
+      if(userInfos.value.authBtnList.includes('100503')){ // 校验是否有权限 获取组织详情
+        getOrgById(row.id).then((res: any) => {
+          state.ruleForm = res.result;
+          state.isShowDialog = true;
+        })
+      }else{
+        console.warn('您没有权限获取组织详情')
+      }
     };
     // 关闭弹窗
     const closeDialog = () => {
@@ -94,6 +96,11 @@ export default defineComponent({
     const onCancel = () => {
       closeDialog();
     };
+    // 获取选择name值
+    const getselKnowledgeList = ()=>{
+        let currentNode = proxy.$refs.cascaderRef.getCheckedNodes();
+        state.ruleForm.parentName = currentNode[0].label;
+    }
     // 修改
     const onSubmit = async (formEl: FormInstance | undefined) => {
       if (!formEl) return;
@@ -121,6 +128,7 @@ export default defineComponent({
       ruleFormRef,
       onCancel,
       onSubmit,
+      getselKnowledgeList,
       ...toRefs(state),
     };
   },

+ 56 - 45
src/views/system/organizational/index.vue

@@ -4,46 +4,52 @@
  * @version: 
  * @Date: 2022-10-21 09:01:23
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2022-11-14 09:21:03
+ * @LastEditTime: 2022-11-15 13:44:46
 -->
 <template>
 	<div class="system-menu-container">
 		<el-card shadow="hover">
 			<div class="system-menu-search mb15">
-				<el-button type="primary" @click="onOpenAddOrg">
+				<el-button type="primary" @click="onOpenAddOrg" v-auth="'100501'">
 					<el-icon>
 						<ele-Plus />
 					</el-icon>
 					<span class="ml5">新增组织</span>
 				</el-button>
 			</div>
-			<el-table :data="orgTableData" v-loading="loading" style="width: 100%" row-key="id"
-				:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
-				<el-table-column label="组织名称" show-overflow-tooltip>
-					<template #default="scope">
-						<SvgIcon :name="scope.row.icon" />
-						<span class="ml10">{{ scope.row.orgName }}</span>
-					</template>
-				</el-table-column>
-				<el-table-column prop="isEnable" label="组织状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.isEnable">启用</el-tag>
-						<el-tag type="info" v-else>禁用</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="parentName" label="上级组织" show-overflow-tooltip></el-table-column>
-				<el-table-column label="创建事件" show-overflow-tooltip>
-					<template #default="scope">
-						<span>{{ scope.row.creationTime }}</span>
-					</template>
-				</el-table-column>
-				<el-table-column label="操作" show-overflow-tooltip width="160" align="center">
-					<template #default="scope">
-						<el-button text type="primary" @click="onOpenEditOrg(scope.row)">修改</el-button>
-						<el-button text type="danger" @click="onTabelRowDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
+			<template v-if="authShow">
+                <!-- 表格 -->
+                <el-table :data="orgTableData" v-loading="loading" style="width: 100%" row-key="id"
+					:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
+					<el-table-column label="组织名称" show-overflow-tooltip>
+						<template #default="scope">
+							<SvgIcon :name="scope.row.icon" />
+							<span class="ml10">{{ scope.row.orgName }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="isEnable" label="组织状态" show-overflow-tooltip>
+						<template #default="scope">
+							<el-tag type="success" v-if="scope.row.isEnable">启用</el-tag>
+							<el-tag type="info" v-else>禁用</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="parentName" label="上级组织" show-overflow-tooltip></el-table-column>
+					<el-table-column label="创建事件" show-overflow-tooltip>
+						<template #default="scope">
+							<span>{{ scope.row.creationTime }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" show-overflow-tooltip width="160" align="center">
+						<template #default="scope">
+							<el-button text type="primary" @click="onOpenEditOrg(scope.row)"  v-auth="'100502'">修改</el-button>
+							<!-- <el-button text type="danger" @click="onTabelRowDel(scope.row)">删除</el-button> -->
+						</template>
+					</el-table-column>
+				</el-table>
+            </template>
+            <template v-else>
+                 <el-alert title="您暂无权限查看" type="warning" show-icon :closable="false"/>
+            </template>
 		</el-card>
 		<AddOrg ref="addOrgRef" @updateList="getOrgListApi" />
 		<EditOrg ref="editOrgRef" @updateList="getOrgListApi" />
@@ -51,19 +57,21 @@
 </template>
 
 <script lang="ts" setup name="organizational">
-import { ref, toRefs, reactive, onMounted } from 'vue';
+import { ref, toRefs, reactive, onMounted, computed} from 'vue';
 import { RouteRecordRaw } from 'vue-router';
-import { ElMessageBox, ElMessage } from 'element-plus';
-
+import {storeToRefs} from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
 import AddOrg from '/@/views/system/organizational/component/addOrg.vue';
 import EditOrg from '/@/views/system/organizational/component/editOrg.vue';
-import { getOrgList, removeOrg } from "/@/api/system/organizational";
+import { getOrgList } from "/@/api/system/organizational";
 const addOrgRef = ref();
 const editOrgRef = ref();
 const state = reactive({
 	orgTableData: <any>[], // 获取所有菜单
 	loading: false
 });
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
 const { orgTableData, loading } = toRefs(state);
 // 打开新增菜单弹窗
 const onOpenAddOrg = () => {
@@ -73,19 +81,22 @@ const onOpenAddOrg = () => {
 const onOpenEditOrg = (row: RouteRecordRaw) => {
 	editOrgRef.value.openDialog(row);
 };
+const authShow = computed(()=>{ // 校验是否有查看权限
+    return userInfos.value.authBtnList.includes('100504')
+})
 // 删除当前行
-const onTabelRowDel = (row: any) => {
-	ElMessageBox.confirm(`此操作将永久删除组织结构:${row.orgName}, 是否继续?`, '提示', {
-		confirmButtonText: '删除',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(() => {
-		removeOrg(row.id).then(() => {
-			ElMessage.success('删除成功');
-			getOrgListApi();
-		})
-	}).catch(() => { });
-};
+// const onTabelRowDel = (row: any) => {
+// 	ElMessageBox.confirm(`此操作将永久删除组织结构:${row.orgName}, 是否继续?`, '提示', {
+// 		confirmButtonText: '删除',
+// 		cancelButtonText: '取消',
+// 		type: 'warning',
+// 	}).then(() => {
+// 		removeOrg(row.id).then(() => {
+// 			ElMessage.success('删除成功');
+// 			getOrgListApi();
+// 		})
+// 	}).catch(() => { });
+// };
 // 获取所有菜单
 const getOrgListApi = () => {
 	state.loading = true;

+ 1 - 1
src/views/system/systemParameter/index.vue

@@ -99,7 +99,7 @@
 						</el-col>
 				</el-row>
 				<el-form-item>
-					<el-button type="primary" @click="submitForm" :loading="loading">保 存</el-button>
+					<el-button type="primary" @click="submitForm" :loading="loading" v-auth="'100301'">保 存</el-button>
 					<el-button @click="resetForm" :loading="loading">重 置</el-button>
 				</el-form-item>
 			</el-form>

+ 8 - 8
src/views/telslog/blacklist/index.vue

@@ -15,7 +15,7 @@
 			</transition>
 			<!-- 刷新和隐藏搜索 -->
 			<el-row :gutter="10" class="mb8">
-				<el-col :span="1.5">
+				<el-col :span="1.5" v-auth="'200201'">
 					<el-button type="primary" @click="onAddBacklist" v-waves>
 						<el-icon style="margin-right: 5px">
 							<Plus />
@@ -28,11 +28,11 @@
 			<!-- 表格 -->
 			<el-table :data="list" v-loading="loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange" id="table">
 				<el-table-column prop="phoneNo" label="电话号码" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="hours" label="黑名单时长(小时)" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="duration" label="黑名单时长(秒)" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip  width="170"></el-table-column>
 				<el-table-column label="操作" width="100" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="danger" @click="onRowDel(scope.row)">删除</el-button>
+						<el-button text type="danger" @click="onRowDel(scope.row)"  v-auth="'200202'">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -49,8 +49,8 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="黑名单时长(小时)" prop="hours" :rules="[{ required: true, message: '请输入时间(小时)', trigger: 'blur' }]">
-							<el-input-number v-model="ruleForm.hours" :precision="0" :min="1" />
+						<el-form-item label="黑名单时长(秒)" prop="duration" :rules="[{ required: true, message: '请输入时间(秒)', trigger: 'blur' }]">
+							<el-input-number v-model="ruleForm.duration" :precision="0" :min="1" />
 						</el-form-item>
 					</el-col>
 					<!-- <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
@@ -137,13 +137,13 @@ const {proxy} = <any>getCurrentInstance();
 interface stateBacklist {
     ruleForm:{
         phoneNo:string,
-        hours:number
+        duration:number
     }
 }
 const state = reactive<stateBacklist>({
     ruleForm:{
         phoneNo:"",
-        hours:1
+        duration:1
     }
 })
 const onAddBacklist = ()=>{// 新增黑名单
@@ -152,7 +152,7 @@ const onAddBacklist = ()=>{// 新增黑名单
     }
     state.ruleForm = {
         phoneNo:"",
-        hours:1
+        duration:1
     }
     isShowDialog.value = true;
 }