瀏覽代碼

知识库对接

zhangchong 2 年之前
父節點
當前提交
93d7e6caee

+ 0 - 11
src/api/knowledge/index.ts

@@ -135,17 +135,6 @@ export const KnowledgeRevoke = (workFlowId: string) => {
 		method: 'put',
 	});
 };
-/**
- * @description: 根据workFlowId,查询审批明细
- * @param {string} workFlowId
- * @return {*}
- */
-export const KnowledgeGetworkflow = (workFlowId: string) => {
-	return request({
-		url: `/api/v1/Knowledge/getworkflow?workFlowId=${workFlowId}`,
-		method: 'get',
-	});
-};
 /**
  * @description: 知识申请-关联知识-获取知识列表
  * @param {object} params

+ 5 - 3
src/views/business/order/index.vue

@@ -227,7 +227,7 @@
 					</el-table-column>
 					<el-table-column label="操作" width="150" fixed="right" align="center">
 						<!-- 草稿0 status 可以删除 -->
-						<template #default="scope">
+						<template #default="{ row }">
 							<!-- <el-button text type="primary" @click="onEditTemp(scope.row)" title="修改">
 								修改
 							</el-button>
@@ -237,8 +237,10 @@
 							<el-button text type="warning" v-if="scope.row.status === 2" @click="tempEnable(scope.row)" title="启用">
 								启用
 							</el-button>-->
-							<el-button text type="primary" @click="onOrderDetail(scope.row)" title="详情"> 详情 </el-button>
-							<el-button text v-if="scope.row.status === 0" type="danger" @click="onDeleteOrder(scope.row)" title="删除"> 删除 </el-button>
+							<el-button text type="primary" @click="onOrderDetail(row)" :title="row.status === 0 ? '编辑工单信息' : '查看工单详情'">
+								详情
+							</el-button>
+							<el-button text v-if="row.status === 0" type="danger" @click="onDeleteOrder(row)" title="删除工单"> 删除 </el-button>
 						</template>
 					</el-table-column>
 					<template #empty>

+ 0 - 701
src/views/device/iverConfig/index.vue

@@ -1,701 +0,0 @@
-<template>
-    <div class="ivrContent  layout-padding">
-        <el-alert type="warning" :closable="false">
-            <template #title>
-                鼠标右键新增、删除、编辑节点。点击节点查看节点更多信息。
-                <el-switch v-model="horizontal" active-text="竖向" inactive-text="横向"></el-switch>&nbsp;
-                <el-switch v-model="collapsable" active-text="可收起" inactive-text="不可收起"></el-switch>
-            </template>
-        </el-alert>
-        <vue3-tree-org :data="state.data" :horizontal="horizontal" :collapsable="collapsable" v-loading="loading"
-            :style="{ height: `calc(100vh - ${setViewHeight}` }" :label-style="style" :only-one-node="onlyOneNode"
-            :default-expand-level="3" :props="{ id: 'id', pid: 'prevIvrNo', label: 'name', children: 'childIvrs' }"
-            :clone-node-drag="cloneNodeDrag" :node-draggable="false" @on-contextmenu="onMenus"
-            :define-menus="defineMenus" :toolBar="false"
-            @node-add="addNode" @node-delete="nodeDelete" ref="vue3TreeOrg">
-            <!-- 自定义节点内容 -->
-            <template v-slot="{ node }">
-                <el-popover placement="top-start" :width="200" trigger="click">
-                    <template #reference>
-                        <div class="tree-org-node__text node-label">ivr名称:{{ node.label }}</div>
-                    </template>
-                    <p>ivr名称:{{ node.label }}</p>
-                    <p>ivr编号:{{ node.$$data.no }}</p>
-                    <p>ivr结束符:{{ node.$$data.exit }}</p>
-                    <p>ivr按键长度:{{ node.$$data.infoLength }}</p>
-                    <p>ivr重复次数:{{ node.$$data.repeat }}</p>
-                    <p>ivr类型:{{ node.$$data.ivrTypeText }}</p>
-                    <p>ivr语音:{{ node.$$data.voice }}</p>
-                </el-popover>
-            </template>
-        </vue3-tree-org>
-        <!-- 新增 -->
-        <el-dialog v-model="drawerAdd" title="新增节点" draggable>
-            <div class="form_content">
-                <el-form :model="ruleFormAdd" ref="ruleFormRefAdd">
-                    <el-row :gutter="35">
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                            <el-form-item label="ivr" prop="ivr" :rules="[{ required: true, message: '请选择ivr', trigger: 'change' }]">
-                                <el-select v-model="ruleFormAdd.ivr" placeholder="请选择ivr" value-key="id" class="w100" @change="chooseIvr">
-                                    <el-option v-for="item in ivrListFilter" :key="item.id" :label="item.name" :value="item" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                            <el-form-item label="策略类型" prop="ivrStrategeType" :rules="[{ required: true, message: '请选择策略类型', trigger: 'change' }]">
-                                <el-select v-model="ruleFormAdd.ivrStrategeType" placeholder="请选择策略类型" class="w100">
-                                    <el-option v-for="item in ivrStrategeTypes" :key="item.key" :label="item.value"
-                                        :value="item.key" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12"  v-if="ruleFormAdd.ivrStrategeType === 1 || ruleFormAdd.ivrStrategeType === 3">
-                            <el-form-item label="按键输入" prop="input" :rules="[{ required: true, message: '请输入按键输入', trigger: 'blur' }]">
-                                <el-input v-model="ruleFormAdd.input" maxlength="1" placeholder="请输入按键输入" class="w100"></el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                            <el-form-item label="响应类型" prop="ivrAnswerType"
-                                :rules="[{ required: true, message: '请选择响应类型', trigger: 'change' }]">
-                                <el-select v-model="ruleFormAdd.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-                                    <el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value"
-                                        :value="item.key" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleFormAdd.ivrAnswerType === 1">
-                            <!-- 转语音选择ivr -->
-                            <el-form-item label="ivr" prop="ivrVoice"
-                                :rules="[{ required: true, message: '请选择ivr', trigger: 'change' }]">
-                                <el-select v-model="ruleFormAdd.ivrVoice" placeholder="请选择ivr" class="w100">
-                                    <el-option v-for="item in ivrListFilter" :key="item.id" :label="item.name" :value="item.id" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12"  v-if="ruleFormAdd.ivrAnswerType === 2">
-                            <!-- 转分机选择分机-->
-                            <el-form-item label="分机" prop="tels"
-                                :rules="[{ required: true, message: '请选择分机', trigger: 'change' }]">
-                                <el-select v-model="ruleFormAdd.tels" 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-col>
-                        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="ruleFormAdd.ivrAnswerType === 3">
-                            <!-- 转分机组 -->
-                            <el-form-item label="分机组" prop="telsGroup"
-                                :rules="[{ required: true, message: '请选择分机组', trigger: 'change' }]">
-                                <el-transfer v-model="ruleFormAdd.telsGroup" :titles="['选择语音文件', '按照选择顺序播放']" target-order="push"
-                                    :data="telsGroup" :props="{
-                                        key: 'no',
-                                        label: 'name',
-                                    }" :filterable="true">
-                                    <template #default="{ option }">
-                                        <span>{{ option.name }}</span>
-                                    </template>
-                                </el-transfer>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleFormAdd.ivrAnswerType === 4">
-                            <!-- 转外部电话 -->
-                            <el-form-item label="外部电话" prop="phone"
-                                :rules="[{ required: true, message: '请输入外部电话', trigger: 'blur' }]">
-                                <el-input v-model="ruleFormAdd.phone" placeholder="请输入外部电话" clearable></el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                            <el-form-item label="语音文件" prop="voiceList" :rules="[{required: false,message: '选择语音文件',trigger: 'change'}]">
-                                <el-transfer v-model="ruleFormAdd.voiceList" 
-                                    :titles="['语音文件', '按照选择顺序播放']"
-                                    target-order="push"
-                                    :data="voiceList" 
-                                    :filterable="true">
-                                    <template #default="{ option }">
-                                        <span>{{ option.label }}</span>
-                                    </template>
-                                </el-transfer>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                </el-form>
-            </div>
-            <template #footer>
-				<span class="dialog-footer">
-					<el-button @click="drawerAdd = false">取消</el-button>
-                    <el-button type="primary" @click="onSubmitAdd">保存</el-button>
-				</span>
-			</template>
-        </el-dialog>
-        <!-- 编辑 -->
-        <el-dialog v-model="drawer" :title="editTitle" draggable>
-            <div class="form_content">
-                <el-form :model="ruleForm" ref="ruleFormRef">
-                    <el-row :gutter="35">
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                            <el-form-item label="策略类型" prop="ivrStrategeType"
-                                :rules="[{ required: true, message: '请选择策略类型', trigger: 'change' }]">
-                                <el-select v-model="ruleForm.ivrStrategeType" placeholder="请选择策略类型" class="w100">
-                                    <el-option v-for="item in ivrStrategeTypes" :key="item.key" :label="item.value"
-                                        :value="item.key" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleForm.ivrStrategeType === 1 || ruleForm.ivrStrategeType === 3">
-                            <el-form-item label="按键输入" prop="input" :rules="[{ required: true, message: '请输入按键输入', trigger: 'change' }]">
-                                <el-input v-model="ruleFormAdd.input" maxlength="1" placeholder="请输入按键输入" class="w100"></el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                            <el-form-item label="响应类型" prop="ivrAnswerType" :rules="[{ required: true, message: '请选择响应类型', trigger: 'change' }]">
-                                <el-select v-model="ruleForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-                                    <el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value"
-                                        :value="item.key" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleForm.ivrAnswerType === 1">
-                            <!-- 转语音选择ivr -->
-                            <el-form-item label="ivr" prop="ivrVoice" :rules="[{ required: true, message: '请选择ivr', trigger: 'change' }]">
-                                <el-select v-model="ruleForm.ivrVoice" placeholder="请选择ivr" class="w100">
-                                    <el-option v-for="item in ivrListFilter" :key="item.id" :label="item.name" :value="item.id" />
-                                </el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleForm.ivrAnswerType === 2">
-                            <!-- 转分机选择分机-->
-                            <el-form-item label="分机" prop="tels" :rules="[{ required: true, message: '请选择分机', trigger: 'change' }]">
-                                <el-select v-model="ruleForm.tels" 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-col>
-                        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="ruleForm.ivrAnswerType === 3">
-                            <!-- 转分机组 -->
-                            <el-form-item label="分机组" prop="telsGroup" :rules="[{ required: true, message: '请选择分机组', trigger: 'change' }]">
-                                <el-transfer v-model="ruleForm.telsGroup" :titles="['选择语音文件', '按照选择顺序播放']" target-order="push"
-                                    :data="telsGroup" :props="{key: 'no',label: 'name',}" :filterable="true">
-                                    <template #default="{ option }">
-                                        <span>{{ option.name }}</span>
-                                    </template>
-                                </el-transfer>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="ruleForm.ivrAnswerType === 4">
-                            <!-- 转外部电话 -->
-                            <el-form-item label="外部电话" prop="phone" :rules="[{ required: true, message: '请输入外部电话', trigger: 'blur' }]">
-                                <el-input v-model="ruleForm.phone" placeholder="请输入外部电话" clearable></el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                            <el-form-item label="语音文件" prop="voiceList" :rules="[{required: false,message: '选择语音文件',trigger: 'change'}]">
-                                <el-transfer v-model="ruleForm.voiceList" 
-                                    :titles="['语音文件', '按照选择顺序播放']"
-                                    target-order="push"
-                                    :data="voiceList" 
-                                    :filterable="true">
-                                    <template #default="{ option }">
-                                        <span>{{ option.label }}</span>
-                                    </template>
-                                </el-transfer>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                </el-form>
-            </div>
-            <template #footer>
-				<span class="dialog-footer">
-					<el-button @click="drawer = false">取消</el-button>
-                    <el-button type="primary" @click="onSubmit">保存</el-button>
-				</span>
-			</template>
-        </el-dialog>
-        <!-- 替换节点 -->
-        <el-dialog v-model="isShowDialog" width="500px" draggable title="请选择要替换的节点">
-			<el-form :model="ruleFormReplace" ref="ruleFormReplaceRef">
-                <el-form-item label="需要替换的节点" prop="test" :rules="[{ required: true, message: '请选择需要替换的节点', trigger: 'change' }]">
-                    <el-select v-model="ruleFormReplace.test" value-key="id"  placeholder="请选择需要替换的节点" class="w100" @change="replaceRoot">
-                        <el-option v-for="item in ivrListFilter" :key="item.id" :label="item.name" :value="item" />
-                    </el-select>
-                </el-form-item>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="confrimReplace">保 存</el-button>
-				</span>
-			</template>
-		</el-dialog>
-    </div>
-</template>
-<script lang="ts" setup name="ivrConfig">
-import { computed, nextTick, onUnmounted, onMounted, reactive, ref, toRefs, onActivated } from "vue";
-import { onBeforeRouteLeave, useRoute } from "vue-router"
-import { storeToRefs } from 'pinia';
-import { ElMessage, ElMessageBox, ElSwitch } from 'element-plus'
-import { useThemeConfig } from '/@/stores/themeConfig';
-import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
-
-// 引入api
-import { getIvrTree, baseInfo, getIvrById, voicequerylist , addEditIvr,delIvrTree,replaceRootApi} from "/@/api/device/ivr"
-import { getTelsGroupList } from '/@/api/device/telsGroup';
-import { getTelsList } from '/@/api/device/tels';
-
-// 定义变量内容
-let cloneNodeDrag = ref(false);
-let state = reactive<any>({
-    data: {},
-    ivrAnswerTypes: [],
-    ivrStrategeTypes: [],
-    telsGroup: [],
-    telsList:[],
-    ruleFormReplace:{},
-    ivrList:[],
-    voiceList:[],
-    ivrListFilter:[]
-})
-let ruleForm = reactive({  // 新增表单
-    id:0,
-    prevIvrNo:"",
-    ivr:null,
-    ivrStrategeType:null,
-    input:"",
-    ivrAnswerType:undefined as any,
-    ivrVoice:"",
-    tels:"",
-    telsGroup:[],
-    phone:"",
-    voiceList:[]
-})
-let ruleFormAdd = reactive({ // 修改表单
-    id:0,
-    prevIvrNo:"",
-    ivr:null,
-    ivrStrategeType:null,
-    input:"",
-    ivrAnswerType:undefined as any,
-    ivrVoice:"",
-    tels:"",
-    telsGroup:[],
-    phone:"",
-    voiceList:[]
-})
-const {  ivrAnswerTypes, ivrStrategeTypes, telsGroup,telsList,ruleFormReplace,voiceList,ivrListFilter } = toRefs(state);
-const horizontal = ref(false)
-const collapsable = ref(true)
-const onlyOneNode = ref(false)
-const loading = ref(false)
-const storesThemeConfig = useThemeConfig();
-const stores = useTagsViewRoutes();
-const { themeConfig } = storeToRefs(storesThemeConfig);
-const { isTagsViewCurrenFull } = storeToRefs(stores);
-const drawer = ref(false)
-const drawerAdd = ref(false)
-const editTitle = ref('')
-const style = reactive({
-    background: "#fff",
-    color: "#5e6d82",
-})
-const route = useRoute();
-const isShowDialog = ref(false);
-const defineMenus = (e:Event, node:any) => { //自定义菜单
-    if(node.$$root){
-        return [
-            { name: '新建节点', command: 'addNode' },
-            { name: '编辑节点', command: 'editNode' },
-            { name: '替换节点', command: 'nodeReplace' }
-        ]
-    }else{
-        return [
-            { name: '新建节点', command: 'addNode' },
-            { name: '编辑节点', command: 'editNode' },
-            { name: '删除节点', command: 'nodeDelete' }
-        ]
-    }
-}
-const onMenus = ({ node, command, data }: any) => {// 点击菜单
-    switch (command) {
-        case 'editNode':
-            editNode(node, data)
-            break;
-        case 'addNode':
-            addNode(node, data)
-            break;
-        case 'nodeDelete':
-            nodeDelete(node)
-            break;
-        case 'nodeReplace':
-            nodeReplace(node,data)
-            break;
-        default:
-            break;
-    }
-}
-const parentNo = ref(null);
-const ruleFormRefAdd = ref()
-const addNode = (node: any, data: any) => { // 新增节点
-    state.ivrListFilter = state.ivrList.filter((item:any)=>item.id != data.id)
-    parentNo.value = data.no;
-    if (ruleFormRefAdd.value) {
-        ruleFormRefAdd.value.resetFields();
-    }
-    drawerAdd.value = true;
-}
-const editNode = (node: any, data: any) => { //编辑节点
-    editTitle.value = data.name + ' 编辑';
-    currentIvr.value = JSON.parse(JSON.stringify(data));
-    state.ivrListFilter = state.ivrList.filter((item:any)=>item.id != data.id)
-    const form = JSON.parse(JSON.stringify(data));
-    ruleForm.ivr = form;
-    parentNo.value = data.prevIvrNo;
-    if(data.ivrStrategies.length){// 如果有值就赋值
-        ruleForm.ivrStrategeType = form.ivrStrategies[0].ivrStrategeType;
-        ruleForm.input = form.ivrStrategies[0].input;
-        ruleForm.ivrAnswerType = form.ivrStrategies[0].answer.ivrAnswerType;
-        ruleForm.voiceList = form.ivrStrategies[0].answer.preVoice.split('+');
-        switch (form.ivrStrategies[0].answer.ivrAnswerType) {
-            case 1:// 转语音
-                ruleForm.ivrVoice = form.ivrStrategies[0].answer.content;
-                break;
-            case 2: // 专分机
-                ruleForm.tels = form.ivrStrategies[0].answer.content;    
-                break;
-            case 3: // 转分机组
-                let arr = <any>[];
-                for(let i of form.ivrStrategies[0].groupSorts){
-                    arr.push(i.groupNo)
-                }
-                ruleForm.telsGroup = arr;
-                break;
-            case 4: // 转外部电话
-                ruleForm.phone = form.ivrStrategies[0].answer.content;
-                break;
-            default:
-                break;
-        }
-    }
-    drawer.value = true;
-}
-const nodeDelete = (node: any) => { //删除节点
-    ElMessageBox.confirm(`此操作将删除:【${node.label}节点】,是否继续?`, '提示', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'warning',
-        draggable: true,
-		cancelButtonClass:'default-button'
-    }).then(() => {
-        let nodeItem = node.$$data;
-        delIvrTree(nodeItem.id).then(()=>{
-            ElMessage.success('删除成功');
-            getConfig();
-        })
-    }).catch(() => { });
-}
-const ruleFormReplaceRef = ref();
-// 点击替换节点
-const nodeReplace = (node: any, data: any)=>{
-    state.ruleFormReplace = JSON.parse(JSON.stringify(data));
-    state.ivrListFilter = state.ivrList.filter((item:any)=>item.id != data.id)
-    if (ruleFormReplaceRef.value) {
-        ruleFormReplaceRef.value.resetFields();
-    }
-    isShowDialog.value = true;
-}
-const currentIvr = ref({
-    ivrStrategies:<any>[],
-    prevIvrNo:null,
-    id:""
-});
-const chooseIvr = (val:any)=>{// 选择一条ivr
-    currentIvr.value = val;
-}
-const onSubmitAdd = ()=>{// 新增
-    ruleFormRefAdd.value.validate((valid: boolean) => {
-        if (valid) {
-            let request = {};
-            switch (ruleFormAdd.ivrAnswerType ) {
-                case 1: //转语音
-                    request = {
-                        input: ruleFormAdd.input || '',
-                        ivrStrategeType: ruleFormAdd.ivrStrategeType,
-                        answer: {
-                            ivrAnswerType:ruleFormAdd.ivrAnswerType,
-                            content: ruleFormAdd.ivrVoice, 
-                            preVoice: ruleFormAdd.voiceList ? ruleFormAdd.voiceList.join('+') : ""
-                        }
-                    }
-                    break;
-                case 2: // 分机
-                    request = {
-                        input: ruleFormAdd.input || '',
-                        ivrStrategeType: ruleFormAdd.ivrStrategeType,
-                        answer: {
-                            ivrAnswerType:ruleFormAdd.ivrAnswerType,
-                            content: ruleFormAdd.tels,
-                            preVoice: ruleFormAdd.voiceList ? ruleFormAdd.voiceList.join('+') : ""
-                        }
-                    }
-                    break;
-                case 3:// 分机组
-                    let arr = <any>[];
-                    for(let i in ruleFormAdd.telsGroup){
-                        arr.push({
-                            sort:Number(i),
-                            groupNo:ruleFormAdd.telsGroup[i]
-                        })
-                    }
-                    request = {
-                        input: ruleFormAdd.input || '',
-                        ivrStrategeType: ruleFormAdd.ivrStrategeType,
-                        answer: {
-                            ivrAnswerType:ruleFormAdd.ivrAnswerType,
-                            content: ruleFormAdd.ivrVoice,
-                            preVoice: ruleFormAdd.voiceList ? ruleFormAdd.voiceList.join('+') : ""
-                        },
-                        groupSorts:arr
-                    }
-                    break;
-                case 4:// 外部电话
-                    request = {
-                        input: ruleFormAdd.input || '',
-                        ivrStrategeType: ruleFormAdd.ivrStrategeType,
-                        answer: {
-                            ivrAnswerType:ruleFormAdd.ivrAnswerType,
-                            content: ruleFormAdd.phone,
-                            preVoice: ruleFormAdd.voiceList ? ruleFormAdd.voiceList.join('+') : ""
-                        }
-                    }
-                    break;
-                default:
-                    break;
-            }
-            let requestObj = {prevIvrNo:parentNo.value,id:currentIvr.value.id,ivrStrategies:[request]};
-            addEditIvr(requestObj).then(()=>{
-                ElMessage.success('新增成功');
-                getConfig();
-                drawerAdd.value = false;
-            })
-        } else {
-            return false;
-        }
-    });
-    
-}
-const ruleFormRef = ref();
-const onSubmit = () => {//编辑保存
-    ruleFormRef.value.validate((valid: boolean) => {
-        if (valid) {
-                let request = {};
-                switch (ruleForm.ivrAnswerType ) {
-                    case 1: //转语音
-                        request = {
-                            input: ruleForm.input || '',
-                            ivrStrategeType: ruleForm.ivrStrategeType,
-                            answer: {
-                                ivrAnswerType:ruleForm.ivrAnswerType,
-                                content: ruleForm.ivrVoice, 
-                                preVoice: ruleForm.voiceList ? ruleForm.voiceList.join('+') : ""
-                            }
-                        }
-                        break;
-                    case 2: // 分机
-                        request = {
-                            input: ruleForm.input || '',
-                            ivrStrategeType: ruleForm.ivrStrategeType,
-                            answer: {
-                                ivrAnswerType:ruleForm.ivrAnswerType,
-                                content: ruleForm.tels,
-                                preVoice: ruleForm.voiceList ? ruleForm.voiceList.join('+') : ""
-                            }
-                        }
-                        break;
-                    case 3:// 分机组
-                        let arr = <any>[];
-                        for(let i in ruleForm.telsGroup){
-                            arr.push({
-                                sort:Number(i),
-                                groupNo:ruleForm.telsGroup[i]
-                            })
-                        }
-                        request = {
-                            input: ruleForm.input || '',
-                            ivrStrategeType: ruleForm.ivrStrategeType,
-                            answer: {
-                                ivrAnswerType:ruleForm.ivrAnswerType,
-                                content: ruleForm.ivrVoice,
-                                preVoice: ruleForm.voiceList ? ruleForm.voiceList.join('+') : ""
-                            },
-                            groupSorts:arr
-                        }
-                        break;
-                    case 4:// 外部电话
-                        request = {
-                            input: ruleForm.input || '',
-                            ivrStrategeType: ruleForm.ivrStrategeType,
-                            answer: {
-                                ivrAnswerType:ruleForm.ivrAnswerType,
-                                content: ruleForm.phone,
-                                preVoice: ruleForm.voiceList ? ruleForm.voiceList.join('+') : ""
-                            }
-                        }
-                        break;
-                    default:
-                        break;
-                }
-                
-                let requestObj = {prevIvrNo:parentNo.value,id:currentIvr.value.id,ivrStrategies:[request]};
-                addEditIvr(requestObj).then(()=>{
-                    ElMessage.success('编辑成功');
-                    getConfig();
-                    drawer.value = false;
-                })
-        } else {
-            return false;
-        }
-    });
-}
-let currentReplace = reactive<any>({});
-const replaceRoot = (val:any)=>{// 选择替换的ivr
-    currentReplace = val;
-}
-const confrimReplace = ()=>{ //替换保存
-    ruleFormReplaceRef.value.validate((valid: boolean) => {
-        if (valid) {
-            replaceRootApi(currentReplace.id).then(()=>{
-                ElMessage.success('替换成功');
-                getConfig();
-                isShowDialog.value = false;
-            })
-        } else {
-            return false;
-        }
-    });
-}
-const getConfig = () => { //获取树形结构和初始化数据
-    loading.value = true;
-    getIvrTree(route.params.id).then((res: any) => {
-        state.data = res?.content ?? [];
-        getCenter();
-        setTimeout(() => {
-            loading.value = false;
-        }, 300);
-    }).catch(() => {
-        loading.value = false;
-    })
-}
-const init=()=>{// 获取页面上初始数据
-    getIvrById(route.params.id).then((res: any) => {// 根据分类ID查出分类下所有的ivr  排除根节点
-        state.ivrList = res?.content.ivrs.filter((item:any)=>item.id != state.data.id) ?? [];
-    })
-    getTelsList().then((res: any) => {//查询所有的分机
-        state.telsList = res?.content ?? [];
-    })
-    getTelsGroupList().then((res: any) => { // 查询所有的分机组
-        state.telsGroup = res?.content ?? [];
-    })
-    baseInfo().then((res: any) => {// 获取页面基础信息
-        state.ivrAnswerTypes = res?.content.ivrAnswerTypes ?? [];
-        state.ivrStrategeTypes = res?.content.ivrStrategeTypes ?? [];
-    })
-    voicequerylist().then((response: any) => {/** 获取所有语音文件列表 */
-        state.voiceList = response.content.map((item:any)=>{
-            return {
-                key:item,
-                label:item
-            }
-        })
-    }).catch(() => {
-        
-    });
-}
-// 设置 view 的高度
-const setViewHeight = computed(() => {
-    let { isTagsview } = themeConfig.value;
-    if (isTagsViewCurrenFull.value) {
-        return `80px`;
-    } else {
-        if (isTagsview) return `164px`;
-        else return `130px`;
-    }
-});
-const vue3TreeOrg = ref();
-const getCenter = () => {// 设置配置居中
-    nextTick(() => {
-        let boxW: string | number = document.getElementsByClassName('zoom-container')[0].clientWidth;
-        let box1W: string | number = document.getElementsByClassName('zm-draggable')[0].clientWidth;
-        vue3TreeOrg.value.onDragStop((boxW - box1W) / 2, 30);
-    });
-}
-onMounted(() => {
-    getConfig();
-    init();
-    window.addEventListener('resize', getCenter);
-})
-// 缓存重新居中
-onActivated(() => {
-    getCenter();
-    window.addEventListener('resize', getCenter);
-})
-// 移除事件
-onUnmounted(() => {
-    window.removeEventListener('resize', getCenter);
-})
-// 移除事件
-onBeforeRouteLeave(() => {
-    window.removeEventListener('resize', getCenter);
-})
-</script>
-<style scoped lang="scss">
-.tree-org-node__text,
-.node-label {
-    cursor: pointer;
-
-    div {
-        white-space: nowrap
-    }
-}
-
-.form_content {
-    margin: 20px;
-}
-
-:deep(.zm-tree-org) {
-    box-shadow: var(--el-box-shadow-light);
-    background-color: var(--el-color-white);
-    background-image: linear-gradient(90deg, rgba(156, 214, 255, .15) 10%, rgba(0, 0, 0, 0) 10%), linear-gradient(rgba(156, 214, 255, .15) 10%, rgba(0, 0, 0, 0) 10%);
-    background-size: 10px 10px;
-}
-
-:deep(.tree-org-node__inner) {
-    background-color: var(--el-color-white) !important;
-    color: var(--el-color-primary) !important;
-    border: 1px solid var(--el-border-color) !important;
-}
-
-:deep(.tree-org-node__expand) {
-    background-color: var(--el-color-white) !important;
-    border: 1px solid var(--el-border-color) !important;
-}
-
-:deep(.draggable) {
-    cursor: move;
-}
-</style>
-<style lang="scss">
-.zm-tree-contextmenu {
-    background-color: var(--el-color-white) !important;
-    color: var(--el-text-color-regular) !important;
-    border: 1px solid var(--el-border-color) !important;
-    box-shadow: var(--el-box-shadow-light);
-    border-radius: 4px;
-    animation: logoAnimation 0s ease-in-out;
-
-    .zm-tree-menu-item {
-        padding: 6px 15px;
-    }
-
-    .zm-tree-menu-item:hover {
-        background-color: var(--hotline-bg-color) !important;
-        color: var(--el-color-primary) !important;
-    }
-}
-</style>

+ 64 - 62
src/views/device/ivrCategroy/component/addCategroy.vue

@@ -1,85 +1,87 @@
 <template>
-    <div class="device-add-categroy-container">
-        <el-dialog v-model="isShowDialog" width="600px" draggable title="新增ivr分类">
-            <el-form :model="ruleForm" label-width="100px" ref="ruleFormRef">
-                <el-row :gutter="35">
-                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                        <el-form-item label="ivr分类名称" 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="24" :lg="24" :xl="24">
-                        <el-form-item label="备注" prop="remark">
-                            <el-input v-model="ruleForm.remark" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }"
-                                placeholder="请输入备注" clearable></el-input>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-            </el-form>
-            <template #footer>
-                <span class="dialog-footer">
-                    <el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
-                    <el-button type="primary" @click="onSubmit">保 存</el-button>
-                </span>
-            </template>
-        </el-dialog>
-    </div>
+	<div class="device-add-categroy-container">
+		<el-dialog v-model="state.isShowDialog" width="600px" draggable title="新增ivr分类">
+			<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="ivr分类名称" prop="name" :rules="[{ required: true, message: '请输入分类名称', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.name" placeholder="请输入分类名称" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
+						<el-form-item label="备注" prop="remark">
+							<el-input
+								v-model="state.ruleForm.remark"
+								type="textarea"
+								:autosize="{ minRows: 4, maxRows: 6 }"
+								placeholder="请输入备注"
+								clearable
+							></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.isShowDialog = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit">保 存</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script lang="ts" setup>
-import { reactive, ref, toRefs } from "vue";
-import { ElMessage } from 'element-plus'
-import { addIvrCategroies } from "/@/api/device/ivr";
+import { reactive, ref } from 'vue';
+import { ElMessage } from 'element-plus';
+import { addIvrCategroies } from '/@/api/device/ivr';
 
 // 定义接口来定义对象的类型
 interface StateIvrCategroy {
-    ruleForm: {
-        name: string,
-        remark: string
-    },
-    isShowDialog: boolean
+	ruleForm: {
+		name: string;
+		remark: string;
+	};
+	isShowDialog: boolean;
 }
 
 // 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList', 'openDialog', 'closeDialog'])
-
+const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
 
 // 定义变量内容
 const ruleFormRef = ref();
 const state = reactive<StateIvrCategroy>({
-    ruleForm: {
-        name: "",
-        remark: ""
-    },
-    isShowDialog: false
-})
-const { ruleForm, isShowDialog } = toRefs(state);
+	ruleForm: {
+		name: '',
+		remark: '',
+	},
+	isShowDialog: false,
+});
 const openDialog = () => {
-    ruleFormRef.value?.resetFields();
 	ruleFormRef.value?.resetFields();
-    state.isShowDialog = true;
-    emit('openDialog')
-}
+	ruleFormRef.value?.resetFields();
+	state.isShowDialog = true;
+	emit('openDialog');
+};
 // 关闭弹窗
 const closeDialog = () => {
-    state.isShowDialog = false;
-    emit('closeDialog')
+	state.isShowDialog = false;
+	emit('closeDialog');
 };
 // 新增保存
 const onSubmit = () => {
-    ruleFormRef.value.validate((valid: boolean) => {
-        if (valid) {
-            addIvrCategroies(state.ruleForm).then(() => {
-                ElMessage.success("新增成功")
-                emit("updateList");
-                isShowDialog.value = false;
-            })
-        } else {
-            return false;
-        }
-    });
-}
+	ruleFormRef.value.validate((valid: boolean) => {
+		if (valid) {
+			addIvrCategroies(state.ruleForm).then(() => {
+				ElMessage.success('新增成功');
+				emit('updateList');
+				state.isShowDialog = false;
+			});
+		} else {
+			return false;
+		}
+	});
+};
 // 暴露变量
-defineExpose({ closeDialog, openDialog })
+defineExpose({ closeDialog, openDialog });
 </script>

+ 68 - 64
src/views/device/ivrCategroy/component/editCatehroy.vue

@@ -1,84 +1,88 @@
 <template>
-    <div class="device-edit-categroy-container">
-        <el-dialog v-model="isShowDialog" width="600px" draggable title="编辑ivr分类">
-            <el-form :model="ruleForm" label-width="100px" ref="ruleFormRef">
-                <el-row :gutter="35">
-                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                        <el-form-item label="ivr分类名称" 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="24" :lg="24" :xl="24">
-                        <el-form-item label="备注" prop="remark">
-                            <el-input v-model="ruleForm.remark" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }"
-                                placeholder="请输入备注" clearable></el-input>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-            </el-form>
-            <template #footer>
-                <span class="dialog-footer">
-                    <el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
-                    <el-button type="primary" @click="onSubmit">保 存</el-button>
-                </span>
-            </template>
-        </el-dialog>
-    </div>
+	<div class="device-edit-categroy-container">
+		<el-dialog v-model="state.isShowDialog" width="600px" draggable title="编辑ivr分类">
+			<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="ivr分类名称" prop="name" :rules="[{ required: true, message: '请输入分类名称', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.name" placeholder="请输入分类名称" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
+						<el-form-item label="备注" prop="remark">
+							<el-input
+								v-model="state.ruleForm.remark"
+								type="textarea"
+								:autosize="{ minRows: 4, maxRows: 6 }"
+								placeholder="请输入备注"
+								clearable
+							></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.isShowDialog = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit">保 存</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, toRefs  } from 'vue';
-import {  ElMessage } from 'element-plus';
-import { updateIvrCategroies} from "/@/api/device/ivr";
+import { ref, reactive } from 'vue';
+import { ElMessage } from 'element-plus';
+import { updateIvrCategroies } from '/@/api/device/ivr';
 
 // 定义接口来定义对象的类型
 interface StateIvrCategroy {
-    ruleForm: {
-        name: string,
-        remark: string
-    },
-    isShowDialog:boolean
+	ruleForm: {
+		name: string;
+		remark: string;
+	};
+	isShowDialog: boolean;
 }
 
 // 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList','openDialog','closeDialog'])
+const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
 
 // 定义变量内容
 const ruleFormRef = ref();
 const state = reactive<StateIvrCategroy>({
-    ruleForm: {
-        name: "",
-        remark: ""
-    },
-    isShowDialog:false
-})
-const {ruleForm,isShowDialog} = toRefs(state);
-const openDialog = (row:any)=>{
-    ruleFormRef.value?.clearValidate();
-    ruleFormRef.value?.resetFields();
-    state.ruleForm = JSON.parse(JSON.stringify(row));
-    state.isShowDialog = true;
-    emit('openDialog')
-}
+	ruleForm: {
+		name: '',
+		remark: '',
+	},
+	isShowDialog: false,
+});
+const openDialog = (row: any) => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+	state.ruleForm = JSON.parse(JSON.stringify(row));
+	state.isShowDialog = true;
+	emit('openDialog');
+};
 // 关闭弹窗
 const closeDialog = () => {
-    state.isShowDialog = false;
-    emit('closeDialog')
+	state.isShowDialog = false;
+	emit('closeDialog');
 };
-const onSubmit = ()=>{// 编辑保存
+const onSubmit = () => {
+	// 编辑保存
 	ruleFormRef.value.validate((valid: boolean) => {
-        if (valid) {
-			updateIvrCategroies(state.ruleForm).then(()=>{
-				ElMessage.success("操作成功")
-				emit("updateList");
-				isShowDialog.value = false;
-			})
-        } else {
-            return false;
-        }
-    });
-}
+		if (valid) {
+			updateIvrCategroies(state.ruleForm).then(() => {
+				ElMessage.success('操作成功');
+				emit('updateList');
+				state.isShowDialog = false;
+			});
+		} else {
+			return false;
+		}
+	});
+};
 // 暴露变量
-defineExpose({closeDialog,openDialog});
+defineExpose({ closeDialog, openDialog });
 </script>

+ 15 - 13
src/views/device/ivrCategroy/index.vue

@@ -11,7 +11,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column prop="name" label="分类名称" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
@@ -22,13 +22,8 @@
 				</el-table-column>
 				<el-table-column label="操作" width="100" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="onEditCategroy(scope.row)" v-auth="'300303'" title="修改">
-							<SvgIcon name="ele-EditPen" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<el-button text type="danger" @click="onDelCategroy(scope.row)" v-auth="'300304'" title="删除">
-							<SvgIcon name="ele-Delete" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<!-- <el-button text type="success" @click="configIvr(scope.row)">配置ivr</el-button> -->
+						<el-button text type="primary" @click="onEditCategroy(scope.row)" v-auth="'300303'" title="修改IVR分类"> 修改 </el-button>
+						<el-button text type="danger" @click="onDelCategroy(scope.row)" v-auth="'300304'" title="删除IVR分类"> 删除 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -36,14 +31,16 @@
 				</template>
 			</el-table>
 		</div>
-
 		<AddCategroy ref="addCategroyRef" @updateList="handleQuery" />
 		<EditCategroy ref="editCategroyRef" @updateList="handleQuery" />
 	</div>
 </template>
 <script lang="ts" setup name="ivrCategroy">
-import { defineAsyncComponent, onMounted, ref, reactive, toRefs } from 'vue';
+import { defineAsyncComponent, onMounted, ref, reactive } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { useRoute } from 'vue-router';
 import { getIvrCategories, deleteIvrCategroies } from '/@/api/device/ivr';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
@@ -66,10 +63,11 @@ const state = reactive<IvrCategroyState>({
 	tableData: [],
 	multipleSelection: [],
 });
-const { loading, tableData } = toRefs(state);
-
 const addCategroyRef = ref();
 const editCategroyRef = ref();
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 
 // 新增分类
 const onAddCategory = () => {
@@ -126,7 +124,11 @@ const onImportTable = () => {
 		{ key: 'remark', colWidth: '', title: '备注', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `ivr分类管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	handleQuery();

+ 110 - 121
src/views/device/ivrList/index.vue

@@ -11,7 +11,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column prop="no" label="ivr编号" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="name" label="ivr名称" show-overflow-tooltip></el-table-column>
@@ -19,16 +19,16 @@
 				<el-table-column prop="repeat" label="语音播放次数" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="infoLength" label="按键长度" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="exit" label="按键结束符" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="150" fixed="right" align="center">
+				<el-table-column label="操作" width="250" fixed="right" align="center">
 					<template #default="scope">
 						<el-button text type="primary" @click="configure(scope.row)" v-auth="'300402'" title="基础配置">
-							<SvgIcon name="ele-Setting" size="var(--hotline-table-icon-font-size)" />
+							基础配置
 						</el-button>
 						<el-button text type="success" @click="ivrConfigure(scope.row)" v-auth="'300403'" title="策略配置">
-							<SvgIcon name="ele-EditPen" size="var(--hotline-table-icon-font-size)" />
+							策略配置
 						</el-button>
 						<el-button text type="danger" @click="resetIvrConfigure(scope.row)" v-auth="'300404'" title="重置策略配置">
-							<SvgIcon name="ele-Refresh" size="var(--hotline-table-icon-font-size)" />
+							重置策略配置
 						</el-button>
 					</template>
 				</el-table-column>
@@ -39,27 +39,27 @@
 		</div>
 
 		<!-- 基础配置 新增修改 -->
-		<el-dialog v-model="isShowDialog" draggable :title="dialogTitle">
-			<el-form :model="ruleForm" label-width="120px" ref="ruleFormRef">
+		<el-dialog v-model="state.isShowDialog" draggable :title="dialogTitle">
+			<el-form :model="state.ruleForm" label-width="120px" ref="ruleFormRef">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="ivr编号" prop="no">
-							<el-input v-model="ruleForm.no" disabled></el-input>
+							<el-input v-model="state.ruleForm.no" disabled></el-input>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="ivr名称" prop="name" :rules="[{ required: true, message: '请输入ivr名称', trigger: 'blur' }]">
-							<el-input v-model="ruleForm.name" placeholder="请输入ivr名称" clearable></el-input>
+							<el-input v-model="state.ruleForm.name" placeholder="请输入ivr名称" 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="repeat" :rules="[{ required: true, message: '请输入语音播放次数', trigger: 'blur' }]">
-							<el-input-number v-model="ruleForm.repeat" :min="1" :max="50" :precision="0" placeholder="请输入语音播放次数" class="w100" />
+							<el-input-number v-model="state.ruleForm.repeat" :min="1" :max="50" :precision="0" placeholder="请输入语音播放次数" class="w100" />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="按键检测长度" prop="infoLength" :rules="[{ required: true, message: '请输入按键检测长度', trigger: 'blur' }]">
-							<el-input-number v-model="ruleForm.infoLength" :min="1" :precision="0" placeholder="请输入按键检测长度" class="w100" />
+							<el-input-number v-model="state.ruleForm.infoLength" :min="1" :precision="0" placeholder="请输入按键检测长度" class="w100" />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
@@ -71,30 +71,30 @@
 								{ pattern: /[a-z]|[A-Z]|[1-9]#|[*]+/, message: '结束符格式错误,请输入1-9,A-D,*,#' },
 							]"
 						>
-							<el-input v-model="ruleForm.exit" placeholder="请输入1-9,A-D,*,#" clearable maxlength="1"> </el-input>
+							<el-input v-model="state.ruleForm.exit" placeholder="请输入1-9,A-D,*,#" clearable maxlength="1"> </el-input>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="ivr类型" prop="ivrType" :rules="[{ required: true, message: '请选择ivr类型', trigger: 'change' }]">
-							<el-select v-model="ruleForm.ivrType" placeholder="请选择ivr类型" class="w100">
-								<el-option v-for="item in ivrTypes" :key="item.key" :label="item.value" :value="item.key" />
+							<el-select v-model="state.ruleForm.ivrType" placeholder="请选择ivr类型" class="w100">
+								<el-option v-for="item in state.ivrTypes" :key="item.key" :label="item.value" :value="item.key" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="所属分类" prop="ivrCategoryId" :rules="[{ required: true, message: '请选择ivr所属分类', trigger: 'change' }]">
-							<el-select v-model="ruleForm.ivrCategoryId" placeholder="请选择ivr所属分类" class="w100">
-								<el-option v-for="item in categorieList" :key="item.id" :label="item.name" :value="item.id" />
+							<el-select v-model="state.ruleForm.ivrCategoryId" placeholder="请选择ivr所属分类" class="w100">
+								<el-option v-for="item in state.categorieList" :key="item.id" :label="item.name" :value="item.id" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="选择语音文件" prop="voiceList" :rules="[{ required: true, message: '选择语音文件', trigger: 'change' }]">
 							<el-transfer
-								v-model="ruleForm.voiceList"
+								v-model="state.ruleForm.voiceList"
 								:titles="['选择语音文件', '按照选择顺序播放']"
 								target-order="push"
-								:data="voiceList"
+								:data="state.voiceList"
 								:filterable="true"
 							>
 								<template #default="{ option }">
@@ -108,50 +108,50 @@
 
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSave" :loading="loading">保 存</el-button>
+					<el-button @click="state.isShowDialog = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSave" :loading="state.loading">保 存</el-button>
 				</span>
 			</template>
 		</el-dialog>
 
 		<!-- 策略配置 -->
-		<el-dialog v-model="ivrKeyCnfig" draggable title="策略配置">
-			<el-tabs tab-position="left" class="demo-tabs" v-model="ivrAnswerType">
-				<el-tab-pane :label="item.value" v-for="(item, index) in ivrStrategeTypes" :key="index" :name="item.key"></el-tab-pane>
+		<el-dialog v-model="state.ivrKeyCnfig" draggable title="策略配置">
+			<el-tabs tab-position="left" class="demo-tabs" v-model="state.ivrAnswerType">
+				<el-tab-pane :label="item.value" v-for="(item, index) in state.ivrStrategeTypes" :key="index" :name="item.key"></el-tab-pane>
 				<!-- 语音播放完成 -->
-				<el-form :model="voiceFinishedForm" ref="voiceFinishedFormRef" label-width="100px" v-show="ivrAnswerType === 0">
+				<el-form :model="state.voiceFinishedForm" ref="voiceFinishedFormRef" label-width="100px" v-show="state.ivrAnswerType === 0">
 					<el-row :gutter="35">
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="响应类型" prop="ivrAnswerType">
-								<el-select v-model="voiceFinishedForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-									<el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
+								<el-select v-model="state.voiceFinishedForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
+									<el-option v-for="item in state.ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="voiceFinishedForm.ivrAnswerType === 1">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.voiceFinishedForm.ivrAnswerType === 1">
 							<!-- 转语音选择ivr -->
 							<el-form-item label="ivr">
-								<el-select v-model="voiceFinishedForm.content" placeholder="请选择ivr" class="w100">
-									<el-option v-for="item in ivrList" :key="item.id" :label="item.name" :value="item.no" />
+								<el-select v-model="state.voiceFinishedForm.content" placeholder="请选择ivr" class="w100">
+									<el-option v-for="item in state.ivrList" :key="item.id" :label="item.name" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="voiceFinishedForm.ivrAnswerType === 2">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.voiceFinishedForm.ivrAnswerType === 2">
 							<!-- 转分机选择分机-->
 							<el-form-item label="分机" prop="content">
-								<el-select v-model="voiceFinishedForm.content" placeholder="请选择分机" class="w100">
-									<el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+								<el-select v-model="state.voiceFinishedForm.content" placeholder="请选择分机" class="w100">
+									<el-option v-for="item in state.telsList" :key="item.id" :label="item.no" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="voiceFinishedForm.ivrAnswerType === 3">
+						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.voiceFinishedForm.ivrAnswerType === 3">
 							<!-- 转分机组 -->
 							<el-form-item label="分机组" prop="telsGroup">
 								<el-transfer
-									v-model="voiceFinishedForm.telsGroup"
+									v-model="state.voiceFinishedForm.telsGroup"
 									:titles="['选择语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="telsGroup"
+									:data="state.telsGroup"
 									:props="{
 										key: 'no',
 										label: 'name',
@@ -164,19 +164,19 @@
 								</el-transfer>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="voiceFinishedForm.ivrAnswerType === 4">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.voiceFinishedForm.ivrAnswerType === 4">
 							<!-- 转外部电话 -->
 							<el-form-item label="外部电话" prop="content">
-								<el-input v-model="voiceFinishedForm.content" placeholder="请输入外部电话" clearable> </el-input>
+								<el-input v-model="state.voiceFinishedForm.content" placeholder="请输入外部电话" clearable> </el-input>
 							</el-form-item>
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 							<el-form-item label="插播语音" prop="voiceList">
 								<el-transfer
-									v-model="voiceFinishedForm.voiceList"
+									v-model="state.voiceFinishedForm.voiceList"
 									:titles="['语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="voiceList"
+									:data="state.voiceList"
 									:filterable="true"
 								>
 									<template #default="{ option }">
@@ -189,12 +189,12 @@
 				</el-form>
 
 				<!-- 普通按键 -->
-				<el-form label-width="100px" ref="commonKeysFormRef" v-show="ivrAnswerType === 1">
+				<el-form label-width="100px" ref="commonKeysFormRef" v-show="state.ivrAnswerType === 1">
 					<div class="mb20">
 						<el-button type="primary" @click="addFruitConfig"> <SvgIcon name="ele-Plus" class="mr5" />新增按键 </el-button>
 					</div>
 					<!-- <template v-if="keysArray.length"> -->
-					<el-row :gutter="35" v-for="(itemForm, indexForm) in keysArray" :key="indexForm">
+					<el-row :gutter="35" v-for="(itemForm, indexForm) in state.keysArray" :key="indexForm">
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="按键输入" prop="input" :rules="[{ required: false, message: '请输入按键输入', trigger: 'blur' }]">
 								<el-input v-model="itemForm.input" placeholder="请输入按键输入" class="w100"></el-input>
@@ -203,7 +203,7 @@
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="响应类型" prop="ivrAnswerType">
 								<el-select v-model="itemForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-									<el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
+									<el-option v-for="item in state.ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
@@ -211,7 +211,7 @@
 							<!-- 转语音选择ivr -->
 							<el-form-item label="ivr">
 								<el-select v-model="itemForm.content" placeholder="请选择ivr" class="w100">
-									<el-option v-for="item in ivrList" :key="item.id" :label="item.name" :value="item.no" />
+									<el-option v-for="item in state.ivrList" :key="item.id" :label="item.name" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
@@ -219,7 +219,7 @@
 							<!-- 转分机选择分机-->
 							<el-form-item label="分机">
 								<el-select v-model="itemForm.content" placeholder="请选择分机" class="w100">
-									<el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+									<el-option v-for="item in state.telsList" :key="item.id" :label="item.no" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
@@ -230,7 +230,7 @@
 									v-model="itemForm.telsGroup"
 									:titles="['选择语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="telsGroup"
+									:data="state.telsGroup"
 									:props="{
 										key: 'no',
 										label: 'name',
@@ -255,7 +255,7 @@
 									v-model="itemForm.voiceList"
 									:titles="['语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="voiceList"
+									:data="state.voiceList"
 									:filterable="true"
 								>
 									<template #default="{ option }">
@@ -276,39 +276,39 @@
 				</el-form>
 
 				<!-- 异常按键 -->
-				<el-form :model="abnormalKeysForm" ref="abnormalKeysFormRef" label-width="100px" v-show="ivrAnswerType === 2">
+				<el-form :model="state.abnormalKeysForm" ref="abnormalKeysFormRef" label-width="100px" v-show="state.ivrAnswerType === 2">
 					<el-row :gutter="35">
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="响应类型" prop="ivrAnswerType">
-								<el-select v-model="abnormalKeysForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-									<el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
+								<el-select v-model="state.abnormalKeysForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
+									<el-option v-for="item in state.ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="abnormalKeysForm.ivrAnswerType === 1">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.abnormalKeysForm.ivrAnswerType === 1">
 							<!-- 转语音选择ivr -->
 							<el-form-item label="ivr" prop="content">
-								<el-select v-model="abnormalKeysForm.content" placeholder="请选择ivr" class="w100">
-									<el-option v-for="item in ivrList" :key="item.id" :label="item.name" :value="item.no" />
+								<el-select v-model="state.abnormalKeysForm.content" placeholder="请选择ivr" class="w100">
+									<el-option v-for="item in state.ivrList" :key="item.id" :label="item.name" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="abnormalKeysForm.ivrAnswerType === 2">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.abnormalKeysForm.ivrAnswerType === 2">
 							<!-- 转分机选择分机-->
 							<el-form-item label="分机" prop="content">
-								<el-select v-model="abnormalKeysForm.content" placeholder="请选择分机" class="w100">
-									<el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+								<el-select v-model="state.abnormalKeysForm.content" placeholder="请选择分机" class="w100">
+									<el-option v-for="item in state.telsList" :key="item.id" :label="item.no" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="abnormalKeysForm.ivrAnswerType === 3">
+						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.abnormalKeysForm.ivrAnswerType === 3">
 							<!-- 转分机组 -->
 							<el-form-item label="分机组" prop="telsGroup">
 								<el-transfer
-									v-model="abnormalKeysForm.telsGroup"
+									v-model="state.abnormalKeysForm.telsGroup"
 									:titles="['选择语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="telsGroup"
+									:data="state.telsGroup"
 									:props="{
 										key: 'no',
 										label: 'name',
@@ -321,19 +321,19 @@
 								</el-transfer>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="abnormalKeysForm.ivrAnswerType === 4">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.abnormalKeysForm.ivrAnswerType === 4">
 							<!-- 转外部电话 -->
 							<el-form-item label="外部电话" prop="content">
-								<el-input v-model="abnormalKeysForm.content" placeholder="请输入外部电话" clearable></el-input>
+								<el-input v-model="state.abnormalKeysForm.content" placeholder="请输入外部电话" clearable></el-input>
 							</el-form-item>
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 							<el-form-item label="插播语音" prop="voiceList">
 								<el-transfer
-									v-model="abnormalKeysForm.voiceList"
+									v-model="state.abnormalKeysForm.voiceList"
 									:titles="['语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="voiceList"
+									:data="state.voiceList"
 									:filterable="true"
 								>
 									<template #default="{ option }">
@@ -346,39 +346,39 @@
 				</el-form>
 
 				<!-- 返回上一级 -->
-				<el-form :model="returnPreviousForm" ref="returnPreviousFormRef" label-width="100px" v-show="ivrAnswerType === 3">
+				<el-form :model="state.returnPreviousForm" ref="returnPreviousFormRef" label-width="100px" v-show="state.ivrAnswerType === 3">
 					<el-row :gutter="35">
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="响应类型" prop="ivrAnswerType">
-								<el-select v-model="returnPreviousForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-									<el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
+								<el-select v-model="state.returnPreviousForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
+									<el-option v-for="item in state.ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="returnPreviousForm.ivrAnswerType === 1">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.returnPreviousForm.ivrAnswerType === 1">
 							<!-- 转语音选择ivr -->
 							<el-form-item label="ivr" prop="content">
-								<el-select v-model="returnPreviousForm.content" placeholder="请选择ivr" class="w100">
-									<el-option v-for="item in ivrList" :key="item.id" :label="item.name" :value="item.no" />
+								<el-select v-model="state.returnPreviousForm.content" placeholder="请选择ivr" class="w100">
+									<el-option v-for="item in state.ivrList" :key="item.id" :label="item.name" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="returnPreviousForm.ivrAnswerType === 2">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.returnPreviousForm.ivrAnswerType === 2">
 							<!-- 转分机选择分机-->
 							<el-form-item label="分机" prop="content">
-								<el-select v-model="returnPreviousForm.content" placeholder="请选择分机" class="w100">
-									<el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+								<el-select v-model="state.returnPreviousForm.content" placeholder="请选择分机" class="w100">
+									<el-option v-for="item in state.telsList" :key="item.id" :label="item.no" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="returnPreviousForm.ivrAnswerType === 3">
+						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.returnPreviousForm.ivrAnswerType === 3">
 							<!-- 转分机组 -->
 							<el-form-item label="分机组" prop="telsGroup">
 								<el-transfer
-									v-model="returnPreviousForm.telsGroup"
+									v-model="state.returnPreviousForm.telsGroup"
 									:titles="['选择语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="telsGroup"
+									:data="state.telsGroup"
 									:props="{
 										key: 'no',
 										label: 'name',
@@ -391,19 +391,19 @@
 								</el-transfer>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="returnPreviousForm.ivrAnswerType === 4">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.returnPreviousForm.ivrAnswerType === 4">
 							<!-- 转外部电话 -->
 							<el-form-item label="外部电话" prop="content">
-								<el-input v-model="returnPreviousForm.content" placeholder="请输入外部电话" clearable> </el-input>
+								<el-input v-model="state.returnPreviousForm.content" placeholder="请输入外部电话" clearable> </el-input>
 							</el-form-item>
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 							<el-form-item label="插播语音" prop="voiceList">
 								<el-transfer
-									v-model="returnPreviousForm.voiceList"
+									v-model="state.returnPreviousForm.voiceList"
 									:titles="['语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="voiceList"
+									:data="state.voiceList"
 									:filterable="true"
 								>
 									<template #default="{ option }">
@@ -416,39 +416,39 @@
 				</el-form>
 
 				<!-- 按键超时 -->
-				<el-form :model="keyTimeoutForm" ref="keyTimeoutFormRef" label-width="100px" v-show="ivrAnswerType === 4">
+				<el-form :model="state.keyTimeoutForm" ref="keyTimeoutFormRef" label-width="100px" v-show="state.ivrAnswerType === 4">
 					<el-row :gutter="35">
 						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 							<el-form-item label="响应类型" prop="ivrAnswerType">
-								<el-select v-model="keyTimeoutForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
-									<el-option v-for="item in ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
+								<el-select v-model="state.keyTimeoutForm.ivrAnswerType" placeholder="请选择响应类型" class="w100">
+									<el-option v-for="item in state.ivrAnswerTypes" :key="item.key" :label="item.value" :value="item.key" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="keyTimeoutForm.ivrAnswerType === 1">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.keyTimeoutForm.ivrAnswerType === 1">
 							<!-- 转语音选择ivr -->
 							<el-form-item label="ivr" prop="content">
-								<el-select v-model="keyTimeoutForm.content" placeholder="请选择ivr" class="w100">
-									<el-option v-for="item in ivrList" :key="item.id" :label="item.name" :value="item.no" />
+								<el-select v-model="state.keyTimeoutForm.content" placeholder="请选择ivr" class="w100">
+									<el-option v-for="item in state.ivrList" :key="item.id" :label="item.name" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="keyTimeoutForm.ivrAnswerType === 2">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.keyTimeoutForm.ivrAnswerType === 2">
 							<!-- 转分机选择分机-->
 							<el-form-item label="分机" prop="content">
-								<el-select v-model="keyTimeoutForm.content" placeholder="请选择分机" class="w100">
-									<el-option v-for="item in telsList" :key="item.id" :label="item.no" :value="item.no" />
+								<el-select v-model="state.keyTimeoutForm.content" placeholder="请选择分机" class="w100">
+									<el-option v-for="item in state.telsList" :key="item.id" :label="item.no" :value="item.no" />
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="keyTimeoutForm.ivrAnswerType === 3">
+						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.keyTimeoutForm.ivrAnswerType === 3">
 							<!-- 转分机组 -->
 							<el-form-item label="分机组" prop="telsGroup">
 								<el-transfer
-									v-model="keyTimeoutForm.telsGroup"
+									v-model="state.keyTimeoutForm.telsGroup"
 									:titles="['选择语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="telsGroup"
+									:data="state.telsGroup"
 									:props="{
 										key: 'no',
 										label: 'name',
@@ -461,19 +461,19 @@
 								</el-transfer>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="keyTimeoutForm.ivrAnswerType === 4">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.keyTimeoutForm.ivrAnswerType === 4">
 							<!-- 转外部电话 -->
 							<el-form-item label="外部电话" prop="content">
-								<el-input v-model="keyTimeoutForm.content" placeholder="请输入外部电话" clearable></el-input>
+								<el-input v-model="state.keyTimeoutForm.content" placeholder="请输入外部电话" clearable></el-input>
 							</el-form-item>
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 							<el-form-item label="插播语音" prop="voiceList">
 								<el-transfer
-									v-model="keyTimeoutForm.voiceList"
+									v-model="state.keyTimeoutForm.voiceList"
 									:titles="['语音文件', '按照选择顺序播放']"
 									target-order="push"
-									:data="voiceList"
+									:data="state.voiceList"
 									:filterable="true"
 								>
 									<template #default="{ option }">
@@ -487,8 +487,8 @@
 			</el-tabs>
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="ivrKeyCnfig = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="saveIvrConfig" :loading="loading">保 存</el-button>
+					<el-button @click="state.ivrKeyCnfig = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="saveIvrConfig" :loading="state.loading">保 存</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -496,10 +496,12 @@
 </template>
 
 <script lang="ts" name="ivrList" setup>
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { useRoute } from 'vue-router';
 import table2excel from 'js-table2excel';
 import { formatDate } from '/@/utils/formatTime';
 // 引入api
@@ -640,27 +642,10 @@ const state = reactive<IvrListState>({
 		voiceList: [],
 	},
 });
-const {
-	ruleForm,
-	ivrStrategeTypes,
-	ivrAnswerTypes,
-	ivrAnswerType,
-	ivrList,
-	telsList,
-	telsGroup,
-	voiceList,
-	keysArray,
-	categorieList,
-	tableData,
-	isShowDialog,
-	ivrKeyCnfig,
-	loading,
-	ivrTypes,
-	voiceFinishedForm,
-	abnormalKeysForm,
-	returnPreviousForm,
-	keyTimeoutForm,
-} = toRefs(state);
+
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 获取ivr列表 */
 const getList = () => {
 	state.loading = true;
@@ -904,7 +889,7 @@ const ivrConfigure = (row: any) => {
 				break;
 		}
 	}
-	ivrKeyCnfig.value = true;
+	state.ivrKeyCnfig = true;
 };
 // 保存ivr配置
 const saveIvrConfig = () => {
@@ -1015,7 +1000,7 @@ const saveIvrConfig = () => {
 		.then(() => {
 			ElMessage.success('操作成功');
 			getList();
-			ivrKeyCnfig.value = false;
+			state.ivrKeyCnfig = false;
 			state.loading = false;
 		})
 		.catch(() => {
@@ -1053,7 +1038,11 @@ const onImportTable = () => {
 		{ key: 'infoLength', colWidth: '', title: '按键长度', type: 'text', isCheck: true },
 		{ key: 'exit', colWidth: '', title: '按键结束符', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `ivr管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getList(); // ivr列表

+ 13 - 4
src/views/device/tels/index.vue

@@ -11,7 +11,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column prop="no" label="分机编号" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="groupNames" label="所属分机组" show-overflow-tooltip></el-table-column>
@@ -31,8 +31,11 @@
 </template>
 
 <script lang="ts" name="tels" setup>
-import { onMounted, reactive, toRefs } from 'vue';
+import { onMounted, reactive } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { useRoute } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 // 引入api
@@ -51,7 +54,9 @@ const state = reactive<TelsState>({
 	tableData: [],
 	multipleSelection: [],
 });
-const { loading, tableData } = toRefs(state);
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 获取分机列表 */
 const getList = () => {
 	state.loading = true;
@@ -98,7 +103,11 @@ const onImportTable = () => {
 		{ key: '分机状态', colWidth: '', title: '分机状态', type: 'text', isCheck: true },
 		{ key: '创建时间', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `话机管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getList();

+ 32 - 18
src/views/device/telsGroup/index.vue

@@ -10,7 +10,7 @@
 					</el-button>
 				</div>
 			</div>
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column prop="no" label="编号" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="name" label="分机组名称" show-overflow-tooltip></el-table-column>
@@ -29,7 +29,7 @@
 				<el-table-column label="操作" width="100" fixed="right" align="center">
 					<template #default="scope">
 						<el-button text type="primary" @click="configure(scope.row)" v-auth="'300203'" title="配置分机组">
-							<SvgIcon name="ele-EditPen" size="var(--hotline-table-icon-font-size)" />
+							配置
 						</el-button>
 					</template>
 				</el-table-column>
@@ -39,34 +39,40 @@
 			</el-table>
 		</div>
 		<!-- 配置分机组 -->
-		<el-dialog v-model="isShowDialog" draggable :title="dialogTitle">
-			<el-form :model="ruleForm" label-width="110px" ref="ruleFormRef">
+		<el-dialog v-model="state.isShowDialog" draggable :title="dialogTitle">
+			<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="分机编号" prop="no">
-							<el-input v-model="ruleForm.no" disabled></el-input>
+							<el-input v-model="state.ruleForm.no" disabled></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-input v-model="state.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="distribution" :rules="[{ required: true, message: '请选择ivr类型', trigger: 'change' }]">
-							<el-select v-model="ruleForm.distribution" placeholder="请选择呼叫分配方式" class="w100">
-								<el-option v-for="item in distributions" :key="item.key" :label="item.value" :value="item.key" />
+							<el-select v-model="state.ruleForm.distribution" placeholder="请选择呼叫分配方式" class="w100">
+								<el-option v-for="item in state.distributions" :key="item.key" :label="item.value" :value="item.key" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="默认分组" prop="isDefault" :rules="[{ required: false, message: '请选择ivr类型', trigger: 'change' }]">
-							<el-switch v-model="ruleForm.isDefault" />
+							<el-switch v-model="state.ruleForm.isDefault" />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="选择分机" prop="telNos" :rules="[{ required: true, message: '请选择分机', trigger: 'change' }]">
-							<el-transfer v-model="ruleForm.telNos" :titles="['所有分机', '已选分机']" :props="{ key: 'no' }" :data="telsList" :filterable="true">
+							<el-transfer
+								v-model="state.ruleForm.telNos"
+								:titles="['所有分机', '已选分机']"
+								:props="{ key: 'no' }"
+								:data="state.telsList"
+								:filterable="true"
+							>
 								<template #default="{ option }">
 									<span>分机 - {{ option.no }}</span>
 								</template>
@@ -77,10 +83,10 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="语音文件" prop="voiceList" :rules="[{ required: false, message: '选择语音文件', trigger: 'change' }]">
 							<el-transfer
-								v-model="ruleForm.voiceList"
+								v-model="state.ruleForm.voiceList"
 								:titles="['选择语音文件', '按照选择顺序播放']"
 								target-order="push"
-								:data="voiceData"
+								:data="state.voiceData"
 								:filterable="true"
 							>
 								<template #default="{ option }">
@@ -92,7 +98,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="备注" prop="remark">
 							<el-input
-								v-model="ruleForm.remark"
+								v-model="state.ruleForm.remark"
 								type="textarea"
 								:autosize="{ minRows: 4, maxRows: 6 }"
 								placeholder="请输入备注"
@@ -105,8 +111,8 @@
 
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="save" :loading="loading">保 存</el-button>
+					<el-button @click="state.isShowDialog = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="save" :loading="state.loading">保 存</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -114,11 +120,13 @@
 </template>
 
 <script lang="ts" name="tels" setup>
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, onMounted } from 'vue';
 import { ElMessage } from 'element-plus';
 import { storeToRefs } from 'pinia';
 import { formatDate } from '/@/utils/formatTime';
 import { useUserInfo } from '/@/stores/userInfo';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { useRoute } from 'vue-router';
 import table2excel from 'js-table2excel';
 // 引入需要的api
 import { getTelsGroupList, addTelsGroup, updateTelsGroup, baseInfoTelsGroup } from '/@/api/device/telsGroup';
@@ -170,7 +178,9 @@ const state = reactive<TelsGroupState>({
 });
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo);
-const { ruleForm, distributions, loading, tableData, voiceData, isShowDialog, telsList } = toRefs(state);
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 获取所有语音文件列表 */
 const getAudioList = () => {
 	if (userInfos.value.authBtnList.includes('300201')) {
@@ -311,7 +321,11 @@ const onImportTable = () => {
 		{ key: 'remark', colWidth: '', title: '备注', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `分机组管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 页面加载时
 onMounted(() => {

+ 14 - 8
src/views/device/trunks/index.vue

@@ -54,14 +54,10 @@
 						<span>{{ formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" show-overflow-tooltip width="100" fixed="right" align="center">
+				<el-table-column label="操作" show-overflow-tooltip width="160" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="updateTrunks(scope.row)" v-auth="'300503'" title="修改线路">
-							<SvgIcon name="ele-EditPen" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<el-button text type="success" @click="ivrConfigure(scope.row)" v-auth="'300504'" title="删除线路">
-							<SvgIcon name="ele-Delete" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
+						<el-button text type="primary" @click="updateTrunks(scope.row)" v-auth="'300503'" title="修改线路"> 修改线路 </el-button>
+						<el-button text type="success" @click="ivrConfigure(scope.row)" v-auth="'300504'" title="删除线路"> 删除线路 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -77,6 +73,9 @@
 import { onMounted, reactive, toRefs, defineAsyncComponent, ref } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
+import { useRoute } from 'vue-router';
 import table2excel from 'js-table2excel';
 // 引入api
 import { getList, removetrunk } from '/@/api/device/trunks';
@@ -101,6 +100,9 @@ const state = reactive<TelsState>({
 const { loading, tableData } = toRefs(state);
 const addTrunksRef = ref();
 const EditTrunksRef = ref();
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 获取线路列表 */
 const getListFn = () => {
 	state.loading = true;
@@ -158,7 +160,11 @@ const onImportTable = () => {
 		{ key: 'afterBegin', colWidth: '', title: '是否启用', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `线路管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getListFn();

+ 25 - 20
src/views/knowledge/apply/index.vue

@@ -69,7 +69,7 @@
 						<span style="color: var(--el-color-danger)" v-if="row.status === 2">已退回</span>
 					</template>
 				</el-table-column>
-				<el-table-column prop="content" label="处理人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="processor" label="处理人" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="creationName" label="申请人" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="creationOrgName" label="部门名称" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
@@ -97,7 +97,7 @@
 						{{ row.isOvertime ? '是' : '否' }}
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="180" fixed="right" align="center">
+				<el-table-column label="操作" width="150" fixed="right" align="center">
 					<template #default="{ row }">
 						<el-button text type="primary" @click="onDetail(row)" title="查看详情" v-if="[1, 2].includes(row.status)"> 查看详情 </el-button>
 						<el-button text type="primary" @click="onHandle(row)" title="处理" v-if="[0].includes(row.status)"> 处理 </el-button>
@@ -117,7 +117,8 @@
 </template>
 
 <script lang="ts" setup name="knowledgeApply">
-import { ref, reactive, onMounted,defineAsyncComponent } from 'vue';
+import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
+import { useRoute } from 'vue-router';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
@@ -193,6 +194,7 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
 const ruleFormRef = ref<FormInstance>();
 const applyDetailRef = ref();
 const applyHandleRef = ref();
+const route = useRoute();
 // 创建时间
 const tiemChange = (val: string[]) => {
 	state.queryParams.StartTime = val[0];
@@ -231,12 +233,12 @@ const handleClick = () => {
 	getList();
 };
 // 查看详情
-const onDetail = (row:any) => {
-	applyDetailRef.value.openDialog(row)
+const onDetail = (row: any) => {
+	applyDetailRef.value.openDialog(row);
 };
 // 处理
-const onHandle = (row:any) => {
-	applyHandleRef.value.openDialog(row)
+const onHandle = (row: any) => {
+	applyHandleRef.value.openDialog(row);
 };
 // 退回
 const onReturn = (row: any) => {
@@ -269,20 +271,23 @@ const onReturn = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'userName', colWidth: '', title: '用户名称', type: 'text', isCheck: true },
-		{ key: 'fromNo', colWidth: '', title: '主叫号码', type: 'text', isCheck: true },
-		{ key: 'toNo', colWidth: '', title: '被叫号码', type: 'text', isCheck: true },
-		{ key: 'callTypeText', colWidth: '', title: '通话类型', type: 'text', isCheck: true },
-		{ key: 'callStatusText', colWidth: '', title: '通话状态', type: 'text', isCheck: true },
-		{ key: 'callDirectionText', colWidth: '', title: '呼叫方向', type: 'text', isCheck: true },
-		{ key: 'endByText', colWidth: '', title: '通话结束方', type: 'text', isCheck: true },
-		{ key: 'phoneIspText', colWidth: '', title: '运营商', type: 'text', isCheck: true },
-		{ key: 'ringOffTypeText', colWidth: '', title: '挂断类型', type: 'text', isCheck: true },
-		{ key: 'attribution', colWidth: '', title: '归属地', type: 'text', isCheck: true },
-		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
-		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
+		{ key: 'content', colWidth: '', title: '申请内容', type: 'text', isCheck: true },
+		{ key: 'knowledgeApplyType', colWidth: '', title: '申请类型', type: 'text', isCheck: true },
+		{ key: 'status', colWidth: '', title: '状态', type: 'text', isCheck: true },
+		{ key: 'processor', colWidth: '', title: '处理人', type: 'text', isCheck: true },
+		{ key: 'creationName', colWidth: '', title: '申请人', type: 'text', isCheck: true },
+		{ key: 'creationOrgName', colWidth: '', title: '部门名称', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '截止时间', type: 'text', isCheck: true },
+		{ key: 'handleTime', colWidth: '', title: '处理完成时间', type: 'text', isCheck: true },
+		{ key: 'returnTime', colWidth: '', title: '退回时间', type: 'text', isCheck: true },
+		{ key: 'isOvertime', colWidth: '', title: '是否超时', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getList();

+ 20 - 18
src/views/knowledge/apply/my/index.vue

@@ -94,7 +94,7 @@
 						{{ row.isOvertime ? '是' : '否' }}
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="200" fixed="right" align="center">
+				<el-table-column label="操作" width="160" fixed="right" align="center">
 					<template #default="{ row }">
 						<el-button text type="primary" @click="onDetail(row)" title="查看详情" v-if="[0, 1, 2].includes(row.status)"> 查看详情 </el-button>
 						<el-button text type="primary" @click="onEdit(row)" title="编辑" v-if="[2, 3].includes(row.status)"> 编辑 </el-button>
@@ -112,7 +112,7 @@
 		<!-- 新增 -->
 		<MyApplyAdd ref="myApplyAddRef" @updateList="getList" />
 		<!-- 修改 -->
-		<MyApplyEdit ref="myApplyEditRef"  @updateList="getList"/>
+		<MyApplyEdit ref="myApplyEditRef" @updateList="getList" />
 		<!-- 详情 -->
 		<MyApplyDetail ref="myApplyDetailRef" />
 	</div>
@@ -122,6 +122,7 @@
 import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { useRoute } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
@@ -199,6 +200,7 @@ const ruleFormRef = ref<FormInstance>();
 const myApplyAddRef = ref();
 const myApplyEditRef = ref();
 const myApplyDetailRef = ref();
+const route = useRoute();
 // 创建时间
 const tiemChange = (val: string[]) => {
 	if (val) {
@@ -244,11 +246,11 @@ const onDetail = (row: any) => {
 };
 // 发起申请
 const onApply = () => {
-	myApplyAddRef.value.openDialog(state.orgData,state.knowledgeOptions);
+	myApplyAddRef.value.openDialog(state.orgData, state.knowledgeOptions);
 };
 // 修改申请
 const onEdit = (row: any) => {
-	myApplyEditRef.value.openDialog(row, state.orgData,state.knowledgeOptions);
+	myApplyEditRef.value.openDialog(row, state.orgData, state.knowledgeOptions);
 };
 // 撤回
 const onRecall = (row: any) => {
@@ -287,20 +289,20 @@ const onDelete = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'userName', colWidth: '', title: '用户名称', type: 'text', isCheck: true },
-		{ key: 'fromNo', colWidth: '', title: '主叫号码', type: 'text', isCheck: true },
-		{ key: 'toNo', colWidth: '', title: '被叫号码', type: 'text', isCheck: true },
-		{ key: 'callTypeText', colWidth: '', title: '通话类型', type: 'text', isCheck: true },
-		{ key: 'callStatusText', colWidth: '', title: '通话状态', type: 'text', isCheck: true },
-		{ key: 'callDirectionText', colWidth: '', title: '呼叫方向', type: 'text', isCheck: true },
-		{ key: 'endByText', colWidth: '', title: '通话结束方', type: 'text', isCheck: true },
-		{ key: 'phoneIspText', colWidth: '', title: '运营商', type: 'text', isCheck: true },
-		{ key: 'ringOffTypeText', colWidth: '', title: '挂断类型', type: 'text', isCheck: true },
-		{ key: 'attribution', colWidth: '', title: '归属地', type: 'text', isCheck: true },
-		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
-		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
+		{ key: 'content', colWidth: '', title: '申请内容', type: 'text', isCheck: true },
+		{ key: 'knowledgeApplyType', colWidth: '', title: '申请类型', type: 'text', isCheck: true },
+		{ key: 'status', colWidth: '', title: '状态', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
+		{ key: 'handleTime', colWidth: '', title: '处理完成时间', type: 'text', isCheck: true },
+		{ key: 'revokeTime', colWidth: '', title: '撤回时间', type: 'text', isCheck: true },
+		{ key: 'returnTime', colWidth: '', title: '退回时间', type: 'text', isCheck: true },
+		{ key: 'isOvertime', colWidth: '', title: '是否超时', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 
 onMounted(async () => {
@@ -312,7 +314,7 @@ onMounted(async () => {
 		state.knowledgeOptions = state.knowledgeOptions.map((v: any) => ({
 			label: v.title,
 			value: v.id,
-			...v
+			...v,
 		}));
 	} catch (error) {
 		console.log(error);

+ 2 - 2
src/views/knowledge/component/ProcessRecord.vue

@@ -15,7 +15,7 @@
 
 <script setup lang="ts" name="knowledgeProcessRecord">
 import { reactive, defineAsyncComponent } from 'vue';
-import { KnowledgeGetworkflow } from '/@/api/knowledge';
+import { workflowTraces } from '/@/api/system/workflow';
 
 // 引入组件
 const TimeLine = defineAsyncComponent(() => import('/@/components/TimeLine/index.vue'));
@@ -32,7 +32,7 @@ const openDialog = async (row: any) => {
 	try {
 		state.loading = true;
 		// 查询审核记录
-		const res = await KnowledgeGetworkflow(row.workflowId);
+		const res = await workflowTraces(row.workflowId);
 		state.traces = res.result?.traces ?? [];
 		state.traces = formatTraces(state.traces);
 		state.title = row.title ?? '';

+ 1 - 1
src/views/knowledge/config/type/index.vue

@@ -39,7 +39,7 @@
 						<el-tag v-else type="info"> 停用 </el-tag>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="300" fixed="right" align="center">
+				<el-table-column label="操作" width="250" fixed="right" align="center">
 					<template #default="{ row }">
 						<el-button text type="primary" @click="onOpenEdit(row)" title="修改"> 修改 </el-button>
 						<el-button text type="info" @click="onDisabled(row)" v-if="row.isEnable" title="停用"> 停用 </el-button>

+ 21 - 17
src/views/knowledge/knowledge/delApply/index.vue

@@ -58,7 +58,7 @@
 				<el-table-column prop="creationBMName" label="创建部门" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="pageView" label="阅读次数" show-overflow-tooltip></el-table-column>
 				<el-table-column label="状态" show-overflow-tooltip>
-					<template #default="{row}">
+					<template #default="{ row }">
 						<span v-if="row.workFlowApplyStatus === 1" style="color: var(--el-color-primary)">审核中</span>
 						<span v-if="row.workFlowApplyStatus === 2" style="color: var(--el-color-success)">审核通过</span>
 						<span v-if="row.workFlowApplyStatus === 3" style="color: var(--el-color-info)">已撤销</span>
@@ -66,13 +66,15 @@
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="申请时间" show-overflow-tooltip width="170">
-					<template #default="{row}">
+					<template #default="{ row }">
 						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column label="操作" width="180" fixed="right" align="center">
-					<template #default="{row}">
-						<el-button text type="primary" @click="onRecord(row)" title="查看审核记录" v-if="[1,2,3,4].includes(row.workFlowApplyStatus)"> 查看审核记录 </el-button>
+					<template #default="{ row }">
+						<el-button text type="primary" @click="onRecord(row)" title="查看审核记录" v-if="[1, 2, 3, 4].includes(row.workFlowApplyStatus)">
+							查看审核记录
+						</el-button>
 						<el-button text type="danger" @click="onRecall(row)" title="撤回申请" v-if="[1].includes(row.workFlowApplyStatus)"> 撤回申请 </el-button>
 					</template>
 				</el-table-column>
@@ -92,6 +94,7 @@
 import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { useRoute } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
@@ -165,6 +168,7 @@ const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const ruleFormRef = ref<FormInstance>();
 const processRecordRef = ref();
+const route = useRoute();
 // 创建时间
 const tiemChange = (val: string[]) => {
 	state.queryParams.StartApplyTime = val[0];
@@ -225,20 +229,20 @@ const onRecall = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'userName', colWidth: '', title: '用户名称', type: 'text', isCheck: true },
-		{ key: 'fromNo', colWidth: '', title: '主叫号码', type: 'text', isCheck: true },
-		{ key: 'toNo', colWidth: '', title: '被叫号码', type: 'text', isCheck: true },
-		{ key: 'callTypeText', colWidth: '', title: '通话类型', type: 'text', isCheck: true },
-		{ key: 'callStatusText', colWidth: '', title: '通话状态', type: 'text', isCheck: true },
-		{ key: 'callDirectionText', colWidth: '', title: '呼叫方向', type: 'text', isCheck: true },
-		{ key: 'endByText', colWidth: '', title: '通话结束方', type: 'text', isCheck: true },
-		{ key: 'phoneIspText', colWidth: '', title: '运营商', type: 'text', isCheck: true },
-		{ key: 'ringOffTypeText', colWidth: '', title: '挂断类型', type: 'text', isCheck: true },
-		{ key: 'attribution', colWidth: '', title: '归属地', type: 'text', isCheck: true },
-		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
-		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
+		{ key: 'title', colWidth: '', title: '标题', type: 'text', isCheck: true },
+		{ key: 'knowledgeTypeName', colWidth: '', title: '类型', type: 'text', isCheck: true },
+		{ key: 'hotspotName', colWidth: '', title: '热点', type: 'text', isCheck: true },
+		{ key: 'creationName', colWidth: '', title: '创建人', type: 'text', isCheck: true },
+		{ key: 'creationBMName', colWidth: '', title: '创建部门', type: 'text', isCheck: true },
+		{ key: 'pageView', colWidth: '', title: '阅读次数', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '申请时间', type: 'text', isCheck: true },
+		{ key: 'workFlowApplyStatus', colWidth: '', title: '状态', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getList();

+ 11 - 15
src/views/knowledge/knowledge/draft/index.vue

@@ -82,7 +82,7 @@ import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { treelist } from '/@/api/knowledge/type';
 import { formatDate } from '/@/utils/formatTime';
-import { useRouter } from 'vue-router';
+import { useRouter, useRoute } from 'vue-router';
 import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
@@ -138,6 +138,7 @@ const state = reactive(<any>{
 	multipleSelection: [],
 });
 const router = useRouter();
+const route = useRoute();
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const ruleFormRef = ref<FormInstance>();
@@ -202,26 +203,21 @@ const onDel = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'userName', colWidth: '', title: '用户名称', type: 'text', isCheck: true },
-		{ key: 'fromNo', colWidth: '', title: '主叫号码', type: 'text', isCheck: true },
-		{ key: 'toNo', colWidth: '', title: '被叫号码', type: 'text', isCheck: true },
-		{ key: 'callTypeText', colWidth: '', title: '通话类型', type: 'text', isCheck: true },
-		{ key: 'callStatusText', colWidth: '', title: '通话状态', type: 'text', isCheck: true },
-		{ key: 'callDirectionText', colWidth: '', title: '呼叫方向', type: 'text', isCheck: true },
-		{ key: 'endByText', colWidth: '', title: '通话结束方', type: 'text', isCheck: true },
-		{ key: 'phoneIspText', colWidth: '', title: '运营商', type: 'text', isCheck: true },
-		{ key: 'ringOffTypeText', colWidth: '', title: '挂断类型', type: 'text', isCheck: true },
-		{ key: 'attribution', colWidth: '', title: '归属地', type: 'text', isCheck: true },
-		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
-		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
+		{ key: 'title', colWidth: '', title: '标题', type: 'text', isCheck: true },
+		{ key: 'knowledgeTypeName', colWidth: '', title: '类型', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 知识分类
 const getKnowledgeType = async () => {
 	state.loading = true;
 	try {
-		const res: any = await treelist({IsEnable:1});
+		const res: any = await treelist({ IsEnable: 1 });
 		state.typeData = res.result ?? [];
 		state.loading = false;
 	} catch (error) {

+ 22 - 10
src/views/knowledge/knowledge/index.vue

@@ -236,7 +236,7 @@
 <script lang="ts" setup name="knowledge">
 import { ref, reactive, onMounted, watch, onActivated, defineAsyncComponent } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
-import { useRouter } from 'vue-router';
+import { useRouter, useRoute } from 'vue-router';
 import type { FormInstance } from 'element-plus';
 import table2excel from 'js-table2excel';
 import { formatDate } from '/@/utils/formatTime';
@@ -245,6 +245,8 @@ import { KnowledgePaged, KnowledgeRevoke, KnowledgeOffshelf, KnowledgeOntheshelf
 import { getOrgList } from '/@/api/system/organize';
 import { treelist } from '/@/api/knowledge/type';
 import { hotspottype } from '/@/api/business/order';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
 
 // 引入组件
 const ProcessRecord = defineAsyncComponent(() => import('/@/views/knowledge/component/ProcessRecord.vue'));
@@ -298,11 +300,14 @@ const state = reactive<any>({
 	options: [],
 });
 const router = useRouter();
+const route = useRoute();
 const ruleFormRef = ref<FormInstance>(); //表单ref
 const rightScrollRef = ref();
 const processRecordRef = ref();
 const processRef = ref();
 const updateKnowledge = ref();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 // 热点分类远程搜索
 const HotspotProps = {
 	label: 'hotSpotFullName',
@@ -578,16 +583,23 @@ const onRowDel = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'name', colWidth: '', title: '姓名', type: 'text', isCheck: true },
-		{ key: 'userName', colWidth: '', title: '账号', type: 'text', isCheck: true },
-		{ key: 'orgName', colWidth: '', title: '所属部门', type: 'text', isCheck: true },
-		{ key: 'roles', colWidth: '', title: '角色', type: 'text', isCheck: true },
-		{ key: 'phoneNo', colWidth: '', title: '电话号码', type: 'text', isCheck: true },
-		{ key: 'staffNo', colWidth: '', title: '工号', type: 'text', isCheck: true },
-		{ key: 'defaultTelNo', colWidth: '', title: '默认分机', type: 'text', isCheck: true },
-		{ key: 'creationTime', colWidth: '', title: '更新时间', type: 'text', isCheck: true },
+		{ key: 'title', colWidth: '', title: '标题', type: 'text', isCheck: true },
+		{ key: 'knowledgeTypeName', colWidth: '', title: '类型', type: 'text', isCheck: true },
+		{ key: 'hotspotName', colWidth: '', title: '热点', type: 'text', isCheck: true },
+		{ key: 'creationName', colWidth: '', title: '创建人', type: 'text', isCheck: true },
+		{ key: 'creationBMName', colWidth: '', title: '创建部门', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
+		{ key: 'pageView', colWidth: '', title: '阅读次数', type: 'text', isCheck: true },
+		{ key: 'onShelfTime', colWidth: '', title: '上架时间', type: 'text', isCheck: true },
+		{ key: 'offShelfTime', colWidth: '', title: '下架时间', type: 'text', isCheck: true },
+		{ key: 'lastModificationTime', colWidth: '', title: '更新时间', type: 'text', isCheck: true },
+		{ key: 'status', colWidth: '', title: '状态', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `用户信息 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getList();

+ 22 - 25
src/views/knowledge/process/index.vue

@@ -9,7 +9,7 @@
 				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 					<el-form-item label="审核类型" prop="EKnowledgeApplyType">
 						<el-select v-model="state.queryParams.EKnowledgeApplyType" placeholder="请选择审核类型" class="w100">
-							<el-option v-for="(item,index) in state.directionList" :key="index" :label="item.label" :value="item.value" />
+							<el-option v-for="(item, index) in state.directionList" :key="index" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="关键字" prop="Keyword">
@@ -53,25 +53,25 @@
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="创建时间" show-overflow-tooltip width="170">
-					<template #default="{row}">
+					<template #default="{ row }">
 						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="到达该节点时间" show-overflow-tooltip width="170">
-					<template #default="{row}">
+					<template #default="{ row }">
 						<span>{{ formatDate(row.currentStepTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
 				<el-table-column prop="toNo" label="审核时间" show-overflow-tooltip width="170">
-					<template #default="{row}">
+					<template #default="{ row }">
 						<span>{{ formatDate(row.handleTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="200" fixed="right" align="center">
-					<template #default="{row}">
-						<el-button text type="primary" @click="onPreview(row)" title="预览" v-if="[1,2,3].includes(row.status)"> 预览 </el-button>
+				<el-table-column label="操作" width="150" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button text type="primary" @click="onPreview(row)" title="预览" v-if="[1, 2, 3].includes(row.status)"> 预览 </el-button>
 						<el-button text type="primary" @click="onProcess(row)" title="审核" v-if="[1].includes(row.status)"> 审核 </el-button>
-						<el-button text type="info" @click="onRecord(row)" title="查看审核记录" v-if="[2,3].includes(row.status)">查看审核记录 </el-button>
+						<el-button text type="info" @click="onRecord(row)" title="查看审核记录" v-if="[2, 3].includes(row.status)">查看审核记录 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -97,7 +97,7 @@ import table2excel from 'js-table2excel';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 // 引入节流
-import { throttle,commonEeum } from '/@/utils/tools';
+import { throttle, commonEeum } from '/@/utils/tools';
 import { KnowledgeApprovedlist } from '/@/api/knowledge';
 
 // 引入组件
@@ -175,12 +175,12 @@ const onPreview = (row: any) => {
 };
 // 审核
 const onProcess = (row: any) => {
-	processRef.value.openDialog({ id: row.workflowId, title:'提交', processType: 'next', commonEeum: commonEeum.OrderCirculation });
+	processRef.value.openDialog({ id: row.workflowId, title: '提交', processType: 'next', commonEeum: commonEeum.OrderCirculation });
 };
 // 发起更新成功
-const onSubmitProcess = ()=>{
+const onSubmitProcess = () => {
 	getList();
-}
+};
 // 查看审核记录
 const onRecord = (row: any) => {
 	processRecordRef.value.openDialog(row);
@@ -188,20 +188,17 @@ const onRecord = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'userName', colWidth: '', title: '用户名称', type: 'text', isCheck: true },
-		{ key: 'fromNo', colWidth: '', title: '主叫号码', type: 'text', isCheck: true },
-		{ key: 'toNo', colWidth: '', title: '被叫号码', type: 'text', isCheck: true },
-		{ key: 'callTypeText', colWidth: '', title: '通话类型', type: 'text', isCheck: true },
-		{ key: 'callStatusText', colWidth: '', title: '通话状态', type: 'text', isCheck: true },
-		{ key: 'callDirectionText', colWidth: '', title: '呼叫方向', type: 'text', isCheck: true },
-		{ key: 'endByText', colWidth: '', title: '通话结束方', type: 'text', isCheck: true },
-		{ key: 'phoneIspText', colWidth: '', title: '运营商', type: 'text', isCheck: true },
-		{ key: 'ringOffTypeText', colWidth: '', title: '挂断类型', type: 'text', isCheck: true },
-		{ key: 'attribution', colWidth: '', title: '归属地', type: 'text', isCheck: true },
-		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
-		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
+		{ key: 'title', colWidth: '', title: '标题', type: 'text', isCheck: true },
+		{ key: 'knowledgeTypeName', colWidth: '', title: '类型', type: 'text', isCheck: true },
+		{ key: 'hotspotName', colWidth: '', title: '热点', type: 'text', isCheck: true },
+		{ key: 'creationName', colWidth: '', title: '创建人', type: 'text', isCheck: true },
+		{ key: 'creationBMName', colWidth: '', title: '创建部门', type: 'text', isCheck: true },
+		{ key: 'workFlowApplyStatus', colWidth: '', title: '状态', type: 'text', isCheck: true },
+		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
+		{ key: 'currentStepTime', colWidth: '', title: '到达该节点时间', type: 'text', isCheck: true },
+		{ key: 'handleTime', colWidth: '', title: '审核时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle}-知识库-审核管理 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
 };
 onMounted(() => {
 	getList();

+ 2 - 4
src/views/system/config/dict/index.vue

@@ -98,7 +98,6 @@ import { ElMessage } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import { throttle } from '/@/utils/tools';
 import { dictypeList, getDataByTypeid } from '/@/api/system/dict';
-import SvgIcon from '/@/views/system/menu/component/SvgIcon.vue';
 
 // 引入组件
 const DictAdd = defineAsyncComponent(() => import('/@/views/system/config/dict/component/DictAdd.vue'));
@@ -146,7 +145,7 @@ const state = reactive<any>({
 		{
 			key: 'handle',
 			title: '操作',
-			width: 80,
+			width: 70,
 			fixed: 'right',
 			align: 'center',
 			cellRenderer: (data: any) => {
@@ -157,9 +156,8 @@ const state = reactive<any>({
 						{
 							onClick: () => onOpenEditUser(data),
 							type: 'primary',
-							icon: h(SvgIcon, { name: 'ele-Edit', size: '16px' }, {}),
 							link: true,
-							title: '修改',
+							title: '修改字典西悉尼',
 						},
 						{ default: () => '修改' }
 					);

+ 8 - 12
src/views/system/menu/index.vue

@@ -153,22 +153,20 @@ const state = reactive({
 							{
 								onClick: () => onOpenEditMenu(data.rowData),
 								type: 'primary',
-								icon: h(SvgIcon, { name: 'ele-Edit', size: '16px' }, {}),
 								link: true,
-								title: '修改',
+								title: '修改菜单',
 							},
-							{ default: () => '' }
+							{ default: () => '修改' }
 						),
 						h(
 							ElButton,
 							{
 								onClick: () => onTabelRowDel(data.rowData),
 								type: 'danger',
-								icon: h(SvgIcon, { name: 'ele-Delete', size: '16px' }, {}),
 								link: true,
-								title: '删除',
+								title: '删除菜单',
 							},
-							{ default: () => '' }
+							{ default: () => '删除' }
 						),
 					]);
 				} else if (userInfos.value.authBtnList.includes('100402')) {
@@ -177,11 +175,10 @@ const state = reactive({
 						{
 							onClick: () => onOpenEditMenu(data.rowData),
 							type: 'primary',
-							icon: h(SvgIcon, { name: 'ele-Edit', size: '16px' }, {}),
 							link: true,
-							title: '修改',
+							title: '修改菜单',
 						},
-						{ default: () => '' }
+						{ default: () => '修改' }
 					);
 				} else if (userInfos.value.authBtnList.includes('100403')) {
 					h(
@@ -189,11 +186,10 @@ const state = reactive({
 						{
 							onClick: () => onTabelRowDel(data.rowData),
 							type: 'danger',
-							icon: h(SvgIcon, { name: 'ele-Delete', size: '16px' }, {}),
 							link: true,
-							title: '删除',
+							title: '删除菜单',
 						},
-						{ default: () => '' }
+						{ default: () => '删除' }
 					);
 				}
 			},

+ 1 - 3
src/views/system/organize/index.vue

@@ -41,7 +41,6 @@ import { defineAsyncComponent, ref, h, reactive, onMounted, watch } from 'vue';
 import { ElButton,ElTag } from 'element-plus';
 import { getOrgList } from '/@/api/system/organize';
 import { formatDate } from '/@/utils/formatTime';
-import SvgIcon from '/@/views/system/menu/component/SvgIcon.vue';
 // 引入组件
 const AddOrg = defineAsyncComponent(() => import('/@/views/system/organize/component/addOrg.vue'));
 const EditOrg = defineAsyncComponent(() => import('/@/views/system/organize/component/editOrg.vue'));
@@ -90,7 +89,7 @@ const state = reactive({
 		{
 			key: 'handle',
 			title: '操作',
-			width: 80,
+			width: 70,
 			fixed: 'right',
 			align: 'center',
 			cellRenderer: (data: any) =>
@@ -100,7 +99,6 @@ const state = reactive({
 						onClick: () => onOpenEditOrg(data),
 						type: 'primary',
 						title: '修改',
-						icon: h(SvgIcon, { name: 'ele-Edit', size: '16px' }, {}),
 						link: true,
 					},
 					{ default: () => '修改' }

+ 6 - 12
src/views/system/roles/index.vue

@@ -39,19 +39,13 @@
 					</template>
 				</el-table-column>
 				<el-table-column prop="state" label="状态" show-overflow-tooltip width="80"> </el-table-column>
-				<el-table-column label="操作" width="130" fixed="right" align="center">
+				<el-table-column label="操作" width="230" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="onOpenEditRole(scope.row)" v-auth="'100203'" title="修改">
-							<SvgIcon name="ele-Edit" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<el-button text type="success" @click="onPermissions(scope.row)" v-auth="'100204'" title="配置权限">
-							<SvgIcon name="iconfont icon-quanxian" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<el-button text type="info" @click="onDataAuth(scope.row)" v-auth="'100204'" title="数据权限">
-							<SvgIcon name="ele-MessageBox" size="var(--hotline-table-icon-font-size)" />
-						</el-button>
-						<el-button text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.state === '正常'" v-auth="'100202'" title="删除">
-							<SvgIcon name="ele-Delete" size="var(--hotline-table-icon-font-size)" />
+						<el-button text type="primary" @click="onOpenEditRole(scope.row)" v-auth="'100203'" title="修改角色信息"> 修改 </el-button>
+						<el-button text type="success" @click="onPermissions(scope.row)" v-auth="'100204'" title="配置角色权限"> 配置权限 </el-button>
+						<el-button text type="info" @click="onDataAuth(scope.row)" v-auth="'100204'" title="配置角色数据权限"> 数据权限 </el-button>
+						<el-button text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.state === '正常'" v-auth="'100202'" title="删除角色">
+							删除
 						</el-button>
 					</template>
 				</el-table-column>

+ 6 - 16
src/views/system/user/index.vue

@@ -44,9 +44,7 @@
 									<el-button type="primary" @click="handleQuery" :loading="state.tableLoading">
 										<SvgIcon name="ele-Search" class="mr5" />查询
 									</el-button>
-									<el-button @click="resetQuery(ruleFormRef)" class="default-button">
-										<SvgIcon name="ele-Refresh" class="mr5" />重置
-									</el-button>
+									<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 								</el-form-item>
 							</el-form>
 							<div class="flex-center-between mb20">
@@ -75,20 +73,12 @@
 									</template>
 								</el-table-column>
 								<el-table-column prop="state" label="状态" show-overflow-tooltip width="60"></el-table-column>
-								<el-table-column label="操作" width="140" fixed="right" align="center">
+								<el-table-column label="操作" width="230" fixed="right" align="center">
 									<template #default="scope">
-										<el-button text type="primary" @click="onOpenEditUser(scope.row)" v-auth="'100103'" title="修改">
-											<SvgIcon name="ele-Edit" size="var(--hotline-table-icon-font-size)" />
-										</el-button>
-										<el-button text type="success" @click="onSetRole(scope.row)" v-auth="'100105'" title="设置角色">
-											<SvgIcon name="ele-Setting" size="var(--hotline-table-icon-font-size)" />
-										</el-button>
-										<el-button text type="warning" @click="onRestPwd(scope.row)" title="重置密码">
-											<SvgIcon name="ele-Refresh" size="var(--hotline-table-icon-font-size)" />
-										</el-button>
-										<el-button text type="danger" @click="onRowDel(scope.row)" v-auth="'100104'" title="删除">
-											<SvgIcon name="ele-Delete" size="var(--hotline-table-icon-font-size)" />
-										</el-button>
+										<el-button text type="primary" @click="onOpenEditUser(scope.row)" v-auth="'100103'" title="修改"> 修改 </el-button>
+										<el-button text type="success" @click="onSetRole(scope.row)" v-auth="'100105'" title="设置角色"> 设置角色 </el-button>
+										<el-button text type="warning" @click="onRestPwd(scope.row)" title="重置密码"> 重置密码 </el-button>
+										<el-button text type="danger" @click="onRowDel(scope.row)" v-auth="'100104'" title="删除"> 删除 </el-button>
 									</template>
 								</el-table-column>
 								<template #empty>

+ 23 - 17
src/views/tels/blacklist/index.vue

@@ -2,23 +2,23 @@
 	<div class="telslog-balckList-container layout-pd">
 		<el-card shadow="never">
 			<!-- 通用搜索 -->
-			<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 				<el-form-item label="级别" prop="level">
-					<el-select v-model="queryParams.level" placeholder="请选择呼叫方向" class="w100">
-						<el-option v-for="item in levelList" :key="item.value" :label="item.label" :value="item.value" />
+					<el-select v-model="state.queryParams.level" placeholder="请选择呼叫方向" class="w100">
+						<el-option v-for="item in state.levelList" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
 				<el-form-item label="电话号码" prop="PhoneNum">
-					<el-input v-model="queryParams.PhoneNum" placeholder="请输入电话号码" clearable @keyup.enter="handleQuery" />
+					<el-input v-model="state.queryParams.PhoneNum" placeholder="请输入电话号码" clearable @keyup.enter="handleQuery" />
 				</el-form-item>
 				<el-form-item label="状态" prop="status">
-					<el-select v-model="queryParams.status" placeholder="请选择呼叫方向" class="w100">
-						<el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
+					<el-select v-model="state.queryParams.status" placeholder="请选择呼叫方向" class="w100">
+						<el-option v-for="item in state.statusList" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
 				<el-form-item label="时间" prop="time">
 					<el-date-picker
-						v-model="queryParams.time"
+						v-model="state.queryParams.time"
 						type="daterange"
 						range-separator="至"
 						start-placeholder="开始时间"
@@ -27,7 +27,7 @@
 					/>
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary" @click="handleQuery" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 				</el-form-item>
 			</el-form>
@@ -46,7 +46,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column type="index" width="60" label="序号" />
 				<el-table-column prop="phoneNo" label="电话号码" show-overflow-tooltip></el-table-column>
@@ -88,10 +88,7 @@
 				</el-table-column>
 				<el-table-column label="操作" width="100" fixed="right" align="center">
 					<template #default="scope">
-						<el-button text type="primary" @click="onViewRecord(scope.row)" v-auth="'200202'" title="查看记录">
-							<!-- <SvgIcon name="ele-View" size="var(--hotline-table-icon-font-size)" /> -->
-							查看记录
-						</el-button>
+						<el-button text type="primary" @click="onViewRecord(scope.row)" v-auth="'200202'" title="查看记录"> 查看记录 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -99,7 +96,7 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
 
 		<AddBlacklist ref="addBlacklistRef" @updateList="handleQuery" />
@@ -108,9 +105,12 @@
 </template>
 
 <script lang="ts" setup name="balckList">
-import { defineAsyncComponent, ref, reactive, toRefs, onMounted } from 'vue';
+import { defineAsyncComponent, ref, reactive, onMounted } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import type { FormInstance } from 'element-plus';
+import { useRoute } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
 import { formatDate } from '/@/utils/formatTime';
 import { blacklistPaged, balcklistDelete } from '/@/api/tels/blacklist';
 import { throttle } from '/@/utils/tools';
@@ -187,7 +187,9 @@ const state = reactive<QueryState>({
 const ruleFormRef = ref<FormInstance>();
 const addBlacklistRef = ref();
 const operationRecordRef = ref();
-const { queryParams, loading, total, tableData, levelList, statusList } = toRefs(state);
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const route = useRoute();
 /** 搜索按钮操作 节流操作 */
 const handleQuery = throttle(() => {
 	state.queryParams.PageIndex = 1;
@@ -227,7 +229,11 @@ const onImportTable = () => {
 		{ key: 'duration', colWidth: '', title: '黑名单时长(秒)', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 删除黑名单
 const onRowDel = (row: any) => {

+ 37 - 41
src/views/tels/callRecord/index.vue

@@ -1,34 +1,32 @@
 <template>
 	<div class="telslog-callRecord-container layout-pd">
 		<el-card shadow="never">
-			<el-tabs v-model="activeName" @tab-change="handleClick">
+			<el-tabs v-model="state.activeName" @tab-change="handleClick">
 				<el-tab-pane label="呼入列表" name="incoming"></el-tab-pane>
 				<el-tab-pane label="呼出列表" name="exhale"></el-tab-pane>
 				<el-tab-pane label="未接列表" name="missed" v-auth="'200101'"></el-tab-pane>
-				<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
-					<el-form-item label="呼叫方向" prop="Direction" v-if="activeName === 'missed'">
-						<el-select v-model="queryParams.Direction" placeholder="请选择呼叫方向" class="w100">
-							<el-option v-for="item in directionList" :key="item.value" :label="item.label" :value="item.value" />
+				<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+					<el-form-item label="呼叫方向" prop="Direction" v-if="state.activeName === 'missed'">
+						<el-select v-model="state.queryParams.Direction" placeholder="请选择呼叫方向" class="w100">
+							<el-option v-for="item in state.directionList" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="接通状态" prop="CallState" v-else>
-						<el-select v-model="queryParams.CallState" placeholder="请选择接通状态" class="w100">
-							<el-option v-for="item in stateList" :key="item.value" :label="item.label" :value="item.value" />
+						<el-select v-model="state.queryParams.CallState" placeholder="请选择接通状态" class="w100">
+							<el-option v-for="item in state.stateList" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="被叫号码" prop="PhoneNum">
-						<el-input v-model="queryParams.PhoneNum" placeholder="请输入被叫号码" clearable @keyup.enter="getList(activeName)" />
+						<el-input v-model="state.queryParams.PhoneNum" placeholder="请输入被叫号码" clearable @keyup.enter="getList" />
 					</el-form-item>
 					<el-form-item label="主叫号码" prop="ToNum">
-						<el-input v-model="queryParams.ToNum" placeholder="请输入主叫号码" clearable @keyup.enter="getList(activeName)" />
+						<el-input v-model="state.queryParams.ToNum" placeholder="请输入主叫号码" clearable @keyup.enter="getList" />
 					</el-form-item>
 					<el-form-item label="坐席" prop="UserName">
-						<el-input v-model="queryParams.UserName" placeholder="请输入坐席姓名或工号" clearable @keyup.enter="getList(activeName)" />
+						<el-input v-model="state.queryParams.UserName" placeholder="请输入坐席姓名或工号" clearable @keyup.enter="getList" />
 					</el-form-item>
 					<el-form-item>
-						<el-button type="primary" @click="getList(activeName)" :loading="loading" v-waves>
-							<SvgIcon name="ele-Search" class="mr5" />查询
-						</el-button>
+						<el-button type="primary" @click="getList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
@@ -44,14 +42,14 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableList" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column type="index" width="60" label="序号" />
 				<el-table-column prop="fromNo" label="主叫号码" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="被叫号码" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="toNo" label="呼叫时间" show-overflow-tooltip></el-table-column>
 				<!-- 呼入 -->
-				<template v-if="activeName === 'incoming'">
+				<template v-if="state.activeName === 'incoming'">
 					<el-table-column label="工单" show-overflow-tooltip>
 						<template #default="scope">
 							<el-button text type="primary">
@@ -86,7 +84,7 @@
 					</el-table-column>
 				</template>
 				<!-- 呼出 -->
-				<template v-else-if="activeName === 'exhale'">
+				<template v-else-if="state.activeName === 'exhale'">
 					<el-table-column label="工单" show-overflow-tooltip>
 						<template #default="scope">
 							<el-button text type="primary">
@@ -100,22 +98,16 @@
 					<el-table-column prop="toNo" label="挂断方" show-overflow-tooltip></el-table-column>
 					<el-table-column prop="toNo" label="等待时长" show-overflow-tooltip></el-table-column>
 					<el-table-column prop="toNo" label="通话保持时长" show-overflow-tooltip></el-table-column>
-					<el-table-column label="操作" width="120" fixed="right" align="center">
+					<el-table-column label="操作" width="200" fixed="right" align="center">
 						<template #default="scope">
-							<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="播放录音">
-								<SvgIcon name="ele-VideoPlay" size="var(--hotline-table-icon-font-size)" />
-							</el-button>
-							<el-button text type="success" @click="onDownload(scope.row)" title="下载录音">
-								<SvgIcon name="ele-Download" size="var(--hotline-table-icon-font-size)" />
-							</el-button>
-							<el-button text type="warning" @click="onRelationWorkOrder(scope.row)" title="关联工单">
-								<SvgIcon name="ele-Connection" size="var(--hotline-table-icon-font-size)" />
-							</el-button>
+							<el-button text type="primary" @click="onPalySoundRecording(scope.row)" title="播放录音"> 播放录音 </el-button>
+							<el-button text type="success" @click="onDownload(scope.row)" title="下载录音"> 下载录音 </el-button>
+							<el-button text type="warning" @click="onRelationWorkOrder(scope.row)" title="关联工单"> 关联工单 </el-button>
 						</template>
 					</el-table-column>
 				</template>
 				<!-- 未接 -->
-				<template v-else-if="activeName === 'missed'">
+				<template v-else-if="state.activeName === 'missed'">
 					<el-table-column prop="toNo" label="进入IVR时间" show-overflow-tooltip></el-table-column>
 					<el-table-column prop="toNo" label="进入队列时间" show-overflow-tooltip></el-table-column>
 					<el-table-column prop="toNo" label="振铃时间" show-overflow-tooltip></el-table-column>
@@ -138,15 +130,16 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList(activeName)" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
 		<PlayRecording ref="playRecordingRef" />
 	</div>
 </template>
 
 <script lang="ts" setup name="callRecord">
-import { ref, reactive, toRefs, onMounted, defineAsyncComponent } from 'vue';
+import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
+import { useRoute } from 'vue-router';
 import { ElMessage } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import table2excel from 'js-table2excel';
@@ -226,16 +219,15 @@ const state = reactive(<QueryState>{
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const { queryParams, tableList, loading, total, activeName, directionList, stateList } = toRefs(state);
 const ruleFormRef = ref<FormInstance>();
 const playRecordingRef = ref();
+const route = useRoute();
 /** 获取用户列表 */
-const getList = (val: string) => {
-	queryParams.value.PageIndex = 1;
+const getList = () => {
 	state.loading = true;
-	switch (val) {
+	switch (state.activeName) {
 		case 'incoming':
-			callPaged(queryParams.value)
+			callPaged(state.queryParams)
 				.then((response: any) => {
 					state.tableList = response?.result.items ?? [];
 					state.total = response?.result.total;
@@ -246,7 +238,7 @@ const getList = (val: string) => {
 				});
 			break;
 		case 'exhale':
-			callPaged(queryParams.value)
+			callPaged(state.queryParams)
 				.then((response: any) => {
 					state.tableList = response?.result.items ?? [];
 					state.total = response?.result.total;
@@ -257,7 +249,7 @@ const getList = (val: string) => {
 				});
 			break;
 		case 'missed':
-			callPagedMissed(queryParams.value)
+			callPagedMissed(state.queryParams)
 				.then((response: any) => {
 					state.tableList = response?.result.items ?? [];
 					state.total = response?.result.total;
@@ -280,11 +272,11 @@ const handleSelectionChange = (val: any) => {
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
-	getList(state.activeName);
+	getList();
 }, 1000);
 // 切换tab 查询列表
-const handleClick = (val: string) => {
-	getList(val);
+const handleClick = () => {
+	getList();
 };
 // 导出表格
 const onImportTable = () => {
@@ -302,7 +294,11 @@ const onImportTable = () => {
 		// { key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 		// { key: 'image', colWidth: '', width: '70', height: '40', title: '图片描述', type: 'image', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${themeConfig.value.globalTitle} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 播放录音
 const onPalySoundRecording = (val: any) => {
@@ -313,7 +309,7 @@ const onDownload = (val: any) => {};
 // 关联工单
 const onRelationWorkOrder = (val: any) => {};
 onMounted(() => {
-	getList(state.activeName);
+	getList();
 });
 </script>
 <style lang="scss" scoped></style>

+ 18 - 9
src/views/tels/telsLog/index.vue

@@ -2,10 +2,10 @@
 	<div class="telslog-balckList-container layout-pd">
 		<el-card shadow="never">
 			<!-- 通用搜索 -->
-			<el-form :model="queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
+			<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent class="mt15">
 				<el-form-item label="时间" prop="time">
 					<el-date-picker
-						v-model="queryParams.time"
+						v-model="state.queryParams.time"
 						type="daterange"
 						range-separator="至"
 						start-placeholder="开始时间"
@@ -14,7 +14,7 @@
 					/>
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary" @click="handleQuery" :loading="loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 				</el-form-item>
 			</el-form>
@@ -29,7 +29,7 @@
 				</div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="tableData" v-loading="loading" row-key="id" @selection-change="handleSelectionChange">
+			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" :reserve-selection="true" />
 				<el-table-column type="index" width="60" label="序号" />
 				<el-table-column prop="phoneNo" label="电话号码" show-overflow-tooltip></el-table-column>
@@ -40,7 +40,7 @@
 				<el-table-column label="明细" width="100" fixed="right" align="center">
 					<template #default="scope">
 						<el-button text type="primary" @click="onDetail(scope.row)" v-auth="'200202'" title="查看明细">
-							<SvgIcon name="ele-View" size="var(--hotline-table-icon-font-size)" />
+							查看明细
 						</el-button>
 					</template>
 				</el-table-column>
@@ -49,7 +49,7 @@
 				</template>
 			</el-table>
 			<!-- 分页 -->
-			<pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.PageSize" @pagination="getList" />
+			<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="getList" />
 		</el-card>
 
 		<OperationRecord ref="operationRecordRef" />
@@ -57,8 +57,11 @@
 </template>
 
 <script lang="ts" setup name="telsLog">
-import { defineAsyncComponent, ref, reactive, toRefs, onMounted } from 'vue';
+import { defineAsyncComponent, ref, reactive, onMounted } from 'vue';
 import type { FormInstance } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { useRoute } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import { blacklistPaged } from '/@/api/tels/blacklist';
 import { throttle } from '/@/utils/tools';
@@ -93,7 +96,9 @@ const state = reactive<QueryState>({
 });
 const ruleFormRef = ref<FormInstance>();
 const operationRecordRef = ref();
-const { queryParams, loading, total, tableData } = toRefs(state);
+const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 搜索按钮操作 节流操作 */
 const handleQuery = throttle(() => {
 	state.queryParams.PageIndex = 1;
@@ -129,7 +134,11 @@ const onImportTable = () => {
 		{ key: 'duration', colWidth: '', title: '黑名单时长(秒)', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '创建时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 查看坐席话务明细
 const onDetail = (row: any) => {