2025-03-21 10:15:35 +08:00
< template >
< div class = "p-2" >
<!-- 查询区域 -- >
< div class = "jeecg-basic-table-form-container" >
< a -form ref = "formRef" @keyup.enter.native ="searchQuery" :model ="queryParam" :label-col ="labelCol"
: wrapper - col = "wrapperCol" >
< a -row :gutter ="24" >
2025-07-22 09:46:13 +08:00
<!-- < a -col :lg ="6" >
2025-06-19 15:09:53 +08:00
< a -form -item name = "instructionTagId" >
< template # label > < span title = "分类标签" > 分类标签 < / span > < / template >
2025-07-22 09:46:13 +08:00
< j -dict -select -tag v -model :value ="queryParam.instructionTagId"
2025-08-07 16:24:07 +08:00
: dictCode = "`nu_config_service_instruction_tag,instruction_name,id,del_flag = 0 and iz_enabled = 0 order by sort asc`"
2025-07-22 09:46:13 +08:00
placeholder = "请选择分类标签" allowClear : ignoreDisabled = "true" / >
< / a - f o r m - i t e m >
< / a - c o l >
< a -col :lg ="6" >
< a -form -item name = "categoryId" >
< template # label > < span title = "服务类别" > 服务类别 < / span > < / template >
< j -dict -select -tag type = "list" v -model :value ="queryParam.categoryId"
2025-08-07 16:24:07 +08:00
: dictCode = "`nu_config_service_category,category_name,id,del_flag = 0 and iz_enabled = 0 and instruction_id = '${queryParam.instructionTagId || ''}' order by sort asc`"
2025-07-22 09:46:13 +08:00
placeholder = "请选择服务类别" allowClear : ignoreDisabled = "true" / >
< / a - f o r m - i t e m >
< / a - c o l >
< a -col :lg ="6" >
< a -form -item name = "typeId" >
< template # label > < span title = "服务类型" > 服务类型 < / span > < / template >
< j -dict -select -tag type = "list" v -model :value ="queryParam.typeId"
2025-08-07 16:24:07 +08:00
: dictCode = "`nu_config_service_type,type_name,id,del_flag = 0 and iz_enabled = 0 and category_id = '${queryParam.categoryId || ''}' order by sort asc`"
2025-07-22 09:46:13 +08:00
placeholder = "请选择服务类型" allowClear : ignoreDisabled = "true" / >
< / a - f o r m - i t e m >
< / a - c o l > - - >
2025-06-19 15:09:53 +08:00
< a -col :lg ="6" >
< a -form -item name = "directiveName" >
< template # label > < span title = "服务指令" > 服务指令 < / span > < / template >
< JInput v -model :value ="queryParam.directiveName" placeholder = "请输入服务指令名称" allowClear / >
< / a - f o r m - i t e m >
< / a - c o l >
< a -col :lg ="6" >
< a -form -item name = "bodyTags" >
< template # label > < span title = "体型标签" > 体型标签 < / span > < / template >
< j -dict -select -tag type = 'list' v -model :value ="queryParam.bodyTags"
2025-08-07 16:24:07 +08:00
: dictCode = "`nu_config_body_tag,tag_name,id,del_flag = '0' and iz_enabled = 0 order by sort asc`"
: ignoreDisabled = "true" placeholder = "请选择体型标签" allowClear / >
2025-06-19 15:09:53 +08:00
< / a - f o r m - i t e m >
< / a - c o l >
< a -col :lg ="6" >
< a -form -item name = "emotionTags" >
< template # label > < span title = "情绪标签" > 情绪标签 < / span > < / template >
< j -dict -select -tag type = "list" v -model :value ="queryParam.emotionTags"
2025-08-07 16:24:07 +08:00
: dictCode = "`nu_config_emotion_tag,tag_name,id,del_flag = '0' and iz_enabled = 0 order by sort asc`"
: ignoreDisabled = "true" placeholder = "请选择情绪标签" allowClear / >
2025-06-19 15:09:53 +08:00
< / a - f o r m - i t e m >
< / a - c o l >
2025-08-05 10:53:13 +08:00
<!-- < a -col :lg ="6" >
2025-06-19 15:09:53 +08:00
< a -form -item name = "izEnabled" >
< template # label > < span title = "是否启用" > 是否启用 < / span > < / template >
2025-07-16 08:34:10 +08:00
< j -dict -select -tag type = 'list' v -model :value ="queryParam.izEnabled" dictCode = "iz_enabled"
2025-06-19 15:09:53 +08:00
: ignoreDisabled = "true" placeholder = "请选择是否启用" allowClear / >
2025-03-21 10:15:35 +08:00
< / a - f o r m - i t e m >
2025-08-05 10:53:13 +08:00
< / a - c o l > - - >
2025-03-21 10:15:35 +08:00
< a -col :xl ="6" :lg ="7" :md ="8" :sm ="24" >
< span style = "float: left; overflow: hidden" class = "table-page-search-submitButtons" >
< a -col :lg ="6" >
< a -button type = "primary" preIcon = "ant-design:search-outlined" @click ="searchQuery" > 查询 < / a -button >
< a -button type = "primary" preIcon = "ant-design:reload-outlined" @click ="searchReset"
style = "margin-left: 8px" > 重置 < / a - b u t t o n >
< / a - c o l >
< / span >
< / a - c o l >
< / a - r o w >
< / a - f o r m >
< / div >
2025-07-22 09:46:13 +08:00
< div >
2025-08-05 10:53:13 +08:00
< div style = "width:350px;float: left;max-height:77vh; overflow:auto;position: relative;" >
< div
style = "position: absolute; top: 4px; right: 8px; z-index: 1; background: white; padding: 0px; border-radius: 4px;" >
< a -radio -group v -model :value ="filterIzEnabled" size = "small" @change ="searchQuery" >
< a -radio -button value = "all" > 全部 < / a - r a d i o - b u t t o n >
< a -radio -button value = "enabled" > 启用 < / a - r a d i o - b u t t o n >
< / a - r a d i o - g r o u p >
< / div >
2025-07-22 09:46:13 +08:00
< a -empty v -if = " treeLoading " / >
2025-07-23 08:39:10 +08:00
< a -button v -else -if = " ! treeLoading & & treeData.length < 1 " type = "link" class = "btnPrivate" @click ="addInstruction"
preIcon = "ant-design:plus-outlined" > 新增分类标签 < / a - b u t t o n >
< a -tree v -else :tree-data ="treeData" v -model :expandedKeys ="expandedKeys" expandAction = "click"
@ select = "handleTreeSelect" >
2025-07-22 09:46:13 +08:00
< template # title = "{ data }" >
2025-07-23 08:39:10 +08:00
<!-- @ click . stop = "openMenu(data, data.children, $event)" -- >
<!-- @ contextmenu . prevent = "openMenu(data, data.children, $event)" -- >
< span class = "node-title" @ mouseenter = "onNodeEnter(data, data.children, $event)"
@ mouseleave = "onNodeLeave(data)" >
< div v-if ="data.level == 5" >
2025-07-28 10:25:47 +08:00
< div > < strong > 体型标签 : < / strong > { { data ? . bodyTagList ? . map ( tag => tag . tagName ) . join ( '、' ) || '-' } } < / div >
< div > < strong > 情绪标签 : < / strong > { { data ? . emotionTagList ? . map ( tag => tag . tagName ) . join ( '、' ) || '-' } } < / div >
2025-07-23 08:39:10 +08:00
< / div >
< span v -else -if = " data.level = = 4 " > { { data ? . title + '(' + data ? . cycleTypeName + ')' } } < / span >
2025-07-22 09:46:13 +08:00
< span v-else > {{ data ? .title }} < / span >
2025-08-07 16:24:07 +08:00
< span v-if ="data?.izEnabled == '1' && data.level != 5" style="color:red;" > ( 已停用 ) < / span >
2025-07-23 08:39:10 +08:00
2025-07-22 09:46:13 +08:00
<!-- 下拉菜单 -- >
< a -dropdown :open ="menuState[data?.key]?.open" @ openChange = "onMenuOpenChange(data.key, $event)" >
< template # overlay >
< a -menu >
2025-08-07 16:24:07 +08:00
< a -menu -item v -for = " item in menuItems ( data ) " :key ="item.key" :disabled ="!item.canAdd"
2025-07-22 09:46:13 +08:00
@ click = "() => { closeAllMenus(); item.action(data) }" >
< Icon style = "color:#1890FF;" :icon ="item.icon" class = "action-icon" > < / Icon >
< span style = " color:#1890FF;margin-left: 5px;" > { { item . label } } < / span >
< / a - m e n u - i t e m >
< / a - m e n u >
< / template >
<!-- 图标 -- >
2025-07-23 08:39:10 +08:00
< Icon v -show = " data.showIcon & & data.level ! = 5 " style = "color:#1890FF;" :icon ="iconClass(data.level)"
class = "action-icon" @ mouseenter = "onNodeIconEnter(data, data.children)"
@ mouseleave = "onNodeIconLeave(data)" / >
2025-07-22 09:46:13 +08:00
< / a - d r o p d o w n >
< / span >
< / template >
< / a - t r e e >
< / div >
< div style = "width:calc(100% - 360px);float: left;margin-left: 10px;" >
<!-- 引用表格 -- >
< BasicTable @register ="registerTable" >
<!-- 插槽 : table标题 -- >
< template # tableTitle >
2025-07-23 08:39:10 +08:00
<!-- < a -button type = "primary" class = "btnPrivate" @click ="handleinstructionTag"
2025-07-22 09:46:13 +08:00
preIcon = "tabler:settings" > 配置分类标签 < / a - b u t t o n >
< a -button type = "primary" class = "btnPrivate" @click ="handleCategory"
preIcon = "tabler:settings" > 配置服务类别 < / a - b u t t o n >
2025-07-23 08:39:10 +08:00
< a -button type = "primary" class = "btnPrivate" @click ="handleType" preIcon = "tabler:settings" > 配置服务类型 < / a - b u t t o n > - - >
2025-07-22 09:46:13 +08:00
< a -button type = "primary" class = "btnPrivate" @click ="handleBodyTag"
preIcon = "tabler:settings" > 配置体型标签 < / a - b u t t o n >
< a -button type = "primary" class = "btnPrivate" @click ="handleEmotionTag"
preIcon = "tabler:settings" > 配置情绪标签 < / a - b u t t o n >
2025-07-23 08:39:10 +08:00
<!-- < a -button type = "primary" class = "btnPrivate" @click ="handleAdd"
preIcon = "ant-design:plus-outlined" > 新增服务指令 < / a - b u t t o n > - - >
2025-08-04 14:48:44 +08:00
< a -button type = "primary" class = "btnPrivate" @click ="handleDirectiveMainOpen" v -show = " isShowDM "
preIcon = "ant-design:profile-outlined" > 指令库 < / a - b u t t o n >
2025-07-22 09:46:13 +08:00
< / template >
<!-- 操作栏 -- >
< template # action = "{ record }" >
< TableAction :actions ="getTableAction(record)" :dropDownActions ="getDropDownAction(record)" / >
< / template >
< template v -slot : bodyCell = "{ column, record, index, text }" >
<!-- 音频播放控制 -- >
< template v-if ="column.dataIndex === 'mp3File'" >
< span v-if ="!text" style="font-size: 12px;font-style: italic;" > 无文件 < / span >
< a -button v -else type = "link" class = "btnPrivate" @click ="openAudioModal(text)" > 播放 < / a -button >
< / template >
<!-- < template v-if ="column.dataIndex === 'mp3File'" >
2025-03-21 10:15:35 +08:00
< span v-if ="!text" style="font-size: 12px;font-style: italic;" > 无文件 < / span >
2025-07-15 08:39:29 +08:00
< div v -else style = "display: flex; align-items: center; gap: 8px;" >
< audio ref = "audioPlayer" :src ="getFileAccessHttpUrl(text)" hidden > < / audio >
< a -button v -if = " ! currentPlayingAudio | | currentPlayingAudio ! = = text " type = "link" @click ="playAudio(text)"
preIcon = "ant-design:play-circle-outlined" >
播放
< / a - b u t t o n >
< template v-else >
< a -button v-if ="isPlaying" type="link" @click="pauseAudio" preIcon="ant-design:pause-circle-outlined" >
暂停
< / a - b u t t o n >
< a -button v -else type = "link" @click ="resumeAudio" preIcon = "ant-design:play-circle-outlined" >
播放
< / a - b u t t o n >
< a -button type = "link" @click ="restartAudio" preIcon = "ant-design:reload-outlined" >
重播
< / a - b u t t o n >
< a -button type = "link" @click ="stopAudio" preIcon = "ant-design:stop-outlined" >
停止
< / a - b u t t o n >
< / template >
< / div >
< / template > -- >
2025-07-22 09:46:13 +08:00
< template v-if ="column.dataIndex === 'mp4File'" >
< span v-if ="!text" style="font-size: 12px;font-style: italic;" > 无文件 < / span >
< a -button v -else type = "link" class = "btnPrivate" @click ="openVideoModal(text)" > 播放 < / a -button >
< / template >
< template v-if ="column.dataIndex === 'bodyTagList'" >
< span : title = "text.map((item) => item.tagName).join('、')" > { { text . map ( ( item ) =>
item . tagName ) . join ( '、' ) } } < / span >
< / template >
< template v-if ="column.dataIndex === 'emotionTagList'" >
< span : title = "text.map((item) => item.tagName).join('、')" > { { text . map ( ( item ) =>
item . tagName ) . join ( '、' ) } } < / span >
< / template >
< / template >
< / BasicTable >
< / div >
< / div >
2025-03-21 10:15:35 +08:00
<!-- 表单区域 -- >
2025-07-15 08:39:29 +08:00
< ConfigServiceDirectiveModal ref = "registerModal" @success ="handleSuccess" >
2025-06-19 15:09:53 +08:00
< / ConfigServiceDirectiveModal >
2025-03-21 10:15:35 +08:00
< / div >
2025-07-15 08:39:29 +08:00
<!-- 分类标签 -- >
< a -drawer title = "分类标签" width = "60vw" :open ="insTagOpen" @close ="onInsTagClose" >
< template # footer >
< a -button type = "primary" @click ="onInsTagClose" style = "float: right;" > 关闭 < / a - b u t t o n >
< / template >
< InstructionTag v-if ="insTagOpen" > < / InstructionTag >
< / a - d r a w e r >
2025-03-21 10:15:35 +08:00
<!-- 服务类别 -- >
< a -drawer title = "服务类别" width = "60vw" :open ="categoryOpen" @close ="onCategoryClose" >
< template # footer >
< a -button type = "primary" @click ="onCategoryClose" style = "float: right;" > 关闭 < / a - b u t t o n >
< / template >
< ConfigServiceCategoryList v-if ="categoryOpen" > < / ConfigServiceCategoryList >
< / a - d r a w e r >
<!-- 服务类型 -- >
< a -drawer title = "服务类型" width = "60vw" :open ="typeOpen" @close ="onTypeClose" >
< template # footer >
< a -button type = "primary" @click ="onTypeClose" style = "float: right;" > 关闭 < / a - b u t t o n >
< / template >
< ConfigServiceTypeList v-if ="typeOpen" > < / ConfigServiceTypeList >
< / a - d r a w e r >
2025-04-28 16:08:53 +08:00
<!-- 体型标签 -- >
2025-08-05 15:59:16 +08:00
< a -drawer title = "体型标签" width = "60vw" :open ="bodyTagOpen" @close ="onBodyTagClose"
bodyStyle = "background: url(../../resource/img/modalback.png);" >
2025-03-21 10:15:35 +08:00
< template # footer >
2025-04-28 16:08:53 +08:00
< a -button type = "primary" @click ="onBodyTagClose" style = "float: right;" > 关闭 < / a - b u t t o n >
2025-03-21 10:15:35 +08:00
< / template >
2025-08-05 15:59:16 +08:00
< BodyTagList v-if ="bodyTagOpen" > < / BodyTagList >
2025-04-28 16:08:53 +08:00
< / a - d r a w e r >
<!-- 情绪标签 -- >
2025-08-05 15:59:16 +08:00
< a -drawer title = "情绪标签" width = "60vw" :open ="emotionTagOpen" @close ="onEmotionTagClose"
bodyStyle = "background: url(../../resource/img/modalback.png);" >
2025-04-28 16:08:53 +08:00
< template # footer >
< a -button type = "primary" @click ="onEmotionTagClose" style = "float: right;" > 关闭 < / a - b u t t o n >
< / template >
2025-08-05 15:59:16 +08:00
< EmotionTagList v-if ="emotionTagOpen" > < / EmotionTagList >
2025-03-21 10:15:35 +08:00
< / a - d r a w e r >
2025-07-15 08:39:29 +08:00
<!-- 音频播放 -- >
< a -modal v -model :visible ="showAudioModal" title = "音频播放" :footer ="null" @cancel ="closeAudioModal"
: bodyStyle = "{ padding: '0', maxHeight: '80vh', overflow: 'auto' }" : keyboard = "true" >
2025-08-01 15:16:29 +08:00
< audio ref = "audioPlayer" controls style = "width: 100%; display: block; margin: 20px auto;" >
2025-07-15 08:39:29 +08:00
< source :src ="audioUrl" >
您的浏览器不支持音频播放 。
< / audio >
< / a - m o d a l >
2025-03-21 10:15:35 +08:00
<!-- 视频播放 -- >
< a -modal v -model :visible ="showVideoModal" title = "视频播放" :footer ="null" @cancel ="closeVideoModal"
: bodyStyle = "{ padding: '0', maxHeight: '80vh', overflow: 'auto' }" >
2025-08-05 10:53:13 +08:00
< video ref = "videoPlayer" controls style = "width: 100%; max-height: 70vh; display: block; margin: 0 auto;" >
2025-03-21 10:15:35 +08:00
< source :src ="videoUrl" >
您的浏览器不支持视频播放 。
< / video >
< / a - m o d a l >
2025-07-22 09:46:13 +08:00
<!-- 分类标签 -- >
< InstructionTagModal ref = "insRegisterModal" @success ="reloadTree" > < / InstructionTagModal >
< ConfigServiceCategoryModal ref = "catRegisterModal" @success ="reloadTree" > < / ConfigServiceCategoryModal >
< ConfigServiceTypeModal ref = "typRegisterModal" @success ="reloadTree" > < / ConfigServiceTypeModal >
2025-03-21 10:15:35 +08:00
< / template >
< script lang = "ts" name = "serviceDirective-configServiceDirective" setup >
2025-07-22 09:46:13 +08:00
import { ref , reactive , watch , onMounted , computed } from 'vue' ;
2025-06-19 15:09:53 +08:00
import { BasicTable , TableAction } from '/@/components/Table' ;
2025-03-21 10:15:35 +08:00
import { useListPage } from '/@/hooks/system/useListPage' ;
import { columns , superQuerySchema } from './ConfigServiceDirective.data' ;
2025-07-22 09:46:13 +08:00
import { list , deleteOne , batchDelete , getImportUrl , getExportUrl , tree } from './ConfigServiceDirective.api' ;
2025-03-21 10:15:35 +08:00
import ConfigServiceDirectiveModal from './components/ConfigServiceDirectiveModal.vue'
import { useUserStore } from '/@/store/modules/user' ;
import JInput from "/@/components/Form/src/jeecg/components/JInput.vue" ;
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue' ;
import { cloneDeep } from "lodash-es" ;
import ConfigServiceCategoryList from '../serviceCategory/ConfigServiceCategoryList.vue' ;
2025-07-15 08:39:29 +08:00
import InstructionTag from '../instructiontag/InstructionTag.vue' ;
2025-03-21 10:15:35 +08:00
import ConfigServiceTypeList from '../serviceType/ConfigServiceTypeList.vue' ;
2025-04-28 16:08:53 +08:00
import BodyTagList from '/@/views/services/directivetag/bodytag/BodyTagList.vue' ;
import EmotionTagList from '/@/views/services/directivetag/emotiontag/EmotionTagList.vue' ;
2025-03-21 10:15:35 +08:00
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils' ;
2025-07-22 09:46:13 +08:00
import { Empty } from 'ant-design-vue' ;
import InstructionTagModal from '/@/views/services/InstructionTag/components/InstructionTagModal.vue'
import ConfigServiceCategoryModal from '/@/views/services/serviceCategory/components//ConfigServiceCategoryModal.vue'
import ConfigServiceTypeModal from '/@/views/services/serviceType/components//ConfigServiceTypeModal.vue'
2025-08-04 14:48:44 +08:00
import { queryByKey } from '/@/views/admin/sysconfig/SysConfig.api'
import { getOrgInfo } from '@/api/common/api'
2025-08-07 16:24:07 +08:00
import { useMessage } from '/@/hooks/web/useMessage' ;
2025-07-22 09:46:13 +08:00
2025-08-07 16:24:07 +08:00
const { createMessage , createConfirm } = useMessage ( ) ;
2025-07-22 09:46:13 +08:00
const insRegisterModal = ref ( ) ;
const catRegisterModal = ref ( ) ;
const typRegisterModal = ref ( ) ;
const simpleImage = Empty . PRESENTED _IMAGE _SIMPLE ;
2025-03-21 10:15:35 +08:00
const formRef = ref ( ) ;
2025-07-15 08:39:29 +08:00
const queryParam = reactive < any > ( {
instructionTagId : '' ,
categoryId : '' ,
typeId : '' ,
2025-08-05 10:53:13 +08:00
izEnabled : '0' ,
2025-07-15 08:39:29 +08:00
} ) ;
watch (
( ) => queryParam . instructionTagId ,
( ) => {
queryParam . categoryId = ''
queryParam . typeId = ''
}
)
// 当服务类别变动,清空服务类型
watch (
( ) => queryParam . categoryId ,
( ) => {
queryParam . typeId = ''
}
)
2025-03-21 10:15:35 +08:00
const toggleSearchStatus = ref < boolean > ( false ) ;
const registerModal = ref ( ) ;
2025-07-22 09:46:13 +08:00
const treeData = ref < any > ( [ ] ) ;
2025-03-21 10:15:35 +08:00
const userStore = useUserStore ( ) ;
2025-08-04 14:48:44 +08:00
const isShowDM = ref ( false ) //是否展示指令库功能
2025-03-21 10:15:35 +08:00
//注册table数据
const { prefixCls , tableContext , onExportXls , onImportXls } = useListPage ( {
tableProps : {
title : '服务指令' ,
api : list ,
columns ,
canResize : false ,
useSearchForm : false ,
showIndexColumn : true ,
2025-07-22 09:46:13 +08:00
scroll : { y : '58vh' } ,
2025-06-19 15:09:53 +08:00
pagination : {
current : 1 ,
pageSize : 10 ,
pageSizeOptions : [ '10' , '20' , '50' , '100' ] ,
} ,
2025-03-21 10:15:35 +08:00
actionColumn : {
2025-08-06 16:01:50 +08:00
width : 70 ,
2025-03-21 10:15:35 +08:00
fixed : 'right' ,
} ,
beforeFetch : async ( params ) => {
2025-03-28 16:44:40 +08:00
params . column = 'createTime'
params . order = 'desc'
2025-03-21 10:15:35 +08:00
let rangerQuery = await setRangeQuery ( ) ;
return Object . assign ( params , rangerQuery ) ;
} ,
} ,
exportConfig : {
name : "服务指令" ,
url : getExportUrl ,
params : queryParam ,
} ,
importConfig : {
url : getImportUrl ,
success : handleSuccess
} ,
} ) ;
const [ registerTable , { reload , collapseAll , updateTableDataRecord , findTableDataRecord , getDataSource } , { rowSelection , selectedRowKeys } ] = tableContext ;
const labelCol = reactive ( {
xs : 24 ,
sm : 4 ,
xl : 6 ,
xxl : 4
} ) ;
const wrapperCol = reactive ( {
xs : 24 ,
sm : 20 ,
} ) ;
// 高级查询配置
const superQueryConfig = reactive ( superQuerySchema ) ;
2025-07-15 08:39:29 +08:00
const insTagOpen = ref ( false ) //分类标签抽屉
2025-03-21 10:15:35 +08:00
const categoryOpen = ref ( false ) //服务类别抽屉
const typeOpen = ref ( false ) //服务类型抽屉
2025-04-28 16:08:53 +08:00
const bodyTagOpen = ref ( false ) //体型标签抽屉
const emotionTagOpen = ref ( false ) //情绪标签抽屉
2025-08-04 14:48:44 +08:00
const mainOrgCode = ref ( ) //指令库编码
2025-08-05 10:53:13 +08:00
const filterIzEnabled = ref ( 'enabled' ) //筛选全部/已启用
2025-03-21 10:15:35 +08:00
/ * *
* 高级查询事件
* /
function handleSuperQuery ( params ) {
Object . keys ( params ) . map ( ( k ) => {
queryParam [ k ] = params [ k ] ;
} ) ;
searchQuery ( ) ;
}
/ * *
* 新增事件
* /
function handleAdd ( ) {
registerModal . value . disableSubmit = false ;
2025-07-23 08:39:10 +08:00
registerModal . value . opeType = 'add' ;
2025-03-21 10:15:35 +08:00
registerModal . value . add ( ) ;
}
/ * *
* 编辑事件
* /
function handleEdit ( record : Recordable ) {
registerModal . value . disableSubmit = false ;
2025-07-23 08:39:10 +08:00
registerModal . value . opeType = 'edit' ;
2025-03-21 10:15:35 +08:00
registerModal . value . edit ( record ) ;
}
2025-07-15 08:39:29 +08:00
/ * *
* 编辑指令资源
* /
function handleMedia ( record : Recordable ) {
registerModal . value . disableSubmit = false ;
2025-07-23 08:39:10 +08:00
registerModal . value . opeType = 'editMedia' ;
2025-07-15 08:39:29 +08:00
registerModal . value . editMedia ( record ) ;
}
2025-03-21 10:15:35 +08:00
/ * *
* 详情
* /
function handleDetail ( record : Recordable ) {
registerModal . value . disableSubmit = true ;
2025-07-23 08:39:10 +08:00
registerModal . value . opeType = 'look' ;
2025-03-21 10:15:35 +08:00
registerModal . value . edit ( record ) ;
}
/ * *
* 成功回调
* /
function handleSuccess ( ) {
( selectedRowKeys . value = [ ] ) && reload ( ) ;
2025-07-22 09:46:13 +08:00
reloadTree ( )
2025-03-21 10:15:35 +08:00
}
/ * *
* 操作栏
* /
function getTableAction ( record ) {
return [
{
label : '详情' ,
onClick : handleDetail . bind ( null , record ) ,
2025-07-15 08:39:29 +08:00
} ,
2025-07-23 08:39:10 +08:00
// {
// label: '编辑',
// onClick: handleEdit.bind(null, record)
// },
// {
// label: '指令资源',
// onClick: handleMedia.bind(null, record)
// },
2025-03-21 10:15:35 +08:00
] ;
}
/ * *
* 下拉操作栏
* /
function getDropDownAction ( record ) {
return [
]
}
2025-07-23 08:39:10 +08:00
function expandTreeNodeToLevel4 ( directiveData : any ) {
// 清空之前展开的节点
expandedKeys . value = [ ] ;
// 递归查找并展开相应的节点
const findAndExpandNode = ( nodes : any [ ] , level : number , directiveData : any ) => {
for ( const node of nodes ) {
// 判断当前节点的 level 是否与 directiveData 的级别匹配
if ( level === 1 && node . instructionId === directiveData . instructionTagId ) {
expandedKeys . value . push ( node . key ) ;
if ( node . children && node . children . length > 0 ) {
findAndExpandNode ( node . children , 2 , directiveData ) ;
}
} else if ( level === 2 && node . categoryId === directiveData . categoryId ) {
expandedKeys . value . push ( node . key ) ;
if ( node . children && node . children . length > 0 ) {
findAndExpandNode ( node . children , 3 , directiveData ) ;
}
} else if ( level === 3 && node . typeId === directiveData . typeId ) {
expandedKeys . value . push ( node . key ) ;
if ( node . children && node . children . length > 0 ) {
findAndExpandNode ( node . children , 4 , directiveData ) ;
}
} else if ( level === 4 && node . key === directiveData . id ) {
expandedKeys . value . push ( node . key ) ;
}
}
} ;
// 调用递归方法,从树的根节点开始查找
findAndExpandNode ( treeData . value , 1 , directiveData ) ;
}
2025-03-21 10:15:35 +08:00
/ * *
* 查询
* /
2025-08-05 15:59:16 +08:00
function searchQuery ( reloadTree = true , resetId = true ) {
2025-08-05 10:53:13 +08:00
if ( ! ! queryParam . directiveName || ! ! queryParam . bodyTags || ! ! queryParam . emotionTags ) {
2025-07-28 10:25:47 +08:00
queryParam . instructionTagId = '' ;
queryParam . categoryId = '' ;
queryParam . typeId = '' ;
}
2025-08-05 15:59:16 +08:00
if ( resetId ) {
queryParam . id = ''
}
2025-08-05 10:53:13 +08:00
if ( filterIzEnabled . value == 'enabled' ) {
queryParam . izEnabled = '0'
} else {
queryParam . izEnabled = ''
}
2025-07-23 08:39:10 +08:00
reload ( ) . then ( ( ) => {
2025-07-31 14:20:34 +08:00
if ( reloadTree ) {
initTree ( ) ;
}
} )
2025-03-21 10:15:35 +08:00
2025-07-31 14:20:34 +08:00
}
2025-07-23 08:39:10 +08:00
2025-03-21 10:15:35 +08:00
/ * *
* 重置
* /
function searchReset ( ) {
2025-07-23 08:39:10 +08:00
formRef . value . resetFields ( ) ; // 重置表单字段
selectedRowKeys . value = [ ] ; // 清空选中的行
// 清空 queryParam 中相关字段
queryParam . instructionTagId = '' ;
queryParam . categoryId = '' ;
queryParam . typeId = '' ;
queryParam . directiveName = '' ; // 如果你有其他需要清除的字段,也可以加到这里
queryParam . bodyTags = '' ;
queryParam . emotionTags = '' ;
2025-08-05 15:59:16 +08:00
queryParam . id = '' ;
2025-08-05 10:53:13 +08:00
// queryParam.izEnabled = '';
2025-07-23 08:39:10 +08:00
// 刷新数据
reload ( ) . then ( ( ) => {
2025-07-28 10:25:47 +08:00
initTree ( ) ;
2025-07-23 08:39:10 +08:00
} ) ;
2025-03-21 10:15:35 +08:00
}
2025-07-23 08:39:10 +08:00
2025-03-21 10:15:35 +08:00
let rangeField = 'tollPrice,comPrice,'
/ * *
* 设置范围查询条件
* /
async function setRangeQuery ( ) {
let queryParamClone = cloneDeep ( queryParam ) ;
if ( rangeField ) {
let fieldsValue = rangeField . split ( ',' ) ;
fieldsValue . forEach ( item => {
if ( queryParamClone [ item ] ) {
let range = queryParamClone [ item ] ;
queryParamClone [ item + '_begin' ] = range [ 0 ] ;
queryParamClone [ item + '_end' ] = range [ 1 ] ;
delete queryParamClone [ item ] ;
} else {
queryParamClone [ item + '_begin' ] = '' ;
queryParamClone [ item + '_end' ] = '' ;
}
} )
}
return queryParamClone ;
}
2025-07-15 08:39:29 +08:00
//分类标签抽屉打开
function handleinstructionTag ( ) {
insTagOpen . value = true
}
2025-03-21 10:15:35 +08:00
//服务类别抽屉打开
function handleCategory ( ) {
categoryOpen . value = true
}
//服务类型抽屉打开
function handleType ( ) {
typeOpen . value = true
}
2025-04-28 16:08:53 +08:00
//体型标签抽屉打开
function handleBodyTag ( ) {
bodyTagOpen . value = true
}
//情绪标签抽屉打开
function handleEmotionTag ( ) {
emotionTagOpen . value = true
2025-03-21 10:15:35 +08:00
}
2025-07-15 08:39:29 +08:00
//分类标签抽屉关闭
function onInsTagClose ( ) {
insTagOpen . value = false
}
2025-03-21 10:15:35 +08:00
//服务类别抽屉关闭
function onCategoryClose ( ) {
categoryOpen . value = false
}
//服务类型抽屉关闭
function onTypeClose ( ) {
typeOpen . value = false
}
2025-04-28 16:08:53 +08:00
//体型标签抽屉关闭
function onBodyTagClose ( ) {
bodyTagOpen . value = false
}
//体型标签抽屉关闭
function onEmotionTagClose ( ) {
emotionTagOpen . value = false
2025-03-21 10:15:35 +08:00
}
2025-07-15 08:39:29 +08:00
const showAudioModal = ref ( false ) ; // 控制音频模态框显示
const audioUrl = ref ( '' ) ; // 音频 URL
2025-08-01 15:16:29 +08:00
const audioPlayer = ref ( null ) ;
2025-07-15 08:39:29 +08:00
// 打开音频模态框
const openAudioModal = ( url ) => {
audioUrl . value = getFileAccessHttpUrl ( url ) ;
showAudioModal . value = true ;
} ;
// 关闭音频模态框
const closeAudioModal = ( ) => {
2025-08-01 15:16:29 +08:00
if ( audioPlayer . value ) {
audioPlayer . value . pause ( ) ; // 暂停音频播放
audioPlayer . value . currentTime = 0 ; // 可选:重置播放进度
}
2025-07-15 08:39:29 +08:00
showAudioModal . value = false ;
audioUrl . value = '' ;
} ;
2025-03-21 10:15:35 +08:00
const showVideoModal = ref ( false ) ; // 控制模态框显示
const videoUrl = ref ( '' ) ; // 视频 URL
2025-08-01 15:16:29 +08:00
const videoPlayer = ref ( null ) ;
2025-03-21 10:15:35 +08:00
// 打开视频模态框
const openVideoModal = ( url ) => {
videoUrl . value = getFileAccessHttpUrl ( url ) ;
showVideoModal . value = true ;
} ;
// 关闭视频模态框
const closeVideoModal = ( ) => {
2025-08-01 15:16:29 +08:00
if ( videoPlayer . value ) {
videoPlayer . value . pause ( ) ; // 暂停视频播放
videoPlayer . value . currentTime = 0 ; // 可选:将播放进度重置到开始
}
2025-03-21 10:15:35 +08:00
showVideoModal . value = false ;
videoUrl . value = '' ;
} ;
2025-05-27 14:14:07 +08:00
2025-07-15 08:39:29 +08:00
// 添加以下响应式变量
const currentPlayingAudio = ref < string | null > ( null ) ;
const isPlaying = ref ( false ) ;
// 添加音频控制方法
const playAudio = ( url : string ) => {
if ( currentPlayingAudio . value && currentPlayingAudio . value !== url ) {
// 如果正在播放其他音频,先停止
stopAudio ( ) ;
}
currentPlayingAudio . value = url ;
isPlaying . value = true ;
// 确保audio元素存在
if ( audioPlayer . value ) {
audioPlayer . value . src = getFileAccessHttpUrl ( url ) ;
audioPlayer . value . play ( ) . catch ( e => {
isPlaying . value = false ;
currentPlayingAudio . value = null ;
} ) ;
}
} ;
const pauseAudio = ( ) => {
if ( audioPlayer . value ) {
audioPlayer . value . pause ( ) ;
isPlaying . value = false ;
}
} ;
const resumeAudio = ( ) => {
if ( audioPlayer . value ) {
audioPlayer . value . play ( ) . catch ( e => {
} ) ;
isPlaying . value = true ;
}
} ;
const restartAudio = ( ) => {
if ( audioPlayer . value ) {
audioPlayer . value . currentTime = 0 ;
audioPlayer . value . play ( ) . catch ( e => {
} ) ;
isPlaying . value = true ;
}
} ;
const stopAudio = ( ) => {
if ( audioPlayer . value ) {
audioPlayer . value . pause ( ) ;
audioPlayer . value . currentTime = 0 ;
isPlaying . value = false ;
currentPlayingAudio . value = null ;
}
} ;
2025-07-22 09:46:13 +08:00
const clickCount = ref ( 0 ) ;
const treeChildData = ref < any > ( [ ] ) ;
const expandedKeys = ref < string [ ] > ( [ ] ) ;
// 为每个 node 维护一个菜单状态和 hover 定时器
const menuState = reactive < Record < string , { timer ? : number , openedByClick : boolean , open : boolean } > > ( {
} )
2025-07-23 08:39:10 +08:00
function onNodeEnter ( node , level , event ) {
node . showIcon = true
}
2025-07-22 09:46:13 +08:00
2025-07-23 08:39:10 +08:00
function onNodeLeave ( node ) {
node . showIcon = false
}
function onNodeIconEnter ( node , level ) {
// 检查当前节点是否已经展开,如果是,则跳过关闭所有菜单的操作
const key = node . key ;
const currentMenuState = menuState [ key ] ;
if ( currentMenuState ? . open ) {
// 当前菜单已经展开,直接返回
return ;
}
// 如果没有菜单状态,则初始化
2025-07-22 09:46:13 +08:00
if ( ! menuState [ key ] ) {
2025-07-23 08:39:10 +08:00
menuState [ key ] = { openedByClick : false , open : false } ;
2025-07-22 09:46:13 +08:00
}
2025-07-23 08:39:10 +08:00
// 只有前三级需要自动展开
2025-07-22 09:46:13 +08:00
if ( level <= 3 && ! menuState [ key ] . openedByClick ) {
menuState [ key ] . timer = window . setTimeout ( ( ) => {
2025-07-23 08:39:10 +08:00
menuState [ key ] . open = true ;
} , 2000 ) ;
2025-07-22 09:46:13 +08:00
}
}
2025-07-23 08:39:10 +08:00
function onNodeIconLeave ( node ) {
2025-07-22 09:46:13 +08:00
const s = menuState [ node . key ]
if ( s ? . timer ) {
clearTimeout ( s . timer )
delete s . timer
}
}
// 用户点击图标手动打开
function openMenu ( node , level , ev ) {
2025-07-23 08:39:10 +08:00
closeAllMenus ( ) ;
2025-07-22 09:46:13 +08:00
const key = node . key
if ( ! menuState [ key ] ) menuState [ key ] = { openedByClick : false , open : false }
menuState [ key ] . openedByClick = true
menuState [ key ] . open = true
}
// 当 Dropdown 自身触发 openChange( 比如点击外部关闭) 时, 同步状态
function onMenuOpenChange ( key : string , open : boolean ) {
if ( ! menuState [ key ] ) menuState [ key ] = { open : false , openedByClick : false }
menuState [ key ] . open = open
// 如果是外部关闭,则重置 clicked 状态
if ( ! open ) menuState [ key ] . openedByClick = false
}
// 关闭所有菜单工具函数
function closeAllMenus ( ) {
Object . keys ( menuState ) . forEach ( k => {
menuState [ k ] . open = false
menuState [ k ] . openedByClick = false
} )
}
// 根据层级返回图标 class
function iconClass ( level : number ) {
switch ( level ) {
case 1 : return 'ant-design:setting-twotone'
case 2 : return 'ant-design:setting-twotone'
case 3 : return 'ant-design:setting-twotone'
case 4 : return 'ant-design:setting-outlined'
default : return 'ant-design:setting-outlined'
}
}
//新增分类标签
function addInstruction ( ) {
insRegisterModal . value . disableSubmit = false ;
insRegisterModal . value . add ( ) ;
}
//启用分类标签
function usingInstruction ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时启用分类标签“' + data . title + '”下所有服务类别、服务类型、服务指令!' + '是否确认启用分类标签“' + data . title + '”!' ,
okText : '启用' ,
cancelText : '取消' ,
onOk : ( ) => {
insRegisterModal . value . usingOrStop ( data . instructionId , '0' , false )
catRegisterModal . value . usingOrStopByCascade ( data . instructionId , '0' , false )
typRegisterModal . value . usingOrStopByCascade ( data . instructionId , '' , '0' , false )
registerModal . value . usingOrStopByCascade ( data . instructionId , '' , '' , '0' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//停用分类标签
function stopInstruction ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时停用分类标签“' + data . title + '”下所有服务类别、服务类型、服务指令!' + '是否确认停用分类标签“' + data . title + '”!' ,
okText : '停用' ,
cancelText : '取消' ,
onOk : ( ) => {
insRegisterModal . value . usingOrStop ( data . instructionId , '1' , false )
catRegisterModal . value . usingOrStopByCascade ( data . instructionId , '1' , false )
typRegisterModal . value . usingOrStopByCascade ( data . instructionId , '' , '1' , false )
registerModal . value . usingOrStopByCascade ( data . instructionId , '' , '' , '1' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//新增服务类别
function addCategory ( data ) {
catRegisterModal . value . disableSubmit = false ;
catRegisterModal . value . edit ( { instructionId : data . instructionId } ) ;
}
//启用服务类别
function usingCategory ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时启用服务类别“' + data . title + '”下所有服务类型、服务指令!' + '是否确认启用服务类别“' + data . title + '”!' ,
okText : '启用' ,
cancelText : '取消' ,
onOk : ( ) => {
catRegisterModal . value . usingOrStop ( data . categoryId , '0' , false )
typRegisterModal . value . usingOrStopByCascade ( '' , data . categoryId , '0' , false )
registerModal . value . usingOrStopByCascade ( '' , data . categoryId , '' , '0' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//停用服务类别
function stopCategory ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时停用服务类别“' + data . title + '”下所有服务类型、服务指令!' + '是否确认停用服务类别“' + data . title + '”!' ,
okText : '停用' ,
cancelText : '取消' ,
onOk : ( ) => {
catRegisterModal . value . usingOrStop ( data . categoryId , '1' , false )
typRegisterModal . value . usingOrStopByCascade ( '' , data . categoryId , '1' , false )
registerModal . value . usingOrStopByCascade ( '' , data . categoryId , '' , '1' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//新增服务类型
function addType ( data ) {
typRegisterModal . value . disableSubmit = false ;
typRegisterModal . value . edit ( { instructionId : data . instructionId , categoryId : data . categoryId } ) ;
}
//启用服务类型
function usingType ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时启用服务类型“' + data . title + '”下所有服务指令!' + '是否确认启用服务类型“' + data . title + '”!' ,
okText : '启用' ,
cancelText : '取消' ,
onOk : ( ) => {
typRegisterModal . value . usingOrStop ( data . typeId , '0' , false )
registerModal . value . usingOrStopByCascade ( '' , '' , data . typeId , '0' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//停用服务类型
function stopType ( data ) {
2025-08-07 16:24:07 +08:00
createConfirm ( {
iconType : 'warning' ,
title : '操作确认' ,
content : '此操作会同时停用服务类型“' + data . title + '”下所有服务指令!' + '是否确认停用服务类型“' + data . title + '”!' ,
okText : '停用' ,
cancelText : '取消' ,
onOk : ( ) => {
typRegisterModal . value . usingOrStop ( data . typeId , '1' , false )
registerModal . value . usingOrStopByCascade ( '' , '' , data . typeId , '1' , true )
}
} ) ;
2025-07-22 09:46:13 +08:00
}
//新增服务指令
function addDirective ( data ) {
registerModal . value . disableSubmit = false ;
2025-07-28 10:25:47 +08:00
registerModal . value . opeType = 'add' ;
2025-07-22 09:46:13 +08:00
registerModal . value . edit ( { instructionTagId : data . instructionId , categoryId : data . categoryId , typeId : data . typeId } ) ;
}
//编辑务指令
function editDirective ( data ) {
registerModal . value . disableSubmit = false ;
2025-07-28 10:25:47 +08:00
registerModal . value . opeType = 'edit' ;
2025-07-22 09:46:13 +08:00
registerModal . value . queryByIdFunc ( data . key ) ;
}
2025-07-23 08:39:10 +08:00
//指令资源
function editMedia ( data ) {
registerModal . value . disableSubmit = false ;
registerModal . value . opeType = 'editMedia' ;
registerModal . value . queryAndEditMedia ( data . key ) ;
}
2025-07-22 09:46:13 +08:00
//启用服务指令
function usingDirective ( data ) {
2025-08-07 16:24:07 +08:00
registerModal . value . usingOrStop ( data . key , '0' , true ) ;
2025-07-22 09:46:13 +08:00
}
//停用服务指令
function stopDirective ( data ) {
2025-08-07 16:24:07 +08:00
registerModal . value . usingOrStop ( data . key , '1' , true ) ;
2025-07-22 09:46:13 +08:00
}
2025-07-23 08:39:10 +08:00
//查看体型标签
function bodyTagsDetail ( data ) {
2025-07-22 09:46:13 +08:00
2025-07-23 08:39:10 +08:00
}
//查看情绪标签
function emotionTagsDetail ( data ) {
}
2025-07-22 09:46:13 +08:00
// 根据层级返回菜单项
function menuItems ( data ) {
if ( data . level === 1 ) {
const items = [
2025-08-07 16:24:07 +08:00
{ key : 'addIns' , label : '新增分类标签' , icon : 'ant-design:plus-outlined' , canAdd : true , action : addInstruction } ,
2025-07-22 09:46:13 +08:00
]
if ( data . canAdd ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'addCat' , label : '新增服务类别' , icon : 'ant-design:plus-outlined' , canAdd : data . canAdd , action : addCategory } )
2025-07-22 09:46:13 +08:00
}
if ( data . izEnabled === '1' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'usingIns' , label : '启用分类标签' , icon : 'ant-design:check-circle-outlined' , canAdd : true , action : usingInstruction } )
2025-07-22 09:46:13 +08:00
} else if ( data . izEnabled === '0' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'stopIns' , label : '停用分类标签' , icon : 'ant-design:stop-outlined' , canAdd : true , action : stopInstruction } )
2025-07-22 09:46:13 +08:00
}
return items
}
else if ( data . level === 2 ) {
const items = [
2025-08-07 16:24:07 +08:00
{ key : 'addCat' , label : '新增服务类别' , icon : 'ant-design:plus-outlined' , canAdd : data . canAdd , action : addCategory } ,
2025-07-22 09:46:13 +08:00
]
if ( data . canAdd ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'addTyp' , label : '新增服务类型' , icon : 'ant-design:plus-outlined' , canAdd : data . canAdd , action : addType } )
2025-07-22 09:46:13 +08:00
}
if ( data . izEnabled === '1' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'usingCat' , label : '启用服务类别' , icon : 'ant-design:check-circle-outlined' , canAdd : data . canAdd , action : usingCategory } )
2025-07-22 09:46:13 +08:00
} else if ( data . izEnabled === '0' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'stopCat' , label : '停用服务类别' , icon : 'ant-design:stop-outlined' , canAdd : data . canAdd , action : stopCategory } )
2025-07-22 09:46:13 +08:00
}
return items
}
else if ( data . level === 3 ) {
const items = [
2025-08-07 16:24:07 +08:00
{ key : 'addTyp' , label : '新增服务类型' , icon : 'ant-design:plus-outlined' , canAdd : data . canAdd , action : addType } ,
2025-07-22 09:46:13 +08:00
]
if ( data . canAdd ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'addDir' , label : '新增服务指令' , icon : 'ant-design:plus-outlined' , canAdd : data . canAdd , action : addDirective } )
2025-07-22 09:46:13 +08:00
}
if ( data . izEnabled === '1' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'usingTyp' , label : '启用服务类型' , icon : 'ant-design:check-circle-outlined' , canAdd : data . canAdd , action : usingType } )
2025-07-22 09:46:13 +08:00
} else if ( data . izEnabled === '0' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'stopTyp' , label : '停用服务类型' , icon : 'ant-design:stop-outlined' , canAdd : data . canAdd , action : stopType } )
2025-07-22 09:46:13 +08:00
}
return items
}
else if ( data . level === 4 ) {
const items = [
2025-08-07 16:24:07 +08:00
{ key : 'editDir' , label : '编辑服务指令' , icon : 'ant-design:edit-outlined' , canAdd : data . canAdd && data . izEnabled == '0' , action : editDirective } ,
{ key : 'editMedia' , label : '编辑指令资源' , icon : 'ant-design:edit-outlined' , canAdd : data . canAdd && data . izEnabled == '0' , action : editMedia } ,
2025-07-22 09:46:13 +08:00
]
2025-07-28 10:25:47 +08:00
// if (data.canAdd) {
2025-08-07 16:24:07 +08:00
// items.push({ key: 'addDir', label: '新增服务指令', icon: 'ant-design:plus-outlined', canAdd: data.canAdd , action: addDirective })
2025-07-28 10:25:47 +08:00
// }
2025-07-22 09:46:13 +08:00
if ( data . izEnabled === '1' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'usingDir' , label : '启用服务指令' , icon : 'ant-design:check-circle-outlined' , canAdd : data . canAdd , action : usingDirective } )
2025-07-22 09:46:13 +08:00
} else if ( data . izEnabled === '0' ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'stopDir' , label : '停用服务指令' , icon : 'ant-design:stop-outlined' , canAdd : data . canAdd , action : stopDirective } )
2025-07-22 09:46:13 +08:00
}
2025-07-23 08:39:10 +08:00
if ( data ? . bodyTagList ? . length > 0 ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'bodyTagsDetail' , label : '查看体型标签' , icon : 'ant-design:stop-outlined' , canAdd : true , action : bodyTagsDetail } )
2025-07-23 08:39:10 +08:00
}
if ( data ? . emotionTagList ? . length > 0 ) {
2025-08-07 16:24:07 +08:00
items . push ( { key : 'emotionTagsDetail' , label : '查看情绪标签' , icon : 'ant-design:stop-outlined' , canAdd : true , action : emotionTagsDetail } )
2025-07-23 08:39:10 +08:00
}
2025-07-22 09:46:13 +08:00
return items
}
return [ ]
}
// 递归取每级第一个 key
function setDefaultExpanded ( nodes : any [ ] ) {
2025-08-07 16:24:07 +08:00
// expandedKeys.value.push(nodes[0].key)
// expandedKeys.value.push(nodes[0]?.children?.[0]?.key)
// expandedKeys.value.push(nodes[0]?.children?.[0]?.children?.[0]?.key)
2025-07-22 09:46:13 +08:00
}
const treeLoading = ref ( false )
function reloadTree ( ) {
2025-08-05 15:59:16 +08:00
tree ( { filterIzEnabled : filterIzEnabled . value } ) . then ( res => {
2025-07-22 09:46:13 +08:00
treeData . value = res ;
} )
}
2025-07-23 08:39:10 +08:00
function handleTreeSelect ( selectedKeys : string [ ] , { node } : any ) {
const level = node . level ;
// 清空不必要的查询条件
queryParam . directiveName = '' ;
queryParam . bodyTags = '' ;
queryParam . emotionTags = '' ;
2025-08-05 15:59:16 +08:00
queryParam . id = ''
2025-08-05 10:53:13 +08:00
// queryParam.izEnabled = '';
2025-07-23 08:39:10 +08:00
// 根据节点级别设置查询条件
switch ( level ) {
case 1 : // 分类标签
queryParam . instructionTagId = node . instructionId ;
queryParam . categoryId = '' ;
queryParam . typeId = '' ;
break ;
case 2 : // 服务类别
queryParam . instructionTagId = node . instructionId ;
queryParam . categoryId = node . categoryId ;
queryParam . typeId = '' ;
break ;
case 3 : // 服务类型
queryParam . instructionTagId = node . instructionId ;
queryParam . categoryId = node . categoryId ;
queryParam . typeId = node . typeId ;
break ;
case 4 : // 服务指令
// 四级节点特殊处理:设置指令名称
queryParam . instructionTagId = node . instructionId ;
queryParam . categoryId = node . categoryId ;
queryParam . typeId = node . typeId ;
queryParam . directiveName = node . title ;
2025-08-05 15:59:16 +08:00
queryParam . id = node . key
2025-07-23 08:39:10 +08:00
break ;
}
if ( level == 5 ) return
// 触发查询
2025-08-05 15:59:16 +08:00
searchQuery ( false , level != 4 ) ;
2025-07-23 08:39:10 +08:00
}
2025-07-28 10:25:47 +08:00
function initTree ( ) {
2025-07-22 09:46:13 +08:00
treeLoading . value = true
2025-08-05 10:53:13 +08:00
tree ( { filterIzEnabled : filterIzEnabled . value } ) . then ( res => {
2025-07-22 09:46:13 +08:00
treeData . value = res ;
expandedKeys . value = [ ]
//默认展开每级第一个
setDefaultExpanded ( res )
} )
. finally ( ( ) => {
treeLoading . value = false
} )
2025-07-28 10:25:47 +08:00
}
2025-08-04 14:48:44 +08:00
/ * *
* 查看指令库
* /
function handleDirectiveMainOpen ( ) {
registerModal . value ? . openDM ( mainOrgCode . value )
}
async function getDirectiveMainOrgCode ( ) {
let { orgCode } = await getOrgInfo ( )
let { configValue } = await queryByKey ( { key : 'directive_main_org_code' } )
mainOrgCode . value = configValue
if ( orgCode != configValue ) isShowDM . value = true
}
2025-07-28 10:25:47 +08:00
// 添加音频结束监听
onMounted ( ( ) => {
if ( audioPlayer . value ) {
audioPlayer . value . addEventListener ( 'ended' , ( ) => {
isPlaying . value = false ;
} ) ;
}
initTree ( )
2025-08-04 14:48:44 +08:00
getDirectiveMainOrgCode ( )
2025-07-15 08:39:29 +08:00
} ) ;
2025-03-21 10:15:35 +08:00
< / script >
< style lang = "less" scoped >
. jeecg - basic - table - form - container {
padding : 0 ;
. table - page - search - submitButtons {
display : block ;
margin - bottom : 24 px ;
white - space : nowrap ;
}
. query - group - cust {
min - width : 100 px ! important ;
}
. query - group - split - cust {
width : 30 px ;
display : inline - block ;
text - align : center
}
. ant - form - item : not ( . ant - form - item - with - help ) {
margin - bottom : 16 px ;
height : 32 px ;
}
: deep ( . ant - picker ) ,
: deep ( . ant - input - number ) {
width : 100 % ;
}
}
audio : : - webkit - media - controls - timeline {
display : none ;
}
audio : : - webkit - media - controls - current - time - display ,
audio : : - webkit - media - controls - time - remaining - display {
display : none ;
}
2025-06-19 15:09:53 +08:00
. btnPrivate {
2025-05-13 15:34:20 +08:00
height : 34 px ;
margin - left : 4 px ;
}
2025-07-22 09:46:13 +08:00
. node - title {
display : inline - flex ;
align - items : center ;
}
. action - icon {
margin - left : 4 px ;
cursor : pointer ;
}
2025-07-23 08:39:10 +08:00
: deep ( . centered - dropdown ) {
position : fixed ;
left : 50 % ! important ;
top : 50 % ! important ;
transform : translate ( - 50 % , - 50 % ) ! important ;
max - height : 80 vh ;
overflow - y : auto ;
. ant - dropdown - menu {
max - height : 70 vh ;
overflow - y : auto ;
}
}
2025-08-05 10:53:13 +08:00
. backClass {
background : url ( . . / . . / resource / img / modalback . png ) ;
2025-08-04 08:36:44 +08:00
}
2025-03-21 10:15:35 +08:00
< / style >