1、提示词管理模块

2、设置病例提示词模块
jinan_by_release_3.0.0
卢会旭 4 months ago
parent d09210a735
commit ab87fa37ce

@ -127,3 +127,53 @@ export const talkRasa = (data?: object) => {
data
});
};
/** 查询提示词列表 */
export const queryMedicalRecAiManage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecAiManage/query",
{
params: data
}
);
};
/** 新增提示词 */
export const createMedicalRecAiManage = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecAiManage/create",
{
data
}
);
};
/** 修改提示词 */
export const modifyMedicalRecAiManage = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/medicalRecAiManage/modify",
{
data
}
);
};
/** 删除提示词 */
export const deleteMedicalRecAiManage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecAiManage/delete",
{
params: data
}
);
};
/** 查询模板列表 */
export const queryMedicalPromptStats = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryMedicalPromptStats",
{
params: data
}
);
};

@ -29,6 +29,17 @@ export default {
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/generalRules/promptManage",
name: "PromptManage",
component: () => import("@/views/generalRules/promptManage/index.vue"),
meta: {
title: "提示词管理 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
}
]
} as RouteConfigsTable;

@ -22,20 +22,102 @@
<span>设置提示词模板</span>
</div>
<div class="line" />
<el-form
ref="formRef"
:model="forms"
label-width="80px"
label-position="top"
>
<el-form-item label="提示词模板" prop="medicalRecordAi">
<el-form ref="formRef" :model="forms" label-width="80px">
<!-- <el-form-item label="提示词模板" prop="medicalRecordAi">-->
<!-- <el-input-->
<!-- v-model="forms.medicalRecordAi"-->
<!-- type="textarea"-->
<!-- :autosize="{ minRows: 5 }"-->
<!-- placeholder="请输入提示词模板"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="通用模板" prop="general">
<el-select
v-model="forms.general"
placeholder="请选择通用模板"
@change="selectChange"
style="width: 100%"
clearable
filterable
>
<el-option
v-for="item in templateOptions"
:key="item.id"
:label="item.attributeName"
:value="item.attributeParam"
/>
</el-select>
</el-form-item>
<el-input
v-if="forms.commonModelParam"
v-model="forms.commonModelParam"
type="textarea"
disabled
:autosize="{ minRows: 5 }"
style="margin-bottom: 10px"
/>
<div
v-for="(item, index) in forms.medicalRecCreateListAiManageVOS"
:key="index"
class="property-item"
>
<el-form-item
:label="'属性' + (index + 1)"
:prop="
'medicalRecCreateListAiManageVOS.' + index + '.attributeName'
"
style="margin-top: 20px"
>
<el-select
v-model="item.attributeName"
placeholder="请选择属性模板"
@change="selectChangeProperty(item, $event)"
style="flex: 1"
clearable
filterable
>
<el-option
v-for="item in templatePropertyOptions"
:key="item.id"
:label="item.attributeName"
:value="item.attributeName"
/>
</el-select>
<el-button
plain
type="primary"
style="margin-left: 10px"
@click="addItem()"
>新增</el-button
>
<el-button
plain
type="danger"
:disabled="index === 0"
@click="removeItem(index)"
>删除</el-button
>
</el-form-item>
<el-input
v-model="forms.medicalRecordAi"
v-if="item.attributeParam"
v-model="item.attributeParam"
type="textarea"
disabled
:autosize="{ minRows: 5 }"
placeholder="请输入提示词模板"
/>
</el-form-item>
</div>
<!-- <pure-table-->
<!-- align-whole="center"-->
<!-- showOverflowTooltip-->
<!-- table-layout="auto"-->
<!-- adaptive-->
<!-- :data="dataList"-->
<!-- :columns="columns"-->
<!-- :header-cell-style="{-->
<!-- background: 'var(&#45;&#45;el-table-row-hover-bg-color)',-->
<!-- color: 'var(&#45;&#45;el-text-color-primary)'-->
<!-- }"-->
<!-- />-->
</el-form>
</div>
<template #footer>
@ -47,7 +129,7 @@
size="large"
@click="save(formRef)"
style="width: 120px"
>确定</el-button
>生成</el-button
>
</template>
</el-drawer>
@ -57,16 +139,65 @@
import { ref } from "vue";
import { FormInstance, ElMessage } from "element-plus";
import { uploadMedicalAiById } from "@/api/medicalRecord";
import { queryMedicalPromptStats } from "@/api/generalRules";
// import PureTable from "@pureadmin/table";
//
const drawerOption = ref({
show: false
});
const formRef = ref<FormInstance>();
const forms = ref({
medicalRecordAi: undefined,
medicalId: undefined
general: undefined,
commonModelParam: undefined,
medicalRecCreateListAiManageVOS: [
{ attributeParam: undefined, attributeName: undefined }
],
medicalRecId: undefined
});
// const dataList = ref([]);
// const columns = [
// {
// label: "",
// prop: "propertyName",
// minWidth: 100
// },
// {
// label: "",
// prop: "propertyTemplate",
// minWidth: 100
// }
// ];
const templateOptions = ref([]);
const templatePropertyOptions = ref([]);
const emit = defineEmits(["update"]);
//
async function queryTemplateList() {
const res = await queryMedicalPromptStats();
templateOptions.value = res.data.medicalRecAisCommon;
templatePropertyOptions.value = res.data.medicalRecAisPara;
}
//
function selectChange(val) {
forms.value.commonModelParam = val;
}
//
function selectChangeProperty(item, val) {
const currentName = templatePropertyOptions.value.find(
property => property.attributeName === val
).attributeParam;
item.attributeParam = currentName;
}
//
function addItem() {
forms.value.medicalRecCreateListAiManageVOS.push({
attributeParam: undefined,
attributeName: undefined
});
}
//
function removeItem(index) {
forms.value.medicalRecCreateListAiManageVOS.splice(index, 1);
}
//
function closeDialog() {
drawerOption.value.show = false;
@ -80,10 +211,7 @@ function reset() {
function save(formEl: FormInstance | undefined) {
formEl.validate(async valid => {
if (valid) {
const res: any = await uploadMedicalAiById({
medicalRecId: forms.value.medicalId,
medicalRecAi: forms.value.medicalRecordAi
});
const res: any = await uploadMedicalAiById({ ...forms.value, medicalRecId: forms.value.medicalId });
if (res.code === 200) {
ElMessage.success(res.msg || "设置成功!");
drawerOption.value.show = false;
@ -94,10 +222,26 @@ function save(formEl: FormInstance | undefined) {
}
defineExpose({
show(data: any) {
forms.value = Object.assign({}, data);
forms.value = Object.assign(
{
medicalRecCreateListAiManageVOS: [
{ attributeParam: undefined, attributeName: undefined }
]
},
data
);
drawerOption.value.show = true;
queryTemplateList();
}
});
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.property-item {
border: 1px solid #cdd0d6;
border-radius: 8px;
padding: 20px 10px;
box-sizing: border-box;
margin-bottom: 10px;
}
</style>

@ -16,7 +16,7 @@ const drawerOption = ref({
});
const formRef = ref<FormInstance>();
const upload = ref();
let forms = ref({
const forms = ref({
image: undefined,
file: undefined,
medicalId: undefined

@ -78,6 +78,11 @@ const columns: TableColumnList = [
label: "机构",
prop: "alarmTask"
},
{
label: "提示词模板",
prop: "medicalRecordAi",
minWidth: 200
},
{
label: "更新时间",
prop: "time"

@ -0,0 +1,143 @@
<!--
* @description: 编辑提示词
* @fileName: EditPrompt
* @author: 17076
* @date: 2024/11/14-上午9:40
* @version: V1.0.0
-->
<template>
<el-drawer
:size="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>编辑提示词</span>
</div>
<div class="line" />
<el-form
ref="refForm"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form-item label="模板类型" prop="commonType">
<el-select
v-model="formData.commonType"
placeholder="请选择模板类型"
style="width: 100%"
:disabled="isEditFlag"
>
<el-option
v-for="item in typeOptions"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select>
</el-form-item>
<el-form-item label="提示词名称" prop="attributeName">
<el-input
v-model="formData.attributeName"
placeholder="请输入提示词名称"
/>
</el-form-item>
<el-form-item label="提示词" prop="attributeParam">
<el-input
v-model="formData.attributeParam"
type="textarea"
:rows="5"
placeholder="请输入提示词"
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="resetForm"></div>
<div class="main" @click="submit(refForm)"></div>
</div>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { FormInstance } from "element-plus";
import {
createMedicalRecAiManage,
modifyMedicalRecAiManage
} from "@/api/generalRules";
import { message } from "@/utils/message";
const isEditFlag = ref(false);
const dialogVisible = ref(false);
const formData = ref({
commonType: "",
attributeName: "",
attributeParam: ""
});
const typeOptions = [
{ label: "通用模板", value: "00" },
{ label: "属性模板", value: "01" }
];
const refForm = ref<FormInstance>();
const rules = {
commonType: [
{ required: true, message: "模板类型不能为空!", trigger: "blur" }
],
attributeName: [
{ required: true, message: "提示词名称不能为空!", trigger: "blur" }
],
attributeParam: [
{ required: true, message: "提示词不能为空!", trigger: "blur" }
]
};
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
const submit = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate(async valid => {
if (valid) {
if (isEditFlag.value) {
const res: any = await modifyMedicalRecAiManage(formData.value);
if (res.code === 200) {
message("修改成功", { type: "success" });
emit("update");
dialogVisible.value = false;
}
} else {
const res = await createMedicalRecAiManage(formData.value);
if (res.code === 200) {
message("新增成功", { type: "success" });
emit("update");
dialogVisible.value = false;
}
}
}
});
};
defineExpose({
show(data, isEdit) {
isEditFlag.value = isEdit;
formData.value = isEdit ? Object.assign({}, data) : {};
dialogVisible.value = true;
}
});
</script>
<style scoped lang="scss"></style>

@ -0,0 +1,167 @@
<!--
* @description: 提示词管理
* @fileName: index
* @author: 17076
* @date: 2024/11/14-上午9:39
* @version: V1.0.0
-->
<template>
<div class="app-main-content">
<div class="seach">
<el-form :model="searchForm">
<el-row>
<el-form-item label="属性名称:">
<el-input size="large" v-model="searchForm.attribute_name" />
</el-form-item>
<el-button class="ml-8" size="large" @click="search" type="primary"
>搜索</el-button
>
<el-button size="large" @click="reset"></el-button>
</el-row>
</el-form>
</div>
<div class="main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>提示词配置</span>
</div>
<el-row class="mb-6">
<el-button size="large" @click="handleAdd" type="primary"
>新建</el-button
>
</el-row>
</div>
<pure-table
align-whole="center"
show-overflow-tooltip
table-layout="auto"
:loading="loading"
adaptive
:data="dataList"
:columns="columns"
:pagination="pagination"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
@page-size-change="handleSizeChange"
@page-current-change="handleCurrentChange"
>
<template #operation="{ row }">
<el-button link type="primary" @click="handleEdit(row)"
>编辑</el-button
>
<el-button link type="danger" @click="handleDelete(row)"
>删除</el-button
>
</template>
</pure-table>
</div>
<!--编辑提示词-->
<edit-prompt ref="edit" @update="getData" />
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref } from "vue";
import { PaginationProps } from "@pureadmin/table";
import {
deleteMedicalRecAiManage,
queryMedicalRecAiManage
} from "@/api/generalRules";
import EditPrompt from "@/views/generalRules/promptManage/components/EditPrompt.vue";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
const dataList = ref([{}]);
const loading = ref(false);
const edit = ref(null);
const searchForm = reactive({
attribute_name: ""
});
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "类型",
prop: "commonName",
minWidth: 240
},
{
label: "属性名称",
prop: "attributeName",
minWidth: 240
},
{
label: "提示词",
prop: "attributeParam",
minWidth: 240
},
{
label: "操作",
fixed: "right",
slot: "operation"
}
];
const getData = async () => {
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
...searchForm
};
const res: any = await queryMedicalRecAiManage(params);
dataList.value = res.data.records;
pagination.total = res.data.total;
};
function handleSizeChange(val: number) {
pagination.pageSize = val;
getData();
}
function handleCurrentChange(val: number) {
pagination.currentPage = val;
getData();
}
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const reset = () => {
seachForm.description = "";
seachForm.similarityDescription = "";
search();
};
const handleAdd = () => {
edit.value.show(undefined, false);
};
const handleEdit = item => {
edit.value.show(item, true);
};
//
const handleDelete = item => {
ElMessageBox.confirm("确定删除此项吗?", "提示", {
confirmButtonText: "确定",
callback: async () => {
const res = await deleteMedicalRecAiManage({ id: item.id });
res.code === 200
? message(res.msg || "删除成功!", { type: "success" })
: message(res.msg || "删除失败!", { type: "error" });
await getData();
}
});
};
onMounted(() => {
getData();
});
</script>
<style scoped lang="scss"></style>
Loading…
Cancel
Save