Merge branch 'dev' of 192.168.0.100:smart_bench/cmvr-iot-ui into dev

This commit is contained in:
lixiaolong 2025-09-12 09:13:03 +08:00
commit 9cf201eb98
15 changed files with 3735 additions and 2169 deletions

View File

@ -1,77 +1,77 @@
import request from '@/utils/request' import request from "@/utils/request";
import { method } from 'lodash' import { method } from "lodash";
// 查询语料库列表 // 查询语料库列表
export function listCorpus(query) { export function listCorpus(query) {
return request({ return request({
url: '/vi/corpus/single/list', url: "/vi/corpus/single/list",
method: 'get', method: "post",
params: query data: query,
}) });
} }
// 查询语料库详细 // 查询语料库详细
export function getCorpus(corpusId) { export function getCorpus(corpusId) {
return request({ return request({
url: '/vi/corpus/' + corpusId, url: "/vi/corpus/" + corpusId,
method: 'get' method: "get",
}) });
} }
// 新增语料库 // 新增语料库
export function addCorpus(data) { export function addCorpus(data) {
return request({ return request({
url: '/vi/corpus', url: "/vi/corpus",
method: 'post', method: "post",
data: data data: data,
}) });
} }
// 修改语料库 // 修改语料库
export function updateCorpus(data) { export function updateCorpus(data) {
return request({ return request({
url: '/vi/corpus', url: "/vi/corpus",
method: 'put', method: "put",
data: data data: data,
}) });
} }
// 删除语料库 // 删除语料库
export function delCorpus(corpusId) { export function delCorpus(corpusId) {
return request({ return request({
url: '/vi/corpus/' + corpusId, url: "/vi/corpus/" + corpusId,
method: 'delete' method: "delete",
}) });
} }
export function batchAddCorpus(data) { export function batchAddCorpus(data) {
return request({ return request({
url: '/vi/corpus/continuous/insert', url: "/vi/corpus/continuous/insert",
method: 'post', method: "post",
data: data data: data,
}) });
} }
export function batchUpdateCorpus(data) { export function batchUpdateCorpus(data) {
return request({ return request({
url: '/vi/corpus/continuous/update', url: "/vi/corpus/continuous/update",
method: 'post', method: "post",
data: data data: data,
}) });
} }
export function getBatchCorpus(query) { export function getBatchCorpus(query) {
return request({ return request({
url: '/vi/corpus/continuous/list', url: "/vi/corpus/continuous/list",
method: 'get', method: "post",
params: query data: query,
}) });
} }
export function deleteBatchCorpus(corpusIds) { export function deleteBatchCorpus(corpusIds) {
return request({ return request({
url: `/vi/corpus/continuous`, url: `/vi/corpus/continuous`,
method: 'delete', method: "delete",
data: corpusIds data: corpusIds,
}) });
} }

44
src/api/vi/plan.js Normal file
View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询语音交互-方案列表
export function listScheme(query) {
return request({
url: '/vi/scheme/list',
method: 'get',
params: query
})
}
// 查询语音交互-方案详细
export function getScheme(schemeId) {
return request({
url: '/vi/scheme/' + schemeId,
method: 'get'
})
}
// 新增语音交互-方案
export function addScheme(data) {
return request({
url: '/vi/scheme',
method: 'post',
data: data
})
}
// 修改语音交互-方案
export function updateScheme(data) {
return request({
url: '/vi/scheme',
method: 'put',
data: data
})
}
// 删除语音交互-方案
export function delScheme(schemeId) {
return request({
url: '/vi/scheme/' + schemeId,
method: 'delete'
})
}

44
src/api/vi/project.js Normal file
View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询语音交互-项目列表
export function listProject(query) {
return request({
url: '/vi/project/list',
method: 'get',
params: query
})
}
// 查询语音交互-项目详细
export function getProject(projectId) {
return request({
url: '/vi/project/' + projectId,
method: 'get'
})
}
// 新增语音交互-项目
export function addProject(data) {
return request({
url: '/vi/project',
method: 'post',
data: data
})
}
// 修改语音交互-项目
export function updateProject(data) {
return request({
url: '/vi/project',
method: 'put',
data: data
})
}
// 删除语音交互-项目
export function delProject(projectId) {
return request({
url: '/vi/project/' + projectId,
method: 'delete'
})
}

View File

@ -1,74 +1,69 @@
<script setup> <script setup>
import {ArrowDown, ArrowUp} from "@element-plus/icons-vue"; import {ArrowDown, ArrowUp} from "@element-plus/icons-vue";
const props = defineProps({ const props = defineProps({
queryParams: { queryParams: {
type: Object, type: Object,
}, },
queryRef: { queryRef: {
type: String, type: String,
default: 'queryRef' default: 'queryRef'
}, },
inline: { inline: {
type: Boolean, type: Boolean,
default: false default: false
}, },
showSearch: { showSearch: {
type: Boolean, type: Boolean,
}, },
labelWidth: { labelWidth: {
type: String, type: String,
default: '68px' default: '68px'
} }
}) })
const emits = defineEmits(['search','refresh']) const emits = defineEmits(['search','refresh'])
const {proxy} = getCurrentInstance() const {proxy} = getCurrentInstance()
const formData = reactive({ const formData = reactive({
search: false search: false
}); });
const handleQuery = () => { const handleQuery = () => {
emits('search') emits('search')
} }
const resetQuery = () => { const resetQuery = () => {
proxy.resetForm(props.queryRef) proxy.resetForm(props.queryRef)
emits('refresh') emits('refresh')
} }
</script> </script>
<template> <template>
<el-form <el-form
:model="queryParams" :model="queryParams"
:ref="queryRef" :ref="queryRef"
:inline="inline" :inline="inline"
v-show="showSearch" v-show="showSearch"
:label-width="labelWidth" :label-width="labelWidth"
> >
<el-row :gutter="16"> <el-row :gutter="16">
<slot name="one"></slot> <slot name="one"></slot>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6" :xxl="6" style="padding-bottom: 10px;"> <slot name="other" v-if="formData.search"></slot>
<el-space> <el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6" :xxl="6" style="padding-bottom: 10px;">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-space>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="primary" text @click="formData.search = !formData.search"> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<template #icon> <el-button type="primary" text @click="formData.search = !formData.search">
<ArrowUp v-if="formData.search"/> <template #icon>
<ArrowDown v-else/> <ArrowUp v-if="formData.search"/>
</template> <ArrowDown v-else/>
<template #default>{{ formData.search ? "收起" : "展开" }}</template> </template>
</el-button> <template #default>{{ formData.search ? "收起" : "展开" }}</template>
</el-space> </el-button>
</el-col> </el-space>
</el-row> </el-col>
</el-row>
<el-row :gutter="16"> </el-form>
<TransitionGroup name="other-search"> </template>
<slot name="other" v-if="formData.search"></slot>
</TransitionGroup> <style scoped lang="scss">
</el-row>
</el-form> </style>
</template>
<style scoped lang="scss">
</style>

21
src/hooks/tableHeight.ts Normal file
View File

@ -0,0 +1,21 @@
import { useElementSize } from '@vueuse/core'
import { computed } from 'vue'
/**
* hook
* @param {Ref<HTMLElement | null>} containerRef - ref引用
* @param {boolean} [immediate=true] -
* @returns {Ref<number>}
*/
export function useContainerHeight(containerRef, immediate = true) {
// 存储容器高度的响应式变量
const { height } = useElementSize(containerRef)
const containerHeight = computed(() => {
let offset = height.value + 84
return { height: `calc(100% - ${offset}px)` }
})
return containerHeight;
}

View File

@ -192,6 +192,20 @@ export const dynamicRoutes = [
}, },
], ],
}, },
{
path: "/vi/plan",
component: Layout,
hidden: true,
permissions: ["vi:testProject:list"],
children: [
{
path: "index/:id",
component: () => import("@/views/vi/testProject/plan/index"),
name: "Data",
meta: { title: "方案管理", activeMenu: "/vi/testProject" },
},
],
},
{ {
path: "/monitor/job-log", path: "/monitor/job-log",
component: Layout, component: Layout,
@ -221,7 +235,7 @@ export const dynamicRoutes = [
], ],
}, },
]; ];
console.log("constantRoutes", constantRoutes);
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createWebHistory(),
routes: constantRoutes, routes: constantRoutes,

File diff suppressed because it is too large Load Diff

View File

@ -1,371 +1,445 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<TableSearch <div ref="topContainerRef">
:queryParams="queryParams" <TableSearch
:showSearch="showSearch" :queryParams="queryParams"
label-width="90px" :showSearch="showSearch"
queryRef="queryRef" label-width="90px"
@refresh="resetQuery" queryRef="queryRef"
@search="handleQuery" @refresh="resetQuery"
> @search="handleQuery"
<template #one> >
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6"> <template #one>
<el-form-item label="检测项名称" prop="detectName"> <el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-input <el-form-item label="检测项名称" prop="detectName">
v-model="queryParams.detectName" <el-input
clearable v-model="queryParams.detectName"
placeholder="请输入检测项名称" clearable
style="width:100%" placeholder="请输入检测项名称"
@keyup.enter="handleQuery" style="width: 100%"
/> @keyup.enter="handleQuery"
</el-form-item> />
</el-col> </el-form-item>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6"> </el-col>
<el-form-item label="检测项描述" prop="detectDesc"> <el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-input <el-form-item label="检测项描述" prop="detectDesc">
v-model="queryParams.detectDesc" <el-input
clearable v-model="queryParams.detectDesc"
placeholder="请输入检测项描述" clearable
style="width:100%" placeholder="请输入检测项描述"
@keyup.enter="handleQuery" style="width: 100%"
/> @keyup.enter="handleQuery"
</el-form-item> />
</el-col> </el-form-item>
</template> </el-col>
</template>
</TableSearch> </TableSearch>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
v-hasPermi="['test:detect:add']" v-hasPermi="['test:detect:add']"
icon="Plus" icon="Plus"
plain plain
type="primary" type="primary"
@click="handleAdd" @click="handleAdd"
>新增 >新增
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
v-hasPermi="['test:detect:edit']" v-hasPermi="['test:detect:edit']"
:disabled="single" :disabled="single"
icon="Edit" icon="Edit"
plain plain
type="success" type="success"
@click="handleUpdate" @click="handleUpdate"
>修改 >修改
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
v-hasPermi="['test:detect:remove']" v-hasPermi="['test:detect:remove']"
:disabled="multiple" :disabled="multiple"
icon="Delete" icon="Delete"
plain plain
type="danger" type="danger"
@click="handleDelete" @click="handleDelete"
>删除 >删除
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5">--> <!-- <el-col :span="1.5">-->
<!-- <el-button--> <!-- <el-button-->
<!-- type="warning"--> <!-- type="warning"-->
<!-- plain--> <!-- plain-->
<!-- icon="Download"--> <!-- icon="Download"-->
<!-- @click="handleExport"--> <!-- @click="handleExport"-->
<!-- v-hasPermi="['test:detect:export']"--> <!-- v-hasPermi="['test:detect:export']"-->
<!-- >导出--> <!-- >导出-->
<!-- </el-button>--> <!-- </el-button>-->
<!-- </el-col>--> <!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
</el-row> v-model:showSearch="showSearch"
@queryTable="getList"
<el-table v-loading="loading" :data="detectList" @selection-change="handleSelectionChange"> ></right-toolbar>
<el-table-column align="center" type="selection" width="55"/> </el-row>
<el-table-column align="center" label="id" prop="id" show-overflow-tooltip/> </div>
<el-table-column align="center" label="检测项名称" prop="detectName" show-overflow-tooltip/>
<el-table-column align="center" label="检测项描述" prop="detectDesc" show-overflow-tooltip/> <div :style="containerHeight">
<el-table-column align="center" label="所属分组" prop="groupId" > <el-table
<template #default="scope"> v-loading="loading"
{{ groupList?.find(item => item.value === scope.row.groupId)["label"] }} height="100%"
</template> :data="detectList"
</el-table-column> @selection-change="handleSelectionChange"
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip/> >
<el-table-column align="center" label="启用状态" prop="status"> <el-table-column align="center" type="selection" width="55" />
<template #default="scope"> <el-table-column
<el-switch align="center"
v-model="scope.row.status" label="id"
active-text="启用" prop="id"
active-value="0" show-overflow-tooltip
inactive-text="停用" />
inactive-value="1" <el-table-column
inline-prompt align="center"
@change="handleChange(scope.row)" label="检测项名称"
/> prop="detectName"
</template> show-overflow-tooltip
</el-table-column> />
<el-table-column align="center" label="配置状态" prop="isDeploy"> <el-table-column
<template #default="scope"> align="center"
<TableTags :options="[ label="检测项描述"
{ prop="detectDesc"
label: '已配置', show-overflow-tooltip
value:'0', />
type:'success' <el-table-column align="center" label="所属分组" prop="groupId">
}, <template #default="scope">
{ {{
label: '未配置', groupList?.find((item) => item.value === scope.row.groupId)[
value:'1', "label"
type:'warning' ]
} }}
]" :value="scope.row.isDeploy"></TableTags> </template>
</template> </el-table-column>
</el-table-column> <el-table-column
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="200"> align="center"
<template #default="scope"> label="备注"
<el-button v-hasPermi="['test:detect:edit']" icon="Edit" link type="primary" @click="handleUpdate(scope.row)"> prop="remark"
修改 show-overflow-tooltip
</el-button> />
<el-button v-hasPermi="['device:terminal:deploy']" icon="Cpu" link type="primary" <el-table-column align="center" label="启用状态" prop="status">
@click="handleDeploy(scope.row)">配置 <template #default="scope">
</el-button> <el-switch
<!-- <el-button v-hasPermi="['device:terminal:deploy']" icon="Cpu" link type="primary"--> v-model="scope.row.status"
<!-- @click="()=>dialogVisible=true">配置参数--> active-text="启用"
<!-- </el-button>--> active-value="0"
<el-button v-hasPermi="['test:detect:remove']" icon="Delete" link type="primary" inactive-text="停用"
@click="handleDelete(scope.row)">删除 inactive-value="1"
</el-button> inline-prompt
</template> @change="handleChange(scope.row)"
</el-table-column> />
</el-table> </template>
</el-table-column>
<pagination <el-table-column align="center" label="配置状态" prop="isDeploy">
v-show="total>0" <template #default="scope">
v-model:limit="queryParams.pageSize" <TableTags
v-model:page="queryParams.pageNum" :options="[
:total="total" {
@pagination="getList" label: '已配置',
/> value: '0',
type: 'success',
<!-- 添加或修改检测项配置对话框 --> },
<el-dialog v-model="open" :title="title" append-to-body width="500px"> {
<el-form ref="detectRef" :model="form" :rules="rules" label-width="100px"> label: '未配置',
<el-form-item label="检测项名称" prop="detectName"> value: '1',
<el-input v-model="form.detectName" placeholder="请输入检测项名称"/> type: 'warning',
</el-form-item> },
<el-form-item label="检测项描述" prop="detectDesc"> ]"
<el-input v-model="form.detectDesc" placeholder="请输入检测项描述"/> :value="scope.row.isDeploy"
</el-form-item> ></TableTags>
<el-form-item label="所属分组"> </template>
<el-select v-model="form.groupId" placeholder="请选择所属分组"> </el-table-column>
<el-option v-for="group in groupList" :key="group.value" :label="group.label" <el-table-column
:value="group.value"></el-option> align="center"
</el-select> class-name="small-padding fixed-width"
</el-form-item> label="操作"
<el-form-item label="备注" prop="remark"> width="200"
<el-input v-model="form.remark" >
:rows="2" placeholder="请输入备注" type="textarea"/> <template #default="scope">
</el-form-item> <el-button
</el-form> v-hasPermi="['test:detect:edit']"
<template #footer> icon="Edit"
<div class="dialog-footer"> link
<el-button type="primary" @click="submitForm"> </el-button> type="primary"
<el-button @click="cancel"> </el-button> @click="handleUpdate(scope.row)"
</div> >
</template> 修改
</el-dialog> </el-button>
<el-button
<el-dialog v-model="dialogVisible" title="参数配置" width="1080px"> v-hasPermi="['device:terminal:deploy']"
<EditTable></EditTable> icon="Cpu"
link
</el-dialog> type="primary"
</div> @click="handleDeploy(scope.row)"
</template> >配置
</el-button>
<script name="Detect" setup> <!-- <el-button v-hasPermi="['device:terminal:deploy']" icon="Cpu" link type="primary"-->
import {addDetect, delDetect, getDetect, listDetect, updateDetect} from "@/api/test/detect" <!-- @click="()=>dialogVisible=true">配置参数-->
import TableSearch from "@/components/TableSearch/index.vue" <!-- </el-button>-->
import {listGroup} from "@/api/system/group.js"; <el-button
import {appendParamsToPath} from "@/utils/fn.js"; v-hasPermi="['test:detect:remove']"
import TableTags from "@/components/TableTags/index.vue"; icon="Delete"
import EditTable from "@/components/EditTable/index.vue" link
type="primary"
const {proxy} = getCurrentInstance() @click="handleDelete(scope.row)"
>删除
const detectList = ref([]) </el-button>
const open = ref(false) </template>
const dialogVisible = ref(false) </el-table-column>
const loading = ref(true) </el-table>
const showSearch = ref(true)
const ids = ref([]) <pagination
const single = ref(true) v-show="total > 0"
const multiple = ref(true) v-model:limit="queryParams.pageSize"
const total = ref(0) v-model:page="queryParams.pageNum"
const title = ref("") :total="total"
@pagination="getList"
const data = reactive({ />
form: {}, </div>
queryParams: {
pageNum: 1, <!-- 添加或修改检测项配置对话框 -->
pageSize: 10, <el-dialog v-model="open" :title="title" append-to-body width="500px">
detectName: null, <el-form ref="detectRef" :model="form" :rules="rules" label-width="100px">
detectDesc: null, <el-form-item label="检测项名称" prop="detectName">
status: null, <el-input v-model="form.detectName" placeholder="请输入检测项名称" />
detectVersion: null </el-form-item>
}, <el-form-item label="检测项描述" prop="detectDesc">
rules: { <el-input v-model="form.detectDesc" placeholder="请输入检测项描述" />
detectName: [ </el-form-item>
{required: true, message: "检测项名称不能为空", trigger: "blur"} <el-form-item label="所属分组">
] <el-select v-model="form.groupId" placeholder="请选择所属分组">
} <el-option
}) v-for="group in groupList"
:key="group.value"
const {queryParams, form, rules} = toRefs(data) :label="group.label"
:value="group.value"
/** 查询检测项配置列表 */ ></el-option>
function getList() { </el-select>
loading.value = true </el-form-item>
listDetect(queryParams.value).then(response => { <el-form-item label="备注" prop="remark">
detectList.value = response.rows <el-input
total.value = response.total v-model="form.remark"
loading.value = false :rows="2"
}) placeholder="请输入备注"
} type="textarea"
/>
// </el-form-item>
function cancel() { </el-form>
open.value = false <template #footer>
reset() <div class="dialog-footer">
} <el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
// </div>
function reset() { </template>
form.value = {} </el-dialog>
proxy.resetForm("detectRef")
} <el-dialog v-model="dialogVisible" title="参数配置" width="1080px">
<EditTable></EditTable>
/** 搜索按钮操作 */ </el-dialog>
function handleQuery() { </div>
queryParams.value.pageNum = 1 </template>
getList()
} <script name="Detect" setup>
import {
/** 重置按钮操作 */ addDetect,
function resetQuery() { delDetect,
handleQuery() getDetect,
} listDetect,
updateDetect,
// } from "@/api/test/detect";
function handleSelectionChange(selection) { import TableSearch from "@/components/TableSearch/index.vue";
ids.value = selection.map(item => item.id) import { listGroup } from "@/api/system/group.js";
single.value = selection.length != 1 import { appendParamsToPath } from "@/utils/fn.js";
multiple.value = !selection.length import TableTags from "@/components/TableTags/index.vue";
} import EditTable from "@/components/EditTable/index.vue";
/** 新增按钮操作 */ import { useContainerHeight } from "@/hooks/tableHeight";
function handleAdd() {
reset() const topContainerRef = ref();
open.value = true const containerHeight = useContainerHeight(topContainerRef);
title.value = "添加检测项配置"
} const { proxy } = getCurrentInstance();
/** 修改按钮操作 */ const detectList = ref([]);
function handleUpdate(row) { const open = ref(false);
reset() const dialogVisible = ref(false);
const _id = row.id || ids.value const loading = ref(true);
getDetect(_id).then(response => { const showSearch = ref(true);
form.value = response.data const ids = ref([]);
open.value = true const single = ref(true);
title.value = "修改检测项配置" const multiple = ref(true);
}) const total = ref(0);
} const title = ref("");
/** 提交按钮 */ const data = reactive({
function submitForm() { form: {},
proxy.$refs["detectRef"].validate(valid => { queryParams: {
if (valid) { pageNum: 1,
if (form.value.id != null) { pageSize: 10,
updateDetect(form.value).then(response => { detectName: null,
proxy.$modal.msgSuccess("修改成功") detectDesc: null,
open.value = false status: null,
getList() detectVersion: null,
}) },
} else { rules: {
addDetect(form.value).then(response => { detectName: [
proxy.$modal.msgSuccess("新增成功") { required: true, message: "检测项名称不能为空", trigger: "blur" },
open.value = false ],
getList() },
}) });
}
} const { queryParams, form, rules } = toRefs(data);
})
} /** 查询检测项配置列表 */
function getList() {
/** 删除按钮操作 */ loading.value = true;
function handleDelete(row) { listDetect(queryParams.value).then((response) => {
const _ids = row.id || ids.value detectList.value = response.rows;
proxy.$modal.confirm('是否确认删除检测项配置编号为"' + _ids + '"的数据项?').then(function () { total.value = response.total;
return delDetect(_ids) loading.value = false;
}).then(() => { });
getList() }
proxy.$modal.msgSuccess("删除成功")
}).catch(() => { //
}) function cancel() {
} open.value = false;
reset();
/** 配置按钮操作 */ }
function handleDeploy(row) {
const params = {itemId: row.id, name: row.detectName, state: row.status}; //
const fullPath = appendParamsToPath('/flow', params); function reset() {
const p = window.open( form.value = {};
fullPath, proxy.resetForm("detectRef");
"_blank", }
);
} /** 搜索按钮操作 */
function handleQuery() {
// visibilitychange queryParams.value.pageNum = 1;
// document.addEventListener("visibilitychange", () => { getList();
// if (document.visibilityState === "visible") { }
// //
// getList(); /** 重置按钮操作 */
// } function resetQuery() {
// }); handleQuery();
}
const isMount = ref(false) //
function handleSelectionChange(selection) {
onMounted(() => { ids.value = selection.map((item) => item.id);
handleGetSystemGroup() single.value = selection.length != 1;
getList() multiple.value = !selection.length;
}
nextTick(() => {
isMount.value = true /** 新增按钮操作 */
}) function handleAdd() {
}) reset();
open.value = true;
/** 状态开关操作 */ title.value = "添加检测项配置";
function handleChange(row) { }
if (isMount.value) {
updateDetect({status: row.status, id: row.id}).then(response => { /** 修改按钮操作 */
proxy.$modal.msgSuccess("修改成功") function handleUpdate(row) {
getList() reset();
}) const _id = row.id || ids.value;
} getDetect(_id).then((response) => {
} form.value = response.data;
open.value = true;
const groupList = ref([]) title.value = "修改检测项配置";
});
/** 获取系统分组列表(默认传1查询检测项列表) */ }
function handleGetSystemGroup(row) {
listGroup({type: 1}).then(response => { /** 提交按钮 */
groupList.value = response.rows?.map((item) => { function submitForm() {
return { proxy.$refs["detectRef"].validate((valid) => {
label: item.groupName, if (valid) {
value: item.groupId if (form.value.id != null) {
} updateDetect(form.value).then((response) => {
}) proxy.$modal.msgSuccess("修改成功");
}) open.value = false;
} getList();
});
} else {
</script> addDetect(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal
.confirm('是否确认删除检测项配置编号为"' + _ids + '"的数据项?')
.then(function () {
return delDetect(_ids);
})
.then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
/** 配置按钮操作 */
function handleDeploy(row) {
const params = { itemId: row.id, name: row.detectName, state: row.status };
const fullPath = appendParamsToPath("/flow", params);
const p = window.open(fullPath, "_blank");
}
// visibilitychange
// document.addEventListener("visibilitychange", () => {
// if (document.visibilityState === "visible") {
// //
// getList();
// }
// });
const isMount = ref(false);
onMounted(() => {
handleGetSystemGroup();
getList();
nextTick(() => {
isMount.value = true;
});
});
/** 状态开关操作 */
function handleChange(row) {
if (isMount.value) {
updateDetect({ status: row.status, id: row.id }).then((response) => {
proxy.$modal.msgSuccess("修改成功");
getList();
});
}
}
const groupList = ref([]);
/** 获取系统分组列表(默认传1查询检测项列表) */
function handleGetSystemGroup(row) {
listGroup({ type: 1 }).then((response) => {
groupList.value = response.rows?.map((item) => {
return {
label: item.groupName,
value: item.groupId,
};
});
});
}
</script>

View File

@ -1,388 +1,450 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<TableSearch <div ref="topContainerRef">
:queryParams="queryParams" <TableSearch
:showSearch="showSearch" :queryParams="queryParams"
queryRef="queryRef" :showSearch="showSearch"
@refresh="resetQuery" queryRef="queryRef"
@search="handleQuery" @refresh="resetQuery"
@search="handleQuery"
> >
<template #one> <template #one>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6"> <el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="实例名称" prop="taskName"> <el-form-item label="实例名称" prop="taskName">
<el-input <el-input
v-model="queryParams.taskName" v-model="queryParams.taskName"
clearable clearable
placeholder="请输入任务名称" placeholder="请输入任务名称"
style="width:100%" style="width: 100%"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6"> <el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime"
:clearable="false" :clearable="false"
:disabledDate="(time) => { :disabledDate="
// (time) => {
return time.getTime() > Date.now(); //
}" return time.getTime() > Date.now();
type="daterange" }
value-format="YYYY-MM-DD" "
/> type="daterange"
</el-form-item> value-format="YYYY-MM-DD"
</el-col> />
</template> </el-form-item>
</TableSearch> </el-col>
<el-row :gutter="10" class="mb8"> </template>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getInstList"></right-toolbar> </TableSearch>
</el-row> <el-row :gutter="10" class="mb8">
<el-table v-loading="loading" :data="instList" @selection-change="handleSelectionChange"> <right-toolbar
<el-table-column align="center" label="id" prop="id" show-overflow-tooltip/> v-model:showSearch="showSearch"
<el-table-column align="center" label="任务名称" prop="taskName" show-overflow-tooltip/> @queryTable="getInstList"
<el-table-column align="center" label="创建时间" prop="createTime" width="180"> ></right-toolbar>
<template #default="scope"> </el-row>
<span>{{ parseTime(scope.row.createTime) }}</span> </div>
</template>
</el-table-column> <div :style="containerHeight">
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip/> <el-table
<el-table-column align="center" label="实例状态" prop="status" width="180"> v-loading="loading"
<template #default="scope"> height="100%"
<TableTags :options="[ :data="instList"
{ @selection-change="handleSelectionChange"
label: '已完成', >
value:'0', <el-table-column
type:'success' align="center"
}, label="id"
{ prop="id"
label: '执行中', show-overflow-tooltip
value:'1', />
type:'warning' <el-table-column
}, align="center"
{ label="任务名称"
label: '失败', prop="taskName"
value: '2', show-overflow-tooltip
type:'danger' />
} <el-table-column
]" :value="scope.row.status"></TableTags> align="center"
</template> label="创建时间"
</el-table-column> prop="createTime"
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="180"> width="180"
<template #default="scope"> >
<el-button icon="Notebook" link type="primary" <template #default="scope">
@click="handleOpenLogDialog(scope.row)">日志 <span>{{ parseTime(scope.row.createTime) }}</span>
</el-button> </template>
<el-button icon="DataLine" link type="primary" </el-table-column>
@click="handleOpenDashboard(scope.row)">流程可视化 <el-table-column
</el-button> align="center"
</template> label="备注"
</el-table-column> prop="remark"
</el-table> show-overflow-tooltip
/>
<pagination <el-table-column
v-show="instTotal>0" align="center"
v-model:limit="queryParams.pageSize" label="实例状态"
v-model:page="queryParams.pageNum" prop="status"
:total="instTotal" width="180"
@pagination="getInstList" >
/> <template #default="scope">
<TableTags
<!-- 添加或修改检测项日志对话框 --> :options="[
<el-drawer v-model="open" :destroy-on-close="true" :size="580" :title="title" append-to-body modal-class="test-log" {
@close="cancel" @open="getLogList"> label: '已完成',
<el-timeline> value: '0',
<el-timeline-item type: 'success',
v-for="(item, index) in logList" },
:key="index.id" {
:hollow="true" label: '执行中',
:timestamp="item.createTime" value: '1',
placement="top" type: 'warning',
type="primary" },
> {
<el-descriptions label: '失败',
:column="1" value: '2',
:title="item.taskName" type: 'danger',
border },
direction="vertical" ]"
> :value="scope.row.status"
<!-- <template #title>--> ></TableTags>
<!-- <div class="flex align-center" style="cursor: pointer" @click="handleLogicFlow(item)">--> </template>
<!-- <div>{{ item.taskName }}</div>--> </el-table-column>
<!-- <div class="flex align-center" style="margin-left: 10px;">--> <el-table-column
<!-- <el-icon>--> align="center"
<!-- <View/>--> class-name="small-padding fixed-width"
<!-- </el-icon>--> label="操作"
<!-- </div>--> width="180"
<!-- </div>--> >
<!-- </template>--> <template #default="scope">
<el-descriptions-item label="日志等级">{{ item.logLevel }}</el-descriptions-item> <el-button
<el-descriptions-item label="节点类型">{{ item.nodeType }}</el-descriptions-item> icon="Notebook"
<el-descriptions-item label="消息">{{ item.message }}</el-descriptions-item> link
<el-descriptions-item label="执行参数"> type="primary"
<pre>{{ JSON.parse(item.params) }}</pre> @click="handleOpenLogDialog(scope.row)"
</el-descriptions-item> >日志
</el-descriptions> </el-button>
<!-- <el-card>--> <el-button
<!-- {{ item.message }}--> icon="DataLine"
<!-- </el-card>--> link
type="primary"
</el-timeline-item> @click="handleOpenDashboard(scope.row)"
</el-timeline> >流程可视化
<!-- <el-table style="margin-top: 20px;" v-loading="logLoading" :data="logList" :preserve-expanded-content="true">--> </el-button>
<!-- <el-table-column type="index" width="50" align="center" label="序号"/>--> </template>
<!-- <el-table-column show-overflow-tooltip label="任务名称" align="center" prop="taskName"/>--> </el-table-column>
<!-- <el-table-column show-overflow-tooltip label="检测项名称" align="center" prop="detectName"/>--> </el-table>
<!-- <el-table-column show-overflow-tooltip label="节点类型" align="center" prop="nodeType"/>-->
<!-- <el-table-column show-overflow-tooltip label="日志等级" align="center" prop="logLevel">--> <pagination
<!-- <template #default="scope">--> v-show="instTotal > 0"
<!-- <el-tag type="info">{{ scope.row.logLevel }}</el-tag>--> v-model:limit="queryParams.pageSize"
<!-- </template>--> v-model:page="queryParams.pageNum"
<!-- </el-table-column>--> :total="instTotal"
<!-- <el-table-column show-overflow-tooltip label="消息" align="center" prop="message"/>--> @pagination="getInstList"
<!-- <el-table-column type="expand" width="100" label="执行参数">--> />
<!-- <template #default="props">--> </div>
<!-- <pre>-->
<!-- {{ JSON.parse(props.row.params) }}--> <!-- 添加或修改检测项日志对话框 -->
<!-- </pre>--> <el-drawer
<!-- </template>--> v-model="open"
<!-- </el-table-column>--> :destroy-on-close="true"
<!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">--> :size="580"
<!-- <template #default="scope">--> :title="title"
<!-- <span>{{ parseTime(scope.row.createTime) }}</span>--> append-to-body
<!-- </template>--> modal-class="test-log"
<!-- </el-table-column>--> @close="cancel"
<!-- </el-table>--> @open="getLogList"
<!-- <div class="flex justify-content-center" style="margin: 20px 0 10px;">--> >
<!-- <pagination--> <el-timeline>
<!-- v-show="logTotal>0"--> <el-timeline-item
<!-- :total="logTotal"--> v-for="(item, index) in logList"
<!-- v-model:page="logQueryParams.pageNum"--> :key="index.id"
<!-- v-model:limit="logQueryParams.pageSize"--> :hollow="true"
<!-- @pagination="getLogList"--> :timestamp="item.createTime"
<!-- />--> placement="top"
<!-- </div>--> type="primary"
</el-drawer> >
<el-descriptions
<!-- 添加或修改检测项日志对话框 --> :column="1"
<el-drawer v-model="openDashboard" :destroy-on-close="true" :size="580" :title="currentLog.taskName + '的流程'" :title="item.taskName"
append-to-body border
modal-class="rdashboad-log" direction="vertical"
@close="cancel"> >
<el-card v-for="item in taskRightList" shadow="hover" style="width: 100%;margin-bottom: 10px;"> <el-descriptions-item label="日志等级">{{
<div class="flex align-center" style="cursor: pointer" @click="handleLogicFlow(item)"> item.logLevel
<div>{{ item.name }}</div> }}</el-descriptions-item>
<div class="flex align-center" style="margin-left: 10px;"> <el-descriptions-item label="节点类型">{{
<el-icon> item.nodeType
<View/> }}</el-descriptions-item>
</el-icon> <el-descriptions-item label="消息">{{
</div> item.message
</div> }}</el-descriptions-item>
</el-card> <el-descriptions-item label="执行参数">
</el-drawer> <pre>{{ JSON.parse(item.params) }}</pre>
</div> </el-descriptions-item>
</template> </el-descriptions>
</el-timeline-item>
<script name="Log" setup> </el-timeline>
import {addLog, delLog, getInst, getLog, listInst, updateLog} from "@/api/test/log" </el-drawer>
import TableSearch from "@/components/TableSearch/index.vue"
import {View} from "@element-plus/icons-vue"; <!-- 添加或修改检测项日志对话框 -->
import TableTags from "@/components/TableTags/index.vue"; <el-drawer
import {appendParamsToPath} from "@/utils/fn.js"; v-model="openDashboard"
import {getTaskConfig} from "@/api/test/config.js"; :destroy-on-close="true"
import { onMounted } from "vue"; :size="580"
:title="currentLog.taskName + '的流程'"
const {proxy} = getCurrentInstance() append-to-body
modal-class="rdashboad-log"
const instList = ref([]) @close="cancel"
const logList = ref([]) >
const open = ref(false) <el-card
const openDashboard = ref(false) v-for="item in taskRightList"
const loading = ref(true) shadow="hover"
const logLoading = ref(true) style="width: 100%; margin-bottom: 10px"
const showSearch = ref(true) >
const ids = ref([]) <div
const single = ref(true) class="flex align-center"
const multiple = ref(true) style="cursor: pointer"
const instTotal = ref(0) @click="handleLogicFlow(item)"
const logTotal = ref(0) >
const title = ref("") <div>{{ item.name }}</div>
<div class="flex align-center" style="margin-left: 10px">
const data = reactive({ <el-icon>
form: {}, <View />
queryParams: { </el-icon>
pageNum: 1, </div>
pageSize: 10, </div>
createTime: "", </el-card>
detectName: null, </el-drawer>
taskName: null, </div>
}, </template>
logQueryParams: {
pageNum: 1, <script name="Log" setup>
pageSize: 100000, import {
instId: null, addLog,
}, delLog,
rules: {} getInst,
}) getLog,
listInst,
const {queryParams, form, rules, logQueryParams} = toRefs(data) updateLog,
const startOn = computed(() => queryParams.value.createTime[0] + " 00:00:00" || undefined) } from "@/api/test/log";
const endOn = computed(() => queryParams.value.createTime[1] + " 23:59:59" || undefined) import TableSearch from "@/components/TableSearch/index.vue";
import { View } from "@element-plus/icons-vue";
/** 查询任务实例列表 */ import TableTags from "@/components/TableTags/index.vue";
function getInstList() { import { appendParamsToPath } from "@/utils/fn.js";
loading.value = true import { getTaskConfig } from "@/api/test/config.js";
listInst(Object.assign(queryParams.value, {startOn, endOn})).then(response => { import { onMounted } from "vue";
instList.value = response.rows
instTotal.value = response.total import { useContainerHeight } from "@/hooks/tableHeight";
loading.value = false
}) const topContainerRef = ref();
} const containerHeight = useContainerHeight(topContainerRef);
// const { proxy } = getCurrentInstance();
function cancel() {
open.value = false const instList = ref([]);
reset() const logList = ref([]);
} const open = ref(false);
const openDashboard = ref(false);
// const loading = ref(true);
function reset() { const logLoading = ref(true);
logQueryParams.value = { const showSearch = ref(true);
pageNum: 1, const ids = ref([]);
pageSize: 10, const single = ref(true);
instId: null, const multiple = ref(true);
} const instTotal = ref(0);
} const logTotal = ref(0);
const title = ref("");
/** 搜索按钮操作 */
function handleQuery() { const data = reactive({
queryParams.value.pageNum = 1 form: {},
getInstList() queryParams: {
} pageNum: 1,
pageSize: 10,
/** 重置按钮操作 */ createTime: "",
function resetQuery() { detectName: null,
console.log('11') taskName: null,
proxy.resetForm("queryRef") },
handleQuery() logQueryParams: {
} pageNum: 1,
pageSize: 100000,
// instId: null,
function handleSelectionChange(selection) { },
ids.value = selection.map(item => item.id) rules: {},
single.value = selection.length != 1 });
multiple.value = !selection.length
} const { queryParams, form, rules, logQueryParams } = toRefs(data);
const startOn = computed(
/** 新增按钮操作 */ () => queryParams.value.createTime[0] + " 00:00:00" || undefined
function handleAdd() { );
reset() const endOn = computed(
open.value = true () => queryParams.value.createTime[1] + " 23:59:59" || undefined
title.value = "添加检测项日志" );
}
/** 查询任务实例列表 */
/** 修改按钮操作 */ function getInstList() {
function handleUpdate(row) { loading.value = true;
reset() listInst(Object.assign(queryParams.value, { startOn, endOn })).then(
const _id = row.id || ids.value (response) => {
getLog(_id).then(response => { instList.value = response.rows;
form.value = response.data instTotal.value = response.total;
open.value = true loading.value = false;
title.value = "修改检测项日志" }
}) );
} }
/** 提交按钮 */ //
function submitForm() { function cancel() {
proxy.$refs["logRef"].validate(valid => { open.value = false;
if (valid) { reset();
if (form.value.id != null) { }
updateLog(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功") //
open.value = false function reset() {
getInstList() logQueryParams.value = {
}) pageNum: 1,
} else { pageSize: 10,
addLog(form.value).then(response => { instId: null,
proxy.$modal.msgSuccess("新增成功") };
open.value = false }
getInstList()
}) /** 搜索按钮操作 */
} function handleQuery() {
} queryParams.value.pageNum = 1;
}) getInstList();
} }
/** 删除按钮操作 */ /** 重置按钮操作 */
function handleDelete(row) { function resetQuery() {
const _ids = row.id || ids.value console.log("11");
proxy.$modal.confirm('是否确认删除检测项日志编号为"' + _ids + '"的数据项?').then(function () { proxy.resetForm("queryRef");
return delLog(_ids) handleQuery();
}).then(() => { }
getInstList()
proxy.$modal.msgSuccess("删除成功") //
}).catch(() => { function handleSelectionChange(selection) {
}) ids.value = selection.map((item) => item.id);
} single.value = selection.length != 1;
multiple.value = !selection.length;
/** 导出按钮操作 */ }
function handleExport() {
proxy.download('test/log/export', { /** 新增按钮操作 */
...queryParams.value function handleAdd() {
}, `log_${new Date().getTime()}.xlsx`) reset();
} open.value = true;
title.value = "添加检测项日志";
/** 查询实例日志列表 */ }
function getLogList() {
logLoading.value = true /** 修改按钮操作 */
getInst(logQueryParams.value).then(response => { function handleUpdate(row) {
logList.value = response.rows reset();
logTotal.value = response.total const _id = row.id || ids.value;
logLoading.value = false getLog(_id).then((response) => {
}) form.value = response.data;
} open.value = true;
title.value = "修改检测项日志";
function handleOpenLogDialog(row) { });
logQueryParams.value.instId = row.id }
open.value = true
} /** 提交按钮 */
function submitForm() {
const currentLog = ref({}) proxy.$refs["logRef"].validate((valid) => {
if (valid) {
const handleLogicFlow = (item) => { if (form.value.id != null) {
const params = {instId: currentLog.value.id, taskId: currentLog.value.taskId, itemId: item.id, name: item.name, state: '0', isLog: true}; updateLog(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功");
const fullPath = appendParamsToPath('/flow', params); open.value = false;
const p = window.open( getInstList();
fullPath, });
"_blank", } else {
); addLog(form.value).then((response) => {
} proxy.$modal.msgSuccess("新增成功");
open.value = false;
getInstList();
const handleOpenDashboard = (row) => { });
openDashboard.value = true }
currentLog.value = row }
getRightTaskList(row.taskId) });
} }
const taskRightList = ref([]) /** 删除按钮操作 */
// function handleDelete(row) {
const getRightTaskList = (taskId) => { const _ids = row.id || ids.value;
getTaskConfig({taskId: taskId} proxy.$modal
).then(response => { .confirm('是否确认删除检测项日志编号为"' + _ids + '"的数据项?')
taskRightList.value = response.rows?.map((item) => { .then(function () {
return { return delLog(_ids);
name: item.itemName, })
id: item.itemId .then(() => {
} getInstList();
}) || [] proxy.$modal.msgSuccess("删除成功");
}) })
} .catch(() => {});
}
onMounted(() => {
getInstList() /** 导出按钮操作 */
}) function handleExport() {
proxy.download(
</script> "test/log/export",
{
...queryParams.value,
},
`log_${new Date().getTime()}.xlsx`
);
}
/** 查询实例日志列表 */
function getLogList() {
logLoading.value = true;
getInst(logQueryParams.value).then((response) => {
logList.value = response.rows;
logTotal.value = response.total;
logLoading.value = false;
});
}
function handleOpenLogDialog(row) {
logQueryParams.value.instId = row.id;
open.value = true;
}
const currentLog = ref({});
const handleLogicFlow = (item) => {
const params = {
instId: currentLog.value.id,
taskId: currentLog.value.taskId,
itemId: item.id,
name: item.name,
state: "0",
isLog: true,
};
const fullPath = appendParamsToPath("/flow", params);
const p = window.open(fullPath, "_blank");
};
const handleOpenDashboard = (row) => {
openDashboard.value = true;
currentLog.value = row;
getRightTaskList(row.taskId);
};
const taskRightList = ref([]);
//
const getRightTaskList = (taskId) => {
getTaskConfig({ taskId: taskId }).then((response) => {
taskRightList.value =
response.rows?.map((item) => {
return {
name: item.itemName,
id: item.itemId,
};
}) || [];
});
};
onMounted(() => {
getInstList();
});
</script>

View File

@ -1,133 +1,28 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <div ref="topContainerRef">
<el-form-item label="语料名称" prop="corpusName"> <el-form
<el-input :model="queryParams"
v-model="queryParams.corpusName" ref="queryRef"
placeholder="请输入语料名称" :inline="true"
clearable v-show="showSearch"
@keyup.enter="handleQuery" label-width="68px"
/> >
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select v-model="queryParams.voiceType" placeholder="请选择音色" clearable style="width: 200px">
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select v-model="queryParams.dialect" placeholder="请选择语种" clearable style="width: 200px">
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['vi:corpus:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="corpusList" table-layout="auto" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column label="语音文本" align="center" prop="textContent" min-width="200" show-overflow-tooltip />
<el-table-column label="语音文件路径" align="center" prop="audioPath" min-width="150" show-overflow-tooltip />
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column label="预期结果" align="center" prop="expectedResult" min-width="150" show-overflow-tooltip />
<el-table-column label="顺序" align="center" prop="sortOrder" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="备注" align="center" prop="remark" min-width="150" show-overflow-tooltip />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="280" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['vi:corpus:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['vi:corpus:remove']">删除</el-button>
<el-button link type="primary" icon="Upload" @click="handleUpload(scope.row)" v-hasPermi="['vi:corpus:upload']">上传</el-button>
<el-button link type="primary" icon="VideoPlay" @click="handlePlay(scope.row)" v-hasPermi="['vi:corpus:play']">试听</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="580px" append-to-body>
<el-form ref="corpusRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="语料名称" prop="corpusName"> <el-form-item label="语料名称" prop="corpusName">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" /> <el-input
</el-form-item> v-model="queryParams.corpusName"
<el-form-item label="语音文本" prop="textContent"> placeholder="请输入语料名称"
<el-input v-model="form.textContent" type="textarea" placeholder="请输入内容" /> clearable
</el-form-item> @keyup.enter="handleQuery"
<el-form-item label="文件路径" prop="audioPath"> />
<el-input v-model="form.audioPath" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
<el-form-item label="音色" prop="voiceType"> <el-form-item label="音色" prop="voiceType">
<el-select v-model="form.voiceType" placeholder="请选择音色" clearable style="width: 100%"> <el-select
v-model="queryParams.voiceType"
placeholder="请选择音色"
clearable
style="width: 200px"
>
<el-option <el-option
v-for="dict in vi_voice_type" v-for="dict in vi_voice_type"
:key="dict.value" :key="dict.value"
@ -137,7 +32,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="语种" prop="dialect"> <el-form-item label="语种" prop="dialect">
<el-select v-model="form.dialect" placeholder="请选择语种" clearable style="width: 100%"> <el-select
v-model="queryParams.dialect"
placeholder="请选择语种"
clearable
style="width: 200px"
>
<el-option <el-option
v-for="dict in vi_dialect_type" v-for="dict in vi_dialect_type"
:key="dict.value" :key="dict.value"
@ -147,10 +47,229 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预期结果" prop="expectedResult"> <el-form-item label="预期结果" prop="expectedResult">
<el-input v-model="form.expectedResult" type="textarea" placeholder="请输入预期结果" /> <el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['vi:corpus:export']"
>导出</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<div :style="containerHeight">
<el-table
v-loading="loading"
height="100%"
:data="corpusList"
table-layout="auto"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column
label="语音文本"
align="center"
prop="textContent"
min-width="200"
show-overflow-tooltip
/>
<el-table-column
label="语音文件路径"
align="center"
prop="audioPath"
min-width="150"
show-overflow-tooltip
/>
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column
label="预期结果"
align="center"
prop="expectedResult"
min-width="150"
show-overflow-tooltip
/>
<el-table-column label="顺序" align="center" prop="sortOrder" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column
label="备注"
align="center"
prop="remark"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
width="280"
fixed="right"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
<el-button
link
type="primary"
icon="Upload"
@click="handleUpload(scope.row)"
v-hasPermi="['vi:corpus:upload']"
>上传</el-button
>
<el-button
link
type="primary"
icon="VideoPlay"
@click="handlePlay(scope.row)"
v-hasPermi="['vi:corpus:play']"
>试听</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="580px" append-to-body>
<el-form ref="corpusRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="语料名称" prop="corpusName">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" />
</el-form-item>
<el-form-item label="语音文本" prop="textContent">
<el-input
v-model="form.textContent"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
<el-form-item label="文件路径" prop="audioPath">
<el-input
v-model="form.audioPath"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select
v-model="form.voiceType"
placeholder="请选择音色"
clearable
style="width: 100%"
>
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select
v-model="form.dialect"
placeholder="请选择语种"
clearable
style="width: 100%"
>
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="form.expectedResult"
type="textarea"
placeholder="请输入预期结果"
/>
</el-form-item> </el-form-item>
<el-form-item label="顺序" prop="sortOrder"> <el-form-item label="顺序" prop="sortOrder">
<el-inputNumber v-model="form.sortOrder" placeholder="请输入顺序" style="width: 200px;" /> <el-inputNumber
v-model="form.sortOrder"
placeholder="请输入顺序"
style="width: 200px"
/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-input v-model="form.remark" placeholder="请输入备注" />
@ -167,29 +286,42 @@
</template> </template>
<script setup name="Corpus"> <script setup name="Corpus">
import { listCorpus, getCorpus, delCorpus, addCorpus, updateCorpus } from "@/api/vi/corpus" import {
listCorpus,
getCorpus,
delCorpus,
addCorpus,
updateCorpus,
} from "@/api/vi/corpus";
import { useContainerHeight } from "@/hooks/tableHeight";
const { proxy } = getCurrentInstance() const topContainerRef = ref();
const { vi_voice_type, vi_dialect_type } = proxy.useDict("vi_voice_type", "vi_dialect_type") const containerHeight = useContainerHeight(topContainerRef);
const corpusList = ref([])
const open = ref(false) const { proxy } = getCurrentInstance();
const loading = ref(true) const { vi_voice_type, vi_dialect_type } = proxy.useDict(
const showSearch = ref(true) "vi_voice_type",
const ids = ref([]) "vi_dialect_type"
const single = ref(true) );
const multiple = ref(true) const corpusList = ref([]);
const total = ref(0) const open = ref(false);
const title = ref("") const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({ const data = reactive({
form: { form: {
type: 'WAKEUP' type: "WAKEUP",
}, },
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
corpusName: null, corpusName: null,
type: 'WAKEUP', type: "WAKEUP",
continuous: 1, continuous: 1,
textContent: null, textContent: null,
voiceType: null, voiceType: null,
@ -198,38 +330,36 @@ const data = reactive({
}, },
rules: { rules: {
corpusName: [ corpusName: [
{ required: true, message: "请输入语料名称", trigger: "change" } { required: true, message: "请输入语料名称", trigger: "change" },
], ],
textContent: [ textContent: [
{ required: true, message: "请输入语音文本", trigger: "blur" } { required: true, message: "请输入语音文本", trigger: "blur" },
], ],
voiceType: [ voiceType: [{ required: true, message: "请选择音色", trigger: "blur" }],
{ required: true, message: "请选择音色", trigger: "blur" } dialect: [{ required: true, message: "请选择语种", trigger: "blur" }],
], },
dialect: [ });
{ required: true, message: "请选择语种", trigger: "blur" }
],
}
})
const { queryParams, form, rules } = toRefs(data) const { queryParams, form, rules } = toRefs(data);
/** 查询语料库列表 */ /** 查询语料库列表 */
function getList() { function getList() {
loading.value = true loading.value = true;
listCorpus(queryParams.value).then(response => { listCorpus(queryParams.value)
corpusList.value = response.rows .then((response) => {
total.value = response.total corpusList.value = response.rows;
loading.value = false total.value = response.total;
}).catch(err => { loading.value = false;
loading.value = false })
}) .catch((err) => {
loading.value = false;
});
} }
// //
function cancel() { function cancel() {
open.value = false open.value = false;
reset() reset();
} }
// //
@ -237,7 +367,7 @@ function reset() {
form.value = { form.value = {
corpusId: null, corpusId: null,
corpusName: null, corpusName: null,
type: 'WAKEUP', type: "WAKEUP",
textContent: null, textContent: null,
audioPath: null, audioPath: null,
voiceType: null, voiceType: null,
@ -248,95 +378,103 @@ function reset() {
createBy: null, createBy: null,
createTime: null, createTime: null,
updateBy: null, updateBy: null,
updateTime: null updateTime: null,
} };
proxy.resetForm("corpusRef") proxy.resetForm("corpusRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1 queryParams.value.pageNum = 1;
getList() getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef") proxy.resetForm("queryRef");
handleQuery() handleQuery();
} }
// //
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.corpusId) ids.value = selection.map((item) => item.corpusId);
single.value = selection.length != 1 single.value = selection.length != 1;
multiple.value = !selection.length multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset() reset();
open.value = true open.value = true;
title.value = "添加语料库" title.value = "添加语料库";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset() reset();
const _corpusId = row.corpusId || ids.value const _corpusId = row.corpusId || ids.value;
getCorpus(_corpusId).then(response => { getCorpus(_corpusId).then((response) => {
form.value = response.data form.value = response.data;
open.value = true open.value = true;
title.value = "修改语料库" title.value = "修改语料库";
}) });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["corpusRef"].validate(valid => { proxy.$refs["corpusRef"].validate((valid) => {
if (valid) { if (valid) {
console.log('f', form.value) console.log("f", form.value);
if (form.value.corpusId != null) { if (form.value.corpusId != null) {
updateCorpus(form.value).then(response => { updateCorpus(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功") proxy.$modal.msgSuccess("修改成功");
open.value = false open.value = false;
getList() getList();
}) });
} else { } else {
addCorpus(form.value).then(response => { addCorpus(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功") proxy.$modal.msgSuccess("新增成功");
open.value = false open.value = false;
getList() getList();
}) });
} }
} }
}) });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const _corpusIds = row.corpusId || ids.value const _corpusIds = row.corpusId || ids.value;
proxy.$modal.confirm('是否确认删除语料库编号为"' + _corpusIds + '"的数据项?').then(function() { proxy.$modal
return delCorpus(_corpusIds) .confirm('是否确认删除语料库编号为"' + _corpusIds + '"的数据项?')
}).then(() => { .then(function () {
getList() return delCorpus(_corpusIds);
proxy.$modal.msgSuccess("删除成功") })
}).catch(() => {}) .then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
} }
const handleUpload = (row) => { const handleUpload = (row) => {
console.log('上传') console.log("上传");
} };
const handlePlay = () => { const handlePlay = () => {
console.log('播放') console.log("播放");
} };
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download('vi/corpus/export', { proxy.download(
...queryParams.value "vi/corpus/export",
}, `corpus_${new Date().getTime()}.xlsx`) {
...queryParams.value,
},
`corpus_${new Date().getTime()}.xlsx`
);
} }
getList() getList();
</script> </script>

View File

@ -1,168 +1,173 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form <div ref="topContainerRef">
:model="queryParams" <el-form
ref="queryRef" :model="queryParams"
:inline="true" ref="queryRef"
v-show="showSearch" :inline="true"
label-width="68px" v-show="showSearch"
> label-width="68px"
<el-form-item label="语料名称" prop="corpusName">
<el-input
v-model="queryParams.corpusName"
placeholder="请输入语料名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select
v-model="queryParams.voiceType"
placeholder="请选择音色"
clearable
style="width: 200px"
>
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select
v-model="queryParams.dialect"
placeholder="请选择语种"
clearable
style="width: 200px"
>
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['vi:corpus:export']"
>导出</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="corpusList"
table-layout="auto"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
width="280"
fixed="right"
> >
<template #default="{ row }"> <el-form-item label="语料名称" prop="corpusName">
<el-input
v-model="queryParams.corpusName"
placeholder="请输入语料名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select
v-model="queryParams.voiceType"
placeholder="请选择音色"
clearable
style="width: 200px"
>
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select
v-model="queryParams.dialect"
placeholder="请选择语种"
clearable
style="width: 200px"
>
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button <el-button
link
type="primary" type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit" icon="Edit"
@click="handleUpdate(row)" :disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']" v-hasPermi="['vi:corpus:edit']"
>修改</el-button >修改</el-button
> >
</el-col>
<el-col :span="1.5">
<el-button <el-button
link type="danger"
type="primary" plain
icon="Delete" icon="Delete"
@click="handleDelete(row)" :disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']" v-hasPermi="['vi:corpus:remove']"
>删除</el-button >删除</el-button
> >
</el-col>
<el-col :span="1.5">
<el-button <el-button
link type="warning"
type="primary" plain
icon="VideoPlay" icon="Download"
@click="handlePlay(row)" @click="handleExport"
v-hasPermi="['vi:corpus:play']" v-hasPermi="['vi:corpus:export']"
>试听</el-button >导出</el-button
> >
</template> </el-col>
</el-table-column> <right-toolbar
</el-table> v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<pagination <div :style="containerHeight">
v-show="total > 0" <el-table
:total="total" v-loading="loading"
v-model:page="queryParams.pageNum" :data="corpusList"
v-model:limit="queryParams.pageSize" table-layout="auto"
@pagination="getList" height="100%"
/> @selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
width="280"
fixed="right"
>
<template #default="{ row }">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(row)"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(row)"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
<el-button
link
type="primary"
icon="VideoPlay"
@click="handlePlay(row)"
v-hasPermi="['vi:corpus:play']"
>试听</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改语料库对话框 --> <!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="740px" append-to-body> <el-dialog :title="title" v-model="open" width="740px" append-to-body>
@ -279,6 +284,10 @@ import {
batchAddCorpus, batchAddCorpus,
batchUpdateCorpus, batchUpdateCorpus,
} from "@/api/vi/corpus"; } from "@/api/vi/corpus";
import { useContainerHeight } from "@/hooks/tableHeight";
const topContainerRef = ref();
const containerHeight = useContainerHeight(topContainerRef);
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { vi_voice_type, vi_dialect_type } = proxy.useDict( const { vi_voice_type, vi_dialect_type } = proxy.useDict(

View File

@ -1,131 +1,28 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <div ref="topContainerRef">
<el-form-item label="语料名称" prop="corpusName"> <el-form
<el-input :model="queryParams"
v-model="queryParams.corpusName" ref="queryRef"
placeholder="请输入语料名称" :inline="true"
clearable v-show="showSearch"
@keyup.enter="handleQuery" label-width="68px"
/> >
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select v-model="queryParams.voiceType" placeholder="请选择音色" clearable style="width: 200px">
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select v-model="queryParams.dialect" placeholder="请选择语种" clearable style="width: 200px">
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['vi:corpus:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="corpusList" table-layout="auto" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column label="语音文本" align="center" prop="textContent" min-width="200" show-overflow-tooltip />
<el-table-column label="语音文件路径" align="center" prop="audioPath" min-width="150" show-overflow-tooltip />
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column label="预期结果" align="center" prop="expectedResult" min-width="150" show-overflow-tooltip />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="备注" align="center" prop="remark" min-width="150" show-overflow-tooltip />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="280" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['vi:corpus:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['vi:corpus:remove']">删除</el-button>
<el-button link type="primary" icon="VideoPlay" @click="handlePlay(scope.row)" v-hasPermi="['vi:corpus:play']">试听</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="580px" append-to-body>
<el-form ref="corpusRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="语料名称" prop="corpusName"> <el-form-item label="语料名称" prop="corpusName">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" /> <el-input
</el-form-item> v-model="queryParams.corpusName"
<el-form-item label="语音文本" prop="textContent"> placeholder="请输入语料名称"
<el-input v-model="form.textContent" type="textarea" placeholder="请输入内容" /> clearable
</el-form-item> @keyup.enter="handleQuery"
<el-form-item label="文件路径" prop="audioPath"> />
<el-input v-model="form.audioPath" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
<el-form-item label="音色" prop="voiceType"> <el-form-item label="音色" prop="voiceType">
<el-select v-model="form.voiceType" placeholder="请选择音色" clearable style="width: 100%"> <el-select
v-model="queryParams.voiceType"
placeholder="请选择音色"
clearable
style="width: 200px"
>
<el-option <el-option
v-for="dict in vi_voice_type" v-for="dict in vi_voice_type"
:key="dict.value" :key="dict.value"
@ -135,7 +32,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="语种" prop="dialect"> <el-form-item label="语种" prop="dialect">
<el-select v-model="form.dialect" placeholder="请选择语种" clearable style="width: 100%"> <el-select
v-model="queryParams.dialect"
placeholder="请选择语种"
clearable
style="width: 200px"
>
<el-option <el-option
v-for="dict in vi_dialect_type" v-for="dict in vi_dialect_type"
:key="dict.value" :key="dict.value"
@ -145,10 +47,220 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预期结果" prop="expectedResult"> <el-form-item label="预期结果" prop="expectedResult">
<el-input v-model="form.expectedResult" type="textarea" placeholder="请输入预期结果" /> <el-input
v-model="queryParams.expectedResult"
placeholder="请输入预期结果"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['vi:corpus:add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['vi:corpus:export']"
>导出</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<div :style="containerHeight">
<el-table
v-loading="loading"
height="100%"
:data="corpusList"
table-layout="auto"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column
label="语音文本"
align="center"
prop="textContent"
min-width="200"
show-overflow-tooltip
/>
<el-table-column
label="语音文件路径"
align="center"
prop="audioPath"
min-width="150"
show-overflow-tooltip
/>
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
<el-table-column
label="预期结果"
align="center"
prop="expectedResult"
min-width="150"
show-overflow-tooltip
/>
<el-table-column label="状态" align="center" prop="status" />
<el-table-column
label="备注"
align="center"
prop="remark"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
width="280"
fixed="right"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['vi:corpus:edit']"
>修改</el-button
>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['vi:corpus:remove']"
>删除</el-button
>
<el-button
link
type="primary"
icon="VideoPlay"
@click="handlePlay(scope.row)"
v-hasPermi="['vi:corpus:play']"
>试听</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="580px" append-to-body>
<el-form ref="corpusRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="语料名称" prop="corpusName">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" />
</el-form-item>
<el-form-item label="语音文本" prop="textContent">
<el-input
v-model="form.textContent"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
<el-form-item label="文件路径" prop="audioPath">
<el-input
v-model="form.audioPath"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
<el-form-item label="音色" prop="voiceType">
<el-select
v-model="form.voiceType"
placeholder="请选择音色"
clearable
style="width: 100%"
>
<el-option
v-for="dict in vi_voice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="语种" prop="dialect">
<el-select
v-model="form.dialect"
placeholder="请选择语种"
clearable
style="width: 100%"
>
<el-option
v-for="dict in vi_dialect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预期结果" prop="expectedResult">
<el-input
v-model="form.expectedResult"
type="textarea"
placeholder="请输入预期结果"
/>
</el-form-item> </el-form-item>
<el-form-item label="顺序" prop="sortOrder"> <el-form-item label="顺序" prop="sortOrder">
<el-inputNumber v-model="form.sortOrder" placeholder="请输入顺序" style="width: 200px;" /> <el-inputNumber
v-model="form.sortOrder"
placeholder="请输入顺序"
style="width: 200px"
/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-input v-model="form.remark" placeholder="请输入备注" />
@ -165,29 +277,42 @@
</template> </template>
<script setup name="Corpus"> <script setup name="Corpus">
import { listCorpus, getCorpus, delCorpus, addCorpus, updateCorpus } from "@/api/vi/corpus" import {
listCorpus,
getCorpus,
delCorpus,
addCorpus,
updateCorpus,
} from "@/api/vi/corpus";
import { useContainerHeight } from "@/hooks/tableHeight";
const { proxy } = getCurrentInstance() const topContainerRef = ref();
const { vi_voice_type, vi_dialect_type } = proxy.useDict("vi_voice_type", "vi_dialect_type") const containerHeight = useContainerHeight(topContainerRef);
const corpusList = ref([])
const open = ref(false) const { proxy } = getCurrentInstance();
const loading = ref(true) const { vi_voice_type, vi_dialect_type } = proxy.useDict(
const showSearch = ref(true) "vi_voice_type",
const ids = ref([]) "vi_dialect_type"
const single = ref(true) );
const multiple = ref(true) const corpusList = ref([]);
const total = ref(0) const open = ref(false);
const title = ref("") const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({ const data = reactive({
form: { form: {
type: 'TEST' type: "TEST",
}, },
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
corpusName: null, corpusName: null,
type: 'TEST', type: "TEST",
continuous: 1, continuous: 1,
textContent: null, textContent: null,
audioPath: null, audioPath: null,
@ -199,38 +324,36 @@ const data = reactive({
}, },
rules: { rules: {
corpusName: [ corpusName: [
{ required: true, message: "请输入语料名称", trigger: "change" } { required: true, message: "请输入语料名称", trigger: "change" },
], ],
textContent: [ textContent: [
{ required: true, message: "请输入语音文本", trigger: "blur" } { required: true, message: "请输入语音文本", trigger: "blur" },
], ],
voiceType: [ voiceType: [{ required: true, message: "请选择音色", trigger: "blur" }],
{ required: true, message: "请选择音色", trigger: "blur" } dialect: [{ required: true, message: "请选择语种", trigger: "blur" }],
], },
dialect: [ });
{ required: true, message: "请选择语种", trigger: "blur" }
],
}
})
const { queryParams, form, rules } = toRefs(data) const { queryParams, form, rules } = toRefs(data);
/** 查询语料库列表 */ /** 查询语料库列表 */
function getList() { function getList() {
loading.value = true loading.value = true;
listCorpus(queryParams.value).then(response => { listCorpus(queryParams.value)
corpusList.value = response.rows .then((response) => {
total.value = response.total corpusList.value = response.rows;
loading.value = false total.value = response.total;
}).catch(err => { loading.value = false;
loading.value = false })
}) .catch((err) => {
loading.value = false;
});
} }
// //
function cancel() { function cancel() {
open.value = false open.value = false;
reset() reset();
} }
// //
@ -238,7 +361,7 @@ function reset() {
form.value = { form.value = {
corpusId: null, corpusId: null,
corpusName: null, corpusName: null,
type: 'TEST', type: "TEST",
textContent: null, textContent: null,
audioPath: null, audioPath: null,
voiceType: null, voiceType: null,
@ -249,97 +372,105 @@ function reset() {
createBy: null, createBy: null,
createTime: null, createTime: null,
updateBy: null, updateBy: null,
updateTime: null updateTime: null,
} };
proxy.resetForm("corpusRef") proxy.resetForm("corpusRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1 queryParams.value.pageNum = 1;
getList() getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef") proxy.resetForm("queryRef");
handleQuery() handleQuery();
} }
// //
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.corpusId) ids.value = selection.map((item) => item.corpusId);
single.value = selection.length != 1 single.value = selection.length != 1;
multiple.value = !selection.length multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset() reset();
open.value = true open.value = true;
title.value = "添加语料库" title.value = "添加语料库";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset() reset();
const _corpusId = row.corpusId || ids.value const _corpusId = row.corpusId || ids.value;
getCorpus(_corpusId).then(response => { getCorpus(_corpusId).then((response) => {
form.value = response.data form.value = response.data;
open.value = true open.value = true;
title.value = "修改语料库" title.value = "修改语料库";
}) });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["corpusRef"].validate(valid => { proxy.$refs["corpusRef"].validate((valid) => {
if (valid) { if (valid) {
console.log('f', form.value) console.log("f", form.value);
if (form.value.corpusId != null) { if (form.value.corpusId != null) {
updateCorpus(form.value).then(response => { updateCorpus(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功") proxy.$modal.msgSuccess("修改成功");
open.value = false open.value = false;
getList() getList();
}) });
} else { } else {
addCorpus(form.value).then(response => { addCorpus(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功") proxy.$modal.msgSuccess("新增成功");
open.value = false open.value = false;
getList() getList();
}) });
} }
} }
}) });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const _corpusIds = row.corpusId || ids.value const _corpusIds = row.corpusId || ids.value;
proxy.$modal.confirm('是否确认删除语料库编号为"' + _corpusIds + '"的数据项?').then(function() { proxy.$modal
return delCorpus(_corpusIds) .confirm('是否确认删除语料库编号为"' + _corpusIds + '"的数据项?')
}).then(() => { .then(function () {
getList() return delCorpus(_corpusIds);
proxy.$modal.msgSuccess("删除成功") })
}).catch(() => {}) .then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
} }
const handlePlay = () => { const handlePlay = () => {
console.log('播放') console.log("播放");
} };
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download('vi/corpus/export', { proxy.download(
...queryParams.value "vi/corpus/export",
}, `corpus_${new Date().getTime()}.xlsx`) {
...queryParams.value,
},
`corpus_${new Date().getTime()}.xlsx`
);
} }
onMounted(() => { onMounted(() => {
getList() getList();
}) });
defineExpose({ defineExpose({
getList getList,
}) });
</script> </script>

View File

@ -1,19 +1,93 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <div ref="topContainerRef">
<el-form-item label="项目名称" prop="corpusName"> <TableSearch
<el-input :queryParams="queryParams"
v-model="queryParams.corpusName" :showSearch="showSearch"
placeholder="请输入项目名称" label-width="100px"
clearable queryRef="queryRef"
@keyup.enter="handleQuery" @refresh="resetQuery"
/> @search="handleQuery"
</el-form-item> >
<el-form-item> <template #one>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-form-item label="项目名称" prop="projectName">
</el-form-item> <el-input
</el-form> v-model="queryParams.projectName"
placeholder="请输入项目名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="测试人员" prop="tester">
<el-input
v-model="queryParams.tester"
placeholder="请输入测试人员"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="样品名称" prop="sampleName">
<el-input
v-model="queryParams.sampleName"
placeholder="请输入样品名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
</template>
<template #other>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="计划开始时间" prop="planStart">
<el-date-picker
clearable
v-model="queryParams.planStart"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择计划开始时间"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="计划结束时间" prop="planEnd">
<el-date-picker
clearable
v-model="queryParams.planEnd"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择计划结束时间"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="商标" prop="trademark">
<el-input
v-model="queryParams.trademark"
placeholder="请输入商标"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24" :xxl="6">
<el-form-item label="型号规格" prop="modelSpec">
<el-input
v-model="queryParams.modelSpec"
placeholder="请输入型号规格"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
</template>
</TableSearch>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@ -21,108 +95,233 @@
type="primary" type="primary"
plain plain
icon="Plus" icon="Plus"
size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['vi:corpus:add']" v-hasPermi="['system:project:add']"
>新增</el-button> >新增</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="success" type="success"
plain plain
icon="Edit" icon="Edit"
size="mini"
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
v-hasPermi="['vi:corpus:edit']" v-hasPermi="['system:project:edit']"
>修改</el-button> >修改</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="danger" type="danger"
plain plain
icon="Delete" icon="Delete"
size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['vi:corpus:remove']" v-hasPermi="['system:project:remove']"
>删除</el-button> >删除</el-button
>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
size="mini"
@click="handleExport"
v-hasPermi="['system:project:export']"
>导出</el-button
>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</div>
<el-table v-loading="loading" :data="corpusList" table-layout="auto" @selection-change="handleSelectionChange"> <div :style="containerHeight">
<el-table
v-loading="loading"
height="100%"
:data="projectList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="项目名称" align="center" prop="corpusName" /> <el-table-column label="项目ID" align="center" prop="projectId" />
<el-table-column label="项目编号" align="center" prop="textContent" min-width="200" show-overflow-tooltip /> <el-table-column label="项目名称" align="center" prop="projectName" width="150" show-overflow-tooltip />
<el-table-column label="测试人员" align="center" prop="audioPath" min-width="150" show-overflow-tooltip /> <el-table-column label="测试人员" align="center" prop="tester" />
<el-table-column label="计划测试时间" align="center" prop="voiceType" /> <el-table-column
<el-table-column label="项目描述" align="center" prop="dialect" show-overflow-tooltip /> label="计划测试开始时间"
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="280"> align="center"
<template #default="scope"> prop="planStart"
<el-button link type="primary" icon="Upload" @click="handleUpload(scope.row)">详情</el-button> width="180"
<el-button link type="primary" icon="Upload" @click="handleUpload(scope.row)">下载</el-button> >
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button> <template #default="{ row }">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button> <span>{{ parseTime(row.planStart) }}</span>
<el-button link type="primary" icon="VideoPlay" @click="handlePlay(scope.row)">执行</el-button> </template>
</el-table-column>
<el-table-column label="计划测试结束时间" align="center" prop="planEnd" width="180">
<template #default="{ row }">
<span>{{ parseTime(row.planEnd) }}</span>
</template>
</el-table-column>
<el-table-column label="项目描述" width="200" show-overflow-tooltip align="center" prop="description" />
<el-table-column label="样品名称" align="center" prop="sampleName" width="150" show-overflow-tooltip />
<el-table-column label="商标" align="center" prop="trademark" width="150" show-overflow-tooltip />
<el-table-column label="型号规格" align="center" prop="modelSpec" width="150" show-overflow-tooltip />
<el-table-column label="数量" align="center" prop="quantity" />
<el-table-column label="操作" align="center" width="220px" class-name="small-padding fixed-width" fixed="right">
<template #default="{ row }">
<el-button
size="mini"
type="text"
@click="handleSetting(row)"
>配置
</el-button>
<el-button
size="mini"
type="text"
@click="handleUpdate(row)"
v-hasPermi="['system:project:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
@click="handleDelete(row)"
v-hasPermi="['system:project:remove']"
>删除</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
v-show="total>0" v-show="total > 0"
:total="total" :total="total"
v-model:page="queryParams.pageNum" :page.sync="queryParams.pageNum"
v-model:limit="queryParams.pageSize" :limit.sync="queryParams.pageSize"
@pagination="getList" @pagination="getList"
/> />
</div>
<!-- 添加或修改语料库对话框 --> <!-- 添加或修改语料库对话框 -->
<el-dialog :title="title" v-model="open" width="740px" append-to-body> <el-dialog
<el-form ref="corpusRef" :inline="true" :model="form" :rules="rules" label-width="100px"> :title="title"
v-model="open"
width="740px"
:append-to-body="false"
body-class="testProject_dialog"
>
<el-form ref="projectRef" :model="form" :rules="rules" label-width="120px">
<div class="card"> <div class="card">
<div class="form-title">项目信息</div> <div class="form-title">项目信息</div>
<el-form-item label="项目名称" prop="corpusName"> <el-row :gutter="20">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" /> <el-col :span="12">
</el-form-item> <el-form-item label="项目名称" prop="projectName">
<el-form-item label="项目编号" prop="textContent"> <el-input v-model="form.projectName" placeholder="请输入语料名称" />
<el-input v-model="form.textContent" placeholder="请输入内容" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="测试人员" prop="audioPath"> <el-col :span="12">
<el-input v-model="form.audioPath" placeholder="请输入内容" /> <el-form-item label="测试人员" prop="tester">
</el-form-item> <el-input v-model="form.tester" placeholder="请输入测试人员" />
<el-form-item label="计划测试时间" prop="voiceType"> </el-form-item>
<el-date-picker </el-col>
v-model="form.voiceType" <el-col :span="12">
type="date" <el-form-item label="计划开始时间" prop="planStart">
placeholder="Pick a date" <el-date-picker
/> clearable
</el-form-item> v-model="form.planStart"
<el-form-item label="项目描述" prop="dialect"> type="datetime"
<el-input v-model="form.expectedResult" type="textarea" placeholder="请输入项目描述" /> placeholder="请选择计划测试开始时间"
</el-form-item> >
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划结束时间" prop="planEnd">
<el-date-picker
clearable
v-model="form.planEnd"
type="datetime"
placeholder="请选择计划测试结束时间"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目描述" prop="description">
<el-input
v-model="form.description"
type="textarea"
placeholder="请输入项目描述"
/>
</el-form-item>
</el-col>
</el-row>
</div> </div>
<div class="card"> <div class="card">
<div class="form-title">样品信息</div> <div class="form-title">样品信息</div>
<el-form-item label="样品名称" prop="corpusName"> <el-row :gutter="20">
<el-input v-model="form.corpusName" placeholder="请输入语料名称" /> <el-col :span="12">
</el-form-item> <el-form-item label="样品名称" prop="sampleName">
<el-form-item label="商标" prop="textContent"> <el-input v-model="form.sampleName" placeholder="请输入语料名称" />
<el-input v-model="form.textContent" placeholder="请输入内容" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="型号规格" prop="audioPath"> <el-col :span="12">
<el-input v-model="form.audioPath" placeholder="请输入内容" /> <el-form-item label="商标" prop="trademark">
</el-form-item> <el-input v-model="form.trademark" placeholder="请输入内容" />
<el-form-item label="样品数量" prop="voiceType"> </el-form-item>
<el-date-picker </el-col>
v-model="form.voiceType" <el-col :span="12">
type="date" <el-form-item label="型号规格" prop="modelSpec">
placeholder="Pick a date" <el-input v-model="form.modelSpec" placeholder="请输入内容" />
/> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="生产单位" prop="dialect"> <el-col :span="12">
<el-input v-model="form.expectedResult" placeholder="请输入项目描述" /> <el-form-item label="样品数量" prop="quantity">
</el-form-item> <el-input-number
<el-form-item label="委托单位" prop="dialect"> v-model="form.quantity"
<el-input v-model="form.expectedResult" placeholder="请输入项目描述" /> :min="1"
</el-form-item> :step="1"
:step-strictly="true"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="委托单位" prop="entrustUnit">
<el-input v-model="form.entrustUnit" placeholder="请输入项目描述" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产单位" prop="productionUnit">
<el-input v-model="form.productionUnit" placeholder="请输入项目描述" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="送样日期" prop="sampleDate">
<el-date-picker
clearable
v-model="form.sampleDate"
type="datetime"
placeholder="请选择送样日期"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产日期" prop="productionDate">
<el-date-picker
clearable
v-model="form.productionDate"
type="datetime"
placeholder="请选择生产日期"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
</div> </div>
</el-form> </el-form>
<template #footer> <template #footer>
@ -135,175 +334,236 @@
</div> </div>
</template> </template>
<script setup name="Corpus"> <script setup>
import { listCorpus, getCorpus, delCorpus, addCorpus, updateCorpus } from "@/api/vi/corpus" import {
listProject,
getProject,
delProject,
addProject,
updateProject,
} from "@/api/vi/project";
import TableSearch from "@/components/TableSearch/index.vue";
import { useContainerHeight } from "@/hooks/tableHeight";
const { proxy } = getCurrentInstance() const topContainerRef = ref();
const { vi_voice_type, vi_dialect_type } = proxy.useDict("vi_voice_type", "vi_dialect_type") const containerHeight = useContainerHeight(topContainerRef);
const corpusList = ref([])
const open = ref(false) const { proxy } = getCurrentInstance();
const loading = ref(true)
const showSearch = ref(true) const projectList = ref([]);
const ids = ref([]) const open = ref(false);
const single = ref(true) const loading = ref(false);
const multiple = ref(true) const showSearch = ref(true);
const total = ref(0) const ids = ref([]);
const title = ref("") const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({ const data = reactive({
form: { form: {},
},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
corpusName: null projectName: null,
tester: null,
planStart: null,
planEnd: null,
description: null,
sampleName: null,
trademark: null,
modelSpec: null,
quantity: null,
status: null,
}, },
rules: { rules: {
projectName: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
} tester: [{ required: true, message: "请输入测试人员", trigger: "blur" }],
}) planStart: [{ required: true, message: "请输入计划测试开始时间", trigger: "blur" }],
planEnd: [{ required: true, message: "请输入计划测试结束时间", trigger: "blur" }],
sampleName: [{ required: true, message: "请输入样品名称", trigger: "blur" }],
trademark: [{ required: true, message: "请输入样品商标", trigger: "blur" }],
modelSpec: [{ required: true, message: "请输入样品型号规格", trigger: "blur" }],
entrustUnit: [{ required: true, message: "请输入样品委托单位", trigger: "blur" }],
productionUnit: [{ required: true, message: "请输入样品生产单位", trigger: "blur" }],
quantity: [
{ required: true, message: "请输入样品数量" },
{ type: 'number', message: '请输入样品数量' },],
sampleDate: [{ required: true, message: "请输入样品送达日期", trigger: "blur" }],
productionDate: [{ required: true, message: "请输入样品生产日期", trigger: "blur" }],
},
});
const { queryParams, form, rules } = toRefs(data) const { queryParams, form, rules } = toRefs(data);
/** 查询语料库列表 */ /** 查询语音交互-项目列表 */
function getList() { function getList() {
loading.value = true loading.value = true;
listCorpus(queryParams.value).then(response => { listProject(queryParams.value).then((response) => {
corpusList.value = response.rows projectList.value = response.rows;
total.value = response.total total.value = response.total;
loading.value = false loading.value = false;
}).catch(err => { });
loading.value = false
})
} }
// //
function cancel() { function cancel() {
open.value = false open.value = false;
reset() reset();
} }
// //
function reset() { function reset() {
form.value = { form.value = {
corpusName: null, projectId: null,
} projectName: null,
proxy.resetForm("corpusRef") tester: null,
planStart: null,
planEnd: null,
description: null,
sampleName: null,
trademark: null,
modelSpec: null,
quantity: null,
status: null,
remark: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
};
proxy.resetForm("projectRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1 queryParams.value.pageNum = 1;
getList() getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef") proxy.resetForm("queryRef");
handleQuery() handleQuery();
} }
// //
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.corpusId) ids.value = selection.map((item) => item.projectId);
single.value = selection.length != 1 single.value = selection.length != 1;
multiple.value = !selection.length multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset() reset();
open.value = true open.value = true;
title.value = "添加测试项目" title.value = "添加测试项目";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset() reset();
const _corpusId = row.corpusId || ids.value const _projectId = row.projectId || ids.value;
getCorpus(_corpusId).then(response => { getProject(_projectId).then((response) => {
form.value = response.data form.value = response.data;
open.value = true open.value = true;
title.value = "修改测试项目" title.value = "修改测试项目";
}) });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["corpusRef"].validate(valid => { proxy.$refs["projectRef"].validate((valid) => {
if (valid) { if (valid) {
console.log('f', form.value) if (form.value.projectId != null) {
if (form.value.corpusId != null) { updateProject(form.value).then((response) => {
updateCorpus(form.value).then(response => { proxy.$modal.msgSuccess("修改成功");
proxy.$modal.msgSuccess("修改成功") open.value = false;
open.value = false getList();
getList() });
})
} else { } else {
addCorpus(form.value).then(response => { addProject(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功") proxy.$modal.msgSuccess("新增成功");
open.value = false open.value = false;
getList() getList();
}) });
} }
} }
}) });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const _corpusIds = row.corpusId || ids.value const _projectIds = row.projectId || ids.value;
proxy.$modal.confirm('是否确认删除语料库编号为"' + _corpusIds + '"的数据项?').then(function() { proxy.$modal
return delCorpus(_corpusIds) .confirm('是否确认删除语音交互-项目编号为"' + _projectIds + '"的数据项?')
}).then(() => { .then(function () {
getList() return delProject(_projectIds);
proxy.$modal.msgSuccess("删除成功") })
}).catch(() => {}) .then(() => {
} getList();
proxy.$modal.msgSuccess("删除成功");
const handleUpload = (row) => { })
console.log('上传') .catch(() => {});
}
const handlePlay = () => {
console.log('播放')
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download('vi/corpus/export', { proxy.download(
...queryParams.value "system/project/export",
}, `corpus_${new Date().getTime()}.xlsx`) {
...queryParams.value,
},
`project_${new Date().getTime()}.xlsx`
);
}
const router = useRouter()
const handleSetting = (row) => {
router.push('/vi/plan/index/' + row.projectId)
} }
onMounted(() => { onMounted(() => {
getList() getList();
}) });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.card { :deep() {
padding: 12px; .testProject_dialog {
border: 1px solid #e4e7ed; .el-date-editor {
border-radius: 8px; --el-date-editor-width: 100%;
margin-bottom: 20px; }
&:hover { .el-input-number {
box-shadow: 0px 0px 12px rgba(0, 0, 0, .12); width: 100%;
} }
.form-title { .card {
display: flex; padding: 12px;
align-items: center; border: 1px solid #e4e7ed;
font-size: 16px; border-radius: 8px;
margin-bottom: 10px; margin-bottom: 20px;
&::before { &:hover {
content: ''; box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
width: 4px; }
height: 16px;
background: blue; .form-title {
display: inline-block; display: flex;
margin-right: 8px; align-items: center;
font-size: 16px;
margin-bottom: 10px;
&::before {
content: "";
width: 4px;
height: 16px;
background: blue;
display: inline-block;
margin-right: 8px;
}
}
} }
} }
} }

View File

@ -0,0 +1,428 @@
<template>
<div class="app-container">
<div ref="topContainerRef">
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
v-show="showSearch"
label-width="100px"
>
<el-form-item label="所属项目ID" prop="projectId">
<el-input
v-model="queryParams.projectId"
placeholder="请输入所属项目ID"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="方案名称" prop="schemeName">
<el-input
v-model="queryParams.schemeName"
placeholder="请输入方案名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['system:scheme:add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:scheme:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:scheme:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['system:scheme:export']"
>导出</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<div :style="containerHeight">
<el-table
v-loading="loading"
:data="schemeList"
height="100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="方案ID" align="center" prop="schemeId" />
<el-table-column label="所属项目ID" align="center" prop="projectId" />
<el-table-column label="方案名称" align="center" prop="schemeName" />
<el-table-column
label="语料ID列表"
align="center"
prop="corpusIds"
width="300"
show-overflow-tooltip
/>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:scheme:edit']"
>修改</el-button
>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:scheme:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改语音交互-方案对话框 -->
<el-dialog
:title="title"
v-model="open"
width="700px"
:append-to-body="false"
body-class="plan_dialog"
>
<el-form ref="schemeRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="方案名称" prop="schemeName">
<el-input v-model="form.schemeName" placeholder="请输入方案名称" />
</el-form-item>
<el-form-item label="播放配置" prop="sceneType">
<el-select
v-model="form.sceneType"
placeholder="Select"
style="width: 240px"
>
<el-option
v-for="item in settingOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="唤醒语料列表" prop="wakeId">
<el-select
v-model="form.wakeId"
placeholder="Select"
style="width: 240px"
>
<el-option
v-for="item in corpusIdsOptions"
:key="item.parentId"
:label="item.corpusName"
:value="item.parentId"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
</el-form>
<div v-if="form.sceneType && form.sceneType != 1">
<div>语料配置({{ form.sceneType == 2 ? "单次" : "连续" }})</div>
<Setting
type="1"
v-if="form.sceneType == 2"
:corpusIds="selectCorpusIds"
@updateSelectRows="getSelectRows"
/>
<Setting
type="0"
v-if="form.sceneType == 3"
:corpusIds="selectCorpusIds"
@updateSelectRows="getSelectRows"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
listScheme,
getScheme,
delScheme,
addScheme,
updateScheme,
} from "@/api/vi/plan";
import { listCorpus } from "@/api/vi/corpus";
import Setting from "./setting.vue";
import { onMounted } from "vue";
import { ElMessage } from "element-plus";
import { useContainerHeight } from "@/hooks/tableHeight";
const topContainerRef = ref();
const containerHeight = useContainerHeight(topContainerRef);
const route = useRoute();
const { proxy } = getCurrentInstance();
const schemeList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const selectCorpusIds = ref("");
const data = reactive({
form: {
corpusIds: null,
},
queryParams: {
pageNum: 1,
pageSize: 10,
schemeName: null,
corpusIds: null,
},
rules: {
projectId: [
{ required: true, message: "所属项目ID不能为空", trigger: "blur" },
],
schemeName: [
{ required: true, message: "方案名称不能为空", trigger: "blur" },
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询语音交互-方案列表 */
function getList() {
loading.value = true;
listScheme(queryParams.value).then((response) => {
schemeList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
//
function cancel() {
open.value = false;
reset();
}
//
function reset() {
form.value = {
schemeId: null,
schemeName: null,
corpusIds: null,
remark: null,
};
proxy.resetForm("schemeRef");
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.schemeId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
const settingOptions = [
{ value: 1, label: "唤醒场景" },
{ value: 2, label: "单次对话场景" },
{ value: 3, label: "连续对话场景" },
];
const corpusIdsOptions = ref([]);
/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加方案";
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _schemeId = row.schemeId || ids.value;
getScheme(_schemeId).then((response) => {
form.value = response.data;
selectCorpusIds.value = response.data.corpusIds;
title.value = "修改方案";
open.value = true;
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["schemeRef"].validate((valid) => {
if (valid) {
if (form.value.sceneType === "1") {
form.value.corpusIds = null;
} else {
if (!form.value?.corpusIds || form.value?.corpusIds?.length === 0) {
ElMessage.error("请先添加语料");
return;
}
}
if (form.value.schemeId != null) {
updateScheme(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addScheme({
...form.value,
projectId: route.params.id,
}).then((response) => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _schemeIds = row.schemeId || ids.value;
proxy.$modal
.confirm('是否确认删除语音交互-方案编号为"' + _schemeIds + '"的数据项?')
.then(function () {
return delScheme(_schemeIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download(
"system/scheme/export",
{
...queryParams.value,
},
`scheme_${new Date().getTime()}.xlsx`
);
}
const getWakeList = () => {
listCorpus({
pageNum: 1,
pageSize: 100000,
type: "WAKEUP",
continuous: 1,
})
.then((response) => {
corpusIdsOptions.value = response.rows;
})
.catch((err) => {});
};
const getSelectRows = (arr) => {
const corpusIds = arr.map((item) => item.parentId);
form.value.corpusIds = corpusIds.toString();
};
onMounted(() => {
getList();
getWakeList();
});
</script>
<style lang="scss" scoped>
:deep() {
.plan_dialog {
.el-select {
width: 100% !important;
}
}
}
</style>

View File

@ -0,0 +1,191 @@
<template>
<div>
<div class="btn-container">
<el-button type="primary" @click="openDialog">配置语料</el-button>
</div>
<el-table :data="selectList">
<el-table-column label="语料名称" align="center" prop="corpusName" />
<el-table-column
label="语音文本"
align="center"
prop="textContent"
min-width="200"
show-overflow-tooltip
/>
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
</el-table>
<el-dialog title="选择语料" v-model="open" width="700px">
<el-table
ref="tableRef"
:data="corpusList"
:tree-props="{ checkStrictly: true }"
:row-key="rowKey"
>
<el-table-column
type="selection"
width="55"
align="center"
v-show="false"
:selectable="selectable"
/>
<el-table-column
label="语料名称"
align="center"
prop="corpusName"
min-width="100"
show-overflow-tooltip
/>
<el-table-column
label="语音文本"
align="center"
prop="textContent"
min-width="200"
show-overflow-tooltip
/>
<el-table-column label="音色" align="center" prop="voiceType" />
<el-table-column label="语种" align="center" prop="dialect" />
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { onMounted } from "vue";
import { listCorpus, getBatchCorpus } from "@/api/vi/corpus";
const props = defineProps({
type: {
type: String,
default: "1",
},
corpusIds: {
type: String,
default: "",
},
});
const emits = defineEmits(["updateSelectRows"]);
const selectList = ref([]);
const corpusList = ref([]);
const open = ref(false);
const openDialog = () => {
open.value = true;
setTimeout(() => {
toggleRowSelection();
}, 100);
};
const toggleRowSelection = () => {
if (selectList.value.length > 0) {
corpusList.value.forEach((row) => {
selectList.value.forEach((item) => {
if (
item.parentId + (item?.corpusId || "") ===
row.parentId + (row?.corpusId || "")
) {
tableRef.value.toggleRowSelection(row, true);
}
});
});
}
};
const rowKey = (row) => {
return row.parentId + (row?.corpusId || "");
};
const selectable = (row) => {
if (row.continuous + "" === "0") {
return false;
} else {
return true;
}
};
const getList = () => {
if (props.type === "1") {
listCorpus({
pageNum: 1,
pageSize: 100000,
type: "TEST",
continuous: 1,
})
.then((response) => {
corpusList.value = response.rows;
})
.catch((err) => {});
} else {
getBatchCorpus({
pageNum: 1,
pageSize: 100000,
type: "TEST",
continuous: 0,
})
.then((response) => {
corpusList.value = response.rows;
})
.catch((err) => {});
}
};
const tableRef = ref();
const submitForm = () => {
const rows = tableRef.value.getSelectionRows();
selectList.value = rows;
open.value = false;
emits("updateSelectRows", rows);
};
const cancel = () => {
open.value = false;
};
const getSelectList = (corpusIds) => {
if (props.type === "1") {
listCorpus({
pageNum: 1,
pageSize: 100000,
type: "TEST",
continuous: 1,
parentIds: corpusIds,
})
.then((response) => {
selectList.value = response.rows;
})
.catch((err) => {});
} else {
getBatchCorpus({
pageNum: 1,
pageSize: 100000,
type: "TEST",
continuous: 0,
parentIds: corpusIds,
})
.then((response) => {
selectList.value = response.rows;
})
.catch((err) => {});
}
};
onMounted(() => {
getList();
if (props.corpusIds) {
getSelectList(props.corpusIds.split(","));
}
});
</script>
<style lang="scss" scoped>
.btn-container {
text-align: right;
margin-bottom: 12px;
}
</style>