1、增加提示词模板设置

2、生成数字人功能模块
jinan_by_release_3.0.0
卢会旭 4 months ago
parent 109b526cab
commit d09210a735

@ -120,3 +120,39 @@ export const modifyMedicalRec = (data?: object) => {
}
);
};
/** 导入病历 */
export const uploadMedical = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecManage/uploadMedical",
{
data,
headers: {
"Content-Type": "multipart/form-data"
}
}
);
};
/** 生成数字人 */
export const createHuman = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/humanManage/createHuman",
{
data,
headers: {
"Content-Type": "multipart/form-data"
}
}
);
};
/** 设置提示词模板 */
export const uploadMedicalAiById = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/medicalRecManage/uploadMedicalAiById",
{
data
}
);
};

@ -0,0 +1,103 @@
<!--
* @description: 提示词模板
* @fileName: index
* @author: 17076
* @date: 2024/11/11-上午9:56
* @version: V1.0.0
-->
<template>
<el-drawer
:size="650"
append-to-body
v-model="drawerOption.show"
: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="formRef"
:model="forms"
label-width="80px"
label-position="top"
>
<el-form-item label="提示词模板" prop="medicalRecordAi">
<el-input
v-model="forms.medicalRecordAi"
type="textarea"
:autosize="{ minRows: 5 }"
placeholder="请输入提示词模板"
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<el-button plain size="large" @click="reset" style="width: 120px"
>重置</el-button
>
<el-button
type="primary"
size="large"
@click="save(formRef)"
style="width: 120px"
>确定</el-button
>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { FormInstance, ElMessage } from "element-plus";
import { uploadMedicalAiById } from "@/api/medicalRecord";
//
const drawerOption = ref({
show: false
});
const formRef = ref<FormInstance>();
const forms = ref({
medicalRecordAi: undefined,
medicalId: undefined
});
const emit = defineEmits(["update"]);
//
function closeDialog() {
drawerOption.value.show = false;
reset();
}
//
function reset() {
formRef.value.resetFields();
}
//
function save(formEl: FormInstance | undefined) {
formEl.validate(async valid => {
if (valid) {
const res: any = await uploadMedicalAiById({
medicalRecId: forms.value.medicalId,
medicalRecAi: forms.value.medicalRecordAi
});
if (res.code === 200) {
ElMessage.success(res.msg || "设置成功!");
drawerOption.value.show = false;
emit.apply("update", [true]);
}
}
});
}
defineExpose({
show(data: any) {
forms.value = Object.assign({}, data);
drawerOption.value.show = true;
}
});
</script>
<style scoped lang="scss"></style>

@ -105,7 +105,7 @@ onMounted(() => {
<div class="right">{{ detailInfo.differentialDiagnosisCriteria }}</div>
</div>
<div class="text_item">
<div class="left">全面检查</div>
<div class="left">预期诊断结果</div>
<div class="right">{{ detailInfo.fullCheck }}</div>
</div>
</div>
@ -156,7 +156,7 @@ onMounted(() => {
<span>病历信息</span>
</div>
</template>
</el-collapse-item>
<el-collapse-item name="2">
<template #title>

@ -0,0 +1,159 @@
<!--
* @description: 生成数字人
* @fileName: CreateDigitalHuman
* @author: 17076
* @date: 2024/11/6-上午9:59
* @version: V1.0.0
-->
<script setup lang="ts">
import { ref } from "vue";
import { FormInstance, ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import { createHuman } from "@/api/medicalRecord";
//
const drawerOption = ref({
show: false
});
const formRef = ref<FormInstance>();
const upload = ref();
let forms = ref({
image: undefined,
file: undefined,
medicalId: undefined
});
const rules = ref({
file: [{ required: true, message: "请上传文件", trigger: "blur" }]
});
const emit = defineEmits(["update"]);
//
function closeDialog() {
drawerOption.value.show = false;
reset();
}
//
function reset() {
formRef.value.resetFields();
}
//
function save(formEl: FormInstance | undefined) {
formEl.validate(async valid => {
if (valid) {
const formData = new FormData();
formData.append("file", forms.value.file);
formData.append("medicalId", forms.value.medicalId);
const res: any = await createHuman(formData);
if (res.code === 200) {
ElMessage.success(res.msg || "上传成功,数字人生成中");
drawerOption.value.show = false;
emit.apply("update", [true]);
}
}
});
}
//
const handleOnChange = () => {
upload.value.value = null;
upload.value.click();
};
//
const handleFileChange = e => {
const files = e.target.files;
forms.value.file = files[0];
const render = new FileReader();
render.readAsDataURL(files[0]);
render.onload = result => {
forms.value.image = result.target.result;
};
};
defineExpose({
show(data: any) {
forms.value = Object.assign({}, data);
drawerOption.value.show = true;
}
});
</script>
<template>
<el-drawer
:size="650"
append-to-body
v-model="drawerOption.show"
: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="formRef"
:model="forms"
:rules="rules"
label-width="80px"
label-position="top"
>
<el-form-item label="上传素材" prop="file">
<div class="avatar-uploader" @click="handleOnChange">
<img v-if="forms.image" :src="forms.image" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
<input
ref="upload"
hidden
type="file"
accept=".png,.jpg,.jpeg"
@change="handleFileChange"
/>
</div>
</el-form-item>
</el-form>
</div>
<template #footer>
<el-button plain size="large" @click="reset" style="width: 120px"
>重置</el-button
>
<el-button
type="primary"
size="large"
@click="save(formRef)"
style="width: 120px"
>确定</el-button
>
</template>
</el-drawer>
</template>
<style lang="scss">
.AddEdit {
.avatar-uploader {
width: 178px;
height: 178px;
display: block;
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
&:hover {
border-color: var(--el-color-primary);
}
.avatar {
object-fit: contain;
}
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
.el-drawer__body {
overflow-x: hidden;
}
}
</style>

@ -4,11 +4,22 @@ import { PaginationProps } from "@pureadmin/table";
import { reactive, ref } from "vue";
import {
queryDiseaseListByDropList,
queryMedicalRecPage
queryMedicalRecPage,
uploadMedical
} from "@/api/medicalRecord";
import { onMounted } from "vue";
import { clearObject } from "@/utils/auth";
import { useCaseStoreHooks } from "@/store/modules/caseManagement";
import { ElMessage } from "element-plus";
import {
More,
View,
Edit,
User,
ChatLineSquare
} from "@element-plus/icons-vue";
import CreateDigitalHuman from "./digitalHuman/CreateDigitalHuman.vue";
import PromptTemplate from "./PromptTemplate/index.vue";
defineOptions({
name: "CaseManagement"
@ -16,7 +27,9 @@ defineOptions({
const dataList = ref([]);
const loading = ref(false);
// const upload = ref(null);
const upload = ref(null);
const digital = ref();
const prompt = ref();
const seachForm = reactive({
gender: "",
diseaseId: "",
@ -30,6 +43,12 @@ const pagination = reactive<PaginationProps>({
background: true
});
const columns: TableColumnList = [
{
label: "状态",
prop: "medicalDataStatus",
slot: "status",
minWidth: 100
},
{
label: "病历编号",
prop: "no",
@ -123,6 +142,45 @@ const handleEdit = item => {
}
});
};
//
const handelCreateDigital = row => {
digital.value.show(row);
};
//
const handelPrompt = row => {
prompt.value.show(row);
};
// tagName
const formatterTagName = val => {
let tagName = "";
switch (val) {
case "00":
tagName = "已创建病例";
break;
case "01":
tagName = "数字人生成中";
break;
case "02":
tagName = "完成";
break;
}
return tagName;
};
const formatterType = val => {
let tagName = "";
switch (val) {
case "00":
tagName = "primary";
break;
case "01":
tagName = "warning";
break;
case "02":
tagName = "success";
break;
}
return tagName;
};
// const handleDelete = item => {
// ElMessageBox.confirm(
// item ? `, ` : "",
@ -145,47 +203,40 @@ onMounted(() => {
getData();
useCaseStoreHooks().changeActivedStep(0);
});
// const downloadFile = (url, fileName) => {
// const link = document.createElement("a");
// link.href = url;
// link.download = fileName;
// link.click();
// };
// //
// const handleDownload = () => {
// downloadFile(
// "/virtual-patient-manage/medicalRecManage/downloadMedicalTemplate",
// ""
// );
// };
// //
// const handleImport = () => {
// upload.value.value = null;
// upload.value.click();
// };
// //
// const handleFileChange = e => {
// const files = e.target.files;
// const rawFile = files[0];
// if (!rawFile) return;
// const formData = new FormData();
// formData.append("file", rawFile);
// errorDialog.show = true;
// // uploadAdminExcel(formData).then((res) => {
// // if (res.data.errorList.length > 0) {
// // this.pageData.page = 1
// // this.gridOptions.data = res.data.errorList
// // this.errorDialogOption.show = true
// // this.findByPage()
// // } else if (res.data.finalSuccess === 0) {
// // this.$message.warning(`0`)
// // } else {
// // this.$message.success(`${res.data.finalSuccess}`)
// // this.pageData.page = 1
// // this.findByPage()
// // }
// // })
// };
const downloadFile = (url, fileName) => {
const link = document.createElement("a");
link.href = url;
link.download = fileName;
link.click();
};
//
const handleDownload = () => {
downloadFile(
"/virtual-patient-manage/medicalRecManage/downloadMedicalTemplate",
"病历导入模版"
);
};
//
const handleImport = () => {
upload.value.value = null;
upload.value.click();
};
//
const handleFileChange = e => {
const files = e.target.files;
const rawFile = files[0];
if (!rawFile) return;
const formData = new FormData();
formData.append("multipartFile", rawFile);
// errorDialog.show = true;
uploadMedical(formData).then(res => {
res.code === 200
? ElMessage.success(res.msg || "导入成功")
: ElMessage.error(res.msg || "导入失败!");
getData();
});
};
</script>
<template>
@ -239,20 +290,20 @@ onMounted(() => {
</div>
<el-row class="mb-6">
<el-button size="large" @click="add" type="primary">新增</el-button>
<!-- <el-button size="large" type="warning" @click="handleDownload">-->
<!-- 模板下载-->
<!-- </el-button>-->
<!-- <el-button size="large" type="success" @click="handleImport">-->
<!-- 模板导入-->
<!-- </el-button>-->
<!-- &lt;!&ndash;文件导入&ndash;&gt;-->
<!-- <input-->
<!-- ref="upload"-->
<!-- hidden-->
<!-- type="file"-->
<!-- accept=".xls"-->
<!-- @change="handleFileChange"-->
<!-- />-->
<el-button size="large" type="warning" @click="handleDownload">
模板下载
</el-button>
<el-button size="large" type="success" @click="handleImport">
模板导入
</el-button>
<!--文件导入-->
<input
ref="upload"
hidden
type="file"
accept=".xls,.xlsx"
@change="handleFileChange"
/>
</el-row>
</div>
<pure-table
@ -270,18 +321,72 @@ onMounted(() => {
}"
@page-size-change="handleSizeChange"
@page-current-change="handleCurrentChange"
><template #operation="{ row }">
<el-button link type="primary" @click="openDetail(row)">
详情
</el-button>
<el-button link type="primary" @click="handleEdit(row)">
编辑
</el-button>
<!-- <el-button link type="danger" @click="handleDelete(row)">
删除
</el-button> -->
>
<template #operation="{ row }">
<el-popover trigger="hover" placement="left-start">
<template #reference>
<el-icon size="17"><More /></el-icon>
</template>
<template #default>
<el-row>
<el-col :span="24">
<el-button
link
type="primary"
:icon="View"
@click="openDetail(row)"
>详情</el-button
>
</el-col>
<el-col style="margin-top: 10px">
<el-button
link
type="primary"
:icon="Edit"
@click="handleEdit(row)"
>
编辑
</el-button>
</el-col>
<el-col
:span="24"
v-if="row.medicalDataStatus === '00'"
style="margin-top: 10px"
>
<el-button
link
type="primary"
:icon="User"
@click="handelCreateDigital(row)"
>生成数字人</el-button
>
</el-col>
<el-col :span="24" style="margin-top: 10px">
<el-button
link
type="primary"
:icon="ChatLineSquare"
@click="handelPrompt(row)"
>提示词模板</el-button
>
</el-col>
</el-row>
<!-- <el-button link type="danger" @click="handleDelete(row)">
删除
</el-button> -->
</template>
</el-popover>
</template>
<template #status="{ row }">
<el-tag :type="formatterType(row.medicalDataStatus)">{{
formatterTagName(row.medicalDataStatus)
}}</el-tag>
</template>
</pure-table>
</div>
<!--生成数字人-->
<create-digital-human ref="digital" @update="getData" />
<!--设置提示词-->
<prompt-template ref="prompt" @update="getData" />
</div>
</template>

@ -76,13 +76,13 @@ onMounted(() => {
</el-form-item>
</el-row>
<el-row>
<el-form-item label="全面检查" prop="fullCheck">
<el-form-item label="预期诊断结果" prop="fullCheck">
<el-input
:rows="4"
style="width: 500px"
type="textarea"
:maxLength="500"
placeholder="请输入全面检查"
placeholder="请输入预期诊断结果"
v-model="diagnosticBasisInfo.fullCheck"
/>
</el-form-item>

@ -147,6 +147,9 @@ onMounted(() => {
>
{{ item.diseaseName }}
</div>
<div>
{{ state.dataInfo.fullCheck ? state.dataInfo.fullCheck : "" }}
</div>
</el-tab-pane>
<el-tab-pane name="2">
<template #label>

@ -169,7 +169,7 @@ onMounted(() => {
<el-collapse-item name="6">
<template #title>
<div class="title">
<span>全面检查</span>
<span>预期诊断结果</span>
</div>
</template>
</el-collapse-item>

@ -221,6 +221,7 @@ const activeName = ref("");
>
{{ item.diseaseName }}
</div>
<div style="margin-top: 10px">{{ state.dataInfo?.fullCheck }}</div>
</div>
</el-tab-pane>
<el-tab-pane label="初步诊断依据" name="4">
@ -337,6 +338,7 @@ const activeName = ref("");
/>
</div>
</div>
<!-- <div>{{ state.dataInfo.dealPan }}</div>-->
</div>
</el-tab-pane>
</el-tabs>

Loading…
Cancel
Save